최신 정보
이 WordPress 코어를 작성했기 때문에 클래스 'do_parse_request'
를 확장하지 않고도 URL 라우팅을 우아하게 처리 할 수 있는 후크를 추가했습니다 WP
. 나는 2014 년 애틀랜타 워드 캠프 강연에서 " 하드 코어 URL 라우팅 " 이라는 제목의 주제를 자세히 다루었 다 . 슬라이드는 링크에서 사용할 수 있습니다.
원래 답변
URL 디자인 은 10 년이 넘도록 중요했습니다. 나는 몇 년 전에 블로그를 썼습니다 . 그리고 워드 프레스는 총체적으로 유감스럽게도 소프트웨어의 화려한 비트 이지만 URL 재 작성 시스템은 두뇌가 부족합니다 (물론 IMHO) .
내가 제공 할 대답은 내가 호출하는 플러그인 입니다. Trac에WP_Extended
대한 이 제안에 대한 개념 증명입니다 (제안은 한 가지로 시작하여 다른 것으로 진화 했으므로 전체 내용을 읽어야합니다. 향했다.)
기본적으로 아이디어는 클래스를 서브 WP
클래스 화하고 parse_request()
메소드를 대체 한 다음 $wp
서브 클래스의 인스턴스에 글로벌 변수 를 지정하는 것 입니다. 그런 다음 parse_request()
실제로 URL 전체와 일치 해야하는 정규식 목록을 사용하는 대신 경로 세그먼트별로 경로를 검사하십시오 .
그래서 앞에 명시 적으로이 기술을 삽입 논리를 상태로 parse_request()
URL - 투 - 정규식 일치 및 분류 기간 경기에 대한 대신 첫 외모에 대한 어떤 검사하지만 ONLY 을 대체 parse_request()
하고 잎 워드 프레스 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 경로 지정 논리를 클래스 의 parse_request()
메소드를 호출하여 WordPress 재 작성 시스템에 위임 합니다 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주의 사항 # 1
특정 사이트에서이 기술은 훌륭하게 작동한다고 생각하지만 이 기술을 다른 사람들이 사용할 수 있도록 WordPress.org에 플러그인을 배포하는 데 사용해서는 안됩니다 . WordPress 기반의 소프트웨어 패키지의 핵심이라면 괜찮을 것입니다. 그렇지 않으면이 기술은 특정 사이트에 대한 URL 라우팅을 향상시키는 것으로 제한되어야합니다 .
왜? 하나의 플러그인 만이 기술을 사용할 수 있기 때문 입니다. 두 개의 플러그인이 사용하려고하면 서로 충돌합니다.
이 전략을 제쳐두고 필요할 수있는 거의 모든 사용 사례 패턴을 일반적으로 처리하도록 확장 할 수 있으며, 여가 시간을 찾거나 고객이 원하는 시간을 후원 할 수있는 고객을 찾 자마자 구현하려고합니다 완전히 일반적인 구현을 빌드하십시오.
경고 # 2
나는 이것을 parse_request()
매우 큰 함수 인 재정의하기 위해 썼고 , 전 세계의 속성이나 두 가지를 놓쳤을 가능성이 있습니다.$wp
내가 설정해야 객체 . 그래서 뭔가 이상한 행동이 있으면 알려 드리겠습니다. 그것을 조사하고 필요하다면 답을 수정하십시오.
어쨌든...
'slug' => 'forums'
공란 으로 남겨 두는 대신 완전히 제거하고 그냥 사용해 보셨습니까'rewrite' => array('with_front' => false, 'hierarchical' => true)
? 나는 그것이 과거에 나를 위해 일했다고 생각합니다. 또한 영구 링크를 플러시해야합니다.