En su ejemplo, el autor reescribe los cambios de patrón de /author/[authorname]/
a /[author_level]/[author_name]/
. Si permitimos [author_level]
que haya algo, entraremos en conflicto con las reglas de las páginas, ya que /[anything]/[anything]/
puede ser un archivo de autor o una subpágina normal.
Por esta razón, mi solución asume que tiene un número limitado de niveles de autor, por lo que podemos ponerlos explícitamente en las reglas de reescritura. Entonces /ninja/[anything]/
será un archivo de autor, pero /not-ninja/[anything]/
será una página normal.
Cambiar la estructura de la URL siempre consta de dos partes: cambiar las URL que WordPress aceptará y cambiar las URL que generará WordPress. Primero, cambiaremos las URL que WordPress aceptará introduciendo una nueva etiqueta de reescritura y configurando nuestra base de autores para esa etiqueta.
// 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%';
}
Si verifica las reglas de reescritura resultantes con mi Analizador de reescritura , notará que contiene reglas adicionales para las /[author-level]/
páginas simples . Esto sucede porque WordPress genera reglas para cada parte del directorio que contiene una etiqueta de reescritura, como %author_level%
. No los necesitamos, así que filtre todas las reglas de reescritura de autores que no contengan 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;
}
Ahora WordPress debería aceptar URL usando este nuevo patrón. Lo único que queda por hacer es cambiar las URL que genera cuando crea un enlace a un archivo de autor. Para eso, puede conectarlo al author_link
filtro, como este ejemplo muy 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;
}