Mam serię postów uporządkowanych według wartości meta_key. W razie potrzeby można je również uporządkować według kolejności menu.
Linki do następnego / poprzedniego postu (generowane przez next_post_link
, previous_post_link
lub posts_nav_link
wszystkie nawigują według chronologii. Chociaż rozumiem to domyślne zachowanie, nie rozumiem, jak to zmienić. Stwierdziłem, że mapuje ono na sąsiedni_post_link w link-template.php, ale wtedy zaczyna się wydawać dość mocno zakodowany. Czy zaleca się przepisanie tego od zera, aby go zastąpić, czy też istnieje lepsze rozwiązanie.
custom-post-types
post-meta
sort
next-post-link
previous-post-link
Jodi Warren
źródło
źródło
Odpowiedzi:
Zrozumienie elementów wewnętrznych
Kolejność „sortowania” sąsiednich (następnych / poprzednich) postów nie jest tak naprawdę „kolejnością” sortowania. Jest to osobne zapytanie dla każdego żądania / strony, ale sortuje zapytanie według
post_date
- lub pocztowego rodzica, jeśli masz hierarchiczną posadę aktualnie wyświetlanego obiektu.Kiedy spojrzysz na elementy wewnętrzne
next_post_link()
, zobaczysz, że jest to po prostu opakowanie APIadjacent_post_link()
. Późniejsza funkcja wywołujeget_adjacent_post()
wewnętrznie z ustawionym$previous
argumentem / flagąbool(true|false)
aby pobrać link do następnego lub poprzedniego postu.Co filtrować?
Po głębszym zagłębieniu się w niego zobaczysz, że
get_adjacent_post()
link źródłowy ma kilka ładnych filtrów dla swojego wyniku (inaczej wynik zapytania): (Nazwa filtru / Argumenty)"get_{$adjacent}_post_join"
"get_{$adjacent}_post_where"
"get_{$adjacent}_post_sort"
Możesz więc dużo z tym zrobić . Zaczyna się od filtrowania
WHERE
klauzuli, a takżeJOIN
tabeli ed i plikuORDER BY
instrukcji.Wynik jest buforowany w pamięci dla bieżącego żądania, więc nie dodaje dodatkowych zapytań, jeśli wywołasz tę funkcję wiele razy na jednej stronie.
Automatyczne budowanie zapytań
Jak zauważył @StephenHarris w komentarzach, istnieje podstawowa funkcja, która może się przydać podczas budowania zapytania SQL:
get_meta_sql()
- Przykłady w Kodeksie . Zasadniczo ta funkcja służy tylko do budowania meta-SQL instrukcji, do której się przydajeWP_Query
, ale możesz jej użyć również w tym przypadku (lub innych). Argument, który do niego wrzucisz, to tablica, dokładnie taka sama, jak w przypadkuWP_Query
.Zwracana wartość to tablica:
Więc możesz użyć
$sql['join']
i$sql['where']
w zwrotnego.Zależności, o których należy pamiętać
W twoim przypadku najłatwiej byłoby przechwycić go w małej wtyczce (mu) lub w pliku motywów funkcji.php i zmienić w zależności od
$adjacent = $previous ? 'previous' : 'next';
zmiennej i$order = $previous ? 'DESC' : 'ASC';
zmiennej:Rzeczywiste nazwy filtrów
Więc nazwy filtrów to:
get_previous_post_join
,get_next_post_join
get_previous_post_where
,get_next_post_where
get_previous_post_sort
,get_next_post_sort
Zapakowane jako wtyczka
... a wywołanie zwrotne filtra byłoby (na przykład) czymś w rodzaju:
źródło
get_meta_sql()
$meta_query
jest tylko tablica chcielibyśmy podaćWP_Query
dlameta_query
argument: W tym przykładzie:$meta_sql = get_meta_sql( $meta_query, 'post', $wpdb->posts, 'ID');
- to generujeJOIN
iWHERE
części zapytania, które muszą zostać dodane.Odpowiedź Kaiser jest niesamowita i dokładna, jednak sama zmiana klauzuli ORDER BY nie wystarczy, chyba że
menu_order
pasuje do kolejności chronologicznej.Nie mogę tego przypisać, ale w tej liście znalazłem następujący kod :
Zmodyfikowałem nazwy funkcji dla WP.SE.
Jeśli zmienisz tylko klauzulę ORDER BY, zapytanie nadal będzie wyszukiwać posty większe lub mniejsze niż bieżąca data ogłoszenia. Jeśli Twoje posty nie są uporządkowane chronologicznie, nie dostaniesz właściwego postu.
To zmienia klauzulę where, aby szukać postów, w których menu_order jest większy lub mniejszy niż menu_order bieżącego postu, oprócz modyfikowania klauzuli orderby.
Klauzula orderby również nie powinna być zakodowana na stałe, aby używać DESC, ponieważ będzie musiała się przełączać w zależności od tego, czy otrzymujesz link do następnego czy poprzedniego postu.
źródło
WHERE
klauzula wygląda'YYYY-mm-dd HH:mm:ss'
. Jeśli to nie zostanie spełnione, nie będzie działać. Ponieważ wartość nie jest ustawiona przez DB, ale przez Aplikację, będziesz musiał najpierw sprawdzić ten format podczas budowania wyrażenia Regular.Próbowałem podłączyć się bez powodzenia. Może to być tylko problem z moją konfiguracją, ale dla tych, którzy nie mogą sprawić, by hak działał, oto najprostsze rozwiązanie:
źródło
get_previous_post_where
,get_previous_post_join
aget_previous_post_sort
do gry ładne z niestandardowych typów pocztowych i kompleksowego uporządkowania, który zawiera klucze meta, dałem się i użył tego. Dzięki!źródło
Na podstawie odpowiedzi @Szabolcs Páll Utworzyłem tę klasę użytkową z metod pomocniczych, aby móc uzyskać wiadomości typu według kolejności menu i dostać następny i poprzedni post przez kolejności menu, jak również. Dodatkowo dodałem warunki, aby sprawdzić, czy bieżący post jest pierwszym lub ostatnim postem, aby uzyskać odpowiednio ostatni lub pierwszy post.
Na przykład:
Pełna klasa:
źródło
Uważam, że ta mała wtyczka jest naprawdę przydatna: http://wordpress.org/plugins/wp-query-powered-adjacent-post-link/
źródło
To działało dla mnie:
Zaczerpnięte z: https://stackoverflow.com/questions/16495117/how-to-skip-certain-links-on-adjacent-posts-in-wordpress
źródło
Znalazłem znacznie łatwiejszy sposób na osiągnięcie nawigacji postowej opartej na meta-klawiszach, bez potrzeby modyfikowania funkcji.php.
Mój przykład: masz products.php i chcesz przełączać się między produktami. Poprzedni produkt jest kolejnym tańszym, następny produkt kolejnym droższym.
Oto moje rozwiązanie dla single.php :
źródło
query_posts
gdy kodeks stwierdza, że nie należy go używać.WP_Query
należy stosować jak w poprzednich odpowiedziach.