Was ist der Unterschied zwischen $GLOBALS['wp_the_query']
und global $wp_query
?
Warum lieber eins als das andere?
Was ist der Unterschied zwischen $GLOBALS['wp_the_query']
und global $wp_query
?
Warum lieber eins als das andere?
Antworten:
Sie haben ein, verpasst $GLOBALS['wp_query']
. Für alle Zwecke $GLOBALS['wp_query'] === $wp_query
. $GLOBALS['wp_query']
ist jedoch besser für die Lesbarkeit und sollte stattdessen verwendet werden $wp_query
, ABER das bleibt persönliche Präferenz
Nun, in einer perfekten Welt , wo Einhörner beherrschen die Welt, $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. Standardmäßig sollte dies wahr sein. Wenn wir uns ansehen, wo diese Globals gesetzt sind ( wp-settings.php
), werden Sie sehen, dass das Hauptabfrageobjekt in gespeichert ist $GLOBALS['wp_the_query']
und $GLOBALS['wp_query']
nur eine Kopie von ist$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'];
Der Grund dafür ist, dass WordPress query_posts
in Version 1.5 eingeführt wurde.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
Wie Sie sehen, wird query_posts
das Hauptabfrageobjekt auf den aktuellen benutzerdefinierten Abfragelauf festgelegt. Dadurch wird die Integrität des Hauptabfrageobjekts aufgehoben, wodurch Sie falsche Daten erhalten. Daher wird alles, was sich auf das Hauptabfrageobjekt stützt, aufgrund falscher Daten beschädigt.
Eine Möglichkeit, dem entgegenzuwirken, bestand darin, ein weiteres globales Objekt zum Speichern des Hauptabfrageobjekts zu erstellen, $GLOBALS['wp_the_query']
das in Version 2.0.0 eingeführt wurde. Dieses neue globale Objekt enthält das Hauptabfrageobjekt und $GLOBALS['wp_query']
nur eine Kopie. Durch wp_reset_query()
konnten wir jetzt zurücksetzen$GLOBALS['wp_query']
wieder zum ursprünglichen Hauptabfrageobjekt zurückkehren, um dessen Integrität wiederherzustellen.
Aber dies ist keine perfekte Welt und query_posts
der Teufel selbst. Obwohl Tausende von Warnungen, verwenden die Menschen immer noch query_posts
. Abgesehen von der Unterbrechung der Hauptabfrage wird die Hauptabfrage erneut ausgeführt, wodurch sie viel langsamer als eine normale benutzerdefinierte Abfrage mit ausgeführt wird WP_Query
. Viele Leute setzen die query_posts
Abfrage auch nicht zurück, wp_reset_query()
wenn sie fertig sind, was das query_posts
Ganze noch schlimmer macht.
Da wir nichts dagegen tun und die Verwendung von Plugins und Themes nicht stoppen können und query_posts
wir nie wissen können, ob eine query_posts
Abfrage mit zurückgesetzt wurde wp_reset_query()
, benötigen wir eine zuverlässigere Kopie des Hauptabfrageobjekts, von dem wir wissen, dass es zu 99,99999% zuverlässig und korrekt ist Daten. Dies ist $GLOBALS['wp_the_query']
nützlich, da kein WordPress-Code seinen Wert ändern kann ( außer durch die Filter und Aktionen in sich WP_Query
selbst ).
Schneller Beweis, führen Sie Folgendes aus
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'] );
und überprüfen Sie die Ergebnisse. $GLOBALS['wp_the_query']
hat sich nicht geändert, und $GLOBALS['wp_query']
hat. Was ist also zuverlässiger?
Die letzte Anmerkung $GLOBALS['wp_the_query']
ist KEIN Ersatz für wp_reset_query()
. wp_reset_query()
sollte immer mit verwendet query_posts
werden und query_posts
sollte nie verwendet werden.
Wenn Sie zuverlässigen Code benötigen, der so gut wie nie versagt, verwenden Sie oder $GLOBALS['wp_the_query']
, wenn Sie Plugins und Themencode vertrauen und glauben, dass niemand query_posts
ihn richtig verwendet $GLOBALS['wp_query']
oder verwendet$wp_query
Als ich nun seit einigen Jahren Fragen auf dieser Site beantwortete, sah ich, dass viele Benutzer $wp_query
eine lokale Variable verwendeten, die wiederum auch das Hauptabfrageobjekt aufteilte. Dies erhöht die Verwundbarkeit der $wp_query
.
Zum Beispiel einige Leute dazu
$wp_query = new WP_Query( $args );
Das ist im Wesentlichen genau das gleiche wie das, was query_posts
wir tun
global $wp_query
. global $wp_the_query
hält den Verweis auf die Hauptabfrage
$wp_the_query
der WP_Query::is_main_query()
Methode ist, die nicht erwähnt wurde: D
is_main_query()
dies ist ein Wrapper, bei WP_Query::is_main_query()
dem das aktuelle Abfrageobjekt mit dem in gespeicherten Hauptabfrageobjekt verglichen wird $GLOBALS['wp_the_query']
. Dies ist sehr wichtig, wenn Sie pre_get_posts
Aktionen ausführen und nur auf die Hauptabfrage abzielen möchten ;-)
is_main_query
Funktion im Abschnitt * WICHTIGE BEARBEITUNG erwähnen ? Ich habe pre_get_posts
heute verwendet und fand es äußerst nützlich, diese Funktion zu verwenden, seit ich sie mir ansah $wp_query
.
Grundsätzlich ist eine Kopie der anderen. Check out wp-settings.php
, Zeilen 292-305:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Das globale Schlüsselwort importiert die Variable in den lokalen Bereich, während Sie mit $ GLOBALS nur Zugriff auf die Variable erhalten.
Wenn Sie es verwenden global $wp_the_query;
, können Sie es $wp_the_query
im lokalen Bereich verwenden, ohne das Wort global erneut zu verwenden. Also grundsätzlich global $wp_the_query
zu vergleichen$wp_the_query = $GLOBALS['wp_the_query']
BEARBEITEN
Ich habe wp_query für wp_the_query falsch interpretiert, sodass meine Antwort keine vollständige Antwort auf die Frage ist, sondern allgemeine Informationen zum Unterschied zwischen global $variable
und enthält$GLOBALS['variable']
$GLOBALS['foo']
kann die Variable auch überschrieben oder deaktiviert werden. Es ist also etwas mehr als das, was Sie hier beschreiben.
global $wp_query
nur um Ihre Frage in einer Zeile zu beantworten!