$ GLOBALS ['wp_the_query'] vs global $ wp_query
-
-
Je dirais «global $ wp_query»justepour répondre à votre questionen une seule ligne!I would say `global $wp_query` just to answer your question in one line!
- 2
- 2016-03-14
- Sumit
-
Quelleest la différence?What is the difference?
- 0
- 2016-03-14
- Nathan Powell
-
3 réponses
- votes
-
- 2016-03-14
Vousen avezmanqué un,
$GLOBALS['wp_query']
. Àtoutesfins utiles,$GLOBALS['wp_query'] === $wp_query
.$GLOBALS['wp_query']
est cependantmeilleurpour la lisibilitéet devrait être utilisé à laplace de$wp_query
,MAIS,cela reste unepréférencepersonnelleMaintenant,dans unmondeparfait où les licornesgouvernent lemonde,
$GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. Par défaut,cela devrait être vrai. Sinous regardons où cesglobaux sont définis (wp-settings.php
),vous verrez que l'objet de requêteprincipalest stocké dans$GLOBALS['wp_the_query']
et$GLOBALS['wp_query']
estjuste une copieen double 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 de lefaire de cettefaçon,c'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 vouspouvez le voir,
query_posts
définit l'objet de requêteprincipal sur la requêtepersonnaliséeen cours d'exécution. Celabrise l'intégrité de l'objet de requêteprincipal,ce qui vous donne des donnéesincorrectes,de sorte quetout ce qui repose sur l'objet de requêteprincipalestendommagéen raison de donnéeserronées.Unefaçon de contrer cela était de créer un autreglobalpour stocker l'objet de requêteprincipal,
$GLOBALS['wp_the_query']
qui a étéintroduit dans la version 2.0.0. Cenouveauglobal contient l'objet de requêteprincipalet$GLOBALS['wp_query']
juste une copie. Grâce àwp_reset_query()
,nouspourrionsmaintenant réinitialiser$GLOBALS['wp_query']
à l'objet de requêteprincipal d'originepour restaurer sonintégrité.Mais cen'estpas unmondeparfait,et
query_posts
est le diable lui-même. Malgré desmilliers d'avertissements,lesgens utilisenttoujoursquery_posts
. Enplus de casser la requêteprincipale,il réexécute la requêteprincipale,ce qui la rendbeaucoupplus lente qu'une requêtepersonnaliséenormale avecWP_Query
. Denombreusespersonnesne réinitialisentpasnonplus la requêtequery_posts
avecwp_reset_query()
unefoisterminé,ce qui rendquery_posts
encoreplusmaléfique.Parce quenousne pouvons rienfaire à ce sujet,et quenousne pouvonspasempêcher lespluginset lesthèmes d'utiliser
query_posts
et nousne pouvonsjamais savoir si une requêtequery_posts
a été réinitialisée avecwp_reset_query()
,nous avonsbesoin d'une copieplusfiable de l'objet de requêteprincipal qui,nous le savons,nous donnera des donnéesfiableset correctes à 99,99999%. C'est là que$GLOBALS['wp_the_query']
est utile car aucun code lié à WordPressne peut changer sa valeur ( sauf àtravers lesfiltreset les actions à l'intérieur deWP_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'apas changé,et$GLOBALS['wp_query']
a. Alors,lequelest leplusfiable?Remarquefinale,
$GLOBALS['wp_the_query']
n'est PAS un remplacement dewp_reset_query()
.wp_reset_query()
doit toujours être utilisé avecquery_posts
,etquery_posts
ne doit jamais être utilisé.POUR CONCLURE
Si vous avezbesoin d'un codefiable quin'échouerapresquetoujoursjamais,utilisez
$GLOBALS['wp_the_query']
,si vousfaites confiance auxpluginset au code dethèmeet que vouspensez quepersonnen'utilisequery_posts
ou l'utilise correctement,utilisez$GLOBALS['wp_query']
ou$wp_query
MODIFICATION IMPORTANTE
Répondant aux questions sur ce site depuismaintenant quelques années,j'ai vu denombreux utilisateurs utiliser
$wp_query
comme variable locale,ce qui à sontourbrise également l'objet de requêteprincipal. Cela augmenteencore la vulnérabilité de la$wp_query
.Àtitre d'exemple,certainespersonnes à cela
$wp_query = new WP_Query( $args );
quiestessentiellement lamême chose que ce quefont
query_posts
You have missed one,
$GLOBALS['wp_query']
. For all purposes,$GLOBALS['wp_query'] === $wp_query
.$GLOBALS['wp_query']
is however better for readability and should be used instead of$wp_query
, BUT, that remains personal preferenceNow, in a perfect world where unicorns rule the world,
$GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. By default, this should be true. If we look at where these globals are set (wp-settings.php
), you will see the main query object is stored in$GLOBALS['wp_the_query']
and$GLOBALS['wp_query']
is just a duplicate copy of$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'];
The reason for doing it this way, is because WordPress saw the arrival of
query_posts
in version 1.5.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
As you can see,
query_posts
sets the main query object to the current custom query beign run. This breaks the integrity of the main query object, which gives you incorrect data, so anything that relies on the main query object is broken due to wrong data.A way to counter this was to create another global to store the main query object,
$GLOBALS['wp_the_query']
which was introduced in version 2.0.0. This new global hold the main query object and$GLOBALS['wp_query']
just a copy. Throughwp_reset_query()
, we could now reset$GLOBALS['wp_query']
back to the original main query object to restore its integrity.But this is not a perfect world, and
query_posts
are the devil himself. Although thousands of warnings, people still usequery_posts
. Apart from breaking the main query, it reruns the main query, making it much slower as a normal custom query withWP_Query
. Many people also do not reset thequery_posts
query withwp_reset_query()
when done, which makesquery_posts
even more evil.Because we cannot do anything about that, and cannot stop plugins and themes from using
query_posts
and we can never know if aquery_posts
query was reset withwp_reset_query()
, we need a more reliable copy of the main query object which we know will give us 99.99999% reliable, correct data. That is where$GLOBALS['wp_the_query']
is useful as no WordPress related code can change it's value (except through the filters and actions insideWP_Query
itself).Quick proof, run the following
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'] );
and check the results.
$GLOBALS['wp_the_query']
did not change, and$GLOBALS['wp_query']
has. So which is more reliable?Final note,
$GLOBALS['wp_the_query']
is NOT a replacement forwp_reset_query()
.wp_reset_query()
should always be used withquery_posts
, andquery_posts
should never be used.TO CONCLUDE
If you need reliable code which will almost always never fail, use
$GLOBALS['wp_the_query']
, if you trust and believe plugins and theme code and believe no one usesquery_posts
or is using it correctly, use$GLOBALS['wp_query']
or$wp_query
IMPORTANT EDIT
Being answering questions on this site now for a couple of years, I saw many users using
$wp_query
as a local variable, which in turn also breaks the main query object. This further increases the vulnerabilty of the$wp_query
.As example, some people to this
$wp_query = new WP_Query( $args );
which is in essence the exactly the same as what
query_posts
are doing-
[query_posts ()] (https://developer.wordpress.org/reference/functions/query_posts/) change `global $ wp_query`.`global $ wp_the_query` contient la référence à ** [la requêteprincipale] (https://developer.wordpress.org/reference/classes/wp_query/is_main_query/) **[query_posts()](https://developer.wordpress.org/reference/functions/query_posts/) changes `global $wp_query`. `global $wp_the_query` holds the reference to **[the main query](https://developer.wordpress.org/reference/classes/wp_query/is_main_query/)**
- 1
- 2016-03-15
- Evan Mattson
-
Mon commentairen'étaitpas destiné à être une correction,alorsje m'excuse si c'est le cas.Je résumais simplement (TL; DR si vous voulez)touten soulignant ce queje crois être l'un des aspects lesplus significatifs de `$ wp_the_query`en ce qui concerne laméthode` WP_Query ::is_main_query () `,quin'apas étémentionnée:réMy comment wasn't intended as a correction, so my apologies if it did. I was merely summarizing (TL;DR if you will) while pointing out what I believe is one of the most significant aspects of `$wp_the_query` as it pertains to the `WP_Query::is_main_query()` method, which was not mentioned :D
- 0
- 2016-03-16
- Evan Mattson
-
@EvanMattson Toutesmesexcuses,j'aimal compris votrepremier commentaire ;-).Oui,`is_main_query ()`,quiest un wrapperpour `WP_Query ::is_main_query ()` qui vérifie l'objet de requête actuelpar rapport à l'objet de requêteprincipalenregistré dans `$ GLOBALS ['wp_the_query']`.Ceciest assezimportant lorsque vousexécutez des actions `pre_get_posts`et que vous voulez simplement cibler la requêteprincipale ;-)@EvanMattson Apologies, I misunderstood your first comment ;-). Yes, `is_main_query()`, which is a wrapper for `WP_Query::is_main_query()` which checks the current query object against the main query object saved in `$GLOBALS['wp_the_query']`. This is quite important when you run `pre_get_posts` actions and just want to target the main query ;-)
- 0
- 2016-03-16
- Pieter Goosen
-
Réponseplutôtbien faite!@EvanMattson Cela aurait dû être un [modifier].Pretty well done answer! @EvanMattson That should have been an [edit].
- 0
- 2016-04-06
- kaiser
-
Pouvez-vousinclure lamention de lafonction `is_main_query` dans la section * IMPORTANT EDIT?J'utilisais `pre_get_posts` aujourd'huiet j'aitrouvéextrêmement utile d'utiliser cettefonctionpuisqueje regardais` $ wp_query`.Can you include mention of `is_main_query` function in the *IMPORTANT EDIT section? I was using `pre_get_posts` today and found it utterly useful to use that function since I was looking at `$wp_query`.
- 0
- 2017-03-18
- Nathan Powell
-
- 2016-03-14
Lemot-cléglobalimporte la variable dans laportée locale,tandis que $ GLOBALS vous donne simplement accès à la variable.
Pour élaborer,si vous utilisez
global $wp_the_query;
vouspouvez utiliser$wp_the_query
dans laportée locale sans utiliser ànouveau lemotglobal.Donc,fondamentalement,global $wp_the_query
peut être comparé à$wp_the_query = $GLOBALS['wp_the_query']
J'aimal lu wp_querypour wp_the_query doncma réponsen'estpas une réponse complète à la questionmaisfournittoujours desinformationsgénérales sur la différenceentre
global $variable
et$GLOBALS['variable']
The global keyword imports the variable into the local scope, while $GLOBALS just grants you access to the variable.
To elaborate, if you use
global $wp_the_query;
you can use$wp_the_query
inside the local scope without using the word global again. So basicallyglobal $wp_the_query
can be compared to$wp_the_query = $GLOBALS['wp_the_query']
EDIT
I misread wp_query for wp_the_query so my answer isn't a complete answer to the question but still provides general information about the difference between
global $variable
and$GLOBALS['variable']
-
Veuillez déposer un [modifier] car cen'est vraimentpas une réponse à la question d'origine.Justepourinfo `$ GLOBALS ['foo']`permet également de _overriding_ ou de désactiver la variable.C'est donc unbit deplus que ce que vous décrivezici.Please, file an [edit] as this really is not an answer to the original question. Just FYI `$GLOBALS['foo']` allows _overriding_ or unsetting the variable as well. So it's a _bit_ more than what you describe here.
- 0
- 2016-04-06
- kaiser
-
- 2016-03-14
Engros,l'unest 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'];
Basically one is copy of the other. Check out
wp-settings.php
, lines 292-305:$GLOBALS['wp_the_query'] = new WP_Query(); $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Quelleest la différenceentre
$GLOBALS['wp_the_query']
etglobal $wp_query
?Pourquoipréférer l'un à l'autre?