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

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

Ура,

кузнец

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

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

Три шага:

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

Одна запись:

  • Не редактируйте файлы ядра.

Удалите функцию проверки подлинности по умолчанию 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); 

Измените текст «Username» в wp-login.php на «Email»

Мы можем использовать фильтр gettext для изменения текста «Username» на «Email» без редактирования основных файлов.

 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/

Возможно, вы должны изменить фильтр для имени.

 // 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 в репозитории плагинов; возможно, этот плагин .

Используя приведенный выше код:

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

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

это уже в WP-CORE !

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

Незначительные изменения в коде выше должны быть все, что необходимо для создания элегантного решения. В документации для проверки подлинности указано, что должен быть возвращен объект WP_Error или объект WP_Error .

Исходный код функции wp_authenticate_username_password проходит через довольно простые проверки; мы можем просто повторить способ выполнения этих проверок и создать новый объект WP_Error для работы с адресом электронной почты. В качестве альтернативы мы могли бы даже wp_authenticate_username_password код 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 (ie 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 ); }