Jak zalogować się za pomocą e-maila tylko bez nazwy użytkownika?

20

Po kilku dniach szukania i przeczytaniu 2-letnich wątków mam problem ze znalezieniem rozwiązania problemu z zalogowaniem się użytkowników tylko przez e-mail.

Na początku byłem zachwycony widząc WP_Email_Login tylko po to, aby dowiedzieć się, że nadal możesz używać swojej nazwy użytkownika do logowania. Nie jestem pewien, jak zabrać się do pisania tego jako wtyczki. Moim pomysłem jest zastąpienie funkcji register_new_user. Nie widziałem tego na liście funkcji „wtykowych”. Czy mogę to zrobić za pomocą filtrów / akcji?

Zdaję sobie sprawę, że edytowanie podstawowych plików nie jest modne, więc mam nadzieję, że istnieje rozwiązanie, jednak jeśli nie istnieje, zaryzykuję. W pierwszym wierszu funkcji „register_new_user” w wp-login.php mogę dodać:

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

Działa to całkiem nieźle, ponieważ WordPress nie pozwala ludziom na zmianę nazwy użytkownika. Na ekranie rejestracji (formularz) prosi o podanie nazwy użytkownika i adresu e-mail; Chciałbym ustawić Nazwę użytkownika na zmienną Pseudonim (jeśli ktoś może mi powiedzieć, jak się nazywa zmienna pseudonim lub gdzie jest ustawiona podczas rejestracji, co byłoby mile widziane).

Twoje zdrowie,

Kowal

pełnomocnicy666
źródło
Czy starasz się całkowicie pozbyć nazw użytkowników? Dlaczego wtyczka Email Login nie działa dla Ciebie?
Ryan
Jestem naprawdę ciekawy, dlaczego chcesz pozbyć się nazw użytkowników, ponieważ są one podstawą wszystkich informacji o użytkownikach w WordPress. To trochę jak zlikwidowanie postów - dużo pracy za mało wypłaty i gwarancja problemów na późniejszym etapie.
SickHippie
1
@ Ryan - Nie sądzę, że będę w stanie pozbyć się nazw użytkowników, więc zamiast tego zmuszam nazwę użytkownika do zrównania się z adresem e-mail.
pełnomocnicy666
@SickHippie - do logowania myślę, że e-mail jest lepszy i bardziej unikalny niż nazwa użytkownika. Wolę używać nazwy użytkownika jako pseudonimu, gdy użytkownik publikuje posty. Masz rację, trudno byłoby pozbyć się zmiennej „nazwa użytkownika”, dlatego nie jestem. Po prostu wybieram nazwę użytkownika dla użytkownika podczas rejestracji (nazwa użytkownika będzie ich adresem e-mail; ich pseudonim będzie taki, jak wpisany jako nazwa użytkownika). Ostatecznie zmienne nie są tracone, wszystko jest nienaruszone.
pełnomocnicy666
1
@SickHippie - Masz rację, ponieważ domyślnie Wordpress nie zezwala użytkownikowi na zmianę nazwy użytkownika, nazwa użytkownika / adres e-mail pozostaną takie same, nawet jeśli zmienią kontaktowy adres e-mail. Rozważałem to od samego początku i z własnego doświadczenia stwierdziłem, że ludzie rzadko „usuwają” adres e-mail. Mogą dostać nowe, ale zazwyczaj będą miały swoje stare. A jeśli nie w rzadkich okolicznościach, ręcznie zmienimy to w bazie danych. Naprawdę doceniam twoją opinię i wgląd SickHippie! Teraz mam nadzieję na rozwiązanie mojego postu :)
pełnomocnicy13

Odpowiedzi:

19

Aktualizacja: Stworzyłem wtyczkę do logowania, rejestracji i odzyskiwania hasła za pomocą e-maila. https://wordpress.org/plugins/smart-wp-login/

Krótko mówiąc, możesz skonfigurować WordPressa, aby logował się za pomocą e-maila.

Trzy kroki:

  • Usuń domyślną funkcję uwierzytelniania
  • Dodaj niestandardową funkcję uwierzytelniania
  • Zmień tekst „Nazwa użytkownika” w wp-login.php na „E-mail”

