วิธีสร้างโครงสร้าง Permalink ด้วย taxonomies ที่กำหนดเองและประเภทโพสต์ที่กำหนดเองเช่น base-name / parent-tax / child-tax / custom-post-type-name


53

ฉันตอบโต้ไซต์นี้และ google เพื่อหาคำตอบและฉันว่างเปล่าทั้งหมด โดยทั่วไปฉันต้องการทำสิ่งที่โพสต์นี้ถาม แต่ฉันต้องการอนุกรมวิธานแบบลำดับชั้น คำตอบที่ให้ไว้ในโพสต์นั้นใช้งานได้ดี แต่มีเพียง taxonomy ระดับเดียวเท่านั้น เป็นไปได้ไหมที่จะทำสิ่งที่ฉันต้องการ ฉันได้ลองทำสิ่งต่างๆนับล้าน แต่ไม่มีงานที่ดีที่สุดที่ฉันจะได้รับ permalinks ที่ถูกต้อง แต่พวกเขามา 404

หากต้องการแสดงให้เห็นถึงสิ่งที่ฉันต้องการ:

/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

คุณสามารถทำสิ่งนี้ได้ดีกับโพสต์และหมวดหมู่ในตัวคุณจะทำอย่างไรกับ taxonomies ที่กำหนดเองและประเภทโพสต์ที่กำหนดเอง? ฉันรู้ว่าคุณต้องใช้'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ),เพื่อรับทากแบบลำดับชั้นซึ่งทำงานได้ดีบนหน้าเก็บถาวร แต่โพสต์ประเภทโพสต์ที่กำหนดเองขึ้นมา 404 ถ้าฉันลบ'hierarchical' => trueส่วนแล้วโพสต์ทำงาน แต่ฉันสูญเสีย URL ลำดับชั้น (เฉพาะ / basename / grandchild-cat / post-name / works)

ดังนั้นการแก้ปัญหาใด ๆ ขอบคุณมากนี่ทำให้ฉันรู้สึกแย่เป็นเวลา 3 สัปดาห์แล้ว

คำตอบ:


68

หลังจากรวมคำตอบอื่น ๆ เข้าด้วยกันฉันก็ทำงานได้! ดังนั้นนี่คือทางออกสำหรับผู้ที่ดิ้นรนกับเรื่องนี้เช่นกัน:

โพสต์นี้และอันนี้ช่วยฉันออกมาบ้างขอบคุณคนเหล่านั้น

หมายเหตุรหัสทั้งหมดนี้รวมถึงประเภทโพสต์ที่กำหนดเองเริ่มต้นและรหัสการลงทะเบียน taxonomy จะอยู่ในfunctions.phpไฟล์ของคุณ

ครั้งแรกที่ได้รับกระสุนของคุณได้เมื่อกำหนดประเภทโพสต์ของคุณเองและ taxonomies: สำหรับโพสต์ที่กำหนดเองประเภทที่ควรจะเป็นและกระสุนสำหรับอนุกรมวิธานของคุณควรจะเป็นเพียงแค่basename/%taxonomy_name% basenameอย่าลืมเพิ่ม'hierarchical' => trueไปยังอาเรย์อนุกรมวิธานเขียนซ้ำเพื่อรับคำซ้อนใน URL ของคุณ ตรวจสอบให้แน่ใจว่าquery_varได้ตั้งค่าเป็นtrueทั้งสองกรณี

คุณต้องเพิ่มกฎการเขียนใหม่เพื่อให้ WordPress รู้วิธีตีความโครงสร้าง URL ของคุณ ในกรณีของฉันส่วนโพสต์ที่กำหนดเองของ uri จะเป็นเซ็กเมนต์ uri ที่ 5 เสมอดังนั้นฉันจึงกำหนดกฎการจับคู่ให้เหมาะสม โปรดทราบว่าคุณอาจต้องเปลี่ยนสิ่งนี้หากคุณใช้กลุ่ม uri มากขึ้นหรือน้อยลง หากคุณมีคำซ้อนหลายระดับคุณจะต้องเขียนฟังก์ชั่นเพื่อตรวจสอบว่าส่วน uri สุดท้ายคือประเภทโพสต์ที่กำหนดเองหรือคำศัพท์อนุกรมวิธานเพื่อทราบกฎที่จะเพิ่ม (ถามฉันว่าคุณต้องการความช่วยเหลือหรือไม่ ที่).

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

