Come effettuare il login solo con email senza username?
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
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/

È 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.

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.

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!

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.

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

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 );
}

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.

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

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

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.

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'] ) ) : ''; ?>" />
pulsante
