8 Ноябрь 2012

Регистрация и авторизация в WordPress

Приветствую вас, дорогие друзья. Настало время снова окунуться в мир программирования для WordPress.

В предыдущих публикациях мы уже поговорили о следующих аспектах данной CMS:

В данной статье речь пойдет о регистрации и авторизации в WordPress.

Не секрет, что WordPress позволяет работать с различными группами пользователей, а не только с одним администратором. Данная особенность позволяет реализовать вполне сносный функционал регистрации и авторизованного доступа к тому или иному контенту (если уж по какой-то причине так нужно).

Думаю все знают, что разрешение на регистрацию новых пользователей выдает администратор, ставя галочку в настройках админки WordPress (Параметры→Общие).

Включение регистрации пользователей в WordPress

Рис. 1. Включение регистрации новых пользователей в админке WordPress.

Теперь пользователи смогут переходить на страницу http://vas_domen.ru/wp-login.php?action=register и наблюдать там стандартную форму регистрации WordPress.

Стандартный функционал регистрации в WordPress

Рис. 2. Стандартная форма регистрации WordPress.

Если регистрацию в админке вы не разрешили (см. рис. 1), то и форма регистрации вам не отобразится. Вместо нее вы увидите сообщение о невозможности регистрироваться на данном блоге.

Стандартная процедура регистрации в WordPress организована довольно грамотно (если не считать запроса имени пользователя, он же login, при регистрации; мы то с вами знаем, что вполне достаточно только адреса эл. почты). После проверки на занятость другим пользователем указываемого логина и e-mail, WordPress отправит валидационное письмо и проверит правильность введенного при регистрации адреса эл. почты. Все круто и правильно.

Для авторизации достаточно перейти по адресу http://vash_domen.ru/wp-login.php. Вы увидите стандартную форму авторизации (видели вы ее уже сто раз наверное, когда в свой блог логинились).

Форма авторизации WordPress

Рис. 3. Стандартная форма авторизации WordPress.

Есть даже стандартная процедура восстановления пароля. Перейдите по ссылке http://vash_domen.ru/wp-login.php?action=lostpassword и вы увидите форму грамотного функционала восстановления.

Форма восстановления пароля WordPress
Рис. 4. Стандартна форма восстановления пароля WordPress.

Уж не знаю, зачем я рассказываю эти банальности. Они всем известны? Тогда будем считать, что для разогрева.

Чем мне не нравится стандартный функционал регистрации/авторизации в WordPress? — Да, видимо, тем что на нормальных сайтах регистрация и авторизация выглядит немного по-другому.

Ну во-первых, на нормальных сайтах нет логотипа WordPress в формах регистрации/авторизации. С этой проблемой, кстати, можно легко бороться. Вот тут процедура подробно описана. Суть сводится к цеплянию на хук login_head вывода стилей для #login h1 a. Обратите внимание на директиву !important в перечислении свойств стиля. Именно благодаря этой директиве наложенные вами стили считаются наиболее приоритетными.

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

Что такое хук и как на него цеплять функции вы сможете узнать из моего видеокурса по разработке плагина для WordPress.

С детским садом закончили, переходим к серьезным вещам. На нормальном сайте обычно форма авторизации и регистрации вписывается в дизайн сайта, а не располагается на отдельных страницах.

Впишем форму регистрации в дизайн сайта

С регистрацией пользователя будет много мороки из-за необходимости верифицировать указанный при регистрации e-mail. Я решил эту проблему следующим тернистым путем:

  • Создал отдельную таблицу в БД для хранения имени пользователя, e-mail и пароля (генерируется автоматически). В этой таблице будут храниться данные, указанные пользователем в регистрационной форме до верификации адреса эл. почты. Также в этой таблице будет храниться проверочный код (зачем он нужен, станет понятно дальше).
  • В форму регистрации пользователь вводит логин и e-mail. Логин и e-mail валидируются на предмет совпадения с данными уже существующих пользователей WordPress. Ну и естественно проверяется ввел ли пользователь хоть что-то в поля «Логин» и «E-mail», а также соответствует ли введенный текст регулярному выражению для адреса эл. почты.
  • Если валидация прошла успешно, на почту указанную при регистрации уходит сообщение, содержащее проверочную ссылку.
  • Если пользователь перешел по ссылке, то стандартным методом добавления нового пользователя wp_create_user($user_name, $password, $user_email) происходит сохранение нового пользователя уже в стандартной таблице пользователей WordPress.

