$ GLOBALS ['wp_t__query'] vs globalny $ wp_query


16

Jaka jest różnica między $GLOBALS['wp_the_query']i global $wp_query?

Dlaczego wolisz jedno od drugiego?


2
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 ).

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ć.

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


1
zapytanie_posts () zmiany global $wp_query. global $wp_the_queryzawiera odniesienie do głównego zapytania
Evan Mattson

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:

$GLOBALS['wp_the_query'] = new WP_Query();

$GLOBALS['wp_query'] = $GLOBALS['wp_the_query'];

2

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.
kaiser
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.