В вашем примере автор переписывает изменения шаблона с /author/[authorname]/
на /[author_level]/[author_name]/
. Если мы позволим [author_level]
быть чем-либо, мы вступим в конфликт с правилами для страниц, потому что это /[anything]/[anything]/
может быть либо архив автора, либо обычная подстраница.
По этой причине мое решение предполагает, что у вас есть ограниченное количество уровней автора, поэтому мы можем явно включить их в правила перезаписи. Так /ninja/[anything]/
будет авторский архив, но /not-ninja/[anything]/
будет обычная страница.
Изменение структуры URL всегда состоит из двух частей: изменение URL-адресов, которые будет принимать WordPress, и изменение URL-адресов, которые будет генерировать WordPress. Сначала мы изменим URL-адреса, которые WordPress будет принимать, введя новый тег перезаписи и установив базу наших авторов для этого тега.
// 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%';
}
Если вы проверите полученные правила перезаписи с помощью моего 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;
}