จากนั้นคุณต้องเพิ่มรหัสนี้เพื่อให้ workpress วิธีจัดการกับ%taxonomy_name%โครงสร้างโพสต์ชนิดเขียนทับแบบกำหนดเองของคุณ:

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

ฉันสร้างฟังก์ชั่นที่กำหนดเองตาม 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;    
}

จากนั้นคุณต้องล้างข้อมูลลิงก์ (เพียงโหลดหน้าการตั้งค่าลิงก์ถาวร)

ตอนนี้ทุกอย่าง 'ควร' ทำงานหวังว่า! ไปทำกลุ่มคำศัพท์อนุกรมวิธานและเรียงซ้อนอย่างถูกต้องจากนั้นสร้างโพสต์ประเภทโพสต์ที่กำหนดเองแล้วจัดหมวดหมู่ให้ถูกต้อง คุณยังสามารถสร้างหน้าด้วยกระสุนbasenameและทุกอย่างควรทำงานตามที่ฉันระบุในคำถามของฉัน คุณอาจต้องการสร้างหน้าที่เก็บถาวร taxonomy ที่กำหนดเองเพื่อควบคุมวิธีที่พวกเขาค้นหาและเพิ่มปลั๊กอินวิดเจ็ต taxonomyบางชนิดเพื่อแสดงหมวดหมู่ที่ซ้อนกันของคุณในแถบด้านข้าง

หวังว่าจะช่วยคุณ!


คงที่ - ดูคำถาม Jeff ขอบคุณสำหรับคำอธิบายของคุณ! แต่เป็นไปได้ไหมที่คุณจะสร้างโพสต์รูปแบบ / อนุกรมวิธานแบบกำหนดเอง? ดังนั้นฉันสามารถเห็นสิ่งที่ฉันทำผิด ? จะขอบคุณจริงๆ!
Reitze Bos

เฮ้เจฟฟ์ขอบคุณสำหรับคำตอบของคุณ! ฉันเกือบจะอยู่ที่นั่นหลังจาก 4 ชั่วโมงในการต่อสู้กับสิ่งนี้ ปัญหาเดียวของฉันคือฉันได้รับเครื่องหมายทับสองครั้งก่อนชื่อโพสต์ (เช่นนี้: portfolio / diseno-grafico-2 / logo // alquimia-sonora /) คุณช่วยฉันได้ไหม?
Cmorales

1
@ ผู้เขียนไม่แน่ใจว่าไม่เห็นรหัสของคุณ แต่มองหาสถานที่ที่คุณกำหนดสแลชด้วยตนเองก่อนชื่อโพสต์ของคุณเช่นการลงทะเบียน cug slug หรือฟังก์ชั่น filter_post_type? หากคุณไม่สามารถติดตามตำแหน่งที่คุณเพิ่มสแลชพิเศษคุณก็สามารถตัดอักขระตัวสุดท้ายจากค่าที่ส่งคืนของฟังก์ชัน get_taxonomy_parents ที่เรียกว่าใน filter_post_type_link เพราะนั่นจะทำให้คุณมีสแลชต่อท้ายซึ่งเป็นตัวแรกของ สองเท่า. โชคดี.
เจฟฟ์

1
"ถ้าคุณมีคำซ้อนหลายระดับคุณจะต้องเขียนฟังก์ชั่นเพื่อตรวจสอบว่าส่วน uri สุดท้ายคือประเภทโพสต์ที่กำหนดเองหรือคำศัพท์อนุกรมวิธานเพื่อทราบกฎที่จะเพิ่ม (ถามฉันว่าคุณต้องการความช่วยเหลือหรือไม่ บนนั้น) ... "เอาละคุณช่วยฉันหน่อยได้ไหม :)
Cmorales

2
^ นั่นคือสิ่งที่ฉันต้องการ ใครรู้วิธีการทำ ดูคำถามของฉันที่นี่: wordpress.stackexchange.com/questions/102246/ …
reikyoushin

2

ลองดูที่ปลั๊กอินนี้ มันมี URL ลำดับชั้นสำหรับหมวดหมู่ แต่คุณสามารถปรับให้เข้ากับอนุกรมวิธานใด ๆ

การสร้างกฎดังต่อไปนี้ฟังก์ชันเวียน


2
ปลั๊กอินนี้ไม่สามารถใช้ได้อีกต่อไป
Enkode
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.