web-dev-qa-db-ja.com

ページごとの投稿数の変更とpre_get_postsによるオフセット

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

これは私があなたと同じように私が最近別の質問に対してした答えです。回答が支持されたり受け入れられたりすることはなかったので、この質問に重複のマークを付けることはできませんでした。そのため、他の投稿の回答を削除してここに再投稿しました。

注意してください、いくつかの点はこの問題を目的としておらず、無視することができます、また、私は元の記事では何も変更していないので、あなただけの値を変更する必要があります。だから答えの中の情報のいくつかによって心配しないでください;-)

目的の回答

ここ は、私が同じシナリオについて行った答えのわずかな変化です。ここでの違いは、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オプションを変更したくない場合は、単に変数$ppg300に設定するだけです。

$ppg = get_option( 'posts_per_page' );
//$ppg = 300;
$offset = 200;

ステップ4

1ページ目で、offsetposts_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 );
5
Pieter Goosen