web-dev-qa-db-ja.com

WP_Query、pre_get_posts、およびoffset

頭がわからないのですが、なぜoffsetがページテンプレートのカスタムのWP_Queryからメインのクエリに転送されているようですか。

私のfunctions.phpより

/**
 * ::: Filter 'Custom Post Type' Archive Main Query :::
 */
add_action( 'pre_get_posts', 'filter_cpt_posts' );

function filter_cpt_posts( $query ) {
    if ( ! is_admin() && $query->is_main_query() && ! is_post_type_archive( 'cpt' ) ) {
        return $query;
    } 
    else { // on is_post_type_archive( 'cpt' )
        $query->set( 'offset', '1' );
        return $query;
    }
}

私のarchive-cpt.phpから:

<?php
    $loop_recent_post = new WP_Query( array(
        'post_type' => 'cpt',
        'posts_per_page' => 1, // number of posts to display
        'offset' => 0
    ) );

    if ( $loop_recent_post->have_posts() ) {
        while ( $loop_recent_post->have_posts() ) { 
            $loop_recent_post->the_post(); 
?>

<!-- HTML Code -->

<?php wp_reset_postdata(); ?>

そしてさらに下:

<?php 
    //query_posts( 'post_type=cpt&offset=1' ); //Get rid of `query_posts`
    if ( have_posts() ) { 
        while ( have_posts() ) {
            the_post();
?>

投稿はoffset=0でメインのクエリから始まります。

どうして?

シモンズ:はい、

1
Volker E.

問題を書き留めるのに役立ちます。

私はpre_get_postsを広範囲に使用したことがないので、その原因についてその領域に集中しすぎましたが、それはif節でした。

に変更

if ( ! is_admin() && $query->is_main_query() && ! is_post_type_archive( 'cpt' ) ) {
    return $query;
} 
elseif ( ! is_admin() && $query->is_main_query() && is_post_type_archive( 'cpt' ) ) { // on is_post_type_archive( 'cpt' )
    $query->set( 'offset', '1' );
    return $query;
}
else {
    return $query;
}

すべてうまくいっています。私はpre_get_postsが好きです。

1
Volker E.