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

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

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

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

// удаляем стандартный фильтр
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, а при помощи имени пользователя — запретить?

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

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, то он наткнется на сообщение об ошибке.

Миша

В последние годы я долго не знал, что мне делать с сайтом misha.blog, ведь он практически не приносит никакого профита, но недавно я осознал, что моя миссия – способствовать распространению WordPress. Ведь WordPress – это лучший движок для разработки сайтов – как для тех, кто готов использовать заложенную структуру этой CMS, так и для тех, кто предпочитает headless решения.

Сам же я впервые познакомился с WordPress в 2009 году. Организатор WordCamp. Преподаватель в школах Epic Skills и LoftSchool.

Если вам нужна помощь с вашим сайтом или может даже разработка с нуля на WordPress / WooCommerce — пишите. Я и моя команда сделаем вам всё на лучшем уровне.

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

  • Артем 28 июня 2012 #

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

    • Миша 28 июня 2012 #

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

  • Миша 28 июня 2012 #

    также можно немного подкорректировать саму страницу входа 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 #

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

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

    • Миша 31 июля 2012 #

      ну люди же регистрируются))

  • Timur 13 сентября 2012 #

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

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

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

    • Миша 14 сентября 2012 #

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

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

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

    • Миша 16 апреля 2013 #

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

  • kama 8 августа 2013 #

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

    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 #

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

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

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

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

      • Миша 10 сентября 2013 #

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

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

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

        • Александр 11 сентября 2013 #

          Да именно так, по имейл

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

Если вы хотите добавить код, не забудьте обернуть его в <pre lang="php"></pre>, в случае несоблюдения этого условия в 99% случаях ваш коммент будет удалён, а автор заблокирован. Печалька.