$ GLOBALS ['wp_the_query'] vs globale $ wp_query

16

Was ist der Unterschied zwischen $GLOBALS['wp_the_query']und global $wp_query?

Warum lieber eins als das andere?

Nathan Powell
quelle
2
Ich würde sagen, global $wp_querynur um Ihre Frage in einer Zeile zu beantworten!
Sumit
Was ist der Unterschied?
Nathan Powell

Antworten:

27

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_postsin 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_postsdas 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_postsder 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_postsAbfrage auch nicht zurück, wp_reset_query()wenn sie fertig sind, was das query_postsGanze noch schlimmer macht.

Da wir nichts dagegen tun und die Verwendung von Plugins und Themes nicht stoppen können und query_postswir nie wissen können, ob eine query_postsAbfrage 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_Queryselbst ).

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_postswerden und query_postssollte nie verwendet werden.

SCHLUSSFOLGERN

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_postsihn richtig verwendet $GLOBALS['wp_query']oder verwendet$wp_query

WICHTIGE ÄNDERUNG

Als ich nun seit einigen Jahren Fragen auf dieser Site beantwortete, sah ich, dass viele Benutzer $wp_queryeine 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_postswir tun

Pieter Goosen
quelle
1
query_posts () ändert sich global $wp_query. global $wp_the_queryhält den Verweis auf die Hauptabfrage
Evan Mattson
Mein Kommentar war nicht als Korrektur gedacht, also entschuldige ich mich, wenn er es tat. Ich habe nur zusammengefasst (TL; DR, wenn Sie so wollen), während ich darauf hinwies, was meiner Meinung nach einer der wichtigsten Aspekte $wp_the_queryder WP_Query::is_main_query()Methode ist, die nicht erwähnt wurde: D
Evan Mattson
@EvanMattson Entschuldigung, ich habe deinen ersten Kommentar falsch verstanden ;-). Ja, 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_postsAktionen ausführen und nur auf die Hauptabfrage abzielen möchten ;-)
Pieter Goosen
Ziemlich gut gemacht Antwort! @EvanMattson Das hätte eine Bearbeitung sein sollen .
Kaiser
Können Sie die is_main_queryFunktion im Abschnitt * WICHTIGE BEARBEITUNG erwähnen ? Ich habe pre_get_postsheute verwendet und fand es äußerst nützlich, diese Funktion zu verwenden, seit ich sie mir ansah $wp_query.
Nathan Powell
2

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'];
denis.stoyanov
quelle
2

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_queryim lokalen Bereich verwenden, ohne das Wort global erneut zu verwenden. Also grundsätzlich global $wp_the_queryzu 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 $variableund enthält$GLOBALS['variable']

Jeffrey von Grumbkow
quelle
Bitte reichen Sie eine Bearbeitung ein , da dies wirklich keine Antwort auf die ursprüngliche Frage ist. Mit FYI $GLOBALS['foo']kann die Variable auch überschrieben oder deaktiviert werden. Es ist also etwas mehr als das, was Sie hier beschreiben.
Kaiser