Memahami internal
Urutan "sort" dari posting yang berdekatan (berikutnya / sebelumnya) sebenarnya bukan "urutan". Ini adalah kueri terpisah pada setiap permintaan / halaman, tetapi mengurutkan kueri oleh post_date
- atau induk tulisan jika Anda memiliki posting hierarkis sebagai objek yang saat ini ditampilkan.
Ketika Anda melihat internal next_post_link()
, maka Anda melihat bahwa itu pada dasarnya adalah pembungkus API adjacent_post_link()
. Fungsi nanti memanggil secara get_adjacent_post()
internal dengan $previous
argumen / bendera diatur ke bool(true|false)
untuk mengambil tautan posting berikutnya atau sebelumnya.
Apa yang harus disaring?
Setelah menggali lebih dalam ke dalamnya, Anda akan melihat bahwa get_adjacent_post()
tautan Sumber memiliki beberapa filter bagus untuk hasilnya (alias hasil kueri): (Nama Filter / Argumen)
"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"`
Jadi Anda bisa melakukan banyak hal dengannya. Itu dimulai dengan memfilter WHERE
klausa, serta JOIN
tabel ed dan ORDER BY
pernyataan.
Hasilnya di-cache dalam memori untuk permintaan saat ini, sehingga tidak menambah kueri tambahan jika Anda memanggil fungsi itu beberapa kali pada satu halaman.
Pembuatan kueri otomatis
Seperti @StephenHarris tunjukkan dalam komentar, ada fungsi inti yang mungkin berguna ketika membangun SQL Query: get_meta_sql()
- Contoh dalam Codex . Pada dasarnya fungsi ini hanya digunakan untuk membangun pernyataan meta SQL yang digunakan WP_Query
, tetapi Anda dapat menggunakannya dalam kasus ini (atau orang lain) juga. Argumen yang Anda lemparkan ke dalamnya adalah array, sama persis yang akan ditambahkan ke WP_Query
.
$meta_sql = get_meta_sql(
$meta_query,
'post',
$wpdb->posts,
'ID'
);
Nilai kembali adalah array:
$sql => (array) 'join' => array(),
(array) 'where' => array()
Jadi, Anda dapat menggunakan $sql['join']
dan $sql['where']
dalam panggilan balik Anda.
Ketergantungan yang perlu diingat
Dalam kasus Anda, hal yang paling mudah adalah mencegatnya dalam plugin kecil (mu) atau dalam file functions.php tema Anda dan mengubahnya tergantung pada $adjacent = $previous ? 'previous' : 'next';
variabel dan $order = $previous ? 'DESC' : 'ASC';
variabel:
Nama filter yang sebenarnya
Jadi nama filternya adalah:
get_previous_post_join
, get_next_post_join
get_previous_post_where
, get_next_post_where
get_previous_post_sort
, get_next_post_sort
Dibungkus sebagai plugin
... dan panggilan balik filter akan menjadi (misalnya) sesuatu seperti berikut ini:
<?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' );