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?
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?
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życie pre_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.
query_posts()
jest małą funkcją otoki WP_Query
, jedyną dodatkową rzeczą (jak na schemacie blokowym) jest nadpisywanie globalne$wp_query
query_posts()
ze WP_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 jest pre_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 problemem query_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 wyniki
var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );
get_posts
i WP_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żyj pre_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 przez get_posts
, ale chociaż get_posts()
używa WP_Query
, istnieje kilka różnic
get_posts
są szybsze niż WP_Query
. Margines zależy od całkowitej liczby postów na stronie. Powodem jest to, że domyślnie get_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ń. Paginacja get_posts
to naprawdę jeden wielki bałagan. WP_Query
należy stosować do wszystkich stronicowanych zapytań
get_posts()
nie wpływają na nie posts_*
filtry, na które WP_Query
wpływają te filtry. Powodem jest to get_posts
, że domyślnie przechodzi 'suppress_filters' => true
doWP_Query
get_posts
ma kilka dodatkowych parametrów, takich jak include
, exclude
, numberposts
i category
. Te parametry są zamieniane na prawidłowe parametry WP_Query
przed przekazaniem do WP_Query
. include
zmienia się w post__in
, exclude
w post__not_in
, category
w cat
i numberposts
w posts_per_page
. Uwaga: wszystkie parametry, które można przekazać do WP_Query
pracy get_posts
, można zignorować i nie używać domyślnych parametrówget_posts
get_posts
zwraca tylko $posts
właściwość WP_Query
while WP_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, ale foreach
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ępne
get_posts
przechodzi 'ignore_sticky_posts' => 1
do WP_Query
, więc get_posts
domyślnie ignoruje przyklejone posty
W oparciu o powyższe, czy użyć get_posts
lub WP_Query
zależy od ciebie i czego tak naprawdę potrzebujesz z zapytania. Powyższe powinno pomóc ci w wyborze
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:
query_posts('meta_key=color&meta_value=blue');
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.
Po prostu nie ma potrzeby używania query_posts()
. Wszystko, co robi, tworzy instancję nowego obiektu WP_Query i ponownie przypisuje ten nowy obiekt do global wp_query
.
Dla porównania, jest to faktyczna query_posts()
funkcja.
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
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
na WP_Query
zajęcia i przejrzeć je .
Upewnij się, że używasz wp_reset_query()
po użyciu, query_posts()
ponieważ wpłynie to również na inne wyniki zapytania.