अद्यतन करें
इस लिखने के बाद से वर्डप्रेस कोर ने 'do_parse_request'
हुक जोड़ा है जो URL रूटिंग को सुरुचिपूर्ण ढंग से और WP
कक्षा को विस्तारित करने की आवश्यकता के बिना नियंत्रित करने की अनुमति देता है । मैंने अपने 2014 अटलांटा वर्डकैम्प टॉक में विषय को गहराई से कवर किया, जिसका शीर्षक " हार्डकोर यूआरएल रूटिंग " है ; स्लाइड लिंक पर उपलब्ध हैं।
मूल ANSWER
URL डिज़ाइन एक दशक से अधिक समय तक महत्वपूर्ण रहा है; मैंने कई साल पहले इसके बारे में एक ब्लॉग भी लिखा था । और वर्डप्रेस है, जबकि योग सॉफ्टवेयर का एक शानदार सा है दुर्भाग्य से यह URL रीराइट प्रणाली मस्तिष्क मृत से कुछ ही कम है (IMHO, निश्चित रूप से। :) , लोगों यूआरएल डिजाइन के बारे में देखभाल को देखने के लिए खुशी है कि वैसे भी!
मैं जो जवाब देने जा रहा हूं वह एक प्लगइन है जिसे मैं कॉल WP_Extended
कर रहा हूं जो कि ट्राक पर इस प्रस्ताव के लिए अवधारणा का प्रमाण है (ध्यान दें कि प्रस्ताव एक चीज के रूप में शुरू हुआ और दूसरे में विकसित हुआ, इसलिए आपको यह देखने के लिए पूरी बात पढ़ना होगा इसकी अध्यक्षता की गई।)
मूल रूप से विचार WP
वर्ग को उप- वर्ग में रखना है, parse_request()
विधि को ओवरराइड करता है, और फिर $wp
उपवर्ग के उदाहरण के साथ वैश्विक चर असाइन करता है । फिर parse_request()
आप वास्तव में नियमित अभिव्यक्तियों की सूची का उपयोग करने के बजाय पथ खंड द्वारा पथ का निरीक्षण करते हैं जो URL को उनकी संपूर्णता से मेल खाना चाहिए।
तो यह स्पष्ट रूप से बताने के लिए, यह तकनीक तर्क को सामने रखती है, parse_request()
जिसमें URL-to-RegEx मैचों के लिए जाँच की जाती है और इसके बजाय पहली बार टैक्सोनॉमी टर्म मैचों की तलाश की जाती है, लेकिन यह केवलparse_request()
वर्डप्रेस यूआरएल रूटिंग प्रणाली के बाकी हिस्सों को पूरी तरह से बदल देता है और छोड़ देता है जिसमें शामिल है और विशेष रूप से $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 राउटर लॉजिक को वर्ड रीराइट सिस्टम के प्रतिनिधि 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 CATAT # 1
यद्यपि किसी दिए गए साइट के लिए मुझे लगता है कि यह तकनीक शानदार ढंग से काम करती है, लेकिन इस तकनीक का उपयोग दूसरों के लिए WordPress.org पर वितरित किए जाने वाले प्लगइन के लिए किया जाना चाहिए । यदि यह वर्डप्रेस पर आधारित एक सॉफ्टवेयर पैकेज के मूल में है तो यह ठीक हो सकता है। अन्यथा यह तकनीक एक विशिष्ट साइट के लिए यूआरएल मार्ग को बेहतर बनाने तक सीमित होनी चाहिए ।
क्यूं कर? क्योंकि केवल एक प्लगइन इस तकनीक का उपयोग कर सकता है । यदि दो प्लगइन्स इसका उपयोग करने की कोशिश करते हैं तो वे एक-दूसरे के साथ संघर्ष करेंगे।
एक तरफ के रूप में इस रणनीति को व्यावहारिक रूप से हर उपयोग-केस पैटर्न को संभालने के लिए सामान्य रूप से विस्तारित किया जा सकता है जो आवश्यक हो सकता है और यही कि मैं जल्द से जल्द लागू करने का इरादा रखता हूं या तो मुझे खाली समय मिलता है या एक ग्राहक जो उस समय को प्रायोजित कर सकता है जो इसे ले जाएगा पूरी तरह से सामान्य कार्यान्वयन का निर्माण।
सेवत # २
मैंने इसे ओवरराइड करने के लिए लिखा था parse_request()
जो एक बहुत बड़ा कार्य है, और यह काफी संभव है कि मैंने एक संपत्ति या दो वैश्विक $wp
वस्तु को याद किया जो मुझे सेट करना चाहिए था .. इसलिए अगर कुछ काम करता है तो मुझे पता चल जाएगा और मुझे खुशी होगी। जरूरत पड़ने पर इसका अनुसंधान करें और उत्तर को संशोधित करें।
वैसे भी ...
'slug' => 'forums'
खाली छोड़ने के बजाय पूरी तरह से और बस होने की कोशिश की है'rewrite' => array('with_front' => false, 'hierarchical' => true)
? मुझे लगता है कि मेरे लिए अतीत में काम किया है। यह भी सुनिश्चित करें कि आप पर्मलिंक को फ्लश करते हैं।