Istnieją dwie query_posts()
funkcje technicznie rzecz biorąc. Jedno query_posts()
jest faktycznie, WP_Query::query_posts()
a drugie w globalnej przestrzeni.
Pytanie z rozsądku:
Jeśli globalne query_posts()
jest to „zło”, dlaczego nie jest przestarzałe?
Lub dlaczego nie jest oznaczony jako _doing_it_wong
.
query-posts
prosti
źródło
źródło
Odpowiedzi:
Istotne pytanie
Dig w trio Powiedzmy:
::query_posts
,::get_posts
iclass WP_Query
zrozumieć::query_posts
lepiej.Podstawą do uzyskania danych w WordPress jest
WP_Query
klasa. Obie metody::query_posts
i::get_posts
użyj tej klasy.Zrozumienie
WP_Query
Oto
WP_Query
struktura:WP_Query
to szwajcarski scyzoryk.Niektóre rzeczy na temat
WP_Query
:pre_get_posts
haczykNie potrafię tego wyjaśnić, ale niektóre z nich są trudne, więc podajmy krótkie wskazówki.
WP_Query
możesz kontrolować za pomocą przekazywanych argumentówByłby to minimalny przykład tworzenia
WP_Query
obiektu na podstawie argumentów:WP_Query
jest chciwyStworzony na podstawie pomysłu, że
get all you can
programiści WordPress postanowili uzyskać wszystkie możliwe dane wcześniej, ponieważ jest to dobre dla wydajności . Dlatego domyślnie, gdy zapytanie pobiera 10 postów z bazy danych, będzie również otrzymywać warunki i metadane dla tych postów za pośrednictwem oddzielnych zapytań. Warunki i metadane będą buforowane (wstępnie pobierane).Można wyłączyć buforowanie po ustawieniu
update_post_meta_cache
iupdate_post_term_cache
abyfalse
podczas ustawianiaWP_Query
argumenty. Gdy buforowanie jest wyłączone, dane będą pobierane z bazy danych tylko na żądanie.W przypadku większości blogów WordPress buforowanie działa dobrze, ale w niektórych przypadkach możesz wyłączyć buforowanie.
WP_Query
używa klas pomocniczychJeśli
WP_Query
zaznaczyłeś tam pola, masz te trzy:Możesz sobie wyobrazić dodawanie nowych w przyszłości.
WP_Query
zatrzymuje substancję do zapętleniaW tym kodzie:
możesz zauważyć, że
WP_Query
ma substancję, którą możesz iterować. Istnieją również metody pomocnicze. Właśnie ustawiłeśwhile
pętlę.WP_Query
Pierwszy i drugiW WordPress masz jedno podstawowe i zero lub więcej wtórnych zapytań.
Zapytanie podstawowe znane jako zapytanie główne lub zapytanie zwykłe . Drugie zapytanie nazywane jest również niestandardowym .
WordPress używa
WP_Rewrite
klasy wcześnie, aby utworzyć argumenty zapytania na podstawie adresu URL. Na podstawie tych argumentów przechowuje dwa identyczne obiekty w przestrzeni globalnej. Oba będą zawierać główne zapytanie.Kiedy mówimy główne zapytanie , myślimy o tych zmiennych. Inne zapytania można nazwać drugorzędnymi lub niestandardowymi.
WP_Query
ma poręcznypre_get_posts
haczyk.To jest hak akcji. Będzie miało zastosowanie do dowolnej
WP_Query
instancji. Nazywasz to tak:Ten haczyk jest świetny i może zmieniać dowolne argumenty zapytania.
Oto, co możesz przeczytać :
Ten hak jest menedżerem argumentów, ale nie może tworzyć nowych
WP_Query
obiektów. Jeśli masz jedno zapytanie podstawowe i jedno dodatkowe,pre_get_posts
nie możesz utworzyć trzeciego. Lub jeśli masz tylko jeden element główny, nie może utworzyć elementu dodatkowego.WP_Query
obsługuje zagnieżdżone pętleOto przykładowy przykład WordPress ma funkcje pomocnicze nawet dla zagnieżdżonych pętli:
Wynik będzie taki, ponieważ zainstalowałem dane testu jednostki tematycznej :
Mimo że poprosiłem o 5 postów w niestandardowym zapytaniu $, zwróci mi sześć, ponieważ post przyklei się. Jeśli nie ma
wp_reset_postdata
w poprzednim przykładzie, wynik będzie taki, ponieważ$GLOBALS['post']
będzie nieprawidłowy.WP_Query
mawp_reset_query
funkcjęTo jest jak przycisk resetowania.
$GLOBALS['wp_the_query']
powinien być cały czas zamrożony, a wtyczki lub motywy nigdy nie powinny go zmieniać.Oto co
wp_reset_query
robią:Uwagi na temat
get_posts
get_posts
wygląda jakTo jest po prostu otoki wokół
WP_Query
, że wraca zapytaniu posty obiektu.ignore_sticky_posts
Ustawiona na true oznacza lepkie wpisy mogą pojawić się tylko w naturalnej pozycji. Z przodu nie będzie lepkich słupków. Drugino_found_rows
zestaw wartości true oznacza, że interfejs API bazy danych WordPress nie będzie używanySQL_CALC_FOUND_ROWS
do implementacji paginacji, co zmniejszy obciążenie bazy danych w celu wykonania liczby znalezionych wierszy .Jest to przydatne, gdy nie potrzebujesz stronicowania. Rozumiemy teraz, że możemy naśladować tę funkcję za pomocą tego zapytania:
Oto odpowiednie zapytanie SQL:
Porównaj to, co mamy teraz, z poprzednim żądaniem SQL, o ile
SQL_CALC_FOUND_ROWS
istnieje.Żądanie bez
SQL_CALC_FOUND_ROWS
będzie szybsze.Uwagi na temat
query_posts
query_posts()
jestWP_Query
opakowaniem. Zwraca referencję do głównegoWP_Query
obiektu i jednocześnie ustawiglobal $wp_query
.W PHP4 wszystko, łącznie z obiektami, przechodziło przez wartość.
query_posts
było tak:Uwaga: w typowym scenariuszu z jednym zapytaniem podstawowym i jednym zapytaniem dodatkowym mamy trzy zmienne:
Powiedzmy, że każda z tych trzech zajmuje 1M pamięci. Łącznie byłoby 3 mln pamięci. Jeśli użyjemy
query_posts
,$GLOBALS['wp_query']
zostanie rozbrojony i ponownie utworzony.PHP5 + powinno być inteligentnie opróżniające
$GLOBALS['wp_query']
obiekt, tak jak w PHP4 zrobiliśmy to zunset($GLOBALS['wp_query']);
W rezultacie
query_posts
zużywa ogółem 2 mln pamięci, aget_posts
zużywa 3 mln pamięci.Uwaga:
query_posts
nie zwracamy rzeczywistego obiektu, ale odniesienie do obiektu.Oto jeden przykład
Skutkuje:
Spróbuj zresetować zapytanie:
Skutkuje:
Możesz tworzyć problemy, nawet jeśli używasz
WP_Query
Oczywiście rozwiązaniem byłoby
wp_reset_query
ponowne użycie funkcji.Dlatego myślę, że
query_posts
może być lepiej z punktu widzenia pamięci. Ale zawsze powinieneś robićwp_reset_query
sztuczki.źródło
Właśnie utworzyłem nowy bilet trac, bilet nr 36874 , aby zaproponować wycofanie
query_posts()
. To, czy zostanie ono zaakceptowane, pozostaje dobrym pytaniem.Prawdziwy duży problem
query_posts()
polega na tym, że wciąż jest powszechnie używany przez wtyczki i motywy, mimo że były naprawdę dobre napisy na temat tego, dlaczego NIGDY nie powinieneś go nigdy używać. Myślę, że najbardziej epickim postem na WPSE jest następujący:deprecation! == usunięcie , więc wycofanie
query_posts()
nie zatrzyma jego użycia przez deweloperów niskiej jakości i ogólnie rzecz biorąc, którzy nie znają WordPress i używają samouczków niskiej jakości jako wytycznych. Podobnie jak jakiś dowód, jak wiele pytań wciąż mamy tu gdzie ludzie używającaller_get_posts
wWP_Query
? Od wielu lat jest przestarzały.Przestarzałe funkcje i argumenty można jednak usunąć w dowolnym momencie, gdy rdzeń deweloperów uzna to za stosowne, ale najprawdopodobniej nigdy się tak nie stanie,
query_posts()
ponieważ spowoduje to uszkodzenie milionów witryn. Więc tak, prawdopodobnie nigdy nie zobaczymy całkowitego usunięciaquery_posts()
- co może prowadzić do tego, że najprawdopodobniej nigdy nie zostanie przestarzałe.Jest to jednak punkt wyjścia, ale należy pamiętać, że wycofanie czegoś w WordPress nie przerywa jego użycia.
AKTUALIZACJA 19 maja 2016 r
Zgłoszony przeze mnie bilet jest teraz zamknięty i oznaczony jako duplikat 4-letniego biletu, który został zamknięty jako wontfix i został ponownie otwarty i nadal pozostaje otwarty i nierozwiązany.
Wygląda na to, że główni programiści trzymają się tego starego wiernego małego zła. Wszystkich zainteresowanych, oto duplikat starego 4-letniego biletu
źródło
[nieco rant]
W tej chwili podstawową filozofią jest to, że nic nie jest naprawdę przestarzałe. Powiadomienie o wycofaniu, choć dobrze jest je mieć, zostanie zignorowane, jeśli funkcja nie zostanie w pewnym momencie odrzucona. Jest wiele osób, które nie rozwijają
WP_DEBUG
się i nie zauważą powiadomienia, jeśli nie nastąpi rzeczywiste uszkodzenie.OTOH, ta funkcja jest jak
goto
instrukcja. Osobiście nigdy (w przypadku mniejszej definicji niż się spodziewałem) użyłem,goto
ale rozumiem argumenty wskazujące na sytuację, w której domyślnie nie jest to zło. To samo dotyczyquery_posts
, jest to prosty sposób na skonfigurowanie wszystkich globałów wymaganych do utworzenia prostej pętli i może być przydatny w kontekście ajax lub rest-api. Nigdy nie użyłbym tego również w tych kontekstach, ale widzę, że jest to raczej kwestia stylu kodowania niż funkcji samej w sobie złej.Przechodząc nieco głębiej, głównym problemem jest to, że globalia muszą być w ogóle ustawione. To jest główny problem, a nie jedna funkcja, która pomaga je ustawić.
źródło
query_posts
wolniejszy niż zapytanie wtórne (czytaj: nie zapytanie główne).query_posts
sam, ale bezużyteczne zapytanie, które zostało wykonane podczas ładowania WP