Mam 3 kategorie z każdym 15 postów, chcę wykonać JEDNE zapytanie do bazy danych, przynosząc tylko 5 pierwszych postów dla każdej kategorii, jak mogę to zrobić?
$q = new WP_Query(array( 'post__in' => array(2,4,8), 'posts_per_page' => **FIRST_5_OF_EACH_CAT** ));
W przypadku, gdy nie jest to możliwe, co jest bardziej wydajne, pobieranie wszystkich postów dla kategorii nadrzędnej i przechodzenie między nimi lub tworzenie 3 różnych zapytań?
query-posts
Amit
źródło
źródło
Odpowiedzi:
To, czego chcesz, jest możliwe, ale wymaga zagłębiania się w SQL, którego lubię unikać, gdy tylko jest to możliwe (nie dlatego, że nie wiem, jestem zaawansowanym programistą SQL, ale dlatego, że w WordPress chcesz używać interfejsu API, gdy tylko jest to możliwe aby zminimalizować przyszłe problemy ze zgodnością związane z przyszłymi potencjalnymi zmianami struktury bazy danych).
SQL z
UNION
operatorem to możliwośćAby użyć SQL czego potrzebujesz to
UNION
operator w zapytaniu, coś takiego zakładając kategorię ślimaki są"category-1"
,"category-1"
i"category-3"
:Możesz użyć SQL UNION z
posts_join
filtremKorzystając z powyższego, możesz po prostu bezpośrednio nawiązać połączenie lub użyć
posts_join
haka filtrującego w następujący sposób; Uwaga: Używam heredoc PHP, więc upewnij się, żeSQL;
pozostało kolor. Zauważ też, że użyłem globalnego var, aby umożliwić ci zdefiniowanie kategorii poza hakiem, umieszczając informacje o kategorii w tablicy. Możesz umieścić ten kod we wtyczce lub wfunctions.php
pliku motywu :Ale mogą wystąpić skutki uboczne
Oczywiście użycie haków do modyfikacji zapytań, jak
posts_join
zawsze, wywołuje skutki uboczne, ponieważ działają one globalnie na zapytania, a zatem zwykle trzeba zawinąć modyfikacje w taki,if
który używa go tylko wtedy, gdy jest to potrzebne, a kryteria, które należy przetestować, mogą być trudne.Zamiast tego skupić się na optymalizacji?
Zakładam jednak, że twoje pytanie dotyczy bardziej optymalizacji niż możliwości wykonania zapytania z 5 najlepszych czasów 3, prawda? Jeśli tak jest, to może istnieją inne opcje korzystające z interfejsu API WordPress?
Lepiej używać przejściowego interfejsu API do buforowania?
Zakładam, że twoje posty nie będą się tak często zmieniać, prawda? Co się stanie, jeśli zaakceptujesz trzy (3) trafienia kwerendy okresowo, a następnie buforujesz wyniki przy użyciu interfejsu Transients API ? Otrzymasz łatwy do utrzymania kod i doskonałą wydajność; znacznie lepiej niż
UNION
powyższe zapytanie, ponieważ WordPress przechowuje listy postów jako szeregową tablicę w jednym rekordziewp_options
tabeli.Możesz wziąć następujący przykład i wpaść do katalogu głównego swojej witryny,
test.php
aby to przetestować:Podsumowanie
Chociaż tak, możesz zrobić to, o co prosiłeś, używając
UNION
zapytania SQL iposts_join
haka filtru, ale prawdopodobnie lepiej zaoferować użycie buforowania z Transient API .Mam nadzieję że to pomoże?
źródło
WP_Query()
nie obsługuje czegoś takiego jak First X For Each Cat . Zamiast tegoWP_Query()
możesz użyćget_posts()
każdej ze swoich kategorii, powiedzmy trzy razy:$posts
teraz zawiera pierwsze pięć postów dla każdej kategorii.źródło
Nie znam sposobu na uzyskanie pierwszych pięciu postów dla każdej kategorii w jednym zapytaniu. Jeśli kiedykolwiek będziesz mieć tylko 45 postów, to trafienie do bazy danych raz i uzyskanie pięciu postów dla każdej kategorii jest prawdopodobnie najbardziej wydajnym podejściem. Trzykrotne trafienie do bazy danych i połączenie wyników nie jest złą rzeczą.
źródło