Hiểu nội bộ
Thứ tự "sắp xếp" của các bài viết liền kề (tiếp theo / trước) không thực sự là một "thứ tự" sắp xếp. Đó là một truy vấn riêng biệt trên mỗi yêu cầu / trang, nhưng nó sắp xếp truy vấn theo post_date
- hoặc phụ huynh bài đăng nếu bạn có một bài đăng phân cấp như đối tượng hiện được hiển thị.
Khi bạn nhìn vào phần bên trong next_post_link()
, thì bạn sẽ thấy rằng về cơ bản nó là một trình bao bọc API cho adjacent_post_link()
. Hàm sau gọi get_adjacent_post()
nội bộ với $previous
đối số / cờ được đặt bool(true|false)
để lấy liên kết bài đăng tiếp theo hoặc trước đó.
Lọc cái gì?
Sau khi tìm hiểu sâu hơn về nó, bạn sẽ thấy get_adjacent_post()
liên kết Nguồn có một số bộ lọc đẹp cho đầu ra của nó (còn gọi là kết quả truy vấn): (Tên bộ lọc / Đối số)
"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"`
Vì vậy, bạn có thể làm rất nhiều với nó. Điều đó bắt đầu với việc lọc WHERE
mệnh đề, cũng như JOIN
bảng ed và ORDER BY
câu lệnh.
Kết quả được lưu trong bộ nhớ cho yêu cầu hiện tại, do đó, nó không thêm các truy vấn bổ sung nếu bạn gọi hàm đó nhiều lần trên một trang.
Xây dựng truy vấn tự động
Như @StephenHarris đã chỉ ra trong các bình luận, có một chức năng cốt lõi có thể có ích khi xây dựng Truy vấn SQL: get_meta_sql()
- Ví dụ trong Codex . Về cơ bản, hàm này chỉ được sử dụng để xây dựng câu lệnh meta SQL được sử dụng WP_Query
, nhưng bạn cũng có thể sử dụng nó trong trường hợp này (hoặc những thứ khác). Đối số mà bạn ném vào nó là một mảng, chính xác sẽ thêm vào a WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
Giá trị trả về là một mảng:
$sql => (array) 'join' => array(),
(array) 'where' => array()
Vì vậy, bạn có thể sử dụng $sql['join']
và $sql['where']
trong cuộc gọi lại của bạn.
Phụ thuộc vào ghi nhớ
Trong trường hợp của bạn, điều dễ nhất là chặn nó trong một plugin (mu) nhỏ hoặc trong tệp tin.php của chủ đề và thay đổi tùy thuộc vào $adjacent = $previous ? 'previous' : 'next';
biến và $order = $previous ? 'DESC' : 'ASC';
biến:
Tên bộ lọc thực tế
Vì vậy, tên bộ lọc là:
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
Được gói như một plugin
... và cuộc gọi lại bộ lọc sẽ là (ví dụ) một cái gì đó như sau:
<?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' );