Cum să te autentifici doar cu email fără nume de utilizator?

9 mai 2012, 23:44:26
Vizualizări: 46.4K
Voturi: 25

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

6
Comentarii

Încearcă să elimini complet numele de utilizator? De ce nu funcționează plugin-ul Email Login pentru tine?

Ryan Ryan
10 mai 2012 01:40:07

Sunt foarte curios de ce ai vrea să renunți la numele de utilizator, deoarece acestea stau la baza tuturor informațiilor despre utilizatori în WordPress. E puțin ca și cum ai încerca să renunți la Postări - multă muncă pentru un rezultat nesemnificativ și o garanție a problemelor pe termen lung.

SickHippie SickHippie
10 mai 2012 02:00:16

@Ryan- Nu cred că voi putea renunța la numele de utilizator, așa că în schimb forțez ca numele de utilizator să fie egal cu adresa de email.

agentsmith666 agentsmith666
10 mai 2012 09:29:46

@SickHippie - pentru autentificare cred că adresa de email este mai bună și mai unică decât un nume de utilizator. Aș prefera să folosesc numele de utilizator ca pseudonim când utilizatorul postează. Ai dreptate că ar fi dificil să "scăpăm" de variabila "username", motiv pentru care nu o fac. Pur și simplu aleg numele de utilizator pentru utilizator când se înregistrează (numele de utilizator va fi adresa lor de email; pseudonimul lor va fi ceea ce au introdus ca nume de utilizator). La final, nicio variabilă nu se pierde, totul rămâne intact.

agentsmith666 agentsmith666
10 mai 2012 09:34:30

Dar dacă numele de utilizator nu pot fi schimbate (comportament implicit al WordPress), ce se întâmplă când un utilizator își schimbă adresa de email? Dacă un utilizator, de exemplu, părăsește Hotmail și trece la Gmail, este obligat să-și folosească adresa de Hotmail pentru a se autentifica pe site-ul tău? Dacă nu, atunci ei își pot schimba adresa de email, dar tot pot folosi vechea adresă pentru autentificare (nume de utilizator), lăsându-te în aceeași situație. Nu are sens să restricționezi artificial opțiunile de autentificare ale unui utilizator doar pentru a-ți crea mai multă muncă pentru o soluție care nu rezolvă nici o problemă. De asemenea, numele de utilizator sunt unice, punct. WordPress se ocupă de asta.

SickHippie SickHippie
10 mai 2012 19:47:29

@SickHippie - Ai dreptate, deoarece implicit WordPress nu permite utilizatorilor să-și schimbe numele de utilizator, numele lor de utilizator/adresa de email ar rămâne aceeași chiar dacă ar schimba adresa de contact. M-am gândit la asta de la început și din propria mea experiență am observat că oamenii rareori "șterg" o adresă de email. Pot obține altele noi, dar în general le păstrează pe cele vechi. Și dacă nu, poate în acele cazuri rare vom schimba manual în baza de date. Apreciez cu adevărat feedback-ul și perspectivele tale, SickHippie! Acum sper să găsesc o soluție pentru postarea mea :)

agentsmith666 agentsmith666
13 mai 2012 09:43:48
Arată celelalte 1 comentarii
Toate răspunsurile la întrebare 9
2
25

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/

12 iun. 2014 16:59:14
Comentarii

Răspuns bun, Nishant

Andrew Bartel Andrew Bartel
12 iun. 2014 19:21:00

util! În cazul meu, am eliminat caracterele speciale din email și l-am transformat într-un nume de utilizator. Deci user@example.com devine user_example_com și a funcționat.

wpcoder wpcoder
28 apr. 2018 23:01:53
3

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.

10 mai 2012 08:48:50
Comentarii

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.

agentsmith666 agentsmith666
10 mai 2012 09:37:13

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!

agentsmith666 agentsmith666
10 mai 2012 09:41:54

aceasta este o metodă fără a edita fișierele de bază. Copiază codul într-un plugin, activează-l și gata.

bueltge bueltge
2 apr. 2013 01:06:27
1

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.

1 iun. 2013 03:34:24
Comentarii

Î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

indextwo indextwo
7 iul. 2014 13:16:51
0

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 );
}
19 feb. 2014 21:31:10
1

este deja în WP-CORE!

acum WordPress permite deja înregistrarea EMAIL-ului ca nume de utilizator. dar dacă vorbești despre utilizatori deja înregistrați, atunci încearcă răspunsurile enumerate.

17 iul. 2016 22:46:51
Comentarii

Un link către documentația WP unde este explicat acest lucru ar fi foarte util. Poți să-l oferi? Nu am avut noroc în căutările mele.

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

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

21 mai 2022 15:24:06
1

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

17 apr. 2018 17:29:24
Comentarii

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

squarecandy squarecandy
15 feb. 2020 01:01:08
1

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.

8 mai 2021 03:59:01
Comentarii

Salutare și mulțumesc pentru contribuția ta la WPSE. În general, ne orientăm către răspunsuri bazate pe cod sau dezvoltare, mai degrabă decât recomandări de plugin-uri.

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

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

butonButon de autentificare

27 apr. 2023 18:43:13