Saya memiliki serangkaian posting yang diurutkan berdasarkan nilai meta_key. Mereka juga bisa diatur oleh urutan menu, jika perlu.
Tautan pos berikutnya / sebelumnya (dihasilkan oleh next_post_link
,, previous_post_link
atau posts_nav_link
semua dinavigasi oleh kronologi. Meskipun saya memahami perilaku default ini, saya tidak mengerti bagaimana mengubahnya. Saya menemukan bahwa ia memetakan melalui proximity_post_link di link-template.php, tetapi kemudian mulai tampak agak sulit dikodekan. Dianjurkan untuk menulis ulang ini dari awal untuk menggantinya, atau apakah ada solusi yang lebih baik.
custom-post-types
post-meta
sort
next-post-link
previous-post-link
Jodi Warren
sumber
sumber
Jawaban:
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 APIadjacent_post_link()
. Fungsi nanti memanggil secaraget_adjacent_post()
internal dengan$previous
argumen / bendera diatur kebool(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"
"get_{$adjacent}_post_where"
"get_{$adjacent}_post_sort"
Jadi Anda bisa melakukan banyak hal dengannya. Itu dimulai dengan memfilter
WHERE
klausa, sertaJOIN
tabel ed danORDER 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 digunakanWP_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 keWP_Query
.Nilai kembali adalah 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:
sumber
get_meta_sql()
$meta_query
hanya array yang akan Anda berikanWP_Query
untukmeta_query
argumen,: Dalam contoh ini:$meta_sql = get_meta_sql( $meta_query, 'post', $wpdb->posts, 'ID');
- ini menghasilkanJOIN
danWHERE
bagian dari kueri yang perlu ditambahkan.Jawaban Kaiser luar biasa dan teliti, namun hanya mengubah klausa ORDER BY tidak cukup kecuali Anda
menu_order
cocok dengan urutan kronologis Anda.Saya tidak dapat mengambil kredit untuk ini, tetapi saya menemukan kode berikut di intisari ini :
Saya telah memodifikasi nama fungsi untuk WP.SE.
Jika Anda hanya mengubah klausa ORDER BY, kueri masih mencari posting yang lebih besar atau kurang dari tanggal posting saat ini. Jika posting Anda tidak dalam urutan kronologis, Anda tidak akan mendapatkan posting yang tepat.
Ini mengubah klausa mana untuk mencari posting di mana menu_order lebih besar dari atau kurang dari menu_order posting saat ini, di samping memodifikasi klausa orderby.
Klausa orderby juga tidak boleh dikodekan untuk menggunakan DESC karena harus beralih berdasarkan apakah Anda mendapatkan tautan posting berikutnya atau sebelumnya.
sumber
WHERE
Klausa mencari'YYYY-mm-dd HH:mm:ss'
. Jika itu tidak terpenuhi, itu tidak akan berhasil. Karena nilainya tidak ditentukan oleh DB, tetapi oleh Aplikasi, Anda harus memeriksa format itu terlebih dahulu saat membangun ekspresi Reguler.Mencoba masuk tanpa hasil. Mungkin hanya masalah konfigurasi saya, tetapi bagi mereka yang tidak dapat membuat hook bekerja, berikut adalah solusi paling sederhana:
sumber
get_previous_post_where
,get_previous_post_join
danget_previous_post_sort
bermain bagus dengan tipe posting khusus dan pemesanan kompleks yang mencakup kunci meta, saya menyerah dan menggunakan ini. Terima kasih!sumber
Berdasarkan jawaban @Szabolcs Páll, saya telah membuat kelas utilitas ini dengan metode pembantu untuk bisa mendapatkan postingan dari tipe berdasarkan urutan menu dan mendapatkan postingan berikutnya dan sebelumnya berdasarkan urutan menu juga. Saya juga menambahkan kondisi untuk memeriksa apakah posting saat ini adalah posting pertama atau terakhir untuk mendapatkan posting terakhir atau pertama masing-masing.
Sebagai contoh:
Kelas lengkap:
sumber
Saya menemukan plugin kecil ini sangat berguna: http://wordpress.org/plugins/wp-query-powered-adjacent-post-link/
sumber
Ini bekerja untuk saya:
Diambil dari: https://stackoverflow.com/questions/16495117/how-to-skip-certain-links-on-adjacent-posts-in-wordpress
sumber
Saya telah menemukan cara yang jauh lebih mudah untuk mencapai navigasi posting berbasis meta-key, tanpa perlu memodifikasi functions.php.
Contoh saya: Anda memiliki products.php dan Anda ingin beralih antar produk. Produk sebelumnya adalah yang lebih murah berikutnya, produk berikutnya yang berikutnya lebih mahal.
Inilah solusi saya untuk single.php :
sumber
query_posts
ketika codex menyatakan itu tidak boleh digunakan.WP_Query
harus digunakan seperti pada jawaban sebelumnya.