İlk sayfada farklı sayıda yayın var


12

İlk sayfadaki diğer sayfalardaki sayfa başına farklı miktarda yazıya ihtiyacım var.

Örneğin, ihtiyacım olan şey bu

  • Toplam ileti: 6
  • İlk sayfa: 3 gönderi gösteriliyor
  • Sonraki sayfa: sayfa başına 2 mesaj gösteriliyor

İşte benim kod:

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

$fp_limit = 3; // first page limit
$limit = 2; // following page limit
$offset = 0; // default offset

if( $paged == 1 ) {
    $limit = $fp_limit;
} else {
    $offset = $fp_limit + ( ($paged - 2) * $limit );
}

$args = array(
    'post_type' => 'my_post_type',
    'post_status' => 'publish',
    'offset' => $offset,
    'posts_per_page' => $limit,
    'caller_ get_ posts' => -1, // remove sticky post
    'paged' => $paged,
    'tax_query' => array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    )
);
$my_query = null;
$my_query = new WP_Query($args);

// basic loop
if( $my_query->have_posts() ) : 
while ($my_query->have_posts()) : $my_query->the_post();

...

endwhile; endif; // archive loop
if (function_exists('wp_pagenavi')){ wp_pagenavi( array( 'query' => $my_query ) ); }

wp_reset_query();

Arşivdeki ilk sayfada, bu kod varsayar:

Eh, toplam 6 gönderi ve sayfa başına 3 gönderi. Bu yüzden 2 arşiv sayfasına ihtiyacım var ve size sunduğum sayfa:

[1] [2]

Ancak, arşivdeki diğer tüm sayfalarda kod varsayar:

Eh, toplam 6 gönderi ve sayfa başına 2 gönderi. Bu yüzden 3 arşiv sayfasına ihtiyacım var ve size sunduğum sayfa:

[1] [2] [3]

Bunu düzeltmek için biraz yardıma ihtiyacınız var.


Sadece WP_pagenavi 1. sayfada ve geri kalanı kaç mesaj söyleyebilirdim ...
norixxx

Neden tam olarak bu şekilde yapman gerekiyor. Herhangi bir özel sebep
Pieter Goosen

Sadece müvekkilimin bencilliği. Aslında wp_pagenavi kullanıp kullanmadığım umurumda değil. Kullanabileceğim başka bir teknik var mı?
norixxx

2
İlk uzakta 'caller_ get_ posts'boşluklar var ve geçerli değil. İkincisi, kullanımdan kaldırıldı. ignore_sticky_postsBunun yerine kullanın .
kaiser

Ana sayfanız, normal bir ana sayfa mı yoksa ön sayfa olarak mı ayarlandı
Pieter Goosen

Yanıtlar:


22

DÜZENLEME - CEVAP REVİZE

Aslında orijinal cevap daha iyi başka bir çözüm üzerinde çalışıyorum. Bu herhangi bir özel sorgu içermez ve bence tüm amaçlar için orijinal cevabım atılabilir ancak bilgi amaçlı tutulabilir

Hala ana sayfada olduğunuzu düşünüyorum ve bunu da bu şekilde ele alacağım. Bu benim yeni çözümüm

AŞAMA 1

Özel sorguyu ana sayfadan kaldırın ve varsayılan döngü ile değiştirin

<?php

        if ( have_posts() ) :
            // Start the Loop.
            while ( have_posts() ) : the_post();

                ///<---YOUR LOOP--->

            endwhile;

                //<---YOUR PAGINATION--->   

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

ADIM 2

pre_get_postsAna sayfada görüntülenecek ana sorguya özel sınıflandırmanızı eklemek için ana sorguyu değiştirmek için kullanın .

AŞAMA 3

Şimdi, posts_per_pagearka uçtan ayarlanan seçeneği alın (ki 2 olduğunu varsayıyorum) ve ayrıca offsetkullanacağımız şeyi ayarlayın . Bu, birinci 1sayfada 3 ve geri kalanında 2 gönderiye ihtiyacınız olacak gibi olacak

$ppg = get_option('posts_per_page');
$offset = 1;

4.ADIM

Sayfa birinde, eklemek gerekir offsetiçin posts_per_pagesayfa birinde senin üç mesajları almak için 3'e kadar katacak.

$query->set('posts_per_page', $offset + $ppp);

ADIM 5

offsetSonraki tüm sayfalara uygulamanız gerekir , aksi takdirde bir sonraki sayfada sayfanın son gönderisinin tekrarını alırsınız

$offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
$query->set('posts_per_page',$ppp);
$query->set('offset',$offset); 

6.ADIM

Son olarak, ofsetinizi çıkarmanız gerekir, found_postsaksi takdirde son sayfadaki sayfalandırmanız yanlış olur ve 404yanlış yazı sayısı nedeniyle son yazı eksik olacağından size bir hata verirsiniz

NOT: Bu kod parçası arama sayfasındaki sayfa numaralarını kırdı. Bu düzeltildi, güncellenmiş koda bakın

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

HEP BİRLİKTE

Tam sorgunuz bu şekilde görünecektir. Function.php

function tax_and_offset_homepage( $query ) {
  if ($query->is_home() && $query->is_main_query() && !is_admin()) {
    $query->set( 'post_type', 'my_post_type' );
    $query->set( 'post_status', 'publish' );
    $query->set( 'ignore_sticky_posts', '-1' );
    $tax_query = array(
        array(
            'taxonomy' => 'my_taxo',
            'field' => 'slug',
            'terms' => array('slug1', 'slug2', 'slug3')
        )
    );
    $query->set( 'tax_query', $tax_query );
    $ppp = get_option('posts_per_page');
    $offset = 1;
    if (!$query->is_paged()) {
      $query->set('posts_per_page',$offset + $ppp);
    } else {
      $offset = $offset + ( ($query->query_vars['paged']-1) * $ppp );
      $query->set('posts_per_page',$ppp);
      $query->set('offset',$offset);
    }
  }
}
add_action('pre_get_posts','tax_and_offset_homepage');

function homepage_offset_pagination( $found_posts, $query ) {
    $offset = 1;

    if( $query->is_home() && $query->is_main_query() ) {
        $found_posts = $found_posts - $offset;
    }
    return $found_posts;
}
add_filter( 'found_posts', 'homepage_offset_pagination', 10, 2 );

4

Bu 1000 yıl önce olduğunu biliyorum, ama özel bir sorgu kullanırken bu çözümü arayan herkes için başka bir çözüm, nasıl yapılır. Bu örnekte 1. sayfanın 10 gönderi ve sonraki her sayfanın 9 olması gerekir.

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if( $paged == 1 ) {
   $limit = 10;
} else {
   $limit = 9;
}

ve sonra dizide şunu kullanın:

'posts_per_page' => $limit,

Şimdi gitmekte fayda var.


2
Bu işe yaramaz. Bununla # 10 numaralı mesajın iki kez görüntülenmesini sağlayabilirsiniz. İkinci sayfaya giderken, ilk sayfada 9 gönderinin görüntülendiğini "düşünecek" ve bu nedenle ilk sayfada gösterilmiş olmasına rağmen # 10 numaralı yayını göstermeye başlayacaktır.
leymannx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.