Розуміння внутрішніх справ
Порядок "сортування" сусідніх (наступних / попередніх) публікацій насправді не є своєрідним "порядком". Це окремий запит для кожного запиту / сторінки, але він сортує запит по post_date
- або батьківському запису, якщо у вас є ієрархічна публікація як відображається в даний час об'єкт.
Коли ви подивитесь на внутрішні пристрої next_post_link()
, то побачите, що це в основному обгортка API adjacent_post_link()
. Пізніша функція викликає get_adjacent_post()
внутрішньо з встановленим $previous
аргументом / прапором, bool(true|false)
щоб захопити наступне або попереднє посилання.
Що фільтрувати?
Заглибившись у нього, ви побачите, що get_adjacent_post()
джерело посилання має декілька приємних фільтрів для його виведення (aka результат запиту): (Назва фільтра / аргументи)
"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"`
Таким чином, ви можете зробити багато з цим. Це починається з фільтрації WHERE
пункту, а також JOIN
таблиці ed та ORDER BY
заяви.
Результат отримує кеш-пам'ять для поточного запиту, тому він не додає додаткових запитів, якщо ви зателефонуєте до цієї функції кілька разів на одній сторінці.
Автоматична побудова запитів
Як в коментарях зазначав @StephenHarris , є основна функція, яка може стати в нагоді при побудові запиту SQL: get_meta_sql()
- Приклади в Codex . В основному ця функція використовується просто для створення мета-оператора SQL, який використовується WP_Query
, але ви можете використовувати його і в цьому випадку (або інших). Аргумент, який ви кидаєте в нього - це масив, саме той самий, який додав би до WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
Повернене значення - це масив:
$sql => (array) 'join' => array(),
(array) 'where' => array()
Таким чином, ви можете використовувати $sql['join']
і $sql['where']
у зворотному дзвінку.
Залежності, які слід пам’ятати
У вашому випадку найпростіше було б перехопити його у невеликому (mu) плагіні чи у вашому файлі themes.php та змінити його залежно від $adjacent = $previous ? 'previous' : 'next';
змінної та $order = $previous ? 'DESC' : 'ASC';
змінної:
Фактичні назви фільтрів
Отже, назви фільтрів:
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
Загорнутий як плагін
... і зворотний виклик фільтра буде (наприклад) приблизно таким:
<?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' );