在您的示例中,作者重写模式从更改/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%';
}
如果使用我的重写分析器检查生成的重写规则,您会注意到它包含用于纯/[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;
}