Jaka jest różnica między $GLOBALS['wp_the_query']
i global $wp_query
?
Dlaczego wolisz jedno od drugiego?
Jaka jest różnica między $GLOBALS['wp_the_query']
i global $wp_query
?
Dlaczego wolisz jedno od drugiego?
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']
/**
* 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_posts
wersji 1.5.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
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 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_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 niestandardowe WP_Query
. Wiele osób również nie resetuje query_posts
zapytania wp_reset_query()
po zakończeniu , co czyni query_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, czy query_posts
zapytanie 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_Query
siebie ).
Szybki dowód, uruchom następujące
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'] );
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_posts
i nigdy niequery_posts
należy go używać.
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_posts
lub używa go poprawnie, użyj $GLOBALS['wp_query']
lub$wp_query
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
$wp_query = new WP_Query( $args );
co jest w istocie dokładnie tym samym, co query_posts
robimy
global $wp_query
. global $wp_the_query
zawiera odniesienie do głównego zapytania
$wp_the_query
odnoszących się do WP_Query::is_main_query()
metody, o której nie wspomniano: D
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_posts
akcje i po prostu chcesz kierować na główne zapytanie ;-)
is_main_query
funkcji w sekcji * WAŻNA EDYCJA? Korzystałem z niego pre_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:
$GLOBALS['wp_the_query'] = new WP_Query();
$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];
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. Zasadniczo global $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']
global $wp_query
tylko, aby odpowiedzieć na twoje pytanie w jednym wierszu!