Powiedziałbym global $wp_querytylko, aby odpowiedzieć na twoje pytanie w jednym wierszu!
Sumit
Jaka jest różnica?
Nathan Powell
Odpowiedzi:
27
Pominięcia jednego, $GLOBALS['wp_query']. Dla wszystkich celów $GLOBALS['wp_query'] === $wp_query. $GLOBALS['wp_query']jest jednak lepsza dla czytelności i powinna być używana zamiast $wp_query, ALE, która pozostaje osobistą preferencją
Teraz, w idealnym świecie, gdzie jednorożce rządzić światem, $GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query. Domyślnie powinno to być prawdą. Jeśli spojrzymy na to, gdzie te globały są ustawione ( wp-settings.php), zobaczysz, że główny obiekt zapytania jest przechowywany $GLOBALS['wp_the_query']i $GLOBALS['wp_query']jest tylko zduplikowaną kopią$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'];
Powodem tego jest fakt, że WordPress dostrzegł pojawienie się query_postswersji 1.5.
function query_posts($query){
$GLOBALS['wp_query']=new WP_Query();return $GLOBALS['wp_query']->query($query);}
Jak widać, query_postsustawia główny obiekt zapytania na bieżący niestandardowy przebieg zapytania. To łamie integralność głównego obiektu zapytania, co daje niepoprawne dane, więc wszystko, co opiera się na głównym obiekcie zapytania, jest uszkodzone z powodu niewłaściwych danych.
Sposobem na przeciwdziałanie temu było utworzenie kolejnej globalnej przechowującej główny obiekt zapytania, $GLOBALS['wp_the_query']która została wprowadzona w wersji 2.0.0. Ta nowa globalna przechowuje główny obiekt zapytania i $GLOBALS['wp_query']tylko kopię. Dzięki temu wp_reset_query()możemy teraz przywrócić $GLOBALS['wp_query']pierwotny główny obiekt zapytania, aby przywrócić jego integralność.
Ale to nie jest idealny świat, a query_postssam diabeł. Chociaż tysiące ostrzeżeń, ludzie nadal z nich korzystają query_posts. Oprócz zerwania głównego zapytania, ponownie uruchamia ono główne zapytanie, dzięki czemu jest znacznie wolniejsze niż zwykłe zapytanie niestandardowe WP_Query. Wiele osób również nie resetuje query_postszapytania wp_reset_query()po zakończeniu , co czyni query_postsjeszcze więcej zła.
Ponieważ nie możemy nic na to poradzić i nie możemy zatrzymać korzystania z wtyczek i motywów, query_postsa my nigdy nie wiemy, czy query_postszapytanie zostało zresetowane wp_reset_query(), potrzebujemy bardziej niezawodnej kopii głównego obiektu zapytania, który, jak wiemy, da nam 99,99999% wiarygodności, poprawność dane. Jest to $GLOBALS['wp_the_query']przydatne, ponieważ żaden kod związany z WordPress nie może zmienić jego wartości ( poza filtrami i działaniami wewnątrz WP_Querysiebie ).
i sprawdź wyniki. $GLOBALS['wp_the_query']nie zmienił się i $GLOBALS['wp_query']ma. Więc który jest bardziej niezawodny?
Ostatnia uwaga, $GLOBALS['wp_the_query']to nie zastępuje wp_reset_query(). wp_reset_query()należy zawsze używać query_postsi nigdy niequery_posts należy go używać.
PODSUMOWUJĄC
Jeśli potrzebujesz niezawodnego kodu, który prawie zawsze nigdy nie zawiedzie, użyj $GLOBALS['wp_the_query'], jeśli ufasz wtyczkom i kodowi motywacyjnemu i wierzysz, że nikt nie używa go query_postslub używa go poprawnie, użyj $GLOBALS['wp_query']lub$wp_query
WAŻNA EDYCJA
Odpowiadając na pytania na tej stronie od kilku lat, widziałem wielu użytkowników używających $wp_queryjako zmiennej lokalnej, co z kolei psuje również główny obiekt zapytania. To dodatkowo zwiększa podatność na ataki $wp_query.
Jako przykład, niektórzy ludzie tego
$wp_query =new WP_Query( $args );
co jest w istocie dokładnie tym samym, co query_postsrobimy
Mój komentarz nie miał być poprawką, więc przepraszam, jeśli tak. Ja tylko podsumowałem (TL; DR, jeśli wolisz), wskazując, co uważam za jeden z najbardziej znaczących aspektów $wp_the_queryodnoszących się do WP_Query::is_main_query()metody, o której nie wspomniano: D
Evan Mattson
@EvanMattson Przepraszam, źle zrozumiałem twój pierwszy komentarz ;-). Tak, is_main_query()który jest opakowaniem, dla WP_Query::is_main_query()którego sprawdza bieżący obiekt zapytania względem głównego obiektu zapytania zapisanego w $GLOBALS['wp_the_query']. Jest to dość ważne, gdy uruchamiasz pre_get_postsakcje i po prostu chcesz kierować na główne zapytanie ;-)
Pieter Goosen
Całkiem dobra odpowiedź! @EvanMattson To powinna była być edycja .
kaiser
Czy możesz podać wzmiankę o is_main_queryfunkcji w sekcji * WAŻNA EDYCJA? Korzystałem z niego pre_get_postsdzisiaj i uznałem za użyteczne korzystanie z tej funkcji od kiedy patrzyłem $wp_query.
Nathan Powell,
2
Zasadniczo jeden jest kopią drugiego. Sprawdź wp-settings.phplinie 292-305:
Globalne słowo kluczowe importuje zmienną do zasięgu lokalnego, a $ GLOBALS po prostu zapewnia dostęp do zmiennej.
Aby rozwinąć, jeśli używasz global $wp_the_query;
, możesz używać $wp_the_querywewnątrz zakresu lokalnego bez ponownego używania słowa global. Zasadniczo global $wp_the_querymożna to porównać do$wp_the_query = $GLOBALS['wp_the_query']
EDYTOWAĆ
Źle odczytałem wp_query dla wp_the_query, więc moja odpowiedź nie jest pełną odpowiedzią na pytanie, ale nadal zawiera ogólne informacje na temat różnicy między global $variablea$GLOBALS['variable']
Prześlij edycję, ponieważ tak naprawdę nie jest to odpowiedź na pierwotne pytanie. Just FYI $GLOBALS['foo']pozwala również na przesłonięcie lub rozbrojenie zmiennej. Więc jest to nieco więcej niż to, co można opisać tutaj.
global $wp_query
tylko, aby odpowiedzieć na twoje pytanie w jednym wierszu!Odpowiedzi:
Pominięcia jednego,
$GLOBALS['wp_query']
. Dla wszystkich celów$GLOBALS['wp_query'] === $wp_query
.$GLOBALS['wp_query']
jest jednak lepsza dla czytelności i powinna być używana zamiast$wp_query
, ALE, która pozostaje osobistą preferencjąTeraz, w idealnym świecie, gdzie jednorożce rządzić światem,
$GLOBALS['wp_the_query'] === $GLOBALS['wp_query'] === $wp_query
. Domyślnie powinno to być prawdą. Jeśli spojrzymy na to, gdzie te globały są ustawione (wp-settings.php
), zobaczysz, że główny obiekt zapytania jest przechowywany$GLOBALS['wp_the_query']
i$GLOBALS['wp_query']
jest tylko zduplikowaną kopią$GLOBALS['wp_the_query']
Powodem tego jest fakt, że WordPress dostrzegł pojawienie się
query_posts
wersji 1.5.Jak widać,
query_posts
ustawia główny obiekt zapytania na bieżący niestandardowy przebieg zapytania. To łamie integralność głównego obiektu zapytania, co daje niepoprawne dane, więc wszystko, co opiera się na głównym obiekcie zapytania, jest uszkodzone z powodu niewłaściwych danych.Sposobem na przeciwdziałanie temu było utworzenie kolejnej globalnej przechowującej główny obiekt zapytania,
$GLOBALS['wp_the_query']
która została wprowadzona w wersji 2.0.0. Ta nowa globalna przechowuje główny obiekt zapytania i$GLOBALS['wp_query']
tylko kopię. Dzięki temuwp_reset_query()
możemy teraz przywrócić$GLOBALS['wp_query']
pierwotny główny obiekt zapytania, aby przywrócić jego integralność.Ale to nie jest idealny świat, a
query_posts
sam diabeł. Chociaż tysiące ostrzeżeń, ludzie nadal z nich korzystająquery_posts
. Oprócz zerwania głównego zapytania, ponownie uruchamia ono główne zapytanie, dzięki czemu jest znacznie wolniejsze niż zwykłe zapytanie niestandardoweWP_Query
. Wiele osób również nie resetujequery_posts
zapytaniawp_reset_query()
po zakończeniu , co czyniquery_posts
jeszcze więcej zła.Ponieważ nie możemy nic na to poradzić i nie możemy zatrzymać korzystania z wtyczek i motywów,
query_posts
a my nigdy nie wiemy, czyquery_posts
zapytanie zostało zresetowanewp_reset_query()
, potrzebujemy bardziej niezawodnej kopii głównego obiektu zapytania, który, jak wiemy, da nam 99,99999% wiarygodności, poprawność dane. Jest to$GLOBALS['wp_the_query']
przydatne, ponieważ żaden kod związany z WordPress nie może zmienić jego wartości ( poza filtrami i działaniami wewnątrzWP_Query
siebie ).Szybki dowód, uruchom następujące
i sprawdź wyniki.
$GLOBALS['wp_the_query']
nie zmienił się i$GLOBALS['wp_query']
ma. Więc który jest bardziej niezawodny?Ostatnia uwaga,
$GLOBALS['wp_the_query']
to nie zastępujewp_reset_query()
.wp_reset_query()
należy zawsze używaćquery_posts
i nigdy niequery_posts
należy go używać.PODSUMOWUJĄC
Jeśli potrzebujesz niezawodnego kodu, który prawie zawsze nigdy nie zawiedzie, użyj
$GLOBALS['wp_the_query']
, jeśli ufasz wtyczkom i kodowi motywacyjnemu i wierzysz, że nikt nie używa goquery_posts
lub używa go poprawnie, użyj$GLOBALS['wp_query']
lub$wp_query
WAŻNA EDYCJA
Odpowiadając na pytania na tej stronie od kilku lat, widziałem wielu użytkowników używających
$wp_query
jako zmiennej lokalnej, co z kolei psuje również główny obiekt zapytania. To dodatkowo zwiększa podatność na ataki$wp_query
.Jako przykład, niektórzy ludzie tego
co jest w istocie dokładnie tym samym, co
query_posts
robimyźródło
global $wp_query
.global $wp_the_query
zawiera odniesienie do głównego zapytania$wp_the_query
odnoszących się doWP_Query::is_main_query()
metody, o której nie wspomniano: Dis_main_query()
który jest opakowaniem, dlaWP_Query::is_main_query()
którego sprawdza bieżący obiekt zapytania względem głównego obiektu zapytania zapisanego w$GLOBALS['wp_the_query']
. Jest to dość ważne, gdy uruchamiaszpre_get_posts
akcje i po prostu chcesz kierować na główne zapytanie ;-)is_main_query
funkcji w sekcji * WAŻNA EDYCJA? Korzystałem z niegopre_get_posts
dzisiaj i uznałem za użyteczne korzystanie z tej funkcji od kiedy patrzyłem$wp_query
.Zasadniczo jeden jest kopią drugiego. Sprawdź
wp-settings.php
linie 292-305:źródło
Globalne słowo kluczowe importuje zmienną do zasięgu lokalnego, a $ GLOBALS po prostu zapewnia dostęp do zmiennej.
Aby rozwinąć, jeśli używasz
global $wp_the_query;
, możesz używać$wp_the_query
wewnątrz zakresu lokalnego bez ponownego używania słowa global. Zasadniczoglobal $wp_the_query
można to porównać do$wp_the_query = $GLOBALS['wp_the_query']
EDYTOWAĆ
Źle odczytałem wp_query dla wp_the_query, więc moja odpowiedź nie jest pełną odpowiedzią na pytanie, ale nadal zawiera ogólne informacje na temat różnicy między
global $variable
a$GLOBALS['variable']
źródło
$GLOBALS['foo']
pozwala również na przesłonięcie lub rozbrojenie zmiennej. Więc jest to nieco więcej niż to, co można opisać tutaj.