Як увійти за допомогою електронної пошти лише без імені користувача?


20

Після декількох днів пошуку та читання 2-річних тем у мене виникли труднощі з вирішенням проблеми з тим, щоб користувачі входили лише електронною поштою.

Спочатку я був радий бачити WP_Email_Login лише для того, щоб дізнатися, чи можете ви все ще використовувати своє ім’я користувача для входу. Я не впевнений, як піти про це як плагін. Моя ідея - перекрити функцію register_new_user. Я цього не бачив у списку функцій, що підключаються. Чи можу я використовувати фільтри / дії, щоб досягти цього?

Я усвідомлюю, що не модно редагувати основні файли, тому сподіваюся, що рішення є там, однак якщо такого не існує, я ризикую. У першому рядку функції "register_new_user" у wp-login.php я можу додати:

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

Це працює дуже добре, оскільки WordPress не дозволяє людям змінювати своє ім’я користувача. На екрані реєстрації (формі) він запитує ім'я користувача та електронну пошту; Я хотів би встановити ім'я користувача для змінної псевдоніма (якщо хтось може сказати мені, як називається змінна псевдонім або де вона встановлена ​​під час реєстрації, що буде вдячно).

Ура,

Сміт


Ви намагаєтесь повністю усунути імена користувачів? Чому плагін для входу в електронну пошту не працює для вас?
Райан

Мені дуже цікаво, чому ви хочете покінчити з іменами користувачів, оскільки вони є основою всієї інформації користувачів у WordPress. Це трохи схоже на те, щоб намагатися покінчити з "Повідомленнями" - велика робота за не велику виплату, і гарантія проблем у дорозі.
SickHippie

1
@ Ryan. Я не думаю, що я зможу позбутися імен користувачів, тому замість цього я просто змушую ім’я користувача дорівнювати адресу електронної пошти.
agentmith666

@SickHippie - для входу я думаю, що електронна пошта є кращою та унікальнішою, ніж ім'я користувача. Я вважаю за краще використовувати ім'я користувача як псевдонім, коли користувач публікує повідомлення. Ви маєте рацію, болісно буде "позбутися" змінної "ім'я користувача", тому я цього не роблю. Я просто вибираю ім’я користувача для користувача, коли він реєструється (ім'я користувача буде їх електронною адресою; їх псевдонім буде тим, що він вводив як своє ім’я користувача). Врешті-решт жодна змінна не втрачається, все є неушкодженим.
agentmith666

1
@SickHippie - Ти маєш рацію, оскільки за замовчуванням Wordpress це не дозволяє користувачеві змінювати своє ім'я користувача, ім'я користувача / електронну адресу залишатиметься незмінним, навіть якщо вони змінювали свою контактну електронну адресу. Я вважав, що з самого початку і на власному досвіді я виявив, що люди рідко "видаляють" електронну адресу. Вони можуть отримати нові, але зазвичай вони все ще матимуть свої старі. І якщо ні, можливо, у тих рідкісних обставинах ми вручну змінимо це в базі даних. Я дуже ціную ваші відгуки та проникливість SickHippie! Тепер я сподіваюся на рішення своєї посади :)
agentsmith666

Відповіді:


19

Оновлення: я створив плагін для входу, реєстрації та отримання пароля з електронною поштою. https://wordpress.org/plugins/smart-wp-login/

Відповідь коротко, ви можете налаштувати WordPress для входу з електронною поштою.

Три кроки:

  • Видаліть функцію аутентифікації за замовчуванням
  • Додайте спеціальну функцію аутентифікації
  • Змініть текст "Ім'я користувача" в wp-login.php на "Електронна пошта"

Одна примітка:

  • Не редагуйте основні файли.

Видаліть функцію аутентифікації за замовчуванням WordPress.

WordPress використовує фільтр "Підтвердити автентифікацію " для здійснення додаткової перевірки за входом користувача.

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

Додайте спеціальну функцію аутентифікації

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

Змініть текст "Ім'я користувача" в wp-login.php на "Електронна пошта"

Ми можемо використовувати фільтр gettext для зміни тексту "Ім'я користувача" на "Електронна пошта" без редагування основних файлів.

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

Я також написав детальну статтю в своєму блозі http://www.thebinary.in/blog/wordpress-login-using-email/


2
Гарна відповідь Нішант
Ендрю Бартель

корисно! У моєму випадку я просто знімаю спеціальні символи електронною поштою і роблю це ім’я користувача. тож user@example.com стає user_example_com і він працював.
wpcoder

6

Це можливо, ви повинні змінити фільтр для імені.

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

Альтернативою є плагін, який ви знайдете через Google oder у репо плагіні; можливо, цей плагін .


Дякую за відповідь, однак я не впевнений, чи читаєте ви мій пост чи я недостатньо зрозуміла. Прошу вибачення за останнє. У своєму початковому дописі я згадав плагін WP_Email_Login; точний плагін, з якого ви отримуєте код та посилання. Ось мій оригінальний пост: "Спочатку я був радий бачити WP_Email_Login лише для того, щоб дізнатися, чи можете ви все ще використовувати своє ім'я користувача для входу". <--- Дивіться проблему, я все ще можу використовувати ім'я користувача, тому цей плагін не працюватиме. Оскільки я не можу подолати імена користувачів, я думаю про перенесення функції реєстрації, примушуючи ім’я користувача дорівнювати адресу електронної пошти.
agentmith666

Однак я шукаю спосіб досягти цього без редагування основних файлів. Якщо це неможливо, це добре, але я хотів би знати в будь-якому випадку. Спасибі!
agentmith666

це спосіб без редагування основних файлів. Скопіюйте код у плагін, активуйте його та готовий.
бульдж

4

Використовуючи наведений вище код:

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

Все, що нам потрібно було зробити, це перевірити, чи вказане ім’я користувача принаймні виглядає як електронний лист, а якщо не саботувати ім'я користувача.


Замість примітивної перевірки рядка для '@'імені користувача Wordpress має зручну вбудовану функцію: sanitize_email поверне чи дійсний формат адреси електронної пошти, або нічого:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo

3

це вже є WP-CORE!

тепер wordpress вже дозволяє зареєструвати EMAIL як ім'я користувача. але якщо ви говорите про вже зареєстрованих користувачів, то спробуйте перелічені відповіді.


1

Невеликі зміни коду вище повинні бути всіма необхідними для створення елегантного рішення. У документації на гачок для автентифікації зазначено, що або aWP_User об'єкт, абоWP_Error об'єкт повинен бути повернутий.

Вихідний код для wp_authenticate_username_password функції пробігає кілька досить простих перевірок; ми можемо просто повторити спосіб виконання цих перевірок і створити новий WP_Errorоб’єкт для роботи з електронною адресою. Крім того, ми можемо навіть вимкнути wp_authenticate_username_passwordкод і змінити його, якщо хотіли, хоча це здається непотрібним, якщо ви дійсно не хочете налаштувати функціонування речей. Код, наведений нижче, повинен зробити трюк: (Хоча я сам його не перевіряв ...)

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.