$ GLOBALS ['wp_the_query'] vs global $ wp_query

14

Quelle est la différence entre $GLOBALS['wp_the_query'] et global $wp_query ?

Pourquoi préférer l’un sur l’autre?

    
posée Nathan Powell 14.03.2016 - 09:12

3 réponses

24

Vous en avez oublié un, $GLOBALS['wp_query'] . À toutes fins utiles, $GLOBALS['wp_query'] === $wp_query . $GLOBALS['wp_query'] est cependant meilleur pour la lisibilité et devrait être utilisé à la place de $wp_query , MAIS, cela reste une préférence personnelle

Maintenant, dans un monde parfait où les licornes dominent le monde, $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query . Par défaut, cela devrait être vrai. Si nous examinons l'emplacement de ces paramètres globaux ( wp-settings.php ), vous verrez que l'objet de la requête principale est stocké dans $GLOBALS['wp_the_query'] et que $GLOBALS['wp_query'] n'est qu'une copie dupliquée de $GLOBALS['wp_the_query']

/**
 * WordPress Query object
 * @global WP_Query $wp_the_query
 * @since 2.0.0
 */
$GLOBALS['wp_the_query'] = new WP_Query();
/**
 * Holds the reference to @see $wp_the_query
 * Use this global for WordPress queries
 * @global WP_Query $wp_query
 * @since 1.5.0
 */
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

La raison en est que WordPress a vu l'arrivée de query_posts dans la version 1.5.

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

Comme vous pouvez le constater, query_posts définit l'objet de requête principal sur l'exécution de la requête personnalisée actuelle. Cela casse l'intégrité de l'objet de requête principal, ce qui vous donne des données incorrectes. Ainsi, tout ce qui repose sur l'objet de requête principal est cassé à cause de données erronées.

Un moyen de contrer cela était de créer un autre fichier global pour stocker l'objet de requête principal, $GLOBALS['wp_the_query'] , introduit dans la version 2.0.0. Ce nouveau global contient l'objet de requête principal et $GLOBALS['wp_query'] juste une copie. Grâce à wp_reset_query() , nous pourrions maintenant réinitialiser $GLOBALS['wp_query'] à l'objet de requête principal d'origine afin de restaurer son intégrité.

Mais ce n’est pas un monde parfait, et query_posts sont le diable lui-même. Bien que des milliers d'avertissements, les gens utilisent toujours query_posts . En plus de rompre la requête principale, elle réexécute la requête principale, ce qui la ralentit beaucoup en tant que requête personnalisée normale avec WP_Query . De plus, de nombreuses personnes ne réinitialisent pas la requête query_posts avec wp_reset_query() à la fin de l'opération, ce qui rend encore plus mal query_posts .

Étant donné que nous ne pouvons rien faire à ce sujet ni empêcher les plugins et les thèmes d'utiliser query_posts et que nous ne sachions jamais si une requête query_posts a été réinitialisée avec wp_reset_query() , nous avons besoin d'une copie plus fiable de la requête principale. objet dont nous savons qu’il nous donnera 99,99999% de données fiables et correctes. C’est là que $GLOBALS['wp_the_query'] est utile car aucun code lié à WordPress ne peut en changer la valeur ( sauf par les filtres et les actions à l’intérieur de WP_Query elle-même ).

Épreuve rapide, exécutez ce qui suit

var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

query_posts( 's=crap' );


var_dump( $GLOBALS['wp_the_query'] );
var_dump( $GLOBALS['wp_query'] );

et vérifiez les résultats. $GLOBALS['wp_the_query'] n'a pas changé et $GLOBALS['wp_query'] a. Alors, lequel est le plus fiable?

La note finale, $GLOBALS['wp_the_query'] est PAS un remplaçant pour wp_reset_query() . wp_reset_query() devrait toujours être utilisé avec query_posts et query_posts devrait ne jamais être utilisé.

À CONCLURE

Si vous avez besoin d'un code fiable qui n'échouera presque jamais, utilisez $GLOBALS['wp_the_query'] , si vous croyez les plugins et le code de thème et croyez que personne ne l'utilise query_posts ou ne l'utilise correctement, utilisez $GLOBALS['wp_query'] ou $wp_query

IMPORTANT EDIT

Comme je répondais aux questions sur ce site depuis quelques années, j'ai constaté que de nombreux utilisateurs utilisaient $wp_query comme variable locale, ce qui rompait également l'objet de requête principal. Cela augmente encore la vulnérabilité de $wp_query .

Par exemple, certaines personnes à cette

$wp_query = new WP_Query( $args );

qui est essentiellement identique à ce que query_posts sont en train de faire

    
réponse donnée Pieter Goosen 14.03.2016 - 10:31
2

Fondamentalement, l’un est une copie de l’autre. Consultez wp-settings.php , lignes 292-305:

$GLOBALS['wp_the_query'] = new WP_Query();

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
    
réponse donnée denis.stoyanov 14.03.2016 - 09:29
2

Le mot-clé global importe la variable dans l'étendue locale, tandis que $ GLOBALS vous octroie uniquement l'accès à la variable.

Pour préciser, si vous utilisez global $wp_the_query; vous pouvez utiliser $wp_the_query dans la portée locale sans utiliser à nouveau le mot global. Donc, fondamentalement, global $wp_the_query peut être comparé à $wp_the_query = $GLOBALS['wp_the_query']

MODIFIER

J'ai mal lu wp_query pour wp_the_query afin que ma réponse ne soit pas une réponse complète à la question, mais fournisse néanmoins des informations générales sur la différence entre global $variable et $GLOBALS['variable']

    
réponse donnée Jeffrey von Grumbkow 14.03.2016 - 09:27

Lire d'autres questions sur les étiquettes