Je vois deux façons de résoudre ce problème: changer les données qui forment l'URL de l'auteur ou changer l'URL de l'auteur. Vous devriez probablement également gérer les redirections, de sorte que les anciennes URL vers les archives des utilisateurs continuent de fonctionner lorsqu'un utilisateur change de surnom.
Modification de l'URL de l'auteur
Cette question comporte deux parties: gérer les liens entrants avec le pseudo de l'auteur au lieu du slug de l'auteur et générer des URL de publication de l'auteur avec le pseudo au lieu du slug standard.
La première partie est résolue en se connectant au request
filtre, en vérifiant s'il s'agit d'une demande d'auteur et en recherchant l'auteur par surnom au lieu de slug. Si nous trouvons un auteur, nous modifions les paramètres de requête pour utiliser l'ID d'auteur.
add_filter( 'request', 'wpse5742_request' );
function wpse5742_request( $query_vars )
{
if ( array_key_exists( 'author_name', $query_vars ) ) {
global $wpdb;
$author_id = $wpdb->get_var( $wpdb->prepare( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key='nickname' AND meta_value = %s", $query_vars['author_name'] ) );
if ( $author_id ) {
$query_vars['author'] = $author_id;
unset( $query_vars['author_name'] );
}
}
return $query_vars;
}
La deuxième partie se fait en se connectant au author_link
filtre et en remplaçant la partie auteur standard (indiquée par $author_nicename
) par le surnom.
add_filter( 'author_link', 'wpse5742_author_link', 10, 3 );
function wpse5742_author_link( $link, $author_id, $author_nicename )
{
$author_nickname = get_user_meta( $author_id, 'nickname', true );
if ( $author_nickname ) {
$link = str_replace( $author_nicename, $author_nickname, $link );
}
return $link;
}
Modification des données qui forment l'URL de l'auteur
Un moyen peut-être plus simple serait de mettre à jour le user_nicename
champ autrement inutilisé dans la base de données. Je pense qu'il est généré à partir de la connexion utilisateur et n'a jamais changé après cela. Mais je ne suis pas un expert en gestion des utilisateurs, alors utilisez-le à vos risques et périls.
add_action( 'user_profile_update_errors', 'wpse5742_set_user_nicename_to_nickname', 10, 3 );
function wpse5742_set_user_nicename_to_nickname( &$errors, $update, &$user )
{
if ( ! empty( $user->nickname ) ) {
$user->user_nicename = sanitize_title( $user->nickname, $user->display_name );
}
}