Vedo due modi per risolvere questo problema: cambiare i dati che formano l'URL dell'autore o cambiare l'URL dell'autore. Probabilmente dovresti gestire anche i reindirizzamenti, quindi i vecchi URL per gli archivi utente continuano a funzionare quando un utente cambia il loro nickname.
Modifica dell'URL dell'autore
Ci sono due parti in questa domanda: gestire i collegamenti in arrivo con il nickname dell'autore invece del lumaca dell'autore e generare gli URL post dell'autore con il nickname invece del lumaca standard.
La prima parte viene risolta agganciandosi al request
filtro, controllando se si tratta di una richiesta dell'autore e cercando l'autore in base al nickname anziché alla lumaca. Se troviamo un autore, cambiamo i parametri della query per utilizzare l'ID autore.
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 seconda parte viene eseguita agganciando il author_link
filtro e sostituendo la parte autore standard (indicata da $author_nicename
) con il soprannome.
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;
}
Modifica dei dati che formano l'URL dell'autore
Un modo forse più semplice sarebbe quello di aggiornare il user_nicename
campo altrimenti inutilizzato nel database. Penso che sia generato dal login dell'utente e non sia mai cambiato dopo. Ma non sono un esperto nella gestione degli utenti, quindi utilizzalo a tuo rischio.
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 );
}
}