Cambiare lo Slug dell'Autore da Nome Utente a Nickname
Ciao a tutti,
è possibile cambiare lo slug predefinito del nome utente con il nickname se disponibile?
Per impostazione predefinita l'URL è qualcosa del tipo: http://domain.tld/author/(admin),
è possibile riscriverlo e modificarlo in http://domain.tld/author/(nickname) così che quando un utente modifica il suo nickname dalla pagina del profilo, lo slug cambierà automaticamente con il nuovo nome scelto dall'utente?
grazie mille!
Philip

Vedo due modi per risolvere questo problema: modificare i dati che formano l'URL dell'autore, o cambiare l'URL dell'autore. Probabilmente dovresti gestire anche i redirect, così che i vecchi URL degli archivi utente continuino a funzionare quando un utente cambia il proprio nickname.
Modificare l'URL dell'autore
Ci sono due aspetti da considerare: gestire i link in entrata con il nickname dell'autore invece dello slug, e generare gli URL degli articoli dell'autore con il nickname invece dello slug standard.
Il primo aspetto si risolve agganciandosi al filtro request
, verificando se si tratta di una richiesta per un autore, e cercando l'autore per nickname invece che per slug. Se troviamo un autore, modifichiamo i parametri della query per usare 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;
}
Il secondo aspetto si risolve agganciandosi al filtro author_link
e sostituendo la parte standard dell'autore (indicata da $author_nicename
) con il nickname.
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;
}
Modificare i dati che formano l'URL dell'autore
Un metodo forse più semplice sarebbe aggiornare il campo user_nicename
nel database che altrimenti rimarrebbe inutilizzato. Credo che venga generato dal login utente e non venga più modificato in seguito. Ma non sono un esperto di gestione utenti, quindi usalo 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 );
}
}

Ottima soluzione. Non l'ho ancora verificata, ma penso che il tuo approccio sia davvero valido.

E per quanto riguarda i nicename degli autori duplicati? Dobbiamo preoccuparcene o è WordPress che se ne occupa?

Come ha detto @DrewBaker, potrebbe esserci un problema con gli URL duplicati se due profili utente hanno nomi simili. Ad esempio, se un utente 1 modifica il suo nome utente in John e c'è un altro utente con un nome simile, entrambi i profili utente avranno lo stesso URL autore come site.com/author/john.
Puoi dirmi se esiste una soluzione per questo?

Inoltre, se c'è uno spazio nel nome, l'URL non funzionerà. Succede con i nomi utente casuali creati con questo codice. Quando ho provato il codice sul mio sito, genera nomi utente casuali come "Nuovo utente 654937" e l'URL dell'autore appare come sito.com/author/Nuovoutente654937/. Quell'URL non funzionerà finché non cambiamo nuovamente il nome del profilo e rimuoviamo gli spazi. Puoi suggerire una soluzione per questo?

@IamSJ: Non c'è una prevenzione automatica contro nomi duplicati o caratteri non validi. Dovrai gestirlo tu stesso. Probabilmente il modo più semplice è farlo tramite il secondo metodo, modificando il "nicename".

Utilizza questo plugin: http://wordpress.org/extend/plugins/display-name-author-permalink/
Anche se non è testato per la versione 3.2.1, lo sto utilizzando senza problemi.
Se ricevi un errore di intestazione durante l'attivazione del plugin, puoi trovare una soluzione qui: http://wordpresscloaker.com/blog/how-to-fix-wordpress-plugin-does-not-have-a-valid-header-error.html

Un modo semplice è utilizzare il plugin Author Slug
Puoi anche usare un piccolo codice:
add_action('init', 'set_new_author_base');
function set_new_author_base() {
global $wp_rewrite;
$author_slug = 'new_slug';
$wp_rewrite->author_base = $author_slug;
}
