হালনাগাদ
যেহেতু এই ওয়ার্ডপ্রেস কোরটি লেখার ফলে 'do_parse_request'
হুক যুক্ত হয়েছে যা ইউআরএল রাউটিংকে মার্জিতভাবে এবং WP
ক্লাস প্রসারিত করার প্রয়োজন ছাড়াই পরিচালনা করতে পারে । আমি আমার 2014 আটলান্টা ওয়ার্ডক্যাম্প আলোচনায় " হার্ড ইউআরএল রাউটিং " শিরোনামে বিষয়টিকে গভীরভাবে কভার করেছি ; স্লাইডগুলি লিঙ্কটিতে উপলব্ধ।
মূল উত্তর
ইউআরএল ডিজাইনটি এক দশকেরও বেশি সময় ধরে গুরুত্বপূর্ণ ছিল; এমনকি কয়েক বছর আগে আমি এ সম্পর্কে একটি ব্লগও লিখেছিলাম । এবং ওয়ার্ডপ্রেস যোগফল হ'ল একটি উজ্জ্বল সফ্টওয়্যার দুর্ভাগ্যক্রমে এটির ইউআরএল পুনর্লিখন সিস্টেমটি মস্তিষ্কের মৃতের সংক্ষিপ্ত মাত্রই রয়েছে (আইএমএইচও, অবশ্যই। :) যাইহোক, ইউআরএল ডিজাইন সম্পর্কে যত্নশীল লোকদের দেখে আনন্দিত!
আমি যে উত্তরটি দিতে যাচ্ছি তা হ'ল একটি প্লাগইন যা আমি কল করছি যা ট্র্যাকের উপর এই প্রস্তাবেরWP_Extended
ধারণার প্রমাণ (নোট করুন যে প্রস্তাবটি একটি জিনিস হিসাবে শুরু হয়েছিল এবং অন্যটিতে বিবর্তিত হয়েছে, তাই আপনাকে পুরো জিনিসটি কোথায় পড়তে হবে তা দেখতে হবে এটি নেতৃত্বে ছিল।)
মূলত ধারণাটি হল WP
ক্লাসটি সাবক্লাস করা , parse_request()
পদ্ধতিটি ওভাররাইড করা এবং তারপরে $wp
সাবক্লাসের একটি উদাহরণ সহ গ্লোবাল ভেরিয়েবল বরাদ্দ করা । তারপরে আপনার মধ্যে parse_request()
আসলে নিয়মিত অভিব্যক্তির একটি তালিকা ব্যবহারের পরিবর্তে পথ সেগমেন্টের মাধ্যমে পথটি পরিদর্শন করুন যা অবশ্যই তাদের সম্পূর্ণরূপে URL এর সাথে মেলে।
সুতরাং এটি স্পষ্টভাবে বলতে গেলে, এই কৌশলটি parse_request()
যুক্তরাজ্যের থেকে রেজিএক্স ম্যাচের জন্য যা পরীক্ষা করে এবং এর পরিবর্তে প্রথমে করশাসনের মেয়াদের ম্যাচগুলির সন্ধান করে তবে কেবলমাত্রparse_request()
ওয়ার্ডপ্রেস ইউআরএল URL এর রাউটিং সিস্টেমের সম্পূর্ণ প্রতিস্থাপন এবং অক্ষত রেখে দেয় and বিশেষত $query_vars
ভেরিয়েবলের ব্যবহার ।
আপনার ব্যবহারের ক্ষেত্রে এই বাস্তবায়ন কেবলমাত্র ইউটিউব পাথ বিভাগগুলিকে ট্যাক্সনোমির শর্তগুলির সাথে তুলনা করে যেহেতু আপনার কেবলমাত্র প্রয়োজন। এই বাস্তবায়ন বর্গীকরণ সূত্র পিতা বা মাতা সন্তান শব্দটি সম্পর্ক সম্মান পদ inspects এবং যখন এটি একটি ম্যাচ খুঁজে বের করে এটা URL পথ নির্ধারণ (বিয়োগ সামনের এবং স্ল্যাশ trailing) থেকে $wp->query_vars['category_name']
, $wp->query_vars['tag']
বা $wp->query_vars['taxonomy']
& $wp->query_vars['term']
এবং এটি রোধ করা যাবে parse_request()
পদ্ধতি WP
বর্গ।
অন্যদিকে, যদি 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();
পিএস কভেট # 1
যদিও কোনও প্রদত্ত সাইটের জন্য আমি এই কৌশলটি উজ্জ্বলতার সাথে কাজ করে বলে মনে করি তবে এই কৌশলটি অন্যদের ব্যবহারের জন্য WordPress.org এ বিতরণ করার জন্য কোনও প্লাগইন ব্যবহার করা উচিত নয় । এটি যদি ওয়ার্ডপ্রেস ভিত্তিক কোনও সফ্টওয়্যার প্যাকেজের মূল অংশে থাকে তবে তা ঠিক আছে। অন্যথায় এই কৌশলটি কোনও নির্দিষ্ট সাইটের ইউআরএল রাউটিংয়ের উন্নতির মধ্যে সীমাবদ্ধ হওয়া উচিত ।
কেন? কারণ শুধুমাত্র একটি প্লাগইন এই কৌশলটি ব্যবহার করতে পারে । যদি দুটি প্লাগইন এটি ব্যবহার করার চেষ্টা করে তবে তারা একে অপরের সাথে বিরোধ করবে।
একদিকে যেমন এই কৌশলটি প্রযোজ্য প্রতিটি ব্যবহারের ক্ষেত্রে যে পদ্ধতিটি প্রয়োজন হতে পারে তা হ্যান্ডেল করার জন্য প্রসারিত করা যেতে পারে এবং অবিলম্বে আমি ফাঁকা সময় বা এমন কোনও ক্লায়েন্ট খুঁজে পেতে পারি যেটি সময় নিতে পারে তার স্পনসর করতে পারে সম্পূর্ণ জেনেরিক প্রয়োগ বাস্তবায়ন।
ক্যাভেট # 2
আমি এটি ওভাররাইড করার জন্য লিখেছিলাম parse_request()
যা একটি খুব বড় ফাংশন, এবং এটি সম্ভবত সম্ভব যে আমি যে সম্পত্তি বা আমার দুটি বিশ্বব্যাপী $wp
বস্তু সেট করেছিলাম তা মিস করেছি ... সুতরাং যদি কোন কাজ খুব খারাপ করে তোলে তবে আমাকে জানাতে হবে এবং আমি এতে খুশি হব এটি গবেষণা করুন এবং প্রয়োজনে উত্তরটি সংশোধন করুন।
যাই হোক ...
'slug' => 'forums'
একেবারে পুরোপুরি সরিয়ে এবং কেবল খালি রাখার পরিবর্তে চেষ্টা করেছেন'rewrite' => array('with_front' => false, 'hierarchical' => true)
? আমি মনে করি এটি আমার জন্য অতীতে কাজ করেছে। এছাড়াও নিশ্চিত হয়ে নিন যে আপনি পারমিলিকগুলি ফ্লাশ করেছেন।