사용자 지정 게시물 유형 다시 쓰기 규칙을 추가 할 때 다루어야 할 2 가지 공격 지점이 있습니다.
다시 쓰기 규칙
재 작성 규칙이 생성 될 때 발생합니다 wp-includes/rewrite.php
에서 WP_Rewrite::rewrite_rules()
. WordPress에서는 게시물, 페이지 및 다양한 유형의 아카이브와 같은 특정 요소에 대한 다시 쓰기 규칙을 필터링 할 수 있습니다. 당신이 볼 경우 부분은 사용자 정의 포스트 유형의 이름이어야합니다. 표준 게시물 규칙을 없애지 않는 한 필터를 사용할 수도 있습니다 .posttype_rewrite_rules
posttype
post_rewrite_rules
다음으로 실제로 재 작성 규칙을 생성하는 함수가 필요합니다.
// add our new permastruct to the rewrite rules
add_filter( 'posttype_rewrite_rules', 'add_permastruct' );
function add_permastruct( $rules ) {
global $wp_rewrite;
// set your desired permalink structure here
$struct = '/%category%/%year%/%monthnum%/%postname%/';
// use the WP rewrite rule generating function
$rules = $wp_rewrite->generate_rewrite_rules(
$struct, // the permalink structure
EP_PERMALINK, // Endpoint mask: adds rewrite rules for single post endpoints like comments pages etc...
false, // Paged: add rewrite rules for paging eg. for archives (not needed here)
true, // Feed: add rewrite rules for feed endpoints
true, // For comments: whether the feed rules should be for post comments - on a singular page adds endpoints for comments feed
false, // Walk directories: whether to generate rules for each segment of the permastruct delimited by '/'. Always set to false otherwise custom rewrite rules will be too greedy, they appear at the top of the rules
true // Add custom endpoints
);
return $rules;
}
플레이하기로 결정한 경우 여기서주의해야 할 것은 '워크 디렉토리'부울입니다. Permastruct의 각 세그먼트에 대해 다시 쓰기 규칙을 생성하며 다시 쓰기 규칙이 일치하지 않을 수 있습니다. WordPress URL이 요청되면 다시 쓰기 규칙 배열이 위에서 아래로 확인됩니다. 일치하는 것이 발견 되 자마자, 예를 들어 당신의 permastruct가 욕심있는 일치와 같은 경우, 당신이 겪은 모든 것을로드 할 것입니다. for /%category%/%postname%/
및 walk 디렉토리가 있으면 /%category%/%postname%/
AND와 /%category%/
일치하는 다시 쓰기 규칙이 출력 됩니다. 너무 일찍 발생하면 망가진 것입니다.
퍼머 링크
이것은 포스트 유형 퍼머 링크를 구문 분석하고 퍼머 스트 (예 : '/ % year % / % monthnum % / % postname % /')를 실제 URL로 변환하는 기능입니다.
다음 부분은에서 get_permalink()
찾을 수 있는 함수 의 버전이되는 간단한 예입니다 wp-includes/link-template.php
. 사용자 지정 게시물 퍼머 링크는로 수정 된 get_post_permalink()
버전입니다 get_permalink()
. get_post_permalink()
필터링 post_type_link
하여 커스텀 영구 구조를 만드는 데 사용하고 있습니다.
// parse the generated links
add_filter( 'post_type_link', 'custom_post_permalink', 10, 4 );
function custom_post_permalink( $permalink, $post, $leavename, $sample ) {
// only do our stuff if we're using pretty permalinks
// and if it's our target post type
if ( $post->post_type == 'posttype' && get_option( 'permalink_structure' ) ) {
// remember our desired permalink structure here
// we need to generate the equivalent with real data
// to match the rewrite rules set up from before
$struct = '/%category%/%year%/%monthnum%/%postname%/';
$rewritecodes = array(
'%category%',
'%year%',
'%monthnum%',
'%postname%'
);
// setup data
$terms = get_the_terms($post->ID, 'category');
$unixtime = strtotime( $post->post_date );
// this code is from get_permalink()
$category = '';
if ( strpos($permalink, '%category%') !== false ) {
$cats = get_the_category($post->ID);
if ( $cats ) {
usort($cats, '_usort_terms_by_ID'); // order by ID
$category = $cats[0]->slug;
if ( $parent = $cats[0]->parent )
$category = get_category_parents($parent, false, '/', true) . $category;
}
// show default category in permalinks, without
// having to assign it explicitly
if ( empty($category) ) {
$default_category = get_category( get_option( 'default_category' ) );
$category = is_wp_error( $default_category ) ? '' : $default_category->slug;
}
}
$replacements = array(
$category,
date( 'Y', $unixtime ),
date( 'm', $unixtime ),
$post->post_name
);
// finish off the permalink
$permalink = home_url( str_replace( $rewritecodes, $replacements, $struct ) );
$permalink = user_trailingslashit($permalink, 'single');
}
return $permalink;
}
언급했듯이 이것은 사용자 지정 다시 쓰기 규칙 세트와 퍼머 링크를 생성하기위한 매우 간단한 경우이며, 특히 유연하지는 않지만 시작하기에 충분해야합니다.
부정 행위
나는 당신이 어떤 사용자 정의 게시물 유형에 대한 permastructs를 정의 할 수있는 플러그인을 작성했지만, 당신이 가지고있는 사용자 정의 분류법에 대해 %category%
내 플러그인이 지원 %custom_taxonomy_name%
하는 게시물에 대한 permalink 구조에서 사용할 수있는 것처럼 분류 custom_taxonomy_name
의 이름이 어디에 있습니까 ? %club%
.
계층 적 / 비 계층 적 분류 체계에서 예상대로 작동합니다.
http://wordpress.org/extend/plugins/wp-permastructure/