GÜNCELLEŞTİRME
Bu WordPress çekirdeğini yazdığından beri 'do_parse_request'
, URL yönlendirmesinin zarif bir şekilde ve WP
sınıfı genişletmeye gerek kalmadan ele alınmasına olanak sağlayan kanca eklendi . 2014 Atlanta WordCamp konuşmamda " Hardcore URL Routing " ; slaytlar bağlantıda bulunmaktadır.
ORİJİNAL CEVAP
URL Tasarımı , on yıldan uzun bir süredir olması önemliydi; Birkaç yıl önce bir blog bile yazdım . Ve WordPress toplam olsa da, yazılımın mükemmel bir parçası ne yazık ki , URL yeniden yazma sistemi sadece beyin ölümü eksik (IMHO, elbette. :) Yine de, URL tasarımını önemseyen insanları görmekten memnun oldum !
Vereceğim cevap , Trac'teki bu teklifWP_Extended
için bir konsept kanıtı olarak adlandırdığım bir eklentidir (Teklifin bir şey olarak başladığını ve başka bir evrime dönüştüğünü unutmayın, bu yüzden nerede olduğunu görmek için her şeyi okumanız gerekir. yöneldi.)
Temel olarak fikir sınıfı alt WP
sınıfa koymak , parse_request()
yöntemi geçersiz kılmak ve genel $wp
değişkeni alt sınıfın bir örneğiyle atamaktır . Sonra içinde parse_request()
, aslında URL’yle tam olarak eşleşmesi gereken normal ifadelerin listesini kullanmak yerine yolu yol bölümünden inceleyin .
Açıkça belirtmek gerekirse, bu teknik parse_request()
URL-to-RegEx eşleşmelerini kontrol edenin önüne mantık ekler ve bunun yerine ilk olarak taksonomi terim eşleşmelerini arar, ancak SADECEparse_request()
WordPress URL yönlendirme sisteminin geri kalanının tamamını değiştirir ve bırakır. özellikle $query_vars
değişken kullanımı .
Kullanım durumunuz için bu uygulama yalnızca URL yolu segmentlerini taksonomi terimleriyle karşılaştırır, çünkü ihtiyacınız olan tek şey budur. Bu uygulama, ebeveyn-çocuk ilişkileri terimi saygı sınıflandırma koşullar denetler ve bir eşleşme bulduğunda bu URL yolu atar (ön ve arka eğik çizgi eksi) için $wp->query_vars['category_name']
, $wp->query_vars['tag']
ya da $wp->query_vars['taxonomy']
ve $wp->query_vars['term']
ve atlar parse_request()
yöntemi WP
sınıfı.
Öte yandan, URL yolu belirttiğiniz bir taksonomiden bir terim ile eşleşmiyorsaparse_request()
, WP
sınıf yöntemini çağırarak URL yönlendirme mantığını WordPress yeniden yazma sistemine devreder .
Kullanım WP_Extended
durumunuz için kullanmak üzere register_url_route()
işlevi temanızın functions.php
dosyasından şöyle çağırmanız gerekir :
add_action('init','init_forum_url_route');
function init_forum_url_route() {
register_url_route(array('taxonomy'=>'forum'));
}
Eklentinin kaynak kodu burada:
<?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
Her ne kadar belirli bir site için bu tekniğin mükemmel bir şekilde çalıştığını düşünüyorum, ancak bu tekniğin başkalarının kullanması için WordPress.org'da dağıtılması için bir eklenti ASLA kullanılmamalıdır . WordPress tabanlı bir yazılım paketinin çekirdeğinde ise, o zaman sorun olabilir. Aksi halde, bu teknik, belirli bir sitenin URL yönlendirmesini iyileştirmeyle sınırlı olmalıdır .
Niye ya? Çünkü bu tekniği yalnızca bir eklenti kullanabilir . İki eklenti kullanmaya çalışırsa birbirleriyle çatışırlar.
Bir yana, bu strateji, pratik olarak gerekli olabilecek her kullanım durumu modelini pratik olarak ele alacak şekilde genişletilebilir. tamamen genel uygulamalar oluşturmak.
CAVEAT # 2
Bunu parse_request()
, çok büyük bir işlev olan geçersiz kılmak için yazdım ve ayarlamam gereken bir özelliği ya da iki küresel $wp
nesneyi kaçırmam oldukça muhtemeldir . araştırın ve gerekirse cevabı gözden geçirin.
Neyse ...
'slug' => 'forums'
Sadece tamamen kaldırmak ve sadece sahip olmakla boş bırakmak yerine denediniz'rewrite' => array('with_front' => false, 'hierarchical' => true)
mi? Sanırım bu geçmişte benim için işe yaradı. Ayrıca kalıcı bağlantıları temizlediğinizden emin olun.