web-dev-qa-db-fra.com

Comment savoir laquelle est la requête principale?

J'ai juste fait une action sur la requête en utilisant pre_get_posts et cela n'a pas fonctionné. Quand j'ai enlevé la $query->is_main_query() cela a fonctionné.

Alors, comment savez-vous quelle est la requête principale? Je sais qu'il existe la fonction is_main_query. Ce que je demande, y at-il un moyen de dire lequel vous regardez? Comment WordPress sait-il laquelle est la requête principale? Si vous en avez trois ou quatre pour différentes raisons, telles que catégories, types d'articles, pages. quel est le principal?

3
Jamie

La méthode source WP_Query->is_main_query() (qui appelle les mêmes noms) est très simple et très courte:

function is_main_query() {
    global $wp_the_query;
    return $wp_the_query === $this;
}

La requête principale est la requête stockée dans $wp_the_query global. Mais quel est ce global? Lorsque WP configure la requête principale, il la stocke à deux emplacements: $wp_the_query et $wp_query. Ce dernier est plus connu car cette variable correspond à ce que vous utilisez habituellement pour travailler avec la requête principale et ce que query_posts() change.

Cependant, query_posts() fonctionne comme ceci:

function query_posts($query) {
    $GLOBALS['wp_query'] = new WP_Query();
    return $GLOBALS['wp_query']->query($query);
}

Il coupe le lien entre $wp_query et $wp_the_query. Et l’inverse peut être effectué par wp_reset_query() pour rétablir que:

function wp_reset_query() {
    $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
    wp_reset_postdata();
}

La requête principale est donc celle que WP a configurée pendant le chargement principal.

Il s'agit généralement de ce que $wp_query contient, à moins qu'il n'ait été modifié pour ne plus être la requête principale.

6
Rarst