Cara membuat struktur tautan permanen dengan taksonomi khusus dan jenis pos kustom seperti nama dasar / pajak orang tua / pajak anak / bea-jenis-nama pos

53

Saya telah menyisir situs ini dan google untuk jawabannya dan saya sudah benar-benar kosong. Pada dasarnya saya ingin melakukan persis apa yang diminta posting ini , tetapi saya perlu taksonomi hierarkis. Jawaban yang diberikan di pos itu bekerja dengan baik, tetapi hanya dengan taksonomi tingkat tunggal. Apakah mungkin untuk melakukan apa yang saya inginkan? Saya sudah mencoba jutaan hal, tetapi tidak ada yang berhasil, paling baik saya bisa mendapatkan permalink yang tepat tetapi mereka muncul 404.

Untuk menggambarkan secara visual apa yang saya inginkan:

/basename/ - ideally a page, but I think this will cause a permalink collision    
/basename/top-cat/ - top parent custom taxonomy archive    
/basename/top-cat/child-cat/ - child cat custom taxonomy archive     
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive    
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

Anda dapat melakukan ini dengan posting dan kategori bawaan, bagaimana Anda melakukannya dengan taksonomi khusus dan jenis posting kustom? Saya tahu bahwa Anda perlu menggunakan 'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),untuk mendapatkan siput hierarkis, yang berfungsi dengan baik pada halaman arsip, tetapi posting jenis posting kustom muncul 404. Jika saya menghapus 'hierarchical' => truebagian maka posting bekerja, tetapi saya kehilangan url hirarkis (hanya / basename / cucu-kucing / post-nama / karya).

Jadi, ada solusi? Terima kasih banyak, ini telah membuat saya gila selama sekitar 3 minggu sekarang.

Jeff
sumber

Jawaban:

68

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.phpfile 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' => trueke array penulisan ulang taksonomi untuk mendapatkan istilah bersarang di url Anda. Pastikan query_varjuga diatur truedalam 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!

Jeff
sumber
Memperbaiki-lihat pertanyaan. Jeff, terima kasih atas penjelasannya! Tetapi mungkinkah Anda mengirim posttype / taksonomi kustom? Jadi saya bisa melihat apa yang saya lakukan salah ? Akan sangat berterima kasih!
Reitze Bos
Hei Jeff, terima kasih atas jawaban Anda! Saya hampir sampai, setelah 4 jam berkelahi dengan ini. Satu-satunya masalah saya adalah saya mendapatkan tebasan ganda sebelum nama pos (karena ini: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) Dapatkah Anda membantu saya?
Cmorales
1
@Cmorales, Tidak yakin tanpa melihat kode Anda, tetapi mencari tempat di mana Anda secara manual mendefinisikan garis miring di depan nama posting Anda, seperti mungkin pendaftaran cpt slug atau dalam fungsi filter_post_type? Jika Anda tidak dapat melacak di mana Anda menambahkan garis miring tambahan maka Anda bisa menghapus karakter terakhir dari nilai yang dikembalikan dari fungsi get_taxonomy_parents yang disebut dengan filter_post_type_link, karena itu akan membuat Anda dengan garis miring, yang merupakan yang pertama dari ganda. Semoga berhasil.
Jeff
1
"Jika Anda akan 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 akan ditambahkan (tanyakan kepada saya jika Anda memerlukan bantuan itu) ... "Baiklah, bisakah Anda membantu saya? :)
Cmorales
2
^ itulah yang saya butuhkan. Adakah yang tahu bagaimana melakukannya? lihat pertanyaan saya di sini: wordpress.stackexchange.com/questions/102246/…
reikyoushin
2

Lihatlah plugin ini . Ini memberikan URL hierarkis untuk kategori, tetapi Anda dapat dengan mudah beradaptasi dengan taksonomi apa pun.

Pembuatan aturan mengikuti fungsi rekursif .

vmassuchetto
sumber
2
Plugin ini tidak lagi tersedia.
Enkode