あなたの例では、作成者はパターンをから/author/[authorname]/
に書き換えます/[author_level]/[author_name]/
。私たち[author_level]
が何かになることを許可した場合/[anything]/[anything]/
、著者のアーカイブまたは通常のサブページになる可能性があるため、ページのルールに抵触することになります。
このため、私のソリューションでは、作成者レベルの数が限られていることを前提としているため、それらを明示的に書き換えルールに含めることができます。したがって/ninja/[anything]/
、著者アーカイブに/not-ninja/[anything]/
なりますが、通常のページになります。
URL構造の変更は常に2つの部分で構成されます。WordPressが受け入れるURLを変更することと、WordPressが生成するURLを変更することです。最初に、新しいrewriteタグを導入し、作成者ベースをそのタグに設定することにより、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;
}