Come accedere solo tramite e-mail senza nome utente?


20

Dopo aver cercato un paio di giorni e aver letto i thread di 2 anni, ho difficoltà a trovare una soluzione al problema di avere gli utenti che accedono solo tramite e-mail.

All'inizio sono stato felice di vedere WP_Email_Login solo per scoprire che puoi ancora usare il tuo nome utente per accedere. Non sono sicuro di come scrivere questo come plugin. La mia idea è quella di sovrascrivere la funzione register_new_user. Non l'ho visto nell'elenco delle funzioni "innestabili". Posso usare filtri / azione per fare questo?

Mi rendo conto che non è di moda modificare i file core, quindi spero che esista una soluzione, ma se non esiste ne prenderò le mie possibilità. Nella prima riga della funzione "register_new_user" in wp-login.php posso aggiungere:

$nickname_variable(??) = $user_login // set the nickname to the username
$user_login = $user_email; // set the user_login/username to the email address

Funziona abbastanza bene poiché WordPress non consente alle persone di cambiare il loro nome utente. Nella schermata di registrazione (modulo) richiede il nome utente e l'e-mail; Vorrei impostare il nome utente sulla variabile Nickname (se qualcuno può dirmi come si chiama la variabile nickname o dove è impostato durante la registrazione che sarebbe apprezzato).

Saluti,

fabbro


Stai cercando di eliminare completamente i nomi utente? Perché il plug-in Email Login non funziona per te?
Ryan,

Sono davvero curioso di sapere perché vorresti eliminare i nomi utente, dal momento che questi sono la base di tutte le informazioni dell'utente in WordPress. È un po 'come provare a sbarazzarsi di Posts: molto lavoro per non molto payoff e una garanzia di problemi lungo la strada.
SickHippie,

1
@ Ryan- Non credo che riuscirò a sbarazzarmi dei nomi utente, quindi sto solo forzando il nome utente a eguagliare l'indirizzo e-mail.
agentsmith666,

@SickHippie - per il login, penso che l'e-mail sia migliore e più unica di un nome utente. Preferirei usare il nome utente come soprannome quando l'utente pubblica. Hai ragione, sarebbe una seccatura sbarazzarsi della variabile "username", motivo per cui non lo sono. Sto solo scegliendo il nome utente per l'utente al momento della registrazione (nome utente sarà il loro indirizzo e-mail; il loro nickname sarà quello che hanno inserito come nome utente). Alla fine non si perdono variabili, tutto è intatto.
agentsmith666,

1
@SickHippie - Hai ragione poiché l'impostazione predefinita di Wordpress non è quella di consentire all'utente di modificare il proprio nome utente, il suo nome utente / indirizzo e-mail rimarrebbe lo stesso anche se dovessero cambiare l'indirizzo e-mail di contatto. Ho considerato che sin dall'inizio e nella mia esperienza ho scoperto che le persone raramente "cancellano" un indirizzo e-mail. Potrebbero averne di nuovi, ma in genere ne avranno ancora di vecchi. E se non forse in quelle rare circostanze, lo cambieremo manualmente nel database. Apprezzo molto il tuo feedback e intuizione SickHippie! Ora spero in una soluzione al mio post :)
agentsmith666,

Risposte:


19

Aggiornamento: ho creato un plug-in per l'accesso, la registrazione e il recupero della password tramite e-mail. https://wordpress.org/plugins/smart-wp-login/

Rispondi in breve, puoi configurare WordPress per accedere con la posta elettronica.

Tre passaggi:

  • Rimuovi la funzione di autenticazione predefinita
  • Aggiungi funzione di autenticazione personalizzata
  • Cambia il testo "Nome utente" 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 " autentica " per eseguire ulteriori convalide al login dell'utente.

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

Aggiungi funzione di autenticazione personalizzata

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

    //Check for empty fields
    if(empty($email) || empty ($password)){        
        //create new error object and add errors to it.
        $error = new WP_Error();

        if(empty($email)){ //No email
            $error->add('empty_username', __('<strong>ERROR</strong>: Email field is empty.'));
        }
        else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Invalid Email
            $error->add('invalid_username', __('<strong>ERROR</strong>: Email is invalid.'));
        }

        if(empty($password)){ //No password
            $error->add('empty_password', __('<strong>ERROR</strong>: Password field is empty.'));
        }

        return $error;
    }

    //Check if user exists in WordPress database
    $user = get_user_by('email', $email);

    //bad email
    if(!$user){
        $error = new WP_Error();
        $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
        return $error;
    }
    else{ //check password
        if(!wp_check_password($password, $user->user_pass, $user->ID)){ //bad password
            $error = new WP_Error();
            $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
            return $error;
        }else{
            return $user; //passed
        }
    }
}, 20, 3);

