在您的示例中,作者重写模式从/author/[authorname]/
到/[author_level]/[author_name]/
. 如果我们允许[author_level]
无论如何,我们都会与页面规则发生冲突,因为/[anything]/[anything]/
可以是作者存档或常规子页面。
因此,我的解决方案假设您的作者级别数量有限,因此我们可以将其明确地放入重写规则中。所以/ninja/[anything]/
将是作者档案,但/not-ninja/[anything]/
将是常规页面。
更改URL结构通常包括两部分:更改WordPress将接受的URL和更改WordPress将生成的URL。首先,我们将通过引入一个新的重写标记并将作者库设置为该标记来更改WordPress将接受的URL。
// 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%\';
}
如果使用
my Rewrite Analyzer 您会注意到它包含了平原的额外规则
/[author-level]/
页。这是因为WordPress为每个包含重写标记的目录部分生成规则,如
%author_level%
. 我们不需要这些,所以请过滤掉所有不包含
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;
}
现在WordPress应该使用这种新模式接受URL。剩下要做的唯一一件事就是更改它在创建指向作者存档的链接时生成的URL。为此,您可以
author_link
过滤器,如以下非常基本的示例:
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;
}