Badam Google i WPSE i jedyne, co widzę wielokrotnie, to używanie showposts
, które jest przestarzałe.
Jestem zaznajomiony WP_Query
i pomyślałem, że jeśli ustawię posts_per_page
swój limit (tj. 5), i nopaging
tak true
, stanie się coś w rodzaju „ Ok, dam ci tylko 5 postów ”. Ale to nie działa.
W jaki sposób mogę to zrobić?
'posts_per_page=5'
found_posts
właściwości, jest to liczba większa niż 5. Chcę, aby moje zapytanie zawierało tylko 5 postów. Czy to możliwe? @PieterGoosennopaging
parametru, ustawienie tego na true oznacza, że otrzymujesz wszystkie postynopaging
parametru, zostanie on ustawiony domyślniefalse
, więc strona główna pokazuje 5 postów, ale zapytanie zawiera więcej. Dodaję zdjęcie do pytania.Odpowiedzi:
Myślę, że teraz rozumiem, co próbujesz zrobić. Gdy uruchomisz niestandardowe zapytanie z
WP_Query
ustawionym limitem, aby uzyskać tylko 5 postów na stronę, zapytanie będzie pobierało tylko 5 postów, a to zapytanie będzie zawierało tylko 5 postów, ALE ze względu na paginację,WP_Query
nadal działa w całej bazie danych i zlicza wszystkie posty spełniające kryteria zapytania.Można to zobaczyć, patrząc na
$found_posts
i$max_num_pages
właściwości zapytania. Weźmy przykład:Masz 20 postów należących do domyślnego typu postu
post
. Ty tylko potrzebujesz najnowszych 5 posty bez paginacji. Twoje zapytanie wygląda następującovar_dump( $q->posts )
da ci 5 najnowszych postów zgodnie z oczekiwaniamiecho $q->found_posts
da tobie20
echo $q->max_num_pages
da tobie4
Wpływ tej dodatkowej pracy jest minimalny na witryny zawierające tylko kilka postów, ale może to być kosztowne, jeśli prowadzisz witrynę z setkami lub tysiącami postów. Jest to marnowanie zasobów, jeśli kiedykolwiek będziesz potrzebować tylko 5 najnowszych postów
Istnieje nieudokumentowany parametr o nazwie,
no_found_rows
który używa wartości boolowskich, których można użyć do zwolnienia zapytania po znalezieniu 5 potrzebnych postów. Zmusi toWP_Query
nie szukać więcej postów spełniających kryteria po tym, jak pobierze liczbę zapytań. Ten parametr jest już wbudowanyget_posts
, dlategoget_posts
jest nieco szybszy niżWP_Query
chociażget_posts
używaWP_Query
Wniosek
Podsumowując, jeśli nie zamierzasz używać paginacji w zapytaniu, zawsze mądrze jest
'no_found_rows=true'
w zapytaniu przyspieszyć i zaoszczędzić na marnowaniu zasobów.źródło
Po rozmowie z @Pieter Goosen na temat komentarzy do pytania, myślę, że mogę odpowiedzieć na pytanie i wyjaśnić swój błąd.
Kluczem jest to, że
found_posts
mnie zaskoczył. Sądzę, że ta liczba to pobrane posty, ale nie jest. Jest to liczba postów spełniających kryteria . To tak, jakbyWP_Query
miał 2 części: jedną do znajdowania (wszystkich) postów, a drugą do pobierania zawartości, gdy sprawdzapagination
parametry. Mamy więc$post_count
właściwość, która jest liczbą pobranych postów (kodeks mówiThe number of posts being displayed
), która oczywiście jest równa liczbieposts_per_page
parametrów i liczbie elementów we$posts
właściwości tablicy.Więc
WP_Query
nie robi żadnej bezużytecznej pracy, jak myślałem ^^Mam nadzieję, że to pomaga innym!
źródło
Ok, pozwala ci mieć typ postu o nazwie „blog_posts” i chcesz pobrać 5 postów tego typu. Oto, co musisz zrobić
Powyższe zapytanie zwróci 5 postów typu „blog_posts”, jeśli nie jest to niestandardowy typ postów, po prostu zamień w ten sposób,
'post_type' => 'posts',
jeśli chcesz pobrać wszystkie posty, a następnie zamień w ten sposób'posts_per_page' => '-1',
, aby uzyskać więcej informacji Zapytanie WPźródło
Wiem, że @ user1750063 wspomniał o kodzie, ale spróbuj tego
źródło
id
jest niepoprawny jakoorderby
wartość ipagination
jest niepoprawnym parametrempagination
nie jest prawidłowym parametrem. Masz na myśli'nopaging' => true
? Jeśli tak, to dostanę WSZYSTKIE posty. Nie tego chcę. @PieterGoosen Myślę, że on ma na myśliID
.ID
, nieid