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ługpost_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 API adjacent_post_link()
. Późniejsza funkcja wywołuje get_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"
$join
// Only if `$in_same_cat`
// or: ! empty( $excluded_categories`
// and then:
// " INNER JOIN $wpdb->term_relationships AS tr
// ON p.ID = tr.object_id
// INNER JOIN $wpdb->term_taxonomy tt
// ON tr.term_taxonomy_id = tt.term_taxonomy_id";
// and if $in_same_cat then it APPENDS:
// " AND tt.taxonomy = 'category'
// AND tt.term_id IN (" . implode(',', $cat_array) . ")";
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_where"
$wpdb->prepare(
// $op = $previous ? '<' : '>'; | $current_post_date
"WHERE p.post_date $op %s "
// $post->post_type
."AND p.post_type = %s "
// $posts_in_ex_cats_sql = " AND tt.taxonomy = 'category'
// AND tt.term_id NOT IN (" . implode($excluded_categories, ',') . ')';
// OR empty string if $in_same_cat || ! empty( $excluded_categories
."AND p.post_status = 'publish' $posts_in_ex_cats_sql "
",
$current_post_date,
$post->post_type
)
$in_same_cat
$excluded_categories
"get_{$adjacent}_post_sort"
"ORDER BY p.post_date $order LIMIT 1"`
Możesz więc dużo z tym zrobić . Zaczyna się od filtrowania WHERE
klauzuli, a także JOIN
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ę przydaje WP_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 przypadku WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
Zwracana wartość to tablica:
$sql => (array) 'join' => array(),
(array) 'where' => array()
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:
<?php
/** Plugin Name: (#73190) Alter adjacent post link sort order */
function wpse73190_adjacent_post_sort( $orderby )
{
return "ORDER BY p.menu_order DESC LIMIT 1";
}
add_filter( 'get_previous_post_sort', 'wpse73190_adjacent_post_sort' );
add_filter( 'get_next_post_sort', 'wpse73190_adjacent_post_sort' );