web-dev-qa-db-fra.com

$ GLOBALS ['wp_the_query'] vs global $ wp_query

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

Pourquoi préférer l'un par rapport à l'autre?

14
Nathan Powell

Vous en avez manqué 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 regardons où ces globales sont définies (wp-settings.php), vous verrez que l'objet de requête principal est stocké dans $GLOBALS['wp_the_query'] et que $GLOBALS['wp_query'] est simplement une copie 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 brise 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 rompu à 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 pour 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() une fois l'opération terminée, ce qui rend query_posts encore plus diabolique.

Parce que nous ne pouvons rien faire à ce sujet, et que nous ne pouvons 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 l'objet de requête principal que nous savons 99,99999% données fiables et correctes. C'est là que $GLOBALS['wp_the_query'] est utile, car aucun code associé à WordPress ne peut changer sa valeur (sauf par les filtres et les actions à l'intérieur de WP_Query lui-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'] l'a fait. Alors, lequel est le plus fiable?

Note finale, $GLOBALS['wp_the_query'] estPASun remplaçant pour wp_reset_query(). wp_reset_query() devrait toujours être utilisé avec query_posts, et query_posts devrait jamais être utilisé.

DE CONCLURE

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

IMPORTANT EDIT

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

Par exemple, certaines personnes à cette

$wp_query = new WP_Query( $args );

ce qui est essentiellement le même que ce que font query_posts

25
Pieter Goosen

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

Pour élaborer, si vous utilisez global $wp_the_query;, vous pouvez utiliser $wp_the_query dans la portée locale sans utiliser le mot global Word à nouveau. 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 fournit tout de même des informations générales sur la différence entre global $variable et $GLOBALS['variable']

2

Fondamentalement, l'un est une copie de l'autre. Départ wp-settings.php , lignes 292-305:

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

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
2
denis.stoyanov