Có 2 điểm tấn công để che khi bạn thêm quy tắc viết lại loại bài tùy chỉnh:
Viết lại quy tắc
Điều này xảy ra khi các quy tắc viết lại đang được tạo ra wp-includes/rewrite.php
trong WP_Rewrite::rewrite_rules()
. WordPress cho phép bạn lọc các quy tắc viết lại cho các yếu tố cụ thể như bài đăng, trang và các loại lưu trữ khác nhau. Nơi bạn nhìn thấy posttype_rewrite_rules
các posttype
phần nên là tên của bài tùy chỉnh kiểu của bạn. Ngoài ra, bạn có thể sử dụng post_rewrite_rules
bộ lọc miễn là bạn không xóa các quy tắc bài viết tiêu chuẩn.
Tiếp theo chúng ta cần hàm để thực sự tạo các quy tắc viết lại:
// 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;
}
Điều chính cần chú ý ở đây nếu bạn quyết định chơi xung quanh là boolean 'Thư mục đi bộ. Nó tạo ra các quy tắc viết lại cho mỗi phân đoạn của một phép hoán vị và có thể gây ra sự không phù hợp với quy tắc viết lại. Khi một URL WordPress được yêu cầu, mảng quy tắc viết lại được kiểm tra từ trên xuống dưới. Ngay sau khi một trận đấu được tìm thấy, nó sẽ tải bất cứ thứ gì nó đi qua, ví dụ như nếu phép của bạn có một trận đấu tham lam, vd. thư mục for /%category%/%postname%/
và walk nằm trên nó sẽ xuất ra các quy tắc viết lại cho cả /%category%/%postname%/
AND /%category%/
sẽ khớp với bất cứ thứ gì. Nếu điều đó xảy ra quá sớm, bạn sẽ bị lừa.
Permalinks
Đây là chức năng phân tích permalinks loại bài đăng và chuyển đổi một hoán vị (ví dụ '/% năm% /% thángnum% /% postname% /') thành một URL thực tế.
Phần tiếp theo là một ví dụ đơn giản về những gì lý tưởng sẽ là một phiên bản của get_permalink()
chức năng được tìm thấy wp-includes/link-template.php
. Permalinks bài tùy chỉnh được tạo ra bởi get_post_permalink()
đó là một phiên bản nhiều nước get_permalink()
. get_post_permalink()
được lọc bởi post_type_link
vì vậy chúng tôi sử dụng điều đó để tạo ra một cơ sở hạ tầng tùy chỉnh.
// 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;
}
Như đã đề cập, đây là một trường hợp rất đơn giản để tạo một quy tắc viết lại và permalinks tùy chỉnh, và không đặc biệt linh hoạt nhưng nó đủ để giúp bạn bắt đầu.
Gian lận
Tôi đã viết một plugin cho phép bạn xác định hoán vị cho bất kỳ loại bài đăng tùy chỉnh nào, nhưng giống như bạn có thể sử dụng %category%
trong cấu trúc permalink cho các bài đăng mà plugin của tôi hỗ trợ %custom_taxonomy_name%
cho bất kỳ phân loại tùy chỉnh nào bạn có, custom_taxonomy_name
ví dụ như tên phân loại của bạn. %club%
.
Nó sẽ hoạt động như bạn mong đợi với các phân loại phân cấp / không phân cấp.
http://wordpress.org/extend/plugins/wp-perm Hạ cơ /