Как войти с электронной почтой только без имени пользователя?

20

После поиска в течение нескольких дней и прочтения двухлетних тем у меня возникли проблемы с поиском решения проблемы, когда пользователи заходят только по электронной почте.

Сначала я был рад видеть 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 не позволяет людям менять свое имя пользователя. На экране регистрации (форма) он запрашивает имя пользователя и адрес электронной почты; Я хотел бы установить для имени пользователя переменную Nickname (если кто-то может сказать мне, как называется переменная псевдонима или где она установлена ​​во время регистрации, это будет полезно).

Ура,

кузнец

agentsmith666
источник
Вы пытаетесь покончить с именами пользователей полностью? Почему у вас не работает плагин Email Login?
Райан
Мне действительно любопытно, почему вы хотите покончить с именами пользователей, так как они являются основой всей пользовательской информации в WordPress. Это все равно, что пытаться покончить с сообщениями - много работы за небольшую отдачу и гарантия проблем в будущем.
SickHippie
1
@ Райан: Не думаю, что смогу избавиться от имен пользователей, поэтому вместо этого я просто заставляю имя пользователя совпадать с адресом электронной почты.
agentsmith666
@SickHippie - для входа я думаю, что электронная почта лучше и уникальнее, чем имя пользователя. Я предпочел бы использовать имя пользователя в качестве псевдонима, когда пользователь публикует сообщения. Вы правы, было бы больно "избавляться" от переменной "username", поэтому я не являюсь. Я просто выбираю имя пользователя для пользователя, когда он регистрируется (имя пользователя будет его адресом электронной почты; их псевдоним будет тем, что они ввели в качестве своего имени пользователя). В конце концов, переменные не потеряны, все в порядке.
agentsmith666
1
@ SickHippie - Вы правы, так как Wordpress по умолчанию не позволяет пользователю изменять свое имя пользователя, его имя пользователя / адрес электронной почты останутся прежними, даже если они будут менять свой контактный адрес электронной почты. Я считал это с самого начала, и по своему опыту я обнаружил, что люди редко «удаляют» адрес электронной почты. Они могут получить новые, но, как правило, они будут иметь свои старые. И если нет, возможно, в тех редких случаях, мы вручную изменим это в базе данных. Я действительно ценю ваши отзывы и понимание SickHippie! Теперь я надеюсь на решение моего поста :)
agentsmith666

Ответы:

19

Обновление: я создал плагин для входа в систему, регистрации и восстановления пароля по электронной почте. https://wordpress.org/plugins/smart-wp-login/

Ответ вкратце, вы можете настроить WordPress для входа по электронной почте.

Три шага:

  • Удалить функцию аутентификации по умолчанию
  • Добавить пользовательскую функцию аутентификации
  • Измените текст «Имя пользователя» в wp-login.php на «Электронная почта»

Одна нота:

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

Удалите функцию аутентификации WordPress по умолчанию.

WordPress использует фильтр « authenticate » для дополнительной проверки при входе пользователя в систему.

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
Хороший ответ Nishant
Эндрю Бартел
полезно! В моем случае я просто удаляю почтовые специальные символы и делаю его именем пользователя. так 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 в репозитории плагинов; может быть, этот плагин .

bueltge
источник
Спасибо за ответ, однако я не уверен, что вы прочитали мой пост или я не был достаточно ясен. Я прошу прощения за последнее. В своем оригинальном посте я упомянул плагин WP_Email_Login; Точный плагин ваш код и ссылка с. Вот мой оригинальный пост: «Сначала я был рад видеть WP_Email_Login только для того, чтобы узнать, что вы все еще можете использовать свое имя пользователя для входа». <--- Посмотрите на проблему, я все еще могу использовать имя пользователя, поэтому этот плагин не будет работать. Поскольку я не могу покончить с именами пользователей, я подумываю о переопределении функции регистрации, заставляя имя пользователя совпадать с адресом электронной почты.
agentsmith666
Однако я ищу способ сделать это без редактирования файлов ядра. Если это невозможно, это нормально, но я бы хотел знать, так или иначе. Благодарность!
agentsmith666
это способ без редактирования файлов ядра. Скопируйте код в плагин, активируйте и готово.
bueltge
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 );
} 

Все, что нам нужно было сделать, это проверить, что предоставленное имя пользователя, по крайней мере, выглядит как электронное письмо, а если не саботировать имя пользователя.

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

это уже в WP-CORE!

Теперь WordPress уже позволяет зарегистрировать EMAIL как имя пользователя. но если вы говорите об уже зарегистрированных пользователях, попробуйте перечисленные ответы.

T.Todua
источник
1

Небольшие изменения в приведенном выше коде - это все, что нужно для создания элегантного решения. В документации для хука проверки подлинности говорится, что либо WP_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 );
}
Эндрю Одри
источник