最初のページと他のページでは、1ページあたりの投稿数を変える必要があります。
例えば、これは私が必要とするものです
これが私のコードです:
$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();
アーカイブの最初のページでは、このコードは次のことを前提としています。
1ページに合計6件の投稿と3件の投稿があります。それで、私は2つのアーカイブページを必要とします、そして、私があなたに提示するページ付けは、です:
[1] [2]
ただし、アーカイブ内の他のページのコードでは、次のことを前提としています。
1ページに合計6件の投稿と2件の投稿があります。それで私は3つのアーカイブページを必要とします、そして私があなたに提示するページ付けは以下の通りです:
[1] [2] [3]
これを修正するために少し手助けが必要です。
編集 - 回答の見直し
私は実際には元の答えよりも優れている別の解決策に取り組んでいます。これにはカスタムクエリは含まれず、あらゆる目的で私の元の回答を削除することはできますが、情報提供の目的で保持しています。
私はあなたがホームページにいると今でも信じていますし、これもそのように扱うでしょう。だからこれは私の新しい解決策です
ステップ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ページに3つの投稿と残りの2つの投稿が必要になるので、それは1
になります
$ppg = get_option('posts_per_page');
$offset = 1;
ステップ4
1ページ目に、3つの投稿を1ページに表示するには、offset
を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 );
ALL TOGETHER
これがあなたの完全なクエリが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 );
私はこれが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,
今行ってもいいですね。