Видеоурок. Как сделать свою регистрацию пользователей в WordPress

Бонусом в видеоуроке показано как сделать валидацию имени пользователя и адреса эл. почты. Продемонстрированный подход годится на все случаи жизни.

Скачать плагин, демонстрируемый в видеоуроке (5.49 кБ).

Листинг 1. HTML-код формы регистрации, демонстрируемый в видеоуроке.

<div>
	<form action="" method="get" id="m_reg_user_form">
		<div>
			<label for="m_user_name">Имя:</label>
		</div>
		<div>
			<input type="text" name="m_user_name" id="m_user_name">
		</div>
		<div>
			<label for="m_user_email\">Эл. почта:</label>
		</div>
		<div>
			<input type="text" name="m_user_email" id="m_user_email">
		</div>
		<div>
			<input type="submit" name="m_regiser_usr_btn" value="Зарегистрироваться">
		</div>
	</form>
</div>

В качестве дополнительных плюшек можно добавить проверку разрешения регистрации в админке (см. рис. 1). Проверить можно функцией get_option('users_can_register'). Если функция вернет TRUE, то регистрироваться можно.

Еще я бы сделал функцию в плагине, отвечающую за вывод формы регистрации, чтобы она выводилась именно там где нужно, а не болталась в посте без надобности. Но это уже в следующий раз.

Думаю имеет смысл показывать форму регистрации только не авторизованным пользователям. Проверять авторизован пользователь или нет позволяет функция is_user_logged_in(). Она вернет TRUE если пользователь имеет статус авторизованного.

После перехода пользователя по валидационной ссылке из e-mail, у вас может возникнуть законное желание сразу его авторизовать. Это можно сделать следующим образом.

Листинг 2. PHP-код насильственной авторизации пользователя в WordPress.

$creds = array();
$creds['user_login'] = $email_check->user_name;
$creds['user_password'] = $email_check->password;
$creds['remember'] = false;
$user = wp_signon($creds, false);

Как вы понимаете, авторизация происходит благодаря методу wp_signon.

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

Авторизация пользователя WordPress своей формой

Точно также, как и в случае регистрации, я запросто могу представить себе, что вам захотелось прикрутить свою собственную форму авторизации, а не гонять пользователя на рис. 3.

Используйте HTML-код, представленный ниже. Единственное, что нужно сохранить, это атрибуты name и адрес в атрибуте action тега form (иначе WP не поймет, что вы от него хотите).

Листинг 3. PHP-код формы авторизации. Можно использовать в плагине.

// Получаю адрес текущей страницы
$current_url = "http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

// В перемненную сохраняю HTML-код формы авторизации. Переменную можно вывести тогда, когда потребуется отобразить форму авторизации.
$login_form = "
<form action=\"".wp_login_url($current_url)."\" id=\"loginForm\" method=\"post\">
	<div class=\"field\">
		<label for=\"login\">Имя пользователя:</label>
	</div>
	<div class=\"input\">
		<input type=\"text\" name=\"log\" value=\"\"  id=\"login\">
	</div>
	<div class=\"field\">
		<label for=\"pass\">Пароль:</label>
	</div>
	<div class=\"input\">
		<input type=\"password\" name=\"pwd\" value=\"\" id=\"pass\">
	</div>
	<div class=\"rememberme\">
		<input name=\"rememberme\" type=\"checkbox\" id=\"rememberme\" value=\"forever\"> <label for=\"rememberme\">Запомнить меня</label>
	</div>
	<div class=\"submit\">
		<input name=\"submit\" type=\"submit\" value=\"Войти\">
	</div>
	<input type=\"hidden\" value=\"$product_id\" name=\"product_id\">
</form>
";

Атрибут action тега form содержит функцию wp_login_url. Она на столько замечательная, что позволяет в качестве атрибута передать адрес, на который пользователя вернет после авторизации. Это может быть адрес данной страницы (как в листинге 3) или URL личного кабинета — решать вам.

На этом пока все. До встречи в следующих видеоуроках.

P.S.: На правах саморекламы. А вы знаете, что я разработал замечательный плагин, позволяющий продавать инфотовары с блога на WordPress?

С уважением, Андрей Морковин.

MAXCACHE: 0.87MB/0.00031 sec