อนุกรมวิธานที่กำหนดเองและหน้าเขียนทับกระสุนให้ 404


9

ฉันใช้ปลั๊กอิน Custom Post Type UI เพื่อสร้าง taxonomies ที่กำหนดเองของฉัน ฉันมีพอร์ตโฟลิโอที่สร้างขึ้นจากโครงการ (ประเภทโพสต์ที่กำหนดเอง) พร้อม taxonomies ที่กำหนดเอง 2 เทคโนโลยีและลูกค้า อนุกรมวิธานของลูกค้ามีทากเขียนแบบกำหนดเองportfolio/clients/ในขณะที่อนุกรมวิธานเทคโนโลยีมีทากการเขียนแบบกำหนดเองของportfolio/

เขียนซ้ำ:
portfolio/html <- หน้าแสดงโครงการทั้งหมดโดยใช้ HTML
portfolio/clients/client-a<- หน้าแสดงโครงการทั้งหมดสำหรับลูกค้า A

ตอนนี้เมื่อฉันพยายามสร้างหน้า Landing Page สำหรับลูกค้าที่มีบุ้งกระสุนของ/portfolio/clientsฉันได้รับหน้า 404 ฉันค่อนข้างแน่ใจว่าเป็นเพราะการเขียน url ที่ซ้ำซ้อนของอนุกรมวิธานเทคโนโลยี ฉันเดาว่ามันค้นหาในอนุกรมวิธานเทคโนโลยีมันไม่มีอยู่แล้วมันแยกออกหน้า 404 ดังนั้นฉันจะได้รับกระสุนเขียนทับในการทำงานเพื่อให้เมื่อฉันตี/portfolio/clientsมันจะไม่ส่งกลับ 404 หน้าและมันใช้แม่แบบหน้าที่ถูกต้อง?

คำตอบ:


16

คุณดูเหมือนจะต้องการ "กฎการเขียนซ้ำแบบละเอียดบางส่วน" กฎการเขียนซ้ำแบบละเอียดหมายถึงหน้าทั้งหมดอยู่ด้านบนเนื่องจาก WordPress ไม่สามารถเข้าใจความแตกต่างระหว่างหน้าและโพสต์ นี่มันคิดว่ามันสามารถเพราะ URL ทั้งหมดของรูปแบบportfolio/([^/]+)/มาจากของคุณอนุกรมวิธานยกเว้นหนึ่งนี้portfolio portfolio/clients/คุณจะต้องวางกฎนั้นไว้ด้านบนของกฎการเขียนซ้ำดังนั้นจึงตรงกันก่อนอนุกรมวิธานพอร์ตโฟลิโอทั่วไป คุณอาจบังคับให้กฎการเขียนซ้ำทั้งหมดเป็น verbose แต่จะส่งผลต่อประสิทธิภาพหากคุณมีเพจจำนวนมาก

คำตอบนี้เขียนด้วยความเข้าใจที่เพิ่งได้รับของกฎการเขียนใหม่ดังนั้นฉันหวังว่ามันจะเป็นวิธีที่ดีในการทำและรหัสตัวอย่างไม่มีข้อผิดพลาดมากเกินไป

หน้าไม่ได้สร้างกฎการเขียนซ้ำเพียงครั้งเดียว แต่จะสร้างกลุ่ม:

  • (pagename)/trackback/?$
  • (pagename)/feed/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/(feed|rdf|rss|rss2|atom)/?$
  • (pagename)/page/?([0-9]{1,})/?$
  • (pagename)/comment-page-([0-9]{1,})/?$
  • (pagename)(/[0-9]+)?/?$

WP_Rewriteคุณไม่จำเป็นต้องสร้างตัวเองเหล่านี้คุณสามารถกลับมาใช้อำนาจของ ดูpage_rewrite_rules()วิธีการ: ถ้าเราอยู่ในโหมด verbose มันจะได้รับรายชื่อของทุกหน้า (ผ่านpage_uri_index()) และสิ่งที่แนบมาของพวกเขาเขียนทับ%pagename%แท็กเขียนใหม่และสร้างกฎการเขียนซ้ำสำหรับหน้านี้ เราสามารถทำได้เช่นกัน:

// We only generate them for this page
$page_uri = 'portfolio/clients';
// Returns site root + '%pagename%'
$page_structure = $wp_rewrite->get_page_permastruct();
// Everywhere you see %pagename% in the structure used to generate rules
// in the next step, replace it with our fixed page name
$wp_rewrite->add_rewrite_tag('%pagename%', "({$page_uri})", 'pagename=');
// This generates the group given above
$page_rewrite_rules = $wp_rewrite->generate_rewrite_rules($page_structure, EP_PAGES);

สิ่งนี้จะทำให้เรามีกฎสำหรับหน้า แต่ยังไม่ได้สำหรับสิ่งที่แนบมาที่ใช้ในหน้า หากคุณต้องการสิ่งเหล่านี้คุณต้องทำซ้ำขั้นตอนสำหรับสิ่งที่แนบมาแต่ละรายการด้วยadd_rewrite_tag('%pagename%', "({$attachment_uri})", 'attachment=')(ดูpage_rewrite_rules()รายละเอียดเพิ่มเติม)

ดีเรามีกฏ แต่ตอนนี้คุณต้องเพิ่มมันลงในโครงสร้างการเขียนใหม่ทั้งหมดในบางวิธี คุณสามารถทำได้ด้วยadd_rewrite_rule()แต่คุณต้องเรียกมันสำหรับทุกกฎที่สร้างใน$page_rewrite_rulesอาร์เรย์ ด้วยเหตุนี้หลายคนจึงติดตั้งrewrite_rules_arrayตัวกรองเนื่องจากคุณสามารถปรับเปลี่ยนอาร์เรย์ได้

add_filter('rewrite_rules_array', 'add_verbose_portfolio_clients_page');
function add_verbose_portfolio_clients_page($rewrite_rules)
{
    global $wp_rewrite;

    // The previous code snippet comes here, where we generate $page_rewrite_rules

    // Our rules have priority, they should be on top
    $rewrite_rules = array_merge($page_rewrite_rules, $rewrite_rules);

    return $rewrite_rules;
}

หลังจากคุณรวมตัวกรองนี้แล้วคุณควรล้างกฎการเขียนซ้ำ (หนึ่งครั้งไม่ใช่ทุกครั้งที่โหลดหน้าเว็บเนื่องจากค่อนข้างหนัก) คุณสามารถทำได้โดยการโทรflush_rewrite_rules()หรือไปที่หน้าการตั้งค่า "Permalinks"


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