Nel tuo esempio, l'autore riscrive lo schema cambia da /author/[authorname]/
a /[author_level]/[author_name]/
. Se permettiamo [author_level]
di essere qualsiasi cosa, entreremo in conflitto con le regole per le pagine, perché /[anything]/[anything]/
può essere un archivio autore o una sottopagina regolare.
Per questo motivo, la mia soluzione presuppone che tu abbia un numero limitato di livelli di autore, quindi possiamo esplicitamente inserirli nelle regole di riscrittura. Quindi /ninja/[anything]/
sarà un archivio autore, ma /not-ninja/[anything]/
sarà una pagina normale.
La modifica della struttura dell'URL consiste sempre di due parti: la modifica degli URL accettati da WordPress e la modifica degli URL generati da WordPress. Per prima cosa cambieremo gli URL che WordPress accetterà introducendo un nuovo tag di riscrittura e impostando la nostra base di autori su quel tag.
// 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 controlli le regole di riscrittura risultanti con il mio Analizzatore di riscrittura noterai che contiene regole extra per le /[author-level]/
pagine semplici . Ciò accade perché WordPress genera regole per ogni parte della directory che contiene un tag di riscrittura, come %author_level%
. Non ne abbiamo bisogno, quindi filtra tutte le regole di riscrittura dell'autore che non contengono un 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;
}
Ora WordPress dovrebbe accettare gli URL usando questo nuovo modello. L'unica cosa che resta da fare è cambiare gli URL che genera quando crea un collegamento a un archivio autore. Per questo puoi agganciarti al author_link
filtro, come in questo esempio molto semplice:
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;
}