Setelah menggabungkan banyak jawaban, saya berhasil! Jadi, inilah solusi bagi Anda yang berjuang dengan ini juga:
Posting ini dan yang satu ini membantu saya keluar, jadi terima kasih kepada mereka.
Catatan, semua kode ini, ditambah jenis pos kustom awal Anda dan kode registrasi taksonomi ada di functions.php
file Anda .
Pertama, buat siput Anda dengan benar ketika menentukan jenis dan taksonomi pos kustom Anda: untuk jenis pos kustom harus basename/%taxonomy_name%
dan siput untuk taksonomi Anda harus adil basename
. Jangan lupa juga menambahkan 'hierarchical' => true
ke array penulisan ulang taksonomi untuk mendapatkan istilah bersarang di url Anda. Pastikan query_var
juga diatur true
dalam kedua kasus.
Anda perlu menambahkan aturan penulisan ulang baru sehingga WordPress tahu bagaimana menafsirkan struktur url Anda. Dalam kasus saya, bagian jenis pos kustom dari uri akan selalu menjadi segmen uri ke-5, jadi saya menetapkan aturan pertandingan saya sesuai. Perhatikan bahwa Anda mungkin harus mengubah ini jika Anda menggunakan lebih banyak atau lebih sedikit segmen uri. Jika Anda memiliki berbagai tingkat istilah bersarang maka Anda harus menulis fungsi untuk memeriksa apakah segmen uri terakhir adalah jenis pos kustom atau istilah taksonomi untuk mengetahui aturan mana yang harus ditambahkan (tanyakan kepada saya jika Anda memerlukan bantuan untuk bahwa).
add_filter('rewrite_rules_array', 'mmp_rewrite_rules');
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules['basename/(.+)/(.+)/(.+)/(.+)/?$'] = 'index.php?custom_post_type_name=$matches[4]'; // my custom structure will always have the post name as the 5th uri segment
$newRules['basename/(.+)/?$'] = 'index.php?taxonomy_name=$matches[1]';
return array_merge($newRules, $rules);
}
Maka Anda perlu menambahkan kode ini untuk membiarkan workpress bagaimana menangani %taxonomy_name%
dalam struktur tipe tulis ulang kustom siput Anda:
function filter_post_type_link($link, $post)
{
if ($post->post_type != 'custom_post_type_name')
return $link;
if ($cats = get_the_terms($post->ID, 'taxonomy_name'))
{
$link = str_replace('%taxonomy_name%', get_taxonomy_parents(array_pop($cats)->term_id, 'taxonomy_name', false, '/', true), $link); // see custom function defined below
}
return $link;
}
add_filter('post_type_link', 'filter_post_type_link', 10, 2);
Saya membuat fungsi khusus berdasarkan milik Wordpress get_category_parents
:
// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = '/', $nicename = false, $visited = array()) {
$chain = '';
$parent = &get_term($id, $taxonomy);
if (is_wp_error($parent)) {
return $parent;
}
if ($nicename)
$name = $parent -> slug;
else
$name = $parent -> name;
if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {
$visited[] = $parent -> parent;
$chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
}
if ($link) {
// nothing, can't get this working :(
} else
$chain .= $name . $separator;
return $chain;
}
Maka Anda perlu membersihkan permalink Anda (cukup muat halaman pengaturan permalink Anda).
Sekarang semuanya 'harus' bekerja semoga! Pergi membuat banyak istilah taksonomi dan membuat sarang dengan benar, lalu buat beberapa posting jenis posting khusus dan kategorikan dengan benar. Anda juga dapat membuat halaman dengan siput basename
, dan semuanya harus bekerja seperti yang saya tentukan dalam pertanyaan saya. Anda mungkin ingin membuat beberapa halaman arsip taksonomi khusus untuk mengontrol tampilannya dan menambahkan beberapa jenis widget taksonomi untuk menampilkan kategori bersarang di bilah sisi.
Semoga itu bisa membantu Anda!
Lihatlah plugin ini . Ini memberikan URL hierarkis untuk kategori, tetapi Anda dapat dengan mudah beradaptasi dengan taksonomi apa pun.
Pembuatan aturan mengikuti fungsi rekursif .
sumber