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_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 ).
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_postsi 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_postslub 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_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
global $wp_query. global $wp_the_queryzawiera odniesienie do głównego zapytania
$wp_the_queryodnoszą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_postsakcje i po prostu chcesz kierować na główne zapytanie ;-)
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.
Zasadniczo jeden jest kopią drugiego. Sprawdź wp-settings.phplinie 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_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']
global $wp_querytylko, aby odpowiedzieć na twoje pytanie w jednym wierszu!