$ GLOBALS ['wp_the_query'] vs $ wp_query globale
-
-
Direi `global $ wp_query` soloper rispondere allatua domandain una riga!I would say `global $wp_query` just to answer your question in one line!
- 2
- 2016-03-14
- Sumit
-
Qual è la differenza?What is the difference?
- 0
- 2016-03-14
- Nathan Powell
-
3 risposta
- voti
-
- 2016-03-14
Tene seiperso uno,
$ GLOBALS ['wp_query']
. Atuttiglieffetti,$ GLOBALS ['wp_query']===$ wp_query
.$ GLOBALS ['wp_query']
è comunquemiglioreper la leggibilitàe dovrebbeessere usato alposto di$ wp_query
,MA questa rimane unapreferenzapersonaleOra,in unmondoperfettoin cuigli unicornigovernanoilmondo,
$ GLOBALS ['wp_the_query']===$ GLOBALS ['wp_query']===$ wp_query
. Perimpostazionepredefinita,questo dovrebbeessere vero. Seguardiamo dove sonoimpostate questeglobali (wp-settings.php
),vedrai che l'oggetto queryprincipale èmemorizzatoin$ GLOBALS ['wp_the_query']
e$ GLOBALS ['wp_query']
è solo una copia duplicata di$GLOBALS['wp_the_query'"
/** * Oggetto query WordPress * @global WP_Query $ wp_the_query * @since 2.0.0 */ $ GLOBALS ['wp_the_query']=nuovo WP_Query (); /** * Contieneil riferimento a @see $ wp_the_query * Usa questoglobaleper le query di WordPress * @global WP_Query $ wp_query * @ dalla 1.5.0 */ $ GLOBALS ["wp_query"]=$ GLOBALS ["wp_the_query"]; Ilmotivoperfarloin questomodo èperché WordPress ha visto l'arrivo di
query_posts
nella versione 1.5.funzione query_posts ($ query) { $ GLOBALS ["wp_query"]=nuovo WP_Query (); return $ GLOBALS ['wp_query'] - > query ($ query); }
Comepuoi vedere,
query_posts
imposta l'oggetto queryprincipale sulla querypersonalizzata correntebeign eseguita. Ciòinterrompe l'integrità dell'oggetto queryprincipale,chefornisce datierrati,quinditutto ciò che sibasa sull'oggetto queryprincipale vieneinterrotto a causa di datierrati.Unmodoper contrastare questoproblemaera creare un altroglobalepermemorizzare l'oggetto queryprincipale,
$ GLOBALS ['wp_the_query']
,introdottonella versione 2.0.0. Questonuovoglobale contiene l'oggetto queryprincipalee$ GLOBALS ['wp_query']
solo una copia. Attraversowp_reset_query ()
,orapossiamo reimpostare$ GLOBALS ['wp_query']
all'oggetto queryprincipale originaleper ripristinarne l'integrità.Ma questonon è unmondoperfettoe
query_posts
sonoil diavoloin persona. Nonostantemigliaia di avvisi,lepersone usano ancoraquery_posts
. Oltre ainterrompere la queryprincipale,riesegue la queryprincipale,rendendolamoltopiù lenta come unanormale querypersonalizzata conWP_Query
. Moltepersoneinoltrenon resettano la queryquery_posts
conwp_reset_query ()
una voltaterminato,il che rendequery_posts
ancorapiùmalvagio.Perchénonpossiamofarenulla al riguardoe nonpossiamoimpedire aplugine temi di utilizzare
query_posts
e nonpossiamomai sapere se una queryquery_posts
è stata reimpostata conwp_reset_query ()
,abbiamobisogno di una copiapiù affidabile dell'oggetto queryprincipale che sappiamofornirà dati correttie affidabili al 99,99999%. È qui che$ GLOBALS ['wp_the_query']
è utilein quantonessun codice relativo a WordPresspuòmodificarneil valore (tranne che attraversoi filtrie le azioni all'interno diWP_Query
stesso ).Prova rapida,esegui quanto segue
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']);
e controllai risultati.
$ GLOBALS ['wp_the_query']
non è cambiatoe$ GLOBALS ['wp_query']
sì. Allora qual èilpiù affidabile?Notafinale,
$ GLOBALS ['wp_the_query']
NON è una sostituzione diwp_reset_query ()
.wp_reset_query ()
dovrebbe sempre essere utilizzato conquery_posts
equery_posts
mai dovrebbeessere Usato.PER CONCLUDERE
Se haibisogno di un codice affidabile che quasi semprenonfallirà,usa
$ GLOBALS ['wp_the_query']
,se credie credinei plugine nel codice deltemae credi chenessuno usiquery_posts
o lo stai usando correttamente,usa$ GLOBALS ['wp_query']
o$wp_query
MODIFICA IMPORTANTE
Rispondendo alle domande su questo sito ormai da unpaio di anni,ho vistomolti utenti utilizzare
$ wp_query
come variabile locale,che a sua voltainterrompe anche l'oggetto queryprincipale. Ciò aumenta ulteriormente la vulnerabilità di$ wp_query
.Adesempio,alcunepersone a questo
$ wp_query=new WP_Query ($ args);
chein sostanza èesattamente lo stesso di ciò che stannofacendo
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/) cambia `global $ wp_query`.`global $ wp_the_query` contieneil riferimento a ** [la queryprincipale] (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
-
Ilmio commentononerainteso come una correzione,quindimi scuso se lo hafatto.Stavo semplicemente riassumendo (TL; DR se vuoi) sottolineando quello che credo sia uno degli aspettipiù significativi di `$ wp_the_query`in quanto riguardailmetodo` WP_Query ::is_main_query () `,chenon è statomenzionato:DMy 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 Scusa,ho capitomaleiltuoprimo commento ;-).Sì,`is_main_query ()`,che è un wrapperper `WP_Query ::is_main_query ()` che controlla l'oggetto query corrente rispetto all'oggetto queryprincipale salvatoin `$ GLOBALS ['wp_the_query']`.Questo è abbastanzaimportante quandoesegui azioni `pre_get_posts`e vuoi solo scegliere cometarget la queryprincipale ;-)@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
-
Risposta abbastanzaben fatta!@EvanMattson Avrebbe dovutoessere una [modifica].Pretty well done answer! @EvanMattson That should have been an [edit].
- 0
- 2016-04-06
- kaiser
-
Puoiincludere lamenzione dellafunzione `is_main_query`nella sezione * MODIFICA IMPORTANTE?Oggi stavo usando `pre_get_posts`e hotrovatoestremamente utile usare quellafunzione dato che stavoguardando` $ 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
Laparola chiaveglobaleimporta la variabilenell'ambito locale,mentre $ GLOBALSti concede solo l'accesso alla variabile.
Perelaborare,se usi
global $wp_the_query;
puoi usare$wp_the_query
all'interno dello scope locale senza usare dinuovo laparolaglobal.Quindi sostanzialmenteglobal $wp_the_query
puòessereparagonato a$wp_the_query = $GLOBALS['wp_the_query']
<"EDIT"
Ho lettomale wp_queryper wp_the_query quindi lamia rispostanon è una risposta completa alla domanda,mafornisce comunqueinformazionigenerali sulla differenzatra
global $variable
e$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']
-
Perfavore,invia una [modifica]poiché questanon è davvero una risposta alla domanda originale.Solo FYI `$ GLOBALS ['foo']` consente anche di _override_ o disinserire la variabile.Quindi è un _bit_in più di quello che descrivi qui.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
Fondamentalmente uno è la copia dell'altro.Dai un'occhiata a
wp-settings.php
,righe 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'];
Qual è la differenzatra
$GLOBALS['wp_the_query']
eglobal $wp_query
?Perchépreferirne uno rispetto all'altro?