Cambiare lo Slug dell'Autore da Nome Utente a Nickname

21 dic 2010, 22:14:56
Visualizzazioni: 27.6K
Voti: 16

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

1
Commenti

Non credo sia realisticamente possibile, non esiste un query_var che possa trovare post basandosi sul nickname di un utente, quindi nessuna variabile appropriata a cui mappare il nickname in una regola di riscrittura. Dovresti aggiungere la tua gestione personalizzata delle query var per gestire le ricerche per nickname insieme a qualsiasi codice di riscrittura (è teoricamente possibile, ma non credo sarebbe elegante nella pratica).

t31os t31os
22 dic 2010 11:27:17
Tutte le risposte alla domanda 3
6
18

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 );
    }
}
7 gen 2011 15:58:40
Commenti

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

Anh Tran Anh Tran
7 gen 2011 17:34:36

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

Drew Baker Drew Baker
23 mag 2013 21:38:20

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?

Netizen Netizen
28 dic 2013 10:14:30

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?

Netizen Netizen
28 dic 2013 10:17:40

@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".

Jan Fabry Jan Fabry
29 dic 2013 13:43:00

Riesco a cambiare gli slug, ma tutto restituisce errore 404 anche dopo aver aggiornato i permalink. Qualcuno ha risolto questo problema?

EHerman EHerman
17 gen 2015 23:21:31
Mostra i restanti 1 commenti
0

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

20 nov 2011 19:07:41
1
-3

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;
}
22 dic 2010 02:08:14
Commenti

Purtroppo non è la base degli autori che l'utente sta cercando di modificare.

t31os t31os
22 dic 2010 11:24:00