wake-up-neo.com

$ GLOBALS ['wp_the_query'] vs globale $ wp_query

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

Warum lieber eins als das andere?

14
Nathan Powell

Sie haben einen verpasst, $GLOBALS['wp_query']. Für alle Zwecke $GLOBALS['wp_query'] === $wp_query. $GLOBALS['wp_query'] ist jedoch für die Lesbarkeit besser und sollte anstelle von $wp_query verwendet werden, ABER das bleibt persönliche Präferenz

Jetzt, in einer perfekten Welt, in der Einhörner die Welt beherrschen, $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 $GLOBALS['wp_the_query'] gespeichert ist und $GLOBALS['wp_query'] nur eine doppelte Kopie von $GLOBALS['wp_the_query'] ist.

/**
 * 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 die Ankunft von query_posts in Version 1.5 sah.

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

Wie Sie sehen, setzt query_posts das Hauptabfrageobjekt auf den aktuellen benutzerdefinierten Abfragelauf. 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 $GLOBALS['wp_the_query'] zu erstellen, 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 $GLOBALS['wp_query'] jetzt auf das ursprüngliche Hauptabfrageobjekt zurücksetzen, um dessen Integrität wiederherzustellen.

Aber dies ist keine perfekte Welt, und query_posts sind der Teufel selbst. Trotz Tausender Warnungen wird immer noch query_posts verwendet. Abgesehen von der Unterbrechung der Hauptabfrage wird die Hauptabfrage erneut ausgeführt, wodurch sie viel langsamer wird als eine normale benutzerdefinierte Abfrage mit WP_Query. Viele Leute setzen auch die query_posts-Abfrage nicht mit wp_reset_query() zurück, wenn sie fertig sind, was query_posts noch schlimmer macht.

Da wir nichts dagegen unternehmen und Plugins und Designs nicht daran hindern können, query_posts zu verwenden, und wir niemals wissen können, ob eine query_posts-Abfrage mit wp_reset_query() zurückgesetzt wurde, benötigen wir eine zuverlässigere Kopie des Hauptabfrageobjekts, von dem wir wissen, dass es 99,99999% ergibt. zuverlässige, korrekte Daten. Hier ist $GLOBALS['wp_the_query'] nützlich, da kein WordPress-bezogener Code seinen Wert ändern kann (außer durch die Filter und Aktionen in 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?

Letzte Anmerkung, $GLOBALS['wp_the_query'] istNOTein Ersatz für wp_reset_query(). wp_reset_query() sollte immer mit query_posts verwendet werden, und query_posts sollte nie verwendet werden.

SCHLUSSFOLGERN

Wenn Sie zuverlässigen Code benötigen, der so gut wie nie fehlschlägt, verwenden Sie $GLOBALS['wp_the_query']. Wenn Sie Plugins und Themencode vertrauen und glauben, dass niemand query_posts verwendet oder ihn richtig verwendet, verwenden Sie $GLOBALS['wp_query'] oder $wp_query.

WICHTIGE ÄNDERUNG

Als ich nun seit einigen Jahren Fragen auf dieser Site beantworte, habe ich viele Benutzer gesehen, die $wp_query als lokale Variable verwendet haben, was wiederum auch das Hauptabfrageobjekt zerstört. Dies erhöht die Sicherheitsanfälligkeit des $wp_query weiter.

Zum Beispiel einige Leute dazu

$wp_query = new WP_Query( $args );

das ist im Wesentlichen dasselbe wie das, was query_posts tut

25
Pieter Goosen

Das globale Schlüsselwort importiert die Variable in den lokalen Bereich, während Sie mit $ GLOBALS nur Zugriff auf die Variable erhalten.

Wenn Sie global $wp_the_query; verwenden, können Sie $wp_the_query im lokalen Bereich verwenden, ohne das globale Word erneut zu verwenden. Grundsätzlich kann global $wp_the_query mit $wp_the_query = $GLOBALS['wp_the_query'] verglichen werden

EDIT

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 $GLOBALS['variable'] enthält.

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