Come effettuare il login solo con email senza username?

9 mag 2012, 23:44:26
Visualizzazioni: 46.4K
Voti: 25

Dopo aver cercato per un paio di giorni e letto discussioni vecchie di 2 anni, sto avendo difficoltà a trovare una soluzione al problema di far accedere gli utenti solo tramite email.

All'inizio ero entusiasta di vedere WP_Email_Login solo per scoprire che si può ancora utilizzare il nome utente per accedere. Non sono sicuro di come scrivere questo come plugin. La mia idea è di sovrascrivere la funzione register_new_user. Non ho visto questa funzione nella lista delle funzioni "pluggable". Posso utilizzare filtri/azioni per realizzare questo?

Mi rendo conto che non è consigliabile modificare i file core, quindi spero che esista una soluzione alternativa, tuttavia se non ne esiste una mi prenderò i miei rischi. Nella prima riga della funzione "register_new_user" in wp-login.php posso aggiungere:

$nickname_variable(??) = $user_login // imposta il nickname come nome utente
$user_login = $user_email; // imposta lo user_login/username come indirizzo email

Questo funziona abbastanza bene dato che WordPress non permette alle persone di cambiare il loro nome utente. Nella schermata di registrazione (form) chiede Username & Email; vorrei impostare lo Username come variabile Nickname (se qualcuno può dirmi come si chiama la variabile nickname o dove viene impostata durante la registrazione lo apprezzerei molto).

Saluti,

Smith

6
Commenti

Stai cercando di eliminare completamente i nomi utente? Perché il plugin Email Login non funziona per te?

Ryan Ryan
10 mag 2012 01:40:07

Sono davvero curioso del perché vorresti eliminare i nomi utente, dato che sono la base di tutte le informazioni degli utenti in WordPress. È un po' come cercare di eliminare i Post: un sacco di lavoro per un ritorno minimo, con la certezza di problemi in futuro.

SickHippie SickHippie
10 mag 2012 02:00:16

@Ryan- Non credo che riuscirò a eliminare i nomi utente, quindi invece sto forzando il nome utente a essere uguale all'indirizzo email.

agentsmith666 agentsmith666
10 mag 2012 09:29:46

@SickHippie - per il login penso che l'email sia migliore e più univoca di un username. Preferirei usare l'username come nickname quando l'utente pubblica. Hai ragione che sarebbe un problema "eliminare" la variabile "username" ed è per questo che non lo faccio. Sto solo scegliendo l'username per l'utente quando si registra (l'username sarà il suo indirizzo email; il loro nickname sarà ciò che hanno inserito come username). Alla fine nessuna variabile viene persa, tutto rimane intatto.

agentsmith666 agentsmith666
10 mag 2012 09:34:30

Ma se gli username non possono essere cambiati (comportamento predefinito di WordPress), cosa succede quando un utente cambia il proprio indirizzo email? Se un utente, ad esempio, lascia Hotmail e passa a Gmail, è costretto a usare il suo indirizzo Hotmail per accedere al tuo sito? Se no, allora può cambiare il suo indirizzo email e continuare a usare il vecchio indirizzo email per il login (username), lasciandoti nella stessa situazione. Non ha senso limitare artificialmente le opzioni di login di un utente solo per creare più lavoro per te stesso con una soluzione che non risolve alcun problema. Inoltre, gli username sono univoci, punto. WordPress gestisce questo.

SickHippie SickHippie
10 mag 2012 19:47:29

@SickHippie - Hai ragione, poiché il comportamento predefinito di WordPress non consente agli utenti di cambiare il loro username, il loro username/indirizzo email rimarrebbe lo stesso anche se dovessero cambiare il loro indirizzo email di contatto. L'ho considerato fin dall'inizio e nella mia esperienza personale ho notato che le persone raramente "eliminano" un indirizzo email. Potrebbero ottenere nuovi indirizzi, ma tipicamente manterranno i vecchi. E se non fosse così, forse in quei rari casi lo cambieremo manualmente nel database. Apprezzo molto il tuo feedback e la tua intuizione, SickHippie! Ora spero in una soluzione al mio post :)

agentsmith666 agentsmith666
13 mag 2012 09:43:48
Mostra i restanti 1 commenti
Tutte le risposte alla domanda 9
2
25

Aggiornamento: Ho creato un plugin per login, registrazione e recupero password via email. https://wordpress.org/plugins/smart-wp-login/

Risposta breve: puoi configurare WordPress per fare il login con l'email.

Tre passaggi:

  • Rimuovi la funzione di autenticazione predefinita
  • Aggiungi una funzione di autenticazione personalizzata
  • Cambia il testo "Username" in wp-login.php in "Email"

Una nota:

  • Non modificare i file core.

Rimuovi la funzione di autenticazione predefinita di WordPress.

WordPress utilizza il filtro "authenticate" per eseguire ulteriori validazioni durante il login dell'utente.

