1ページあたりの投稿数をニュースランディングページの4から他のすべてのページ(2、3など)の8に変更するためにpre_get_postsを使用するフィルタがあります。ただし、私が手動でURLにアクセスしても存在しているにもかかわらず、私のget_next_posts_page_link
に3ページ目が表示されていないため、オフセットを正しく設定できていないようです。現在のオフセットは私がどういうわけか偶然に思い起こさせたものです、私はそれが2ページが正しいのでうまくいったと思いました、しかし、私がより多くのテスト記事を加えたので、私はそれがうまくいかなかったことに気づきました。
function page_2_posts_per_page_filter( $query ) {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if ( !is_admin() && $query->is_paged && $query->is_main_query() ) {
$offset = 4 + (($paged - 2) * 8);
$query->set( 'offset', $offset );
$query->set( 'posts_per_page', 8 );
} else if (!is_admin() && $query->is_main_query()) {
$query->set( 'posts_per_page', 4 );
}
return;
}
add_action( 'pre_get_posts', 'page_2_posts_per_page_filter', 1 );
編集:解決策
function page_2_posts_per_page_filter( $query ) {
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$offset = 4;
if ( !is_admin() && $query->is_paged && $query->is_main_query() ) {
$offset = (($paged - 1) * 8) - $offset;
$query->set( 'posts_per_page', 8 );
$query->set( 'offset', $offset );
} else if (!is_admin() && $query->is_main_query()) {
$query->set( 'posts_per_page', 4 );
}
return;
}
add_action( 'pre_get_posts', 'page_2_posts_per_page_filter');
function found_offset( $found_posts, $query ) {
$offset = 4;
if( !is_admin() && $query->is_main_query() ) {
$found_posts = $found_posts + $offset;
}
return $found_posts;
}
add_action( 'found_posts', 'found_offset', 10, 2 );
これは私があなたと同じように私が最近別の質問に対してした答えです。回答が支持されたり受け入れられたりすることはなかったので、この質問に重複のマークを付けることはできませんでした。そのため、他の投稿の回答を削除してここに再投稿しました。
注意してください、いくつかの点はこの問題を目的としておらず、無視することができます、また、私は元の記事では何も変更していないので、あなただけの値を変更する必要があります。だから答えの中の情報のいくつかによって心配しないでください;-)
ここ は、私が同じシナリオについて行った答えのわずかな変化です。ここでの違いは、1ページ目のposts_per_page
を減らしたいということです。
ステップ1
query_posts
を削除します。決してquery_posts
を使うべきではありません
注: この関数はプラグインやテーマで使用するためのものではありません。後で説明するように、メインクエリを変更するためのより優れた、より高性能なオプションがあります。 query_posts()は、ページのメインクエリを新しいクエリインスタンスに置き換えることによって変更する、非常に単純で問題の多い方法です。これは非効率的で(SQLクエリを再実行する)、状況によっては完全に失敗する可能性があります(特に投稿ページ付けを扱うときによくあります)。
デフォルトのループに置き換えます
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<?php if ( 'regularproducts' == get_post_type() ) : ?>
//CONTENT HERE
<?php endif; ?>
<?php if ( 'wpsc-product' == get_post_type() ) : ?>
//CONTENT HERE
<?php endif; ?>
<?php endwhile; endif; ?>
ステップ2
ホームページに表示するメインのクエリにカスタムのpost_typeを追加するようにメインのクエリを変更するには、pre_get_posts
を使用します。
ステップ3
さて、バックエンドから設定されたposts_per_page
オプション(これは300に設定されるべきです)を手に入れ、そしてあなたが使用しようとしているあなたのoffset
も設定します。 1ページ目に100の投稿と残りの300の投稿が必要になるので、それは200
になります。
posts_per_page
オプションを変更したくない場合は、単に変数$ppg
を300
に設定するだけです。
$ppg = get_option( 'posts_per_page' );
//$ppg = 300;
$offset = 200;
ステップ4
1ページ目で、offset
をposts_per_page
に引き算する必要があります
$query->set( 'posts_per_page', $ppp - $offset );
ステップ5
あなたはあなたのoffset
をすべての後続のページに適用しなければなりません、さもなければあなたは次のページでそのページの最後の投稿の繰り返しを得るでしょう
$offset = ( ( $query->query_vars['paged']-1 ) * $ppp ) - $offset;
$query->set( 'posts_per_page', $ppp );
$query->set( 'offset', $offset );
ステップ6
最後に、オフセットをfound_posts
に追加する必要があります。そうしないと、ページ付けで最後のページが表示されません。
注:このコードは検索ページのページ区切りを壊しました。これは修正されました。更新されたコードを参照してください
function homepage_offset_pagination( $found_posts, $query ) {
$offset = 200;
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 ( !is_admin() && $query->is_home() && $query->is_main_query() ) {
$query->set( 'post_type', array( 'regularproducts', 'wpsc-product' ) );
$ppp = get_option( 'posts_per_page' );
//$ppp = 300;
$offset = 200;
if ( !$query->is_paged() ) {
$query->set( 'posts_per_page', $ppp - $offset );
} else {
$offset = ( ( $query->query_vars['paged']-1 ) * $ppp ) - $offset;
$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 = 200;
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 );