No seu exemplo, o autor reescreve as alterações de padrão de /author/[authorname]/
para /[author_level]/[author_name]/
. Se permitirmos [author_level]
qualquer coisa, entraremos em conflito com as regras das páginas, porque /[anything]/[anything]/
pode ser um arquivo de autor ou uma subpágina regular.
Por esse motivo, minha solução supõe que você tenha um número limitado de níveis de autor, para que possamos explicitamente colocá-los nas regras de reescrita. Então, /ninja/[anything]/
será um arquivo de autor, mas /not-ninja/[anything]/
será uma página regular.
Alterar a estrutura da URL sempre consiste em duas partes: alterar as URLs que o WordPress aceitará e alterar as URLs que o WordPress irá gerar. Primeiro, alteraremos os URLs que o WordPress aceitará, introduzindo uma nova marca de reescrita e definindo nossa base de autores para essa marca.
// 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%';
}
Se você verificar as regras de reescrita resultantes com o meu Rewrite Analyzer , notará que ele contém regras extras para as /[author-level]/
páginas comuns . Isso acontece porque o WordPress gera regras para cada parte do diretório que contém uma tag de reescrita, como %author_level%
. Não precisamos disso, portanto, filtre todas as regras de reescrita de autores que não contenham 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;
}
Agora, o WordPress deve aceitar URLs usando esse novo padrão. A única coisa que resta a fazer é alterar os URLs que ele gera quando cria um link para um arquivo de autor. Para isso, você pode conectar-se ao author_link
filtro, como este exemplo muito básico:
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;
}