web-dev-qa-db-fra.com

Qu'est-ce qu'une "requête principale"?

Duplicate possible:
Comment savoir laquelle est la requête principale?

Je suis curieux de savoir quelle est la prétendue "requête principale"?

Ce que j’ai, c’est deux requêtes en première page.

if (have_posts()) : while (have_posts()) : the_post();
    // do the main loop
endwhile; endif;

$posts = new WP_Query(array('post_type' => 'some_other_post_type'));
while ($posts->have_posts()) : $posts->the_post();
    // do the secondary loop
    // but still operating with the some_post_type
endwhile; wp_reset_postdata();

Et ce que je veux, c'est simplement modifier la requête principale en mon type de publication personnalisé pour plus d'efficacité.

add_action( 'pre_get_posts', 'some_name');
function some_name($query) {
    if (is_front_page() && is_main_query()) {
        $query->set( 'post_type', 'some_post_type' );
        return;
    }
}

Ce que je pensais, c’est que la condition dans ce crochet ne sera vraie que pour la première boucle, mais il semble que tout new WP_Query la traverse.

Pouvez-vous m'expliquer, s'il vous plaît, qu'est-ce qu'une "requête principale" et ce qui ne l'est pas?

PS: j'ai trouvé une question presque similaire avec la solution permettant de faire varier les requêtes dans le hook pre_get_post par des vars de requête personnalisés.

8
Nathan

Votre filtre contient un bogue, à savoir lorsque vous appelez is_main_query, vous ne vérifiez pas si la requête transmise est la requête principale, vous vérifiez si la requête actuellement active est la requête principale, qui sera toujours vraie.

Alors essayez plutôt ceci:

add_action( 'pre_get_posts', 'some_name');
function some_name($query) {
    if ($query->is_front_page() && $query->is_main_query()) {
        $query->set( 'post_type', 'some_post_type' );
        return;
    }
}
8
Tom J Nowell

La requête principale est celle déclenchée automatiquement lorsque WordPress a déterminé ce qu'il faut afficher pour l'URI de la requête.

Les instances ultérieures de WP_Query ne sont jamais la requête principale, mais vous pouvez les utiliser pour remplacer le résultat de la requête principale dans $GLOBALS['wp_the_query']. Ne fais pas ça.

3
fuxia