web-dev-qa-db-fra.com

WP_Query, pre_get_posts et offset

Je n'arrive pas à comprendre, pourquoi offset semble être transféré de WP_Query personnalisé dans le modèle de page vers la requête principale plus bas?!

De mon 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;
    }
}

De mon 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(); ?>

et plus bas:

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

Les messages commencent dans la requête principale avec offset=0.

Pourquoi?

PS: oui

1
Volker E.

Cela aide d’écrire des problèmes.

Après que je n’ai pas beaucoup utilisé pre_get_posts, je me suis trop concentré sur ce domaine pour la cause, mais c’était la clause if.

Changé en

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

Tout fonctionne bien. J'aime pre_get_posts.

1
Volker E.