Cum să te autentifici doar cu email fără nume de utilizator?
După căutări de câteva zile și citirea unor discuții vechi de 2 ani, întâmpin dificultăți în găsirea unei soluții pentru problema autentificării utilizatorilor doar cu email.
La început am fost încântat să descopăr WP_Email_Login doar pentru a afla că încă se poate folosi numele de utilizator pentru autentificare. Nu sunt sigur cum să scriu acest lucru ca un plugin. Ideea mea este să suprascriu funcția register_new_user. Nu am văzut această funcție în lista de funcții "pluggable". Pot folosi filtre/acțiuni pentru a realiza acest lucru?
Înțeleg că nu este recomandat să editezi fișierele core, așa că sper să existe o soluție, dar dacă nu există voi risca. În prima linie a funcției "register_new_user" din wp-login.php pot adăuga:
$nickname_variable(??) = $user_login // setează porecla ca numele de utilizator
$user_login = $user_email; // setează user_login/username ca adresa de email
Acest lucru funcționează destul de bine deoarece WordPress nu permite utilizatorilor să-și schimbe numele de utilizator. În ecranul de înregistrare (formular) solicită Numele de utilizator & Email; aș dori să setez Numele de utilizator ca variabila pentru poreclă (dacă cineva îmi poate spune cum se numește variabila pentru poreclă sau unde este setată în timpul înregistrării, aș aprecia).
Cu stimă,
Smith

Actualizare: Am creat un plugin pentru autentificare, înregistrare și recuperare parolă prin email. https://wordpress.org/plugins/smart-wp-login/
Pe scurt, poți configura WordPress să permită autentificarea cu email.
Trei pași:
- Elimină funcția implicită de autentificare
- Adaugă o funcție personalizată de autentificare
- Schimbă textul "Username" din wp-login.php în "Email"
O notă importantă:
- Nu modifica fișierele de nucleu (core files).
Elimină funcția implicită de autentificare din WordPress.
WordPress folosește filtrul "authenticate" pentru a efectua validări suplimentare la autentificarea utilizatorilor.
remove_filter('authenticate', 'wp_authenticate_username_password', 20);
Adaugă o funcție personalizată de autentificare
add_filter('authenticate', function($user, $email, $password){
//Verifică câmpuri goale
if(empty($email) || empty ($password)){
//crează un obiect de eroare și adaugă erori în el
$error = new WP_Error();
if(empty($email)){ //Email lipsă
$error->add('empty_username', __('<strong>EROARE</strong>: Câmpul email este gol.'));
}
else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Email invalid
$error->add('invalid_username', __('<strong>EROARE</strong>: Emailul este invalid.'));
}
if(empty($password)){ //Parolă lipsă
$error->add('empty_password', __('<strong>EROARE</strong>: Câmpul parolă este gol.'));
}
return $error;
}
//Verifică dacă utilizatorul există în baza de date WordPress
$user = get_user_by('email', $email);
//email incorect
if(!$user){
$error = new WP_Error();
$error->add('invalid', __('<strong>EROARE</strong>: Fie emailul, fie parola introdusă este invalidă.'));
return $error;
}
else{ //verifică parola
if(!wp_check_password($password, $user->user_pass, $user->ID)){ //parolă incorectă
$error = new WP_Error();
$error->add('invalid', __('<strong>EROARE</strong>: Fie emailul, fie parola introdusă este invalidă.'));
return $error;
}else{
return $user; //autentificare reușită
}
}
}, 20, 3);
Schimbă textul "Username" din wp-login.php în "Email"
Putem folosi filtrul gettext pentru a schimba textul "Username" în "Email" fără a modifica fișierele de nucleu.
add_filter('gettext', function($text){
if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
if('Username' == $text){
return 'Email';
}
}
return $text;
}, 20);
Am scris și un articol detaliat pe blogul meu http://www.thebinary.in/blog/wordpress-login-using-email/

Este posibil, trebuie să modifici validarea implicită prin intermediul filtrului de acțiune.
// Elimină filtrul implicit.
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// Adaugă un filtru personalizat.
add_filter( 'authenticate', 'fb_authenticate_username_password', 20, 3 );
function fb_authenticate_username_password( $user, $username, $password ) {
// Dacă în câmpul de nume de utilizator este introdusă o adresă de email,
// atunci caută numele de utilizator corespunzător și autentifică ca de obicei, folosind acesta.
if ( ! empty( $username ) )
$user = get_user_by( 'email', $username );
if ( isset( $user->user_login, $user ) )
$username = $user->user_login;
// folosind numele de utilizator găsit la căutarea prin email
return wp_authenticate_username_password( NULL, $username, $password );
}
O alternativă este un plugin public.

Mulțumesc pentru răspuns, dar nu sunt sigur dacă ai citit postarea mea sau dacă nu am fost suficient de clar. Îmi cer scuze pentru ultima variantă. În postarea originală am menționat pluginul WP_Email_Login; exact pluginul din care provine codul tău și linkul. Iată postarea mea originală: "La început am fost încântat să descopăr WP_Email_Login, doar pentru a realiza că poți folosi în continuare numele de utilizator pentru autentificare." <--- Vezi problema - pot folosi în continuare un nume de utilizator, de aceea acest plugin nu va funcționa. Deoarece nu pot elimina numele de utilizator, mă gândesc să suprascriu funcția de înregistrare forțând ca numele de utilizator să fie egal cu adresa de email.

