Используем e-mail вместо имени пользователя для входа на сайт

Во-первых, я хочу извиниться, что почти три недели (!) ничего не писал на блоге, просто сейчас очень много дел навалилось, обещаю, что вскоре снова начну публиковать посты регулярно.

А теперь к делу. Приведу в пример сайт deviantart.com, взгляните на их форму входа пользователей. Как видите, они предлагают ввести либо логин либо e-mail, прикольно.

Реализовать это на WorPress на самом деле проще простого, достаточно вставить этот кусок кода в fucntions.php текущей темы.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// удаляем стандартный фильтр
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
 
// и добавляем собственный
add_filter( 'authenticate', 'login_by_email', 20, 3 );
 
function login_by_email( $user, $username, $password ) {
	// если введен логин, то сразу авторизуем, минуя лишние запросы
	if ( is_email( $username ) ) {
		// получаем ID пользователя 
		if ( ! empty( $username ) )
			$user = get_user_by( 'email', $username );
 
		// подбираем соответствующее емейлу имя пользователя (логин)
		if ( isset( $user->user_login, $user ) )
			$username = $user->user_login;
 
	}
	return wp_authenticate_username_password( NULL, $username, $password );
}

Теперь смотрите, код выше позволяет пользователям входить на сайт вписывая и логин и e-mail. А что если дать им возможность входа только при помощи e-mail, а при помощи имени пользователя — запретить?

Немного видоизменяем функцию:

7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function login_by_email( $user, $username, $password ) {
	// если введен логин, то отправляем лесом
	if ( !is_email( $username ) ) 
		return;
 
	// получаем ID пользователя 
	if ( ! empty( $username ) )
		$user = get_user_by( 'email', $username );
 
	// подбираем соответствующее емейлу имя пользователя (логин)
	if ( isset( $user->user_login, $user ) )
		$username = $user->user_login;
 
	return wp_authenticate_username_password( NULL, $username, $password );
}

Теперь, если какой-нибудь чувак захочет войти и при этом введет имя пользователя, а не email, то он наткнется на сообщение об ошибке.

Подпишитесь, чтобы раз в неделю получать свежие статьи с блога по email.

Смотрите также

Комментарии 14

  • Артем28 июня 2012 в 10:06 #

    Очень полезно. Спасибо. А при регистрации, в таком случае, нужно указывать только E-mail?

    • Миша28 июня 2012 в 11:06 #

      Посчет формы регистрации есть несколько вариантов, либо рандомно генерировать логин, либо в логин автоматически вставлять e-mail, а для пользователей просто скрыть это поле)

  • Миша28 июня 2012 в 11:06 #

    также можно немного подкорректировать саму страницу входа WordPress (если ею пользуются посетители).
    увы, тут хуков не предусмотрено, поэтому придется колдовать на JavaScript:

    1. поменяем лейбл

    document.getElementById('loginform').childNodes[1].childNodes[1].childNodes[0].nodeValue = 'Имя пользователя или Email';

    2. поменяем сообщения об ошибках

    if ( document.getElementById('login_error') )
    	document.getElementById('login_error').innerHTML = document.getElementById('login_error').innerHTML.replace( 'имя пользователя', 'имя пользователя (или email)' );
  • Дмитрий30 июля 2012 в 15:07 #

    Я думаю что если для того что бы войти на сайт нужна регистрация. То я туда входить - не буду. Сайтов очень много, более того автору сайта нужно постораться в двух случаях:
    1) что бы я пришёл на его сайт
    2) что бы я туда приходил снова

    на мой взгляд, чем меньше барьеров, тем удобнее для пользователей.

  • Timur13 сентября 2012 в 00:09 #

    Супер) Простое и действительно полезное дополнение.
    Правда нужно сменить текст с просто "Имя пользователя" на "Имя пользователя или E-mail", может так:

    add_filter( 'gettext', 'edit_login_text' );
    function edit_login_text ($text) {
    	if ( $text == 'Имя пользователя') {
    		$text = 'Имя пользователя или E-mail';
    	}
    	return $text;
    }

    Правда и на странице регистрации меняется текст(

    • Миша14 сентября 2012 в 23:09 #

      попробуй на скриптах)) вот так:

      document.getElementById('loginform').childNodes[1].childNodes[1].childNodes[0].nodeValue = 'Имя пользователя или Email';
  • салат16 апреля 2013 в 07:04 #

    Не прокатывает если регистрация и авторизация проходит через сторонний плагин.
    Наример через Profile Builder.
    Там тупо другие фильры.
    Может кто нашел решение для этого плагина. Купил Про версию а тут такой облом =\

    • Миша16 апреля 2013 в 19:04 #

      ну да, разумеется для каждого плагина - свое собственное индивидуальное решение будет

  • kama8 августа 2013 в 03:08 #

    В самое начало можно установить проверку почты, чтобы не делать лишних запросов, если там логин введен:

    function login_by_email( $user, $username, $password ) {
     
    	if( is_email($username) ){
    		// получаем ID пользователя 
    		if ( ! empty( $username ) )
    			$user = get_user_by( 'email', $username );
     
    		// подбираем соответствующее емейлу имя пользователя (логин)
    		if ( isset( $user->user_login, $user ) )
    			$username = $user->user_login;
    	}
     
    	return wp_authenticate_username_password( NULL, $username, $password );
    }
    • Миша8 августа 2013 в 14:08 #

      согласен,
      спасибо за подсказку по оптимизации кода,
      неплохо бы мне как-нибудь пробежаться по всем старым постам, вот только где найти время)

    • Алексей10 сентября 2013 в 09:09 #

      Помогите пожалуйста с задачей. Проблема глобальная, на много-пользовательских блогах. К примеру, узнать чей-то логин, пустяковое дело, более того, многие блоги ссылаются на профиль "/author/admin"
      и если я в форме восстановления пароля введу логин пользователя то на его мыло придет письмо. Так можно спамить ящики пользователей зная лишь логин. Это конечно не проблема, но всё таки явный недочет.

      Как решить эту задачу используя пример выше, но только для формі восстановления пароля?

      • Миша10 сентября 2013 в 20:09 #

        узнать чей-то логин, пустяковое дело

        разве? насколько я знаю, можно узнать логин через CSS в комментариях, о том, как исправить, я писал в этой статье.

        а чего именно вы хотите добиться? сделать восстановление пароля по email, я правильно вас понимаю?

Оставить комментарий / вопрос

phpjsHTMLCSSSQLПросто код
  Для того, чтобы оставить комментарий, пожалуйста, зарегистрируйтесь или авторизуйтесь на сайте.
Получайте новости блога по email или следите за мной в социальных сетях.
  • Миша: Добрый день! В принципе вам только немного нужно доработать код из этого поста - категории уже есть, цена - это и так...

  • eveniy: Добрый день Михаил, подскажите на примере как добавить свои произвольные поля в в вашу форму фильтрации: Я так понимаю...

  • Миша: Отлично! )

  • Дмитрий: сам разобрался: в настройках кастомного типа записи недавно оптимизировал настройки и переоптимизировал: в аргументе 'ta...

  • Дмитрий: У меня по какой-то причине пропало отображение (как в колонке меню слева, так и метабокс в записях ) раздела рубрик для...