UPDATE
ตั้งแต่เขียน WordPress หลักนี้ได้เพิ่ม'do_parse_request'
เบ็ดที่ช่วยให้การกำหนดเส้นทาง URL ได้รับการจัดการอย่างหรูหราและโดยไม่ต้องขยายWP
ชั้นเรียน ฉันครอบคลุมหัวข้อในเชิงลึกในการพูดคุย WordCamp ที่แอตแลนตา 2557 ของฉันในหัวข้อ" การกำหนดเส้นทาง URL ง่าย ๆ " ; สไลด์มีอยู่ที่ลิงค์
คำตอบเดิม
การออกแบบ URLนั้นมีความสำคัญต่อทศวรรษ ฉันยังเขียนบล็อกเกี่ยวกับเรื่องนี้เมื่อหลายปีก่อน และในขณะที่ WordPress เป็นผลรวมเป็นซอฟต์แวร์ที่ยอดเยี่ยม โชคไม่ดีที่มันเป็นระบบการเขียน URL ที่สั้นมาก(IMHO แน่นอน :)ยินดีที่เห็นคนสนใจเกี่ยวกับการออกแบบ URL!
คำตอบที่ฉันจะมอบให้คือปลั๊กอินที่ฉันเรียกWP_Extended
ว่าเป็นข้อพิสูจน์แนวคิดสำหรับข้อเสนอนี้ใน Trac (โปรดสังเกตว่าข้อเสนอเริ่มต้นจากสิ่งหนึ่งและพัฒนาเป็นอีกสิ่งหนึ่งดังนั้นคุณต้องอ่านทุกสิ่งเพื่อดูว่า มันกำลังมุ่งหน้าไป.)
โดยพื้นฐานแล้วแนวคิดคือการ subclass WP
คลาสแทนที่parse_request()
เมธอดจากนั้นกำหนด$wp
ตัวแปรโกลบอลด้วยอินสแตนซ์ของคลาสย่อย จากนั้นภายในparse_request()
คุณตรวจสอบเส้นทางโดยส่วนของเส้นทางแทนการใช้รายการของนิพจน์ปกติที่ต้องตรงกับ URL อย่างครบถ้วน
เพื่อที่จะระบุอย่างชัดเจนนี้ตรรกะเทคนิคแทรกในด้านหน้าของparse_request()
ซึ่งการตรวจสอบสำหรับการแข่งขัน URL เพื่อ RegEx และรูปลักษณ์แรกแทนสำหรับการแข่งขันระยะอนุกรมวิธาน แต่มันเท่านั้นแทนที่parse_request()
และใบส่วนที่เหลือทั้งหมดของระบบ WordPress URL เส้นทางเหมือนเดิมรวมทั้งและ โดยเฉพาะอย่างยิ่งการใช้$query_vars
ตัวแปร
สำหรับกรณีการใช้งานของคุณการใช้งานนี้จะเปรียบเทียบส่วนเส้นทาง URL กับคำศัพท์อนุกรมวิธานเนื่องจากนั่นคือทั้งหมดที่คุณต้องการ การดำเนินการนี้จะตรวจสอบเงื่อนไขอนุกรมวิธานเคารพความสัมพันธ์ระยะพ่อแม่และลูกและเมื่อพบการแข่งขันก็จะระบุเส้นทาง URL (ลบชั้นนำและต่อท้ายทับ)ไป$wp->query_vars['category_name']
, $wp->query_vars['tag']
หรือ$wp->query_vars['taxonomy']
& $wp->query_vars['term']
และมันทะลุparse_request()
วิธีการWP
ระดับ
ในทางตรงกันข้ามถ้าเส้นทาง URL ไม่ตรงกับคำจากอนุกรมวิธานที่คุณระบุให้มอบหมายตรรกะการกำหนดเส้นทาง URL ไปยังระบบการเขียน WordPress ใหม่โดยการเรียกparse_request()
วิธีการของWP
ชั้นเรียน
วิธีใช้WP_Extended
สำหรับกรณีการใช้งานของคุณคุณจะต้องเรียกใช้register_url_route()
ฟังก์ชันจากภายในfunctions.php
ไฟล์ของธีมของคุณดังนี้:
add_action('init','init_forum_url_route');
function init_forum_url_route() {
register_url_route(array('taxonomy'=>'forum'));
}
นี่คือซอร์สโค้ดสำหรับปลั๊กอิน:
<?php
/*
Filename: wp-extended.php
Plugin Name: WP Extended for Taxonomy URL Routes
Author: Mike Schinkel
*/
function register_url_route($args=array()) {
if (isset($args['taxonomy']))
WP_Extended::register_taxonomy_url($args['taxonomy']);
}
class WP_Extended extends WP {
static $taxonomies = array();
static function on_load() {
add_action('setup_theme',array(__CLASS__,'setup_theme'));
}
static function register_taxonomy_url($taxonomy) {
self::$taxonomies[$taxonomy] = get_taxonomy($taxonomy);
}
static function setup_theme() { // Setup theme is 1st code run after WP is created.
global $wp;
$wp = new WP_Extended(); // Replace the global $wp
}
function parse_request($extra_query_vars = '') {
$path = $_SERVER['REQUEST_URI'];
$domain = str_replace('.','\.',$_SERVER['SERVER_NAME']);
//$root_path = preg_replace("#^https?://{$domain}(/.*)$#",'$1',WP_SITEURL);
$root_path = $_SERVER['HTTP_HOST'];
if (substr($path,0,strlen($root_path))==$root_path)
$path = substr($path,strlen($root_path));
list($path) = explode('?',$path);
$path_segments = explode('/',trim($path,'/'));
$taxonomy_term = array();
$parent_id = 0;
foreach(self::$taxonomies as $taxonomy_slug => $taxonomy) {
$terms = get_terms($taxonomy_slug);
foreach($path_segments as $segment_index => $path_segment) {
foreach($terms as $term_index => $term) {
if ($term->slug==$path_segments[$segment_index]) {
if ($term->parent!=$parent_id) { // Make sure we test parents
$taxonomy_term = array();
} else {
$parent_id = $term->term_id; // Capture parent ID for verification
$taxonomy_term[] = $term->slug; // Collect slug as path segment
unset($terms[$term_index]); // No need to scan it again
}
break;
}
}
}
if (count($taxonomy_term))
break;
}
if (count($taxonomy_term)) {
$path = implode('/',$taxonomy_term);
switch ($taxonomy_slug) {
case 'category':
$this->query_vars['category_name'] = $path;
break;
case 'post_tag':
$this->query_vars['tag'] = $path;
break;
default:
$this->query_vars['taxonomy'] = $taxonomy_slug;
$this->query_vars['term'] = $path;
break;
}
} else {
parent::parse_request($extra_query_vars); // Delegate to WP class
}
}
}
WP_Extended::on_load();
PS CAVEAT # 1
แต่สำหรับเว็บไซต์ที่กำหนดผมคิดว่าเทคนิคนี้ทำงานเก่ง แต่เทคนิคนี้ไม่ควรนำมาใช้สำหรับปลั๊กอินที่จะกระจายใน WordPress.org ให้ผู้อื่นใช้ หากเป็นแกนหลักของแพคเกจซอฟต์แวร์ที่ใช้ WordPress แล้วนั่นอาจจะไม่เป็นไร มิฉะนั้นเทคนิคนี้ควรจะ จำกัด การปรับปรุง URL เส้นทางสำหรับเว็บไซต์ที่เฉพาะเจาะจง
ทำไม? เพราะมีเพียงปลั๊กอินเดียวเท่านั้นที่สามารถใช้เทคนิคนี้ หากสองปลั๊กอินพยายามใช้ปลั๊กอินเหล่านั้นจะขัดแย้งกัน
นอกจากกลยุทธ์นี้สามารถขยายเพื่อจัดการทั่วไปทุกรูปแบบกรณีการใช้งานที่อาจจำเป็นและนั่นคือสิ่งที่ฉันตั้งใจจะนำมาใช้ทันทีที่ฉันพบเวลาว่างหรือลูกค้าที่สามารถสปอนเซอร์เวลาที่ใช้ในการ สร้างการใช้งานทั่วไปอย่างเต็มที่
ถ้ำ # 2
ฉันเขียนสิ่งนี้เพื่อลบล้างparse_request()
ซึ่งเป็นฟังก์ชั่นที่ใหญ่มากและเป็นไปได้มากที่ฉันพลาดคุณสมบัติหนึ่งหรือสองของ$wp
วัตถุระดับโลกที่ฉันควรจะตั้งไว้ .. ดังนั้นหากสิ่งที่ทำหน้าที่ไร้ค่านั้นทำให้ฉันรู้และฉันจะมีความสุข ค้นคว้าและแก้ไขคำตอบหากจำเป็น
อย่างไรก็ตาม...
'slug' => 'forums'
ว่างแล้วเอามันออกไปเลย'rewrite' => array('with_front' => false, 'hierarchical' => true)
ใช่ไหม? ฉันคิดว่ามันได้ผลในอดีตสำหรับฉัน ยังให้แน่ใจว่าคุณล้างลิงก์ถาวร