$ GLOBALS ['wp_the_query'] vs global $ wp_query
-
-
Ich würde "global $ wp_query" sagen,nur um Ihre Fragein einer Zeile zubeantworten!I would say `global $wp_query` just to answer your question in one line!
- 2
- 2016-03-14
- Sumit
-
Wasist der Unterschied?What is the difference?
- 0
- 2016-03-14
- Nathan Powell
-
3 Antworten
- Stimmen
-
- 2016-03-14
Sie habeneinen verpasst,
$ GLOBALS ['wp_query']
. Für alle Zweckeist$ GLOBALS ['wp_query']===$ wp_query
.$ GLOBALS ['wp_query']
istjedochbesser lesbar und sollte anstelle von$ wp_query
verwendet werden,ABER dasbleibtpersönliche PräferenzNun,in einerperfekten Welt,in der Einhörner die Welt regieren,
$ GLOBALS ['wp_the_query']===$ GLOBALS ['wp_query']===$ wp_query
. Standardmäßig sollte dies wahr sein. Wenn wir uns ansehen,wo diese Globalsgesetzt sind (wp-settings.php
) sehen Sie,dass das Hauptabfrageobjektin$ GLOBALS ['wp_the_query']
undgespeichertist$ GLOBALS ['wp_query']
istnureine Kopie von$GLOBALS['wp_the_query'‹
/** * WordPress-Abfrageobjekt * @global WP_Query $ wp_the_query * @since 2.0.0 */ $ GLOBALS ['wp_the_query']=new WP_Query (); /** * Enthält den Verweis auf @see $ wp_the_query * Verwenden Sie dieseglobalefür WordPress-Abfragen * @global WP_Query $ wp_query * @since 1.5.0 */ $ GLOBALS ['wp_query']=$ GLOBALS ['wp_the_query'];
Der Grund dafürist,dassin WordPress
eingetroffenist query_posts
in Version 1.5.Funktion query_posts ($ query) { $ GLOBALS ['wp_query']=new WP_Query (); return $ GLOBALS ['wp_query'] - > query ($ query); }}
Wie Sie sehen können,setzt
query_posts
das Hauptabfrageobjekt auf den aktuellenbenutzerdefinierten Abfrageauslauf. Diesbeeinträchtigt die Integrität des Hauptabfrageobjekts,wodurch Siefalsche Datenerhalten,sodass alles,was auf dem Hauptabfrageobjektberuht,aufgrundfalscher Datenbeschädigt wird.Eine Möglichkeit,dementgegenzuwirken,bestand darin,ein weiteresglobales Objekt zum Speichern des Hauptabfrageobjekts
$ GLOBALS ['wp_the_query']
zuerstellen,dasin Version 2.0.0eingeführt wurde. Dieseneueglobale Dateienthält das Hauptabfrageobjekt und$ GLOBALS ['wp_query']
nureine Kopie. Überwp_reset_query ()
konnten wirjetzt$ GLOBALS ['wp_query']
auf das ursprüngliche Hauptabfrageobjekt zurücksetzen,um dessen Integrität wiederherzustellen.Aber diesist keineperfekte Welt,und
query_posts
sind der Teufel selbst. Obwohl Tausende von Warnungen verwendet werden,verwenden die Benutzerimmernochquery_posts
. Abgesehen davon,dass die Hauptabfrage unterbrochen wird,wird die Hauptabfrageerneut ausgeführt,wodurch sie alsnormalebenutzerdefinierte AbfragemitWP_Query
viel langsamer wird. Viele Leute setzen auch die Abfragequery_posts
nichtmitwp_reset_query ()
zurück,wenn dieserledigtist,wasquery_posts
noch schlimmermacht.Weil wirnichts dagegentun können und Plugins und Themesnicht daran hindern können,
query_posts
zu verwenden,und wirnie wissen können,obeinequery_posts
-Abfragemitwp_reset_query zurückgesetzt wurde ()
benötigen wireine zuverlässigere Kopie des Hauptabfrageobjekts,von der wir wissen,dass sie zu 99,99999% zuverlässige,korrekte Daten liefert. Hierist$ GLOBALS ['wp_the_query']
nützlich,da kein WordPress-Code seinen Wert ändern kann ( außer durch die Filter und AktioneninWP_Query
selbst ).Führen Sie diefolgenden Schritte 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 sichnichtgeändert,und$ GLOBALS ['wp_query']
hat sichgeändert. Wasist also zuverlässiger?Schlussbemerkung,
$ GLOBALS ['wp_the_query']
ist NICHT ein Ersatzfürwp_reset_query ()
.wp_reset_query ()
sollte immer mitquery_posts
verwendet werden,undquery_posts
sollte nie seingebraucht.SCHLUSSFOLGERUNG
Wenn Sie zuverlässigen Codebenötigen,derfastimmerfehlschlägt,verwenden Sie
$ GLOBALS ['wp_the_query']
,wenn Sie Plugins und Themencode vertrauen undglauben undglauben,dassniemandquery_posts
oder verwendetes richtig,verwenden Sie $ GLOBALS ['wp_query']
oder$wp_query
WICHTIGE BEARBEITUNG
Alsich seiteinigen Jahren Fragen auf dieser Sitebeantwortete,sahich viele Benutzer,die
$ wp_query
als lokale Variable verwendeten,was wiederum auch das Hauptabfrageobjekt zerstört. Dieserhöht die Sicherheitsanfälligkeit von$ wp_query
weiter.Als Beispieleinige Leute dazu
$ wp_query=new WP_Query ($ args);
entsprichtim Wesentlichengenau dem,was
query_posts
tunYou have missed one,
$GLOBALS['wp_query']
. For all purposes,$GLOBALS['wp_query'] === $wp_query
.$GLOBALS['wp_query']
is however better for readability and should be used instead of$wp_query
, BUT, that remains personal preferenceNow, in a perfect world where unicorns rule the world,
$GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. By default, this should be true. If we look at where these globals are set (wp-settings.php
), you will see the main query object is stored in$GLOBALS['wp_the_query']
and$GLOBALS['wp_query']
is just a duplicate copy of$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'];
The reason for doing it this way, is because WordPress saw the arrival of
query_posts
in version 1.5.function query_posts($query) { $GLOBALS['wp_query'] = new WP_Query(); return $GLOBALS['wp_query']->query($query); }
As you can see,
query_posts
sets the main query object to the current custom query beign run. This breaks the integrity of the main query object, which gives you incorrect data, so anything that relies on the main query object is broken due to wrong data.A way to counter this was to create another global to store the main query object,
$GLOBALS['wp_the_query']
which was introduced in version 2.0.0. This new global hold the main query object and$GLOBALS['wp_query']
just a copy. Throughwp_reset_query()
, we could now reset$GLOBALS['wp_query']
back to the original main query object to restore its integrity.But this is not a perfect world, and
query_posts
are the devil himself. Although thousands of warnings, people still usequery_posts
. Apart from breaking the main query, it reruns the main query, making it much slower as a normal custom query withWP_Query
. Many people also do not reset thequery_posts
query withwp_reset_query()
when done, which makesquery_posts
even more evil.Because we cannot do anything about that, and cannot stop plugins and themes from using
query_posts
and we can never know if aquery_posts
query was reset withwp_reset_query()
, we need a more reliable copy of the main query object which we know will give us 99.99999% reliable, correct data. That is where$GLOBALS['wp_the_query']
is useful as no WordPress related code can change it's value (except through the filters and actions insideWP_Query
itself).Quick proof, run the following
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'] );
and check the results.
$GLOBALS['wp_the_query']
did not change, and$GLOBALS['wp_query']
has. So which is more reliable?Final note,
$GLOBALS['wp_the_query']
is NOT a replacement forwp_reset_query()
.wp_reset_query()
should always be used withquery_posts
, andquery_posts
should never be used.TO CONCLUDE
If you need reliable code which will almost always never fail, use
$GLOBALS['wp_the_query']
, if you trust and believe plugins and theme code and believe no one usesquery_posts
or is using it correctly, use$GLOBALS['wp_query']
or$wp_query
IMPORTANT EDIT
Being answering questions on this site now for a couple of years, I saw many users using
$wp_query
as a local variable, which in turn also breaks the main query object. This further increases the vulnerabilty of the$wp_query
.As example, some people to this
$wp_query = new WP_Query( $args );
which is in essence the exactly the same as what
query_posts
are doing-
[query_posts ()] (https://developer.wordpress.org/reference/functions/query_posts/) ändert `global $ wp_query`.`global $ wp_the_query`enthält den Verweis auf ** [die Hauptabfrage] (https://developer.wordpress.org/reference/classes/wp_query/is_main_query/) **[query_posts()](https://developer.wordpress.org/reference/functions/query_posts/) changes `global $wp_query`. `global $wp_the_query` holds the reference to **[the main query](https://developer.wordpress.org/reference/classes/wp_query/is_main_query/)**
- 1
- 2016-03-15
- Evan Mattson
-
Mein Kommentar warnicht als Korrekturgedacht,daherentschuldigeichmich,wenn dies der Fallist.Ich habenur zusammengefasst (TL; DR,wenn Sie so wollen) und dabei darauf hingewiesen,wasmeiner Meinungnacheiner der wichtigsten Aspekte von "$ wp_the_query"ist,daes sich um die "WP_Query ::is_main_query ()" -Methode handelt,dienichterwähnt wurde:D.My comment wasn't intended as a correction, so my apologies if it did. I was merely summarizing (TL;DR if you will) while pointing out what I believe is one of the most significant aspects of `$wp_the_query` as it pertains to the `WP_Query::is_main_query()` method, which was not mentioned :D
- 0
- 2016-03-16
- Evan Mattson
-
@EvanMattson Entschuldigung,ich habe deinenersten Kommentarfalsch verstanden ;-).Ja,"is_main_query ()",ein Wrapperfür "WP_Query ::is_main_query ()",der das aktuelle Abfrageobjektmit demin "$ GLOBALS [" wp_the_query "]"gespeicherten Hauptabfrageobjekt vergleicht.Diesist sehr wichtig,wenn Sie "pre_get_posts" -Aktionen ausführen undnur auf die Hauptabfrage abzielenmöchten ;-)@EvanMattson Apologies, I misunderstood your first comment ;-). Yes, `is_main_query()`, which is a wrapper for `WP_Query::is_main_query()` which checks the current query object against the main query object saved in `$GLOBALS['wp_the_query']`. This is quite important when you run `pre_get_posts` actions and just want to target the main query ;-)
- 0
- 2016-03-16
- Pieter Goosen
-
Ziemlichgutgemachte Antwort!@EvanMattson Das hätteein [Bearbeiten] sein sollen.Pretty well done answer! @EvanMattson That should have been an [edit].
- 0
- 2016-04-06
- kaiser
-
Können Sie die Funktion "is_main_query"im Abschnitt "* WICHTIGE BEARBEITUNG"erwähnen?Ich habe heute "pre_get_posts" verwendet undfandes äußerstnützlich,diese Funktion zu verwenden,daichmir "$ wp_query" angesehen habe.Can you include mention of `is_main_query` function in the *IMPORTANT EDIT section? I was using `pre_get_posts` today and found it utterly useful to use that function since I was looking at `$wp_query`.
- 0
- 2017-03-18
- Nathan Powell
-
- 2016-03-14
Dasglobale Schlüsselwortimportiert die Variablein den lokalen Bereich,während $ GLOBALS Ihnennur Zugriff auf die Variablegewährt.
Um dies zuerläutern,wenn Sie
verglichen werdenglobal $wp_the_query;
verwenden Sie können$wp_the_query
im lokalen Bereich verwenden,ohne das Wortglobalerneut zu verwenden.Grundsätzlich kannglobal $wp_the_query
mit$wp_the_query = $GLOBALS['wp_the_query']
EDIT
Ich habe wp_queryfür wp_the_queryfalschgelesen,sodassmeine Antwort keine vollständige Antwort auf die Frageist,aber dennoch allgemeine Informationen über den Unterschied zwischen
global $variable
und$GLOBALS['variable']
The global keyword imports the variable into the local scope, while $GLOBALS just grants you access to the variable.
To elaborate, if you use
global $wp_the_query;
you can use$wp_the_query
inside the local scope without using the word global again. So basicallyglobal $wp_the_query
can be compared to$wp_the_query = $GLOBALS['wp_the_query']
EDIT
I misread wp_query for wp_the_query so my answer isn't a complete answer to the question but still provides general information about the difference between
global $variable
and$GLOBALS['variable']
-
Bitte reichen Sieeine [Bearbeiten]ein,da dies wirklich keine Antwort auf die ursprüngliche Frageist.Nur FYI `$ GLOBALS ['foo']`erlaubt das Überschreiben oder Deaktivieren der Variablen.Esist alsoein Bitmehr als das,was Sie hierbeschreiben.Please, file an [edit] as this really is not an answer to the original question. Just FYI `$GLOBALS['foo']` allows _overriding_ or unsetting the variable as well. So it's a _bit_ more than what you describe here.
- 0
- 2016-04-06
- kaiser
-
- 2016-03-14
Grundsätzlichisteine Kopie der anderen.Überprüfen Sie
wp-settings.php
,Zeilen 292-305:$GLOBALS['wp_the_query'] = new WP_Query(); $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Basically one is copy of the other. Check out
wp-settings.php
, lines 292-305:$GLOBALS['wp_the_query'] = new WP_Query(); $GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
Wasist der Unterschied zwischen
$GLOBALS['wp_the_query']
undglobal $wp_query
?Warumeins dem anderen vorziehen?