ลิงก์ถาวร: ประเภทโพสต์ที่กำหนดเอง -> taxonomy ที่กำหนดเอง -> โพสต์


38

ฉันมีปัญหาในการทำงานกับ WordPress เขียนกฎใหม่และสามารถใช้ความช่วยเหลือได้บ้าง

_shows_ฉันมีประเภทโพสต์ที่กำหนดเองที่เรียกว่า

รายการทั้งหมดมีหมวดหมู่ taxonomy ที่กำหนดเองเดียว_show-category_.A _show_จะไม่มีมากกว่าหนึ่ง_show-category_รายการ

ฉันต้องการให้ URL ของฉันไปยังเส้นทางในลักษณะนี้:

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

เพื่อเป็นตัวอย่างในโลกแห่งความเป็นจริงสมมติว่าเรามี_show-category_"Foo" และ_show_โพสต์ชื่อ "บาร์" ที่มี "Foo" เหมือน_show-category_เดิม ฉันคาดว่าแอพ WordPress ของฉันจะมีลักษณะเช่นนี้:

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

ฉันพยายามหลีกเลี่ยงปลั๊กอินเมื่อเป็นไปได้ แต่ฉันเปิดให้โซลูชันใด ๆ


1
เพียงแค่ชี้ให้คุณสิ่งที่ฉันต้องทำก่อน .. wordpress.stackexchange.com/questions/102246/
reikyoushin

คำตอบ:


70

ขั้นแรกลงทะเบียนอนุกรมวิธานของคุณและตั้งค่าslugอาร์กิวเมนต์ของrewriteเป็นshows:

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

ถัดไปลงทะเบียนประเภทโพสต์ของคุณและตั้งค่ากระสุนเป็นshows/%show_category%และตั้งค่าhas_archiveอาร์กิวเมนต์เป็นshows:

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

สุดท้ายให้เพิ่มตัวกรองเพื่อpost_type_linkแทนที่หมวดหมู่การแสดงในการแสดงแต่ละรายการ:

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 );

แก้ไข

ลืมhas_archiveข้อโต้แย้งของข้างต้นที่ควรจะกำหนดให้register_post_typeshows


1
ไมโลขอขอบคุณ! ตัวกรอง post_type_link เป็นชิ้นส่วนที่ขาดหายไปสำหรับฉัน ทุกคนที่อ่านหัวข้อนี้ที่มีปัญหาเดียวกันสิ่งเดียวที่ทราบคือมีความผิดพลาดเล็กน้อยในฟังก์ชั่น wpa_show_permalinks โดยที่ $ post-> post_type == 'แสดง' ควรเป็น 'แสดง' ขอขอบคุณอีกครั้งไมโล!
พอล T

1
@milo, มาจากwordpress.stackexchange.com/questions/199456/… , ฉันลงจอด404ด้วยวิธีนี้ต่อไป โครงสร้างลิงก์ถาวรของฉันคือ%category%/%postname%
แอทติคัส

4
หากคุณกำลังเปลี่ยนแปลงอินสแตนซ์ของ WordPress ที่มีอยู่ตรวจสอบให้แน่ใจว่าคุณไปที่การตั้งค่า> ลิงก์และคลิกบันทึก การเปลี่ยนแปลงที่คุณทำในฟังก์ชั่น PHP จะไม่มีผลจนกว่าคุณจะทำ
เจย์นีลี

2
วิธีนี้ใช้ได้ผลสำหรับฉันในการที่ taxonomy แสดงบนหน้าประเภทโพสต์ / post_type / taxonomy / เป็นหน้าที่ถูกต้องตามกฎหมาย (ก่อนหน้านี้ 404) แต่ของฉัน / post_type / taxonomy / โพสต์คือ 404 ฉันสังเกตเห็นเมื่อลงทะเบียน taxonomy ด้านบนทั้ง "show_category", "show" ถูกลงทะเบียนแม้ว่าจะมีเพียง show_category เท่านั้นที่เป็น taxonomy ฉันลงทะเบียนอนุกรมวิธานเท่านั้น
justinavery

4
@ มีหลายวิธีที่จะให้เรื่องนี้ทำงานร่วมกับภาษีย่อยเช่นรายการ / ภาษี / ภาษีย่อย / โพสต์?
Benn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.