Qual è la differenza tra $GLOBALS['wp_the_query']
e global $wp_query
?
Perché preferire l'uno all'altro?
Qual è la differenza tra $GLOBALS['wp_the_query']
e global $wp_query
?
Perché preferire l'uno all'altro?
Risposte:
Hai perso una, $GLOBALS['wp_query']
. Per tutti gli scopi, $GLOBALS['wp_query'] === $wp_query
. $GLOBALS['wp_query']
è comunque migliore per la leggibilità e dovrebbe essere usato al posto di $wp_query
, MA, che rimane la preferenza personale
Ora, in un mondo perfetto in cui unicorni governano il mondo, $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. Per impostazione predefinita, questo dovrebbe essere vero. Se osserviamo dove sono impostati questi globi ( wp-settings.php
), vedrai che l'oggetto principale della query è archiviato $GLOBALS['wp_the_query']
ed $GLOBALS['wp_query']
è solo una copia duplicata di$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'];
Il motivo per farlo in questo modo, è perché WordPress ha visto l'arrivo della query_posts
versione 1.5.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Come puoi vedere, query_posts
imposta l'oggetto query principale sull'esecuzione beign della query personalizzata corrente. Ciò interrompe l'integrità dell'oggetto query principale, che fornisce dati errati, quindi tutto ciò che si basa sull'oggetto query principale viene interrotto a causa di dati errati.
Un modo per contrastare ciò era creare un altro globale per archiviare l'oggetto query principale, $GLOBALS['wp_the_query']
introdotto nella versione 2.0.0. Questo nuovo globale contiene l'oggetto query principale e $GLOBALS['wp_query']
solo una copia. Attraverso wp_reset_query()
, ora potremmo ripristinare $GLOBALS['wp_query']
l'oggetto di query principale originale per ripristinarne l'integrità.
Ma questo non è un mondo perfetto e query_posts
sono il diavolo stesso. Sebbene migliaia di avvertimenti, le persone usano ancora query_posts
. Oltre a interrompere la query principale, esegue nuovamente la query principale, rendendola molto più lenta come una normale query personalizzata con WP_Query
. Molte persone, inoltre, non reimpostano la query_posts
query wp_reset_query()
quando fatto, il che rende query_posts
ancora più malvagio.
Poiché non possiamo fare nulla al riguardo e non possiamo impedire l'utilizzo di plug-in e temi query_posts
e non possiamo mai sapere se una query_posts
query è stata reimpostata wp_reset_query()
, abbiamo bisogno di una copia più affidabile dell'oggetto query principale che sappiamo che ci fornirà il 99.99999% affidabile, corretto dati. Ecco dove $GLOBALS['wp_the_query']
è utile in quanto nessun codice correlato a WordPress può modificarne il valore ( tranne che attraverso i filtri e le azioni all'interno di WP_Query
se stesso ).
Prova rapida, eseguire 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 controlla i risultati. $GLOBALS['wp_the_query']
non è cambiato e $GLOBALS['wp_query']
ha. Quindi quale è più affidabile?
Nota finale, NON$GLOBALS['wp_the_query']
è un sostituto di . dovrebbe sempre essere usato con e non dovrebbe mai essere usato.wp_reset_query()
wp_reset_query()
query_posts
query_posts
Se hai bisogno di un codice affidabile che quasi sempre non fallirà, usa $GLOBALS['wp_the_query']
, se ti fidi e credi nel plugin e nel codice tema e credi che nessuno lo usi query_posts
o lo stia usando correttamente, usa $GLOBALS['wp_query']
o$wp_query
Rispondendo alle domande su questo sito ormai da un paio d'anni, ho visto molti utenti usare $wp_query
come una variabile locale, che a sua volta rompe anche l'oggetto principale della query. Ciò aumenta ulteriormente la vulnerabilità del $wp_query
.
Ad esempio, alcune persone a questo
$wp_query = new WP_Query( $args );
che in sostanza è esattamente lo stesso di quello che query_posts
stanno facendo
global $wp_query
. global $wp_the_query
contiene il riferimento alla query principale
$wp_the_query
quanto riguarda il WP_Query::is_main_query()
metodo, che non è stato menzionato: D
is_main_query()
che è un wrapper per il WP_Query::is_main_query()
quale verifica l'oggetto query corrente rispetto all'oggetto query principale salvato in $GLOBALS['wp_the_query']
. Questo è abbastanza importante quando si eseguono pre_get_posts
azioni e si desidera solo indirizzare la query principale ;-)
is_main_query
funzione nella sezione * MODIFICA IMPORTANTE? Stavo usando pre_get_posts
oggi e ho trovato assolutamente utile usare quella funzione da quando stavo guardando $wp_query
.
Fondamentalmente uno è una copia dell'altro. wp-settings.php
Dai un'occhiata , linee 292-305:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
La parola chiave globale importa la variabile nell'ambito locale, mentre $ GLOBALS ti garantisce l'accesso alla variabile.
Per elaborare, se lo si utilizza global $wp_the_query;
è possibile utilizzare $wp_the_query
all'interno dell'ambito locale senza utilizzare nuovamente la parola globale. Quindi sostanzialmente global $wp_the_query
può essere paragonato a$wp_the_query = $GLOBALS['wp_the_query']
MODIFICARE
Ho letto male wp_query per wp_the_query, quindi la mia risposta non è una risposta completa alla domanda ma fornisce comunque informazioni generali sulla differenza tra global $variable
e$GLOBALS['variable']
$GLOBALS['foo']
consente di sostituire o annullare anche la variabile. Quindi è un po ' più di quello che descrivi qui.
global $wp_query
solo per rispondere alla tua domanda in una riga!