ฉันขุดทุกคำถามที่นี่เกี่ยวกับ Permalinks ประเภทโพสต์ที่กำหนดเอง แต่ส่วนใหญ่ดูเหมือนว่าจะมีปัญหากับการเขียน taxonomy ที่กำหนดเองหรือการขาด flush_rewrite_rules () อย่างชัดเจน แต่ในกรณีของฉันฉันใช้ชนิดโพสต์ที่กำหนดเองเท่านั้น (ไม่มีอนุกรมวิธาน) ตั้งเป็นลำดับขั้น (ดังนั้นฉันจึงสามารถกำหนดความสัมพันธ์ระหว่างผู้ปกครองกับลูก) โดยมี "การสนับสนุน" ที่เหมาะสมสำหรับคุณสมบัติ metabox ฯลฯ เป็นต้น ได้เขียนกฎใหม่อีกหลายพันวิธีแล้ว ฉันลองใช้โครงสร้างลิงก์อื่น แต่ URL ย่อยจะส่งผลให้เกิด 404 เสมอ!
เดิมฉันมีประเภทโพสต์ที่กำหนดเองที่เป็นอิสระสำหรับองค์ประกอบ "หลัก" และ "เด็ก" (ใช้ p2p) และฉันอาจจะไม่มีปัญหาในการใช้อนุกรมวิธานสำหรับการจัดกลุ่ม "ผู้ปกครอง" - ฉันรู้ว่าสิ่งเหล่านั้นจะแม่นยำกว่า แต่สำหรับลูกค้ามันเป็นเรื่องง่ายที่สุดสำหรับพวกเขาที่จะเห็นภาพลำดับชั้นเมื่อ "โพสต์" ถูกแสดงในผู้ดูแลระบบเหมือนกับหน้าคือ: ต้นไม้ที่เรียบง่ายที่เด็ก ๆ จะปรากฏภายใต้ผู้ปกครองนำหน้าด้วย "-" และใน คำสั่งที่เหมาะสม นอกจากนี้ยังสามารถใช้วิธีการต่างๆในการกำหนดคำสั่งผ่าน drag-n-drop ได้ การจัดกลุ่มผ่านอนุกรมวิธาน (หรือ p2p) ให้ผลลัพธ์ในรายการ "โพสต์" แบบแบนในรายการผู้ดูแลระบบซึ่งไม่ชัดเจนเท่าที่เห็น
ดังนั้นสิ่งที่ฉันตามมาก็คือพฤติกรรมเช่นเดียวกันกับ "หน้า" หลัก แต่มีประเภทโพสต์ที่กำหนดเองของฉัน ฉันได้ลงทะเบียนประเภทโพสต์ตามที่คาดไว้และในการดูแลระบบมันทำงานได้อย่างสมบูรณ์แบบ - ฉันสามารถกำหนดผู้ปกครองและ menu_order สำหรับจดหมายข่าว "โพสต์" แต่ละรายการพวกเขาปรากฏอย่างถูกต้องในรายการแก้ไข:
Spring 2012
— First Article
— Second Article
และ Permalink ของพวกเขาดูเหมือนจะถูกสร้าง ในความเป็นจริงถ้าฉันเปลี่ยนอะไรก็ตามเกี่ยวกับโครงสร้างหรือแม้กระทั่งเปลี่ยนกระสุนเขียนเมื่อลงทะเบียนประเภทโพสต์พวกเขาปรับปรุงอย่างถูกต้องโดยอัตโนมัติดังนั้นฉันรู้ว่าสิ่งที่ทำงาน:
http://mysite.com/parent-page/child-page/ /* works for pages! */
http://mysite.com/post-type/parent-post/child-post/ /* should work? */
http://mysite.com/newsletter/spring-2012/ /* works! */
http://mysite.com/newsletter/spring-2012/first-article/ /* 404 */
http://mysite.com/newsletter/spring-2012/second-article/ /* 404 */
ฉันยังมี "หน้า" หลักมาตรฐานที่สร้างความสัมพันธ์แบบลำดับชั้นและพวกเขาดูเหมือนกันในผู้ดูแล แต่จริง ๆ แล้วพวกเขาทำงานในส่วนหน้าเช่นกัน (ทั้ง URL หลักและลูกทำงานได้ดี)
โครงสร้างลิงก์ถาวรของฉันถูกตั้งค่าเป็น:
http://mysite.com/%postname%/
ฉันได้ลองทำเช่นนี้แล้ว (เพราะคำตอบอื่น ๆ อีกมากมายดูเหมือนจะบ่งบอกว่ามันจำเป็น แต่ก็ไม่สมเหตุสมผลในกรณีของฉัน):
http://mysite.com/%category%/%postname%/
CPT ของฉันที่ลงทะเบียนรวมถึง:
$args = array(
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'has_archive' => 'newsletter',
'hierarchical' => true,
'query_var' => true,
'supports' => array( 'title', 'editor', 'thumbnail', 'page-attributes' ),
'rewrite' => array( 'slug' => 'newsletter', 'with_front' => false ),
ความแตกต่างที่มองเห็นได้ระหว่างเด็กประเภทโพสต์ที่กำหนดเองของฉันและเด็ก ๆหน้าปกติคือ CPT ของฉันมีกระสุนที่จุดเริ่มต้นของโครงสร้าง Permalink แล้วตามด้วยทากผู้ปกครอง / เด็ก (ที่หน้าเริ่มต้นด้วยทากผู้ปกครอง / เด็ก ไม่มี "คำนำหน้า") ทำไมสิ่งนี้จะเหม็นขึ้นฉันไม่รู้ บทความจำนวนมากดูเหมือนจะบ่งบอกว่านี่เป็นสิ่งที่วิธีการเรียงลำดับ CPT แบบลำดับขั้นควรทำ - แต่ของฉันแม้ว่าจะเกิดขึ้นแล้ว แต่ก็ใช้ไม่ได้
สิ่งที่ทำให้ฉันยุ่งเหยิงคือเมื่อฉันตรวจสอบ query_vars สำหรับหน้า 404 - พวกเขาดูเหมือนจะมีค่าที่ถูกต้องสำหรับ WP เพื่อ "ค้นหา" หน้าย่อยของฉัน แต่มีบางอย่างไม่ทำงาน
$wp_query object WP_Query {46}
public query_vars -> array (58)
'page' => integer 0
'newsletter' => string(25) "spring-2012/first-article"
'post_type' => string(10) "newsletter"
'name' => string(13) "first-article"
'error' => string(0) ""
'm' => integer 0
'p' => integer 0
'post_parent' => string(0) ""
'subpost' => string(0) ""
'subpost_id' => string(0) ""
'attachment' => string(0) ""
'attachment_id' => integer 0
'static' => string(0) ""
'pagename' => string(13) "first-article"
'page_id' => integer 0
[...]
ฉันลองสิ่งนี้ด้วยธีมที่หลากหลายรวมถึงยี่สิบสองเพื่อให้แน่ใจว่าไม่ใช่เทมเพลตที่ขาดหายไปในส่วนของฉัน
การใช้ตัวตรวจสอบกฎการเขียนซ้ำนี่คือสิ่งที่ปรากฏสำหรับ URL: http://mysite.com/newsletter/spring-2012/first-article/
newsletter/(.+?)(/[0-9]+)?/?$
newsletter: spring-2012/first-article
page:
(.?.+?)(/[0-9]+)?/?$
pagename: newsletter/spring-2012/first-article
page:
วิธีแสดงบนหน้าตรวจสอบอื่น:
RULE:
newsletter/(.+?)(/[0-9]+)?/?$
REWRITE:
index.php?newsletter=$matches[1]&page=$matches[2]
SOURCE:
newsletter
ผลลัพธ์ที่เขียนใหม่นี้จะทำให้ฉันเชื่อว่าลิงก์ถาวร "ไม่สวย" ต่อไปนี้จะใช้งานได้:
http://mysite.com/?newsletter=spring-2012&page=first-article
ไม่ใช่ 404 แต่แสดงรายการ "จดหมายข่าว" หลักของรายการ CPT ไม่ใช่รายการย่อย คำขอมีลักษณะดังนี้:
Array
(
[page] => first-article
[newsletter] => spring-2012
[post_type] => newsletter
[name] => spring-2012
)
post_name
คอลัมน์