Trong ví dụ của bạn, tác giả viết lại mẫu thay đổi từ /author/[authorname]/
thành /[author_level]/[author_name]/
. Nếu chúng tôi cho phép [author_level]
là bất cứ điều gì, chúng tôi sẽ xung đột với các quy tắc cho các trang, bởi vì /[anything]/[anything]/
có thể là một kho lưu trữ của tác giả hoặc một trang con thông thường.
Vì lý do này, giải pháp của tôi cho rằng bạn có số lượng cấp độ tác giả hạn chế, vì vậy chúng tôi có thể đưa chúng vào quy tắc viết lại một cách rõ ràng. Vì vậy, /ninja/[anything]/
sẽ là một kho lưu trữ tác giả, nhưng /not-ninja/[anything]/
sẽ là một trang thông thường.
Thay đổi cấu trúc URL luôn bao gồm hai phần: thay đổi URL mà WordPress sẽ chấp nhận và thay đổi URL mà WordPress sẽ tạo. Đầu tiên, chúng tôi sẽ thay đổi các URL mà WordPress sẽ chấp nhận bằng cách giới thiệu thẻ viết lại mới và đặt cơ sở tác giả của chúng tôi cho thẻ đó.
// I assume you define these somewhere, this is just to make the example work
$wpse17106_author_levels = array( 'trainee', 'ninja' );
add_action( 'init', 'wpse17106_init' );
function wpse17106_init()
{
global $wp_rewrite;
$author_levels = $GLOBALS['wpse17106_author_levels'];
// Define the tag and use it in the rewrite rule
add_rewrite_tag( '%author_level%', '(' . implode( '|', $author_levels ) . ')' );
$wp_rewrite->author_base = '%author_level%';
}
Nếu bạn kiểm tra các quy tắc viết lại kết quả với Trình phân tích ghi lại của tôi, bạn sẽ thấy rằng nó chứa các quy tắc bổ sung cho các /[author-level]/
trang đơn giản . Điều này xảy ra vì WordPress tạo quy tắc cho từng phần thư mục có chứa thẻ viết lại, như %author_level%
. Chúng tôi không cần những thứ này, vì vậy hãy lọc ra tất cả các quy tắc viết lại của tác giả không chứa author_name
:
add_filter( 'author_rewrite_rules', 'wpse17106_author_rewrite_rules' );
function wpse17106_author_rewrite_rules( $author_rewrite_rules )
{
foreach ( $author_rewrite_rules as $pattern => $substitution ) {
if ( FALSE === strpos( $substitution, 'author_name' ) ) {
unset( $author_rewrite_rules[$pattern] );
}
}
return $author_rewrite_rules;
}
Bây giờ WordPress nên chấp nhận URL bằng cách sử dụng mẫu mới này. Điều duy nhất còn lại phải làm là thay đổi các URL mà nó tạo khi tạo liên kết đến kho lưu trữ của tác giả. Cho rằng bạn có thể nối vào author_link
bộ lọc, như ví dụ rất cơ bản này:
add_filter( 'author_link', 'wpse17106_author_link', 10, 2 );
function wpse17106_author_link( $link, $author_id )
{
if ( 1 == $author_id ) {
$author_level = 'ninja';
} else {
$author_level = 'trainee';
}
$link = str_replace( '%author_level%', $author_levels, $link );
return $link;
}