it-swarm-id.com

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

Saya telah menyisir situs ini dan google untuk jawabannya dan saya sudah benar-benar kosong. Pada dasarnya saya ingin melakukan persis apa posting ini bertanya, tapi saya perlu taksonomi hirarkis. 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 melakukannya dengan baik 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 postingan jenis posting kustom muncul 404. Jika saya menghapus bagian 'hierarchical' => true maka tulisan berfungsi, tetapi saya kehilangan url hierarki (hanya/basename/grandchild-cat/post-name/works).

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

53
Jeff

Setelah menggabungkan banyak jawaban, saya berhasil! Jadi, inilah solusi bagi Anda yang berjuang dengan ini juga:

Posting ini dan yang 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 file functions.php Anda.

Pertama, buat siput Anda dengan benar ketika mendefinisikan jenis dan taksonomi pos kustom Anda: untuk jenis pos kustom harus basename/%taxonomy_name% dan siput untuk taksonomi Anda harus hanya basename. Jangan lupa juga menambahkan 'hierarchical' => true ke array penulisan ulang taksonomi untuk mendapatkan istilah yang disarangkan di url Anda. Pastikan juga query_var diatur ke 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 akan ditambahkan (tanyakan kepada saya jika Anda memerlukan bantuan 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 memungkinkan workpress cara menangani %taxonomy_name% dalam struktur tipe tulis ulang penulisan slug:

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 pada get_category_parents milik Wordpress:

// 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 semacam widget taksonomi plugin untuk menampilkan kategori bersarang di bilah sisi.

Semoga itu bisa membantu Anda!

68
Jeff

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

Pembuatan aturan mengikuti fungsi rekursif .

2
vmassuchetto