Cambia il testo "Nome utente" in wp-login.php in "Email"

Possiamo usare il filtro gettext per cambiare il testo "Nome utente" 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/


2
Bella risposta Nishant
Andrew Bartel,

utile! Nel mio caso, spoglio semplicemente i caratteri speciali e-mail e ne faccio un nome utente. così user@example.com diventa user_example_com e ha funzionato.
wpcoder,

6

È possibile, è necessario modificare il filtro per il nome.

// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'fb_authenticate_username_password', 20, 3 );
function fb_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) )
        $user = get_user_by( 'email', $username );

    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
}

Un'alternativa è un plug-in, che puoi trovare tramite Google o nel repository plug-in; forse questo plugin .


Grazie per la risposta, tuttavia non sono sicuro che tu abbia letto il mio post o se non fossi abbastanza chiaro. Mi scuso per quest'ultimo. Nel mio post originale ho menzionato il plugin WP_Email_Login; l'esatto plug-in da cui provengono il codice e il link. Ecco il mio post originale: "All'inizio sono stato felice di vedere WP_Email_Login solo per scoprire che puoi ancora usare il tuo nome utente per accedere." <--- Vedi il problema, posso ancora usare un nome utente, ecco perché questo plugin non funzionerà. Dal momento che non riesco a eliminare i nomi utente, sto pensando di ignorare la funzione di registro costringendo il nome utente a eguagliare l'indirizzo e-mail.
agentsmith666,

Tuttavia sto cercando un modo per ottenere questo risultato senza modificare i file core. Se non è possibile, va bene, ma mi piacerebbe saperlo in entrambi i modi. Grazie!
agentsmith666,

questo è un modo senza modificare i file core. Copia il codice in un plugin, attiva e pronto.
fusione

4

Utilizzando il codice sopra:

// Change login credentials
// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'my_authenticate_username_password', 20, 3 );
function my_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) ) {
        //if the username doesn't contain a @ set username to blank string
        //causes authenticate to fail
        if(strpos($username, '@') == FALSE){
                $username = '';
            }
        $user = get_user_by( 'email', $username );
        }
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
} 

Tutto quello che dovevamo fare era controllare che almeno il nome utente fornito sembrasse un'e-mail e, in caso contrario, sabotare il nome utente.


Anziché verificare la stringa di base '@'nel nome utente, Wordpress ha una comoda funzione integrata: sanitize_email restituirà un formato di indirizzo e-mail valido o nulla:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo

3

è già dentro WP-CORE!

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


1

Lievi modifiche al codice sopra dovrebbero essere tutto ciò che è necessario per creare una soluzione elegante. La documentazione per l'hook autenticato afferma che è necessario restituire un WP_Useroggetto o un WP_Erroroggetto.

Il codice sorgente per la funzione wp_authenticate_username_password passa attraverso dei controlli piuttosto semplici; possiamo semplicemente replicare il modo in cui vengono effettuati quei controlli e creare un nuovo WP_Erroroggetto per gestire l'indirizzo e-mail. In alternativa, potremmo anche prendere il wp_authenticate_username_passwordcodice e modificarlo se lo desideriamo, anche se questo sembra inutile a meno che tu non voglia davvero personalizzare il funzionamento delle cose. Il codice qui sotto dovrebbe fare il trucco: (Anche se non l'ho provato da solo ...)

// Remove the default authentication function
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// Add the custom authentication function
add_filter( 'authenticate', 'custom_authenticate_username_password', 20, 3 );

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

    // Get the WP_User object based on the email address
    if ( ! empty( $username ) ) {
        $user = get_user_by( 'email', $username );
    }

    // Return a customized WP_Error object if a WP_User object was not be returned (i.e. The email doesn't exist or a regular username was provided)
    if ( ! $user ) {
        return new WP_Error( 'invalid_username_email', sprintf( __( '<strong>ERROR</strong>: Invalid username. Please log in with your email address. <a href="%s" title="Password Lost and Found">Lost your password</a>?' ), wp_lostpassword_url() ) );
    }

    // Hand authentication back over to the default handler now that we a have a valid WP_User object based on the email address
    return wp_authenticate_username_password( null, $username, $password );
}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.