Totuși, caut o metodă de a realiza acest lucru fără a edita fișierele de bază. Dacă nu este posibil, e în regulă, dar aș dori să știu clar răspunsul. Mulțumesc!

Folosind codul de mai sus:
// Schimbă credențialele de autentificare
// elimină filtrul implicit
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// adaugă filtrul personalizat
add_filter( 'authenticate', 'my_authenticate_username_password', 20, 3 );
function my_authenticate_username_password( $user, $username, $password ) {
// Dacă este introdusă o adresă de email în câmpul de username,
// caută username-ul corespunzător și autentifică ca de obicei, folosind acel username.
if ( ! empty( $username ) ) {
// dacă username-ul nu conține @ setează username-ul ca șir gol
// cauzează eșecul autentificării
if(strpos($username, '@') == FALSE){
$username = '';
}
$user = get_user_by( 'email', $username );
}
if ( isset( $user->user_login, $user ) )
$username = $user->user_login;
// folosind username-ul găsit la căutarea prin email
return wp_authenticate_username_password( NULL, $username, $password );
}
Tot ce a trebuit să facem a fost să verificăm dacă username-ul furnizat arată măcar ca un email și, dacă nu, să sabotez username-ul.

În loc să verifici șirul de caractere primitiv pentru '@'
în numele de utilizator, WordPress are o funcție utilă încorporată: sanitize_email va returna fie un format valid de adresă de email, fie nimic: sanitize_email('email¬!"@business_com'); // Returnează nimic

Mici modificări ale codului de mai sus ar trebui să fie suficiente pentru a crea o soluție elegantă. Documentația pentru hook-ul authenticate precizează că ar trebui returnat fie un obiect WP_User
, fie un obiect WP_Error
.
Codul sursă pentru funcția wp_authenticate_username_password efectuează niște verificări destul de simple; putem pur și simplu reproduce modul în care sunt făcute aceste verificări și crea un nou obiect WP_Error
pentru a gestiona adresa de email. Alternativ, am putea chiar să preluăm codul funcției wp_authenticate_username_password
și să-l modificăm dacă dorim, deși acest lucru pare inutil, cu excepția cazului în care chiar doriți să personalizați modul în care funcționează lucrurile. Codul de mai jos ar trebui să funcționeze: (Deși nu l-am testat eu însumi...)
// Elimină funcția implicită de autentificare
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// Adaugă funcția personalizată de autentificare
add_filter( 'authenticate', 'custom_authenticate_username_password', 20, 3 );
function custom_authenticate_username_password( $user, $username, $password ) {
// Obține obiectul WP_User pe baza adresei de email
if ( ! empty( $username ) ) {
$user = get_user_by( 'email', $username );
}
// Returnează un obiect WP_Error personalizat dacă nu s-a returnat un obiect WP_User (adică emailul nu există sau a fost furnizat un nume de utilizator obișnuit)
if ( ! $user ) {
return new WP_Error( 'invalid_username_email', sprintf( __( '<strong>EROARE</strong>: Nume de utilizator invalid. Vă rugăm să vă autentificați folosind adresa de email. <a href="%s" title="Parolă Pierdută și Recuperată">Ați pierdut parola</a>?' ), wp_lostpassword_url() ) );
}
// Retrimite autentificarea către handler-ul implicit acum că avem un obiect WP_User valid pe baza adresei de email
return wp_authenticate_username_password( null, $username, $password );
}

Știu că acesta este un subiect destul de vechi, dar apare destul de sus în rezultatele Google, așa că am decis să adaug și eu un răspuns.
Începând cu versiunea 4.5.0, WordPress are funcția wp_authenticate_email_password
(documentație) care este conectată la filtrul authenticate
.
Deci, pentru a permite doar autentificarea prin email, trebuie doar să eliminați autentificarea prin nume de utilizator, așa cum se vede în alte răspunsuri:
remove_filter('authenticate', 'wp_authenticate_username_password', 20, 3);
Asta ar trebui să fie tot ce aveți nevoie.

Există un plugin pentru asta: Force Email Login
https://wordpress.org/plugins/force-email-login/
Este disponibil și pe Github: https://github.com/miya0001/force-email-login

Super. Poți pur și simplu să adaugi https://raw.githubusercontent.com/miya0001/force-email-login/master/force-email-login.php în mu-plugins

Am avut dificultăți să fac asta fără codare și multe dintre plugin-urile propuse aici nu mai sunt suportate. Am găsit acesta care își face treaba: https://wordpress.org/plugins/login-customizer/.
De asemenea, face și alte lucruri, dar rămâne foarte ușor.

Schimbă tipul câmpului din text în email, astfel încât câmpul va afișa o eroare dacă utilizatorul încearcă să introducă numele de utilizator și parolă și apasă pe butonul de autentificare
<input type="email" name="username" id="username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" />
buton
