$ GLOBALS ['wp_the_query'] contro $ wp_query globale


16

Qual è la differenza tra $GLOBALS['wp_the_query']e global $wp_query?

Perché preferire l'uno all'altro?


2
Direi global $wp_querysolo per rispondere alla tua domanda in una riga!
Sumit

Qual è la differenza?
Nathan Powell,

Risposte:


27

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_postsversione 1.5.

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

Come puoi vedere, query_postsimposta 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_postssono 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_postsquery wp_reset_query()quando fatto, il che rende query_postsancora più malvagio.

Poiché non possiamo fare nulla al riguardo e non possiamo impedire l'utilizzo di plug-in e temi query_postse non possiamo mai sapere se una query_postsquery è 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_Queryse 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_postsquery_posts

CONCLUDERE

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_postso lo stia usando correttamente, usa $GLOBALS['wp_query']o$wp_query

MODIFICA IMPORTANTE

Rispondendo alle domande su questo sito ormai da un paio d'anni, ho visto molti utenti usare $wp_querycome 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_postsstanno facendo


1
query_posts () cambia global $wp_query. global $wp_the_querycontiene il riferimento alla query principale
Evan Mattson,

Il mio commento non è stato inteso come una correzione, quindi mi scuso se lo ha fatto. Stavo semplicemente riassumendo (TL; DR se vuoi) mentre sottolineo quello che credo sia uno degli aspetti più significativi di $wp_the_queryquanto riguarda il WP_Query::is_main_query()metodo, che non è stato menzionato: D
Evan Mattson

@EvanMattson Mi scuso, ho frainteso il tuo primo commento ;-). Sì,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_postsazioni e si desidera solo indirizzare la query principale ;-)
Pieter Goosen

Risposta abbastanza ben fatta! @EvanMattson Quello avrebbe dovuto essere un modifica .
Kaiser,

Puoi includere la menzione della is_main_queryfunzione nella sezione * MODIFICA IMPORTANTE? Stavo usando pre_get_postsoggi e ho trovato assolutamente utile usare quella funzione da quando stavo guardando $wp_query.
Nathan Powell,

2

Fondamentalmente uno è una copia dell'altro. wp-settings.phpDai un'occhiata , linee 292-305:

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

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

2

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_queryall'interno dell'ambito locale senza utilizzare nuovamente la parola globale. Quindi sostanzialmente global $wp_the_querypuò 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 $variablee$GLOBALS['variable']


Si prega di presentare una modifica in quanto questa non è in realtà una risposta alla domanda originale. Solo FYI $GLOBALS['foo']consente di sostituire o annullare anche la variabile. Quindi è un po ' più di quello che descrivi qui.
Kaiser,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.