wp query — Kiedy należy używać WP_Query vs query_posts() vs get_posts()?
query_posts
– Nigdy nie powinieneś używać query_posts
. Oprócz tego, co powiedział @Rarst, naprawdę duży problem z query_posts
oznacza to, że psuje główny obiekt zapytania (przechowywany w $wp_query
). Wiele wtyczek i niestandardowego kodu opiera się na głównym obiekcie zapytania, więc uszkodzenie głównego obiektu zapytania oznacza, że naruszysz funkcjonalność wtyczek i niestandardowego kodu. Tylko jedną z takich funkcji jest najważniejsza funkcja paginacji, więc jeśli złamiesz główne zapytanie, przerwiesz paginację.
Aby udowodnić, jak źle query_posts
to na dowolnym szablonie wykonaj poniższe 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ą właściwym sposobem konstruowania wtórny zapytania ( jak powiązane posty, suwaki, polecane treści i treści na statycznych stronach głównych ) z. Należy zauważyć, że nie powinieneś używać żadnego z nich na rzecz głównego zapytania na stronie głównej, pojedynczej stronie lub jakimkolwiek typie strony archiwum, ponieważ zakłóci to funkcjonalność strony. Jeśli chcesz zmodyfikować główne zapytanie, użyj pre_get_posts
aby to zrobić, a nie niestandardowe zapytanie. (AKTUALIZACJA: W przypadku statycznych stron głównych i prawdziwych stron zobacz Używanie pre_get_posts na prawdziwych stronach i statycznych stronach głównych*)
W istocie WP_Query
jest używany przez zapytanie główne i jest również używany przez get_posts
ale chociaż get_posts()
wykorzystuje WP_Query
jest kilka różnic
-
get_posts
są szybsze niżWP_Query
. Marża zależy od ilości wszystkich postów na stronie. Powodem tego jest,get_posts
Karnety'no_found_rows' => true
domyślnie doWP_Query
który pomija/prawnie przerywa paginację. Z'no_found_rows' => true
,WP_Query
pobiera liczbę postów, o które pytano, a następnie wycofuje się, gdzie domyślnie szuka dalej wszystkich postów pasujących do zapytania, aby obliczyć paginację.Z tego powodu,
get_posts()
należy używać wyłącznie w przypadku zapytań niestronicowanych. Paginacjaget_posts
to naprawdę jeden wielki bałagan.WP_Query
należy stosować w przypadku wszystkich zapytań stronicowanych -
get_posts()
nie mają na to wpływuposts_*
filtry gdzieWP_Query
ulega wpływowi tych filtrów. Powód jest taki, żeget_posts
domyślnie przechodzi'suppress_filters' => true
DoWP_Query
-
get_posts
ma kilka dodatkowych parametrów, takich jakinclude
,exclude
,numberposts
Icategory
. Parametry te są zmieniane na prawidłowe parametry dlaWP_Query
przed przekazaniemWP_Query
.include
zostaje przemieniony wpost__in
,exclude
dopost__not_in
,category
docat
Inumberposts
doposts_per_page
. Tylko uwaga, Wszystko parametrów, do których można przekazaćWP_Query
pracuje zget_posts
Ty Móc zignoruj i nie używaj domyślnych parametrówget_posts
-
get_posts
zwraca tylko$posts
własnośćWP_Query
chwilaWP_Query
zwraca cały obiekt. Obiekt ten jest całkiem 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 aforeach
pętla do wyświetlania postów. Ponadto domyślnie nie są dostępne żadne tagi szablonów.setup_postdata( $post )
musi zostać użyty, aby udostępnić znaczniki szablonu.WP_Query
wykorzystuje pętlę, a znaczniki szablonów są domyślnie dostępne -
get_posts
Karnety'ignore_sticky_posts' => 1
DoWP_Query
Więcget_posts
domyślnie ignoruje przyklejone posty
Na podstawie powyższego, czy użyć get_posts
Lub WP_Query
zależy od Ciebie i czego tak naprawdę potrzebujesz od zapytania. Powyższe powinno pomóc Ci w dokonaniu wyboru