คุณดูเหมือนจะต้องการ "กฎการเขียนซ้ำแบบละเอียดบางส่วน" กฎการเขียนซ้ำแบบละเอียดหมายถึงหน้าทั้งหมดอยู่ด้านบนเนื่องจาก 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"