Permalinks: jenis kiriman khusus -> taksonomi khusus -> kiriman

39

Saya mengalami kesulitan bekerja dengan aturan penulisan ulang WordPress, dan dapat menggunakan bantuan.

Saya memiliki jenis posting khusus yang disebut _shows_.

Semua acara memiliki kategori taksonomi tunggal tunggal _show-category_.A _show_tidak akan pernah memiliki lebih dari satu _show-category_.

Saya ingin url saya merutekan dengan cara ini:

www.mysite.com/shows/  =>  archive-shows.php

www.mysite.com/shows/%category%/ => taxonomy-show-category.php

www.mysite.com/shows/%category%/%postname%/ => single-shows.php

Jadi sebagai contoh dunia nyata, katakanlah kita memiliki _show-category_"Foo" dan _show_posting berjudul "Bar" yang memiliki "Foo" seperti itu _show-category_. Saya berharap aplikasi WordPress saya terlihat seperti ini:

www.mysite.com/shows/foo/ => shows all posts under the foo category
www.mysite.com/shows/foo/bar => shows the indivual post

Saya mencoba menghindari plugin jika memungkinkan, tetapi saya terbuka untuk solusi apa pun.

Paul T
sumber
1
hanya mengarahkan Anda ke sesuatu yang harus saya lakukan sebelumnya .. wordpress.stackexchange.com/questions/102246/…
reikyoushin

Jawaban:

70

Pertama, daftarkan taksonomi Anda dan tentukan slugargumen rewriteuntuk shows:

register_taxonomy(
    'show_category',
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows', 'with_front' => false ),
        // your other args...
    )
);

Selanjutnya, daftarkan jenis posting Anda dan atur siput ke shows/%show_category%, dan atur has_archiveargumen ke shows:

register_post_type(
    'show',
    array(
        'rewrite' => array( 'slug' => 'shows/%show_category%', 'with_front' => false ),
        'has_archive' => 'shows',
        // your other args...
    )
);

Terakhir, tambahkan filter post_type_linkuntuk menggantikan kategori acara di permalinks acara individual:

function wpa_show_permalinks( $post_link, $post ){
    if ( is_object( $post ) && $post->post_type == 'show' ){
        $terms = wp_get_object_terms( $post->ID, 'show_category' );
        if( $terms ){
            return str_replace( '%show_category%' , $terms[0]->slug , $post_link );
        }
    }
    return $post_link;
}
add_filter( 'post_type_link', 'wpa_show_permalinks', 1, 2 );

EDIT

Lupa has_archiveargumen di register_post_typeatas, itu harus diatur ke shows.

Milo
sumber
1
Milo, terima kasih! Filter post_type_link adalah bagian yang hilang untuk saya. Siapa pun yang membaca utas ini dengan masalah yang sama, satu-satunya hal yang perlu diperhatikan adalah ada kesalahan kecil pada fungsi wpa_show_permalinks, di mana $ post-> post_type == 'show' sebenarnya harus 'shows'. Terima kasih lagi Milo!
Paul T
4
Jika Anda membuat perubahan ke instance WordPress yang ada, pastikan Anda pergi ke Pengaturan> Permalinks dan klik simpan. Perubahan yang Anda buat di functions.php tidak akan berlaku hingga Anda melakukannya.
Jay Neely
2
Ini hampir berhasil bagi saya karena taksonomi ditampilkan pada halaman jenis posting, / post_type / taxonomy / adalah halaman yang sah (sebelumnya 404) tetapi / post_type / taksonomi / postingan saya adalah 404'ing. Saya perhatikan ketika mendaftarkan taksonomi di atas "show_category", "show" sedang didaftarkan, meskipun hanya show_category yang merupakan taksonomi. Saya hanya mendaftarkan taksonomi.
justinavery
4
@ Moo cara apa saja untuk membuatnya bekerja dengan sub pajak seperti pertunjukkan / pajak / subtax / posting?
Benn
2
Saya sangat berharap ini akan bekerja untuk saya juga tetapi setiap tunggal berakhir pada 404 ....
Beee