Jedna uwaga:

  • Nie edytuj podstawowych plików.

Usuń domyślną funkcję uwierzytelniania WordPress.

WordPress używa filtra „ uwierzytelniającego ”, aby przeprowadzić dodatkową weryfikację przy logowaniu użytkownika.

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

Dodaj niestandardową funkcję uwierzytelniania

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

Zmień tekst „Nazwa użytkownika” w wp-login.php na „E-mail”

Możemy użyć filtra gettext, aby zmienić tekst „Nazwa użytkownika” na „E-mail” bez edycji podstawowych plików.

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

Napisałem również szczegółowy artykuł na moim blogu http://www.thebinary.in/blog/wordpress-login-using-email/

Nishant Kumar
źródło
2
Dobra odpowiedź Nishant
Andrew Bartel
przydatny! W moim przypadku po prostu usuwam e-maile ze znaków specjalnych i nadaję im nazwę użytkownika. więc uż[email protected] staje się użytkownik_przyklad_com i zadziałało.
wpcoder
6

Jest to możliwe, musisz zmienić filtr nazwy.

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

Alternatywą jest wtyczka, którą znajdziesz w Google oder w repozytorium wtyczek; może ta wtyczka .

bueltge
źródło
Dziękuję za odpowiedź, ale nie jestem pewien, czy przeczytałeś mój post lub czy nie byłem wystarczająco jasny. Przepraszam za to drugie. W moim oryginalnym poście wspomniałem o wtyczce WP_Email_Login; dokładna wtyczka, z której pochodzi twój kod i link. Oto mój oryginalny post: „Na początku byłem zachwycony widząc WP_Email_Login tylko po to, aby dowiedzieć się, że nadal możesz używać swojej nazwy użytkownika do logowania”. <--- Zobacz problem Nadal mogę używać nazwy użytkownika, dlatego ta wtyczka nie działa. Ponieważ nie mogę pozbyć się nazw użytkowników, myślę o zastąpieniu funkcji rejestracji przez wymuszenie, aby nazwa użytkownika była równa adresowi e-mail.
pełnomocnicy666
Jednak szukam sposobu na osiągnięcie tego bez edytowania podstawowych plików. Jeśli nie jest to możliwe, to dobrze, ale chciałbym wiedzieć tak czy inaczej. Dzięki!
pełnomocnicy666
jest to sposób bez edycji podstawowych plików. Skopiuj kod do wtyczki, aktywuj i gotowe.
bueltge
4

Za pomocą powyższego kodu:

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

Musieliśmy tylko sprawdzić, czy podana nazwa użytkownika przynajmniej wyglądała jak e-mail, a jeśli nie, sabotuj nazwę użytkownika.

Vigs
źródło
Zamiast prymitywnego sprawdzania ciągu '@'w nazwie użytkownika, Wordpress ma przydatną wbudowaną funkcję: sanitize_email zwróci albo prawidłowy format adresu e-mail, albo nic:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo
3

już jest WP-CORE!

teraz wordpress pozwala już zarejestrować EMAIL jako nazwę użytkownika. ale jeśli mówisz o już zarejestrowanych użytkownikach, wypróbuj wymienione odpowiedzi.

T.Todua
źródło
1

Nieznaczne modyfikacje powyższego kodu powinny wystarczyć do stworzenia eleganckiego rozwiązania. Dokumentacja dla uwierzytelnienia hakowych państw, które albo WP_Userprzedmiot lub WP_Errorpowinien być zwrócony obiekt.

Kod źródłowy dla wp_authenticate_username_password funkcyjnych biegnie przez niektórych dość prostych kontroli; możemy po prostu powtórzyć sposób przeprowadzania tych kontroli i utworzyć nowy WP_Errorobiekt do obsługi adresu e-mail. Ewentualnie możemy nawet podnieść wp_authenticate_username_passwordkod i zmodyfikować go, jeśli chcemy, choć wydaje się to niepotrzebne, chyba że naprawdę chcesz dostosować sposób działania. Poniższy kod powinien załatwić sprawę: (Chociaż sam tego nie testowałem ...)

// 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 );
}
Andrew Odri
źródło