remove_filter('authenticate', 'wp_authenticate_username_password', 20);

Aggiungi una funzione di autenticazione personalizzata

add_filter('authenticate', function($user, $email, $password){

    //Controlla campi vuoti
    if(empty($email) || empty ($password)){        
        //Crea nuovo oggetto errore e aggiungi errori
        $error = new WP_Error();

        if(empty($email)){ //Email vuota
            $error->add('empty_username', __('<strong>ERRORE</strong>: Il campo email è vuoto.'));
        }
        else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Email non valida
            $error->add('invalid_username', __('<strong>ERRORE</strong>: L'email non è valida.'));
        }

        if(empty($password)){ //Password vuota
            $error->add('empty_password', __('<strong>ERRORE</strong>: Il campo password è vuoto.'));
        }

        return $error;
    }

    //Controlla se l'utente esiste nel database WordPress
    $user = get_user_by('email', $email);

    //Email errata
    if(!$user){
        $error = new WP_Error();
        $error->add('invalid', __('<strong>ERRORE</strong>: L'email o la password inseriti non sono validi.'));
        return $error;
    }
    else{ //controlla password
        if(!wp_check_password($password, $user->user_pass, $user->ID)){ //password errata
            $error = new WP_Error();
            $error->add('invalid', __('<strong>ERRORE</strong>: L'email o la password inseriti non sono validi.'));
            return $error;
        }else{
            return $user; //superato
        }
    }
}, 20, 3);

Cambia il testo "Username" in wp-login.php in "Email"

Possiamo usare il filtro gettext per cambiare il testo "Username" in "Email" senza modificare i file core.

add_filter('gettext', function($text){
    if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
        if('Username' == $text){
            return 'Email';
        }
    }
    return $text;
}, 20);

Ho anche scritto un articolo dettagliato sul mio blog http://www.thebinary.in/blog/wordpress-login-using-email/

12 giu 2014 16:59:14
Commenti

Ottima risposta Nishant

Andrew Bartel Andrew Bartel
12 giu 2014 19:21:00

utile! Nel mio caso semplicemente rimuovo i caratteri speciali dall'email e la trasformo in un nome utente. Quindi user@example.com diventa user_example_com e ha funzionato.

wpcoder wpcoder
28 apr 2018 23:01:53
3

È possibile, devi modificare la validazione predefinita tramite il filtro delle azioni.

// Rimuovi il filtro predefinito.
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// Aggiungi un filtro personalizzato.
add_filter( 'authenticate', 'fb_authenticate_username_password', 20, 3 );
function fb_authenticate_username_password( $user, $username, $password ) {

    // Se un indirizzo email viene inserito nel campo username, 
    // cerca il corrispondente username e autentica normalmente utilizzandolo.
    if ( ! empty( $username ) )
        $user = get_user_by( 'email', $username );
    
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;
    
    // utilizzando l'username trovato cercando tramite email
    return wp_authenticate_username_password( NULL, $username, $password );
}

Un'alternativa è un plugin pubblico.

10 mag 2012 08:48:50
Commenti

Grazie per la risposta, tuttavia non sono sicuro che tu abbia letto il mio post o se non sono stato abbastanza chiaro. Mi scuso per quest'ultimo caso. Nel mio post originale ho menzionato il plugin WP_Email_Login; lo stesso plugin da cui proviene il tuo codice e il tuo link. Ecco il mio post originale: "Inizialmente ero contento di vedere WP_Email_Login solo per scoprire che puoi ancora usare il tuo username per accedere." <--- Vedi il problema? Posso ancora usare un nome utente, ecco perché questo plugin non funzionerà. Dato che non posso eliminare gli username, sto pensando di sovrascrivere la funzione di registrazione forzando l'username a essere uguale all'indirizzo email.

agentsmith666 agentsmith666
10 mag 2012 09:37:13

Tuttavia sto cercando un modo per realizzare questo senza modificare i file core. Se non è possibile, va bene lo stesso, ma vorrei saperlo in ogni caso. Grazie!

agentsmith666 agentsmith666
10 mag 2012 09:41:54

questo è un modo per farlo senza modificare i file core. Copia il codice in un plugin, attivalo e il gioco è fatto.

bueltge bueltge
2 apr 2013 01:06:27
1

Utilizzando il codice sopra:

// Modifica le credenziali di accesso
// rimuovi il filtro predefinito
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// aggiungi un filtro personalizzato
add_filter( 'authenticate', 'my_authenticate_username_password', 20, 3 );
function my_authenticate_username_password( $user, $username, $password ) {

    // Se viene inserito un indirizzo email nel campo username,
    // cerca l'username corrispondente e autentica normalmente utilizzandolo
    if ( ! empty( $username ) ) {
        // se l'username non contiene una @ imposta username a stringa vuota
        // causa il fallimento dell'autenticazione
        if(strpos($username, '@') == FALSE){
                $username = '';
            }
        $user = get_user_by( 'email', $username );
        }
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // utilizzando l'username trovato cercando via email
    return wp_authenticate_username_password( NULL, $username, $password );
}

Tutto quello che dovevamo fare era verificare che l'username fornito assomigliasse almeno a un'email e, in caso contrario, sabotare l'username.

1 giu 2013 03:34:24
Commenti

Invece di un controllo primitivo della stringa per '@' nel nome utente, WordPress ha una pratica funzione integrata: sanitize_email restituirà o un formato di indirizzo email valido o nulla: sanitize_email('email¬!"@business_com'); // Restituisce nulla

indextwo indextwo
7 lug 2014 13:16:51
0

Piccole modifiche al codice sopra dovrebbero essere sufficienti per creare una soluzione elegante. La documentazione per l'hook authenticate afferma che dovrebbe essere restituito un oggetto WP_User o un oggetto WP_Error.

Il codice sorgente per la funzione wp_authenticate_username_password esegue alcuni controlli abbastanza semplici; possiamo semplicemente replicare il modo in cui questi controlli vengono eseguiti e creare un nuovo oggetto WP_Error per gestire l'indirizzo email. In alternativa, potremmo anche modificare direttamente il codice di wp_authenticate_username_password se volessimo, anche se sembra non necessario a meno che non si voglia personalizzare davvero il funzionamento. Il codice seguente dovrebbe fare al caso nostro: (Anche se non l'ho testato personalmente...)

// Rimuove la funzione di autenticazione predefinita
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// Aggiunge la funzione di autenticazione personalizzata
add_filter( 'authenticate', 'custom_authenticate_username_password', 20, 3 );

function custom_authenticate_username_password( $user, $username, $password ) {

    // Ottiene l'oggetto WP_User basato sull'indirizzo email
    if ( ! empty( $username ) ) {
        $user = get_user_by( 'email', $username );
    }

    // Restituisce un oggetto WP_Error personalizzato se non viene restituito un oggetto WP_User (es. L'email non esiste o è stato fornito un normale username)
    if ( ! $user ) {
        return new WP_Error( 'invalid_username_email', sprintf( __( '<strong>ERRORE</strong>: Username non valido. Effettua il login con il tuo indirizzo email. <a href="%s" title="Password Lost and Found">Password dimenticata</a>?' ), wp_lostpassword_url() ) );
    }

    // Ripassa l'autenticazione al gestore predefinito ora che abbiamo un oggetto WP_User valido basato sull'indirizzo email
    return wp_authenticate_username_password( null, $username, $password );
}
19 feb 2014 21:31:10
1

è già presente nel WP-CORE!

ora WordPress permette già di registrare EMAIL come nome utente. ma se stai parlando di utenti già registrati, allora prova le risposte elencate.

17 lug 2016 22:46:51
Commenti

Sarebbe molto utile un link alla documentazione di WP dove questo viene spiegato. Potresti fornirlo? Non ho avuto fortuna nella mia ricerca.

Gerard Reches Gerard Reches
26 apr 2021 14:39:12
0

So che questo è un argomento piuttosto vecchio ma compare abbastanza in alto su Google, quindi ho pensato di aggiungere una risposta.

Dalla versione 4.5.0 WordPress ha wp_authenticate_email_password (documentazione) che è agganciato al filtro authenticate.

Quindi, per permettere solo l'autenticazione via email, devi semplicemente rimuovere l'autenticazione via username come visto in altre risposte:

remove_filter('authenticate', 'wp_authenticate_username_password', 20, 3);

Questo dovrebbe essere tutto ciò di cui hai bisogno.

21 mag 2022 15:24:06
1

C'è un plugin per quello: Force Email Login

https://wordpress.org/plugins/force-email-login/

È anche su Github: https://github.com/miya0001/force-email-login

17 apr 2018 17:29:24
Commenti

Bene. Puoi semplicemente inserire https://raw.githubusercontent.com/miya0001/force-email-login/master/force-email-login.php nella cartella mu-plugins

squarecandy squarecandy
15 feb 2020 01:01:08
1

Ho avuto difficoltà a fare questo senza scrivere codice e molti dei plugin proposti qui non sono più supportati. Ho trovato questo che fa il lavoro: https://wordpress.org/plugins/login-customizer/.

Fa anche altre cose, ma rimane comunque molto leggero.

8 mag 2021 03:59:01
Commenti

Ciao, e grazie per il tuo contributo a WPSE. In generale, cerchiamo di fornire risposte basate su codice o sviluppo piuttosto che raccomandazioni di plugin.

Matthew Brown aka Lord Matt Matthew Brown aka Lord Matt
8 mag 2021 20:11:03
0

Cambia il tipo di campo da testo a email, in modo che il campo generi un errore se l'utente prova a inserire username e password e clicca su login

<input type="email" name="username" id="username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" />

pulsanteDescrizione immagine qui

27 apr 2023 18:43:13