web-dev-qa-db-fra.com

Changer le slug de base de l'auteur pour différents rôles

Est-il possible de changer le slug de la base auteur en fonction de son rôle? Par exemple, les auteurs obtiennent exemple.com/ninja/%username% et les abonnés obtiennent exemple.com/trainee/%username%?

Je pense à quelque chose comme:

add_action('init', 'set_new_author_base');
function set_new_author_base() {
  global $wp_rewrite;

  if($user->role == 'subscriber')
    $author_slug = 'trainee';
    $wp_rewrite->author_base = $author_slug;
  } elseif($user->role == 'author') {
    $author_slug = 'ninja';
    $wp_rewrite->author_base = $author_slug;
  }
}

Cela devrait fonctionner pour les visiteurs non enregistrés s’ils naviguent sur le site et pour les auteurs et les abonnés connectés eux-mêmes.

8
Maxim Zubarev

Dans votre exemple, l'auteur du modèle de réécriture 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 des pages, car /[anything]/[anything]/ peut être une archive d'auteur ou une sous-page normale.

Pour cette raison, ma solution suppose que vous avez un nombre limité de niveaux d’auteurs. Nous pouvons donc les inclure explicitement dans les règles de réécriture. Donc, /ninja/[anything]/ sera une archive d'auteur, mais /not-ninja/[anything]/ sera une page normale.

La modification de la structure de l'URL comprend toujours deux parties: modification des URL acceptées par WordPress et modification des URL générées par WordPress. Nous allons d’abord changer les URL que WordPress acceptera en introduisant un nouveau tag rewrite et en définissant notre base d’auteurs sur ce 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%';
}

Si vous vérifiez les règles de réécriture obtenues avec mon analyseur de réécriture , vous remarquerez qu'il contient des règles supplémentaires pour les pages en clair /[author-level]/. Cela est dû au fait que WordPress génère des règles pour chaque partie du répertoire contenant une balise de réécriture, telle que %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;
}

Désormais, WordPress doit accepter les URL utilisant ce nouveau modèle. Il ne reste plus qu'à modifier les URL générées lors de la création d'un lien vers une archive d'auteur. Pour cela, vous pouvez vous connecter au filtre author_link, comme dans 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;
}
8
Jan Fabry