Wygląda na to, że połowa samouczków zawartych w Kodeksie i korzystanie z blogosfery query_posts()
oraz połowa użycia WP_Query
. O co chodzi?
wp-query
query-posts
query
get-posts
Dan Gayle
źródło
źródło
Odpowiedzi:
query_posts()
jest zbyt uproszczonym i problematycznym sposobem modyfikowania głównego zapytania strony poprzez zastąpienie go nowym wystąpieniem zapytania. Jest nieefektywny (ponownie uruchamia zapytania SQL) i w niektórych okolicznościach po prostu zawiedzie (szczególnie często w przypadku stronicowania postów). Każdy nowoczesny kod WP powinien w tym celu wykorzystywać bardziej niezawodne metody, takie jak użyciepre_get_posts
haka. TL; DR nigdy nie używaj query_posts () .get_posts()
jest bardzo podobny w użyciu i akceptuje te same argumenty (z niektórymi niuansami, takimi jak różne wartości domyślne), ale zwraca tablicę postów, nie modyfikuje zmiennych globalnych i jest bezpieczny w użyciu w dowolnym miejscu.WP_Query
jest klasą, która napędza obie za kulisami, ale możesz także tworzyć i pracować z własną instancją. Nieco bardziej złożone, mniej ograniczeń, również bezpieczne w użyciu w dowolnym miejscu.źródło
query_posts()
jest małą funkcją otokiWP_Query
, jedyną dodatkową rzeczą (jak na schemacie blokowym) jest nadpisywanie globalne$wp_query
query_posts()
zeWP_Query
zrobi żadnej różnicy w wydajności, zapytanie Oryginalna strona będzie nadal działać, ponieważ jest to część obciążenia rdzenia. Te zapytania będą działać, nawet jeśli plik szablonu nie ma w ogóle pętli.query_posts
wcale nie modyfikuje głównej pętli, zastępuje ją po uruchomieniu. Najlepszym sposobem modyfikacji głównej pętli jestpre_get_posts
filtr. developer.wordpress.com/2012/05/14/…query_posts
- Nigdy nie powinieneś używaćquery_posts
. Oprócz tego, co powiedział @Rarst, naprawdę dużym problememquery_posts
jest to, że psuje główny obiekt zapytania (przechowywany w$wp_query
). Wiele wtyczek i kodu niestandardowego opiera się na głównym obiekcie zapytania, więc zerwanie głównego obiektu zapytania oznacza, że psujesz funkcje wtyczek i kodu niestandardowego. Tylko jedna taka funkcja jest najważniejszą funkcją paginacji, więc jeśli złamiesz główne zapytanie, przerwiesz paginację.Aby udowodnić, jak źle
query_posts
jest na dowolnym szablonie, wykonaj następujące czynności i porównaj wynikiget_posts
iWP_Query
są poprawnym sposobem konstruowania dodatkowych zapytań ( takich jak powiązane posty, suwaki, polecana treśći treść na statycznych stronach głównych) za pomocą. Należy zauważyć, że nie należy używać żadnego z dwóch na rzecz głównego zapytania na stronie głównej, pojedynczej stronie lub dowolnego rodzaju strony archiwum, ponieważ spowoduje to uszkodzenie funkcjonalności strony. Jeśli chcesz zmodyfikować zapytanie główne, użyjpre_get_posts
tego, a nie zapytania niestandardowego. ( AKTUALIZACJA: W przypadku statycznych stron głównych i prawdziwych stron zobacz Używanie pre_get_posts na stronach prawdziwych i statycznych stronach głównych *)Zasadniczo
WP_Query
jest używany przez główne zapytanie i jest również używany przezget_posts
, ale chociażget_posts()
używaWP_Query
, istnieje kilka różnicget_posts
są szybsze niżWP_Query
. Margines zależy od całkowitej liczby postów na stronie. Powodem jest to, że domyślnieget_posts
przechodzi'no_found_rows' => true
na to,WP_Query
co pomija / legalnie łamie paginację. Za pomocą'no_found_rows' => true
,WP_Query
pobiera liczbę wysłanych zapytań, a następnie wysyła kaucję, gdzie domyślnie dalej wyszukuje wszystkie posty pasujące do zapytania w celu obliczenia stronicowania.Z tego powodu
get_posts()
należy go używać tylko w przypadku stronicowanych zapytań. Paginacjaget_posts
to naprawdę jeden wielki bałagan.WP_Query
należy stosować do wszystkich stronicowanych zapytańget_posts()
nie wpływają na nieposts_*
filtry, na któreWP_Query
wpływają te filtry. Powodem jest toget_posts
, że domyślnie przechodzi'suppress_filters' => true
doWP_Query
get_posts
ma kilka dodatkowych parametrów, takich jakinclude
,exclude
,numberposts
icategory
. Te parametry są zamieniane na prawidłowe parametryWP_Query
przed przekazaniem doWP_Query
.include
zmienia się wpost__in
,exclude
wpost__not_in
,category
wcat
inumberposts
wposts_per_page
. Uwaga: wszystkie parametry, które można przekazać doWP_Query
pracyget_posts
, można zignorować i nie używać domyślnych parametrówget_posts
get_posts
zwraca tylko$posts
właściwośćWP_Query
whileWP_Query
zwraca cały obiekt. Ten obiekt jest bardzo przydatny, jeśli chodzi o warunki warunkowe, paginację i inne przydatne informacje, które można wykorzystać wewnątrz pętli.get_posts
nie używa pętli, aleforeach
pętlę do wyświetlania postów. Ponadto domyślnie nie są dostępne żadne tagi szablonów.setup_postdata( $post )
należy użyć, aby tagi szablonu były dostępne.WP_Query
używa pętli, a szablony są domyślnie dostępneget_posts
przechodzi'ignore_sticky_posts' => 1
doWP_Query
, więcget_posts
domyślnie ignoruje przyklejone postyW oparciu o powyższe, czy użyć
get_posts
lubWP_Query
zależy od ciebie i czego tak naprawdę potrzebujesz z zapytania. Powyższe powinno pomóc ci w wyborzeźródło
Podstawowa różnica polega na tym, że
query_posts()
tak naprawdę służy tylko modyfikacji bieżącej pętli. Po zakończeniu należy zresetować pętlę i wysłać ją w wesoły sposób. Ta metoda jest również nieco łatwiejsza do zrozumienia, po prostu dlatego, że „zapytanie” jest w zasadzie ciągiem URL przekazywanym do funkcji, na przykład:Z drugiej strony
WP_Query
jest bardziej narzędziem ogólnego przeznaczenia i bardziej przypomina bezpośrednie pisanie zapytań MySQL niżquery_posts()
jest. Możesz go również używać w dowolnym miejscu (nie tylko w pętli) i nie koliduje on z aktualnie uruchomionymi zapytaniami postowymi.Zwykle używam
WP_Query
częściej, jak to się dzieje. Naprawdę sprowadzi się to do konkretnego przypadku.źródło
Po prostu nie ma potrzeby używania
query_posts()
. Wszystko, co robi, tworzy instancję nowego obiektu WP_Query i ponownie przypisuje ten nowy obiekt doglobal wp_query
.Dla porównania, jest to faktyczna
query_posts()
funkcja.Utwórz własny obiekt WP_Query, jeśli chcesz utworzyć dogłębny niestandardowy skrypt zapytania. Lub użyj,
get_posts()
jeśli wszystko, co musisz zrobić, to lekka manipulacja tu i tam.W obu przypadkach bardzo polecam wyświadczyć sobie przysługę oraz udać się
wp_includes/query.php
naWP_Query
zajęcia i przejrzeć je .źródło
Upewnij się, że używasz
wp_reset_query()
po użyciu,query_posts()
ponieważ wpłynie to również na inne wyniki zapytania.źródło
Jeśli dobrze pamiętam, właściwie „pętla” działa
WP_Query
w podstawowych plikach, ale w łatwiejszy do zrozumienia sposób.źródło
źródło
Powiedziałbym, że nie używaj
get_posts()
wtyczki. To nakłada bardzo restrykcyjne filtry w niektórych przypadkach (Setasuppress_filters
,ignore_sticky_posts
etc.) i powinny prawdopodobnie być stosowane tylko w temacie, jeśli chcesz coś zrobić szybko.źródło