最初のページに異なる数の投稿がある


11

最初のページと他のページでは、ページごとに異なる数の投稿が必要です。

たとえば、これは私が必要なものです

  • 合計投稿数:6
  • 最初のページ:3つの投稿を表示
  • 次のページ:ページごとに2つの投稿を表示

これが私のコードです:

$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();

アーカイブの最初のページでは、このコードは次のことを前提としています。

まあ、合計6つの投稿と1ページあたり3つの投稿。だから私は2つのアーカイブページが必要です、そしてあなたに提示するページネーションは次のとおりです:

[1] [2]

ただし、アーカイブ内の他のページでは、コードは次のことを前提としています。

さて、合計6投稿と1ページあたり2投稿。だから私は3つのアーカイブページが必要です、そしてあなたに提示するページネーションは次のとおりです:

[1] [2] [3]

これを修正するには少し助けが必要です。


WP_pagenaviに最初のページとそれ以外のページの投稿数を伝えることができれば...
norixxx

なぜ正確にこのようにする必要があるのですか?特定の理由
Pieter Goosen 2014

ただ私のクライアントのわがまま。wp_pagenaviを使用するかどうかは、実際には気にしません。他に使用できるテクニックはありますか?
norixxx 2014

2
最初のオフに'caller_ get_ posts'はスペースが含まれており、無効です。第二に、それは非推奨です。ignore_sticky_posts代わりに使用してください。
カイザー14

あなたのホームページ、それは通常のホームページですか、それともフロントページとして設定されていますか
Pieter Goosen

回答:


21

編集-回答の再検討

私は実際に元の答えよりも優れている別のソリューションに取り組んでいます。これにはカスタムクエリが含まれていません。私の目的はすべての目的で削除できますが、情報提供の目的で保持されます。

私はまだあなたがホームページにいると信じており、これもそのように扱います。これが私の新しいソリューションです

ステップ1

ホームページからカスタムクエリを削除し、デフォルトのループに置き換えます

<?php

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

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

            endwhile;

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

            else : 

                //NO POSTS FOUND OR SOMETHING   

            endif; 

    ?>

ステップ2

使用pre_get_postsホームページに表示するメインクエリにカスタム分類を追加するためにメインクエリを変更します。

ステップ3

次に、posts_per_pageバックエンドからオプションセットを取得し(これは2と想定してoffsetいます)、使用するオプションも設定します。それは1あなたが1ページに3つの投稿、残りに2つの投稿が必要になるためです

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

ステップ4

1ページ目に、1ページに3つの投稿を表示するには、offsetto posts_per_pageを追加して最大3つを追加する必要があります。

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

ステップ5

offset後続のすべてのページにを適用する必要があります。そうしないと、ページの最後の投稿が次のページに繰り返されます。

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

ステップ6

最後に、オフセットを差し引く必要があります。found_postsそうしないと、最後のページのページ付けが間違ってしまい404、誤った投稿数のために最後の投稿が失われるため、エラーが発生します。

注:このコードは、検索ページのページネーションを壊しました。これは修正されました。更新されたコードを参照してください

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 );

すべて一緒に

これは、完全なクエリがfunctions.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 );

3

私はこれが1000年前のものであることを知っていますが、カスタムクエリを使用しているときにこのソリューションを探している人のための別のソリューションは、次のとおりです。この例では、最初のページには10件の投稿が必要で、後続のすべてのページには9件の投稿が必要です。

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

そして、配列でこれを使用します:

'posts_per_page' => $limit,

これで準備完了です。


2
これは機能しません。これにより、投稿#10が2回表示されます。2ページ目に移動すると、最初のページにも9つの投稿が表示されていると「考える」ので、最初のページにすでに表示されている投稿#10が表示され始めます。
leymannx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.