Dans votre exemple, le modèle de réécriture de l'auteur passe de /author/[authorname]/
à /[author_level]/[author_name]/
. Si nous permettons [author_level]
d'être quoi que ce soit, nous entrerons en conflit avec les règles pour les pages, car il /[anything]/[anything]/
peut s'agir d'une archive d'auteur ou d'une sous-page régulière.
Pour cette raison, ma solution suppose que vous avez un nombre limité de niveaux d'auteur, nous pouvons donc les mettre explicitement dans les règles de réécriture. Ce /ninja/[anything]/
sera donc une archive d'auteur, mais ce /not-ninja/[anything]/
sera une page régulière.
La modification de la structure des URL se compose toujours de deux parties: la modification des URL que WordPress acceptera et la modification des URL que WordPress générera. Nous allons d'abord modifier les URL que WordPress acceptera en introduisant une nouvelle balise de réécriture et en définissant notre base d'auteur sur cette balise.
// 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 vous vérifiez les règles de réécriture résultantes avec mon analyseur de réécriture, vous remarquerez qu'il contient des règles supplémentaires pour les /[author-level]/
pages simples . Cela se produit car WordPress génère des règles pour chaque partie de répertoire qui contient une balise de réécriture, comme %author_level%
. Nous n'en avons pas besoin, alors filtrez toutes les règles de réécriture d'auteur qui ne contiennent pas de 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;
}
Maintenant, WordPress devrait accepter les URL utilisant ce nouveau modèle. La seule chose qui reste à faire est de modifier les URL qu'il génère lorsqu'il crée un lien vers une archive d'auteur. Pour cela, vous pouvez vous connecter au author_link
filtre, comme cet exemple très basique:
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;
}