Создаем свою собственную страницу входа в WordPress

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

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

Лучше всего создать новую форму входа, используя встроенный в WP пользовательский менеджер, и перенаправлять успешно совершенные входы в любую другую область, отличную от панели администратора WordPress.

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

wordpress_login

Ограничиваем доступ к панели администратора только для администраторов

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

В файл functions.php нашей WP темы добавим следующий код, который позволит нам блокировать доступ к области администратора:

function restrict_admin()
{
	if ( ! current_user_can( 'manage_options' ) && '/wp-admin/admin-ajax.php' != $_SERVER['PHP_SELF'] ) {
                wp_redirect( site_url() );
	}
}
add_action( 'admin_init', 'restrict_admin', 1 );

Код совершает проверку, является ли пользователь администратором, и если нет, то WordPress автоматически перенаправит человека обратно на главную страницу.

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

Создаем новую страницу входа

Для начала нам надо создать новый шаблон страницы входа для нашей темы, что позволит нам создать новую страницу входа в WordPress и связать ее с данным шаблоном.

Создаем новый PHP-файл в теме и добавляем в него следующий код:

<?php
/*
* Template Name: Login Page
*/
?>

Теперь, если вы перейдете к WordPress и создадите новую страницу, вы сможете связать эту страницу с данным шаблоном.

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

<?php
/*
* Template Name: Login Page
*/
?>

<?php get_header(); ?>

<?php 
get_sidebar(); 
get_footer(); 
?>

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

Функция function is wp_login_form() получает один параметр, который является массивом аргументов, использующихся для изменения поведения формы.

Вот аргументы, которые вы можете передавать в функцию формы, и их стандартные значения:

<?php $args = array(
        'echo' => true,
        'redirect' => site_url( $_SERVER['REQUEST_URI'] ), 
        'form_id' => 'loginform',
        'label_username' => __( 'Username' ),
        'label_password' => __( 'Password' ),
        'label_remember' => __( 'Remember Me' ),
        'label_log_in' => __( 'Log In' ),
        'id_username' => 'user_login',
        'id_password' => 'user_pass',
        'id_remember' => 'rememberme',
        'id_submit' => 'wp-submit',
        'remember' => true,
        'value_username' => NULL,
        'value_remember' => false ); ?>

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

<?php
$args = array('redirect' => get_permalink( get_page( $page_id_of_member_area ) ) );

wp_login_form( $args );
?>

При правильном входе WordPress получит URL страницы, доступной только для членов сайта, используя функции get_permalink() и get_page().

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

<?php
/*
* Template Name: Login Page
*/
?>

<?php get_header(); ?>

<?php
$args = array('redirect' => get_permalink( get_page( $page_id_of_member_area ) ) );

wp_login_form( $args );
?>

<?php 
get_sidebar(); 
get_footer(); 
?>

Проблемы с созданием своей собственной страницы входа

Создание своей собственной страницы входа в WordPress требует более сложных действий, нежели просто использования функции wp_login_form(), которая создаст страницу входа и позволит вам успешно входить в WordPress. Проблема появляется в том случае, если у вас имеются неудачные попытки входа.

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

Если вы используете функцию wp_login_form() и у вас имеется неудачная попытка входа, вы всегда будете переноситься к форме входа WordPress wp-login.php. Это не очень удобно для пользователей, которым нужно войти в область, доступную для членов сайта. Таким образом, нам нужно добавить несколько дополнительных функций в functions.php, чтобы убедиться в том, что данные виды поведений обрабатываются корректно.

Неудавшаяся попытка входа

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

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

Как только попытка входа будет неудачной, нам нужно получить URL страницы, с которой мы перешли, и убедиться в том, что это не стандартная страница wp-login.php, после чего мы можем добавить строковый параметр неудачного входа и перенаправить с этим параметром на форму входа.

Добавим следующий код к файлу functions.php для обратного редиректа на произвольную страницу входа при неудавшейся попытке ввода данных:

add_action( 'wp_login_failed', 'pu_login_failed' ); // hook failed login

function pu_login_failed( $user ) {
  	// check what page the login attempt is coming from
  	$referrer = $_SERVER['HTTP_REFERER'];

  	// check that were not on the default login page
	if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $user!=null ) {
		// make sure we don't already have a failed login attempt
		if ( !strstr($referrer, '?login=failed' )) {
			// Redirect to the login page and append a querystring of login failed
	    	wp_redirect( $referrer . '?login=failed');
	    } else {
	      	wp_redirect( $referrer );
	    }

	    exit;
	}
}

Пустой логин и пароль

Если вы не ввели пароль или логин на произвольной странице входа, вы будете перенаправлены обратно к стандартной странице входа WordPress, что не слишком хорошо, поскольку это запутает ваших пользователей. Таким образом, нам понадобится подцепить другую функцию к иному действию – в данном случае мы будем использовать действие authenticate.

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

Добавим следующий код в файл functions.php, чтобы убедиться, что логин и пароль не являются пустыми.

add_action( 'authenticate', 'pu_blank_login');

function pu_blank_login( $user ){
  	// check what page the login attempt is coming from
  	$referrer = $_SERVER['HTTP_REFERER'];

  	$error = false;

  	if($_POST['log'] == '' || $_POST['pwd'] == '')
  	{
  		$error = true;
  	}

  	// check that were not on the default login page
  	if ( !empty($referrer) && !strstr($referrer,'wp-login') && !strstr($referrer,'wp-admin') && $error ) {

  		// make sure we don't already have a failed login attempt
    	if ( !strstr($referrer, '?login=failed') ) {
    		// Redirect to the login page and append a querystring of login failed
        	wp_redirect( $referrer . '?login=failed' );
      	} else {
        	wp_redirect( $referrer );
      	}

    exit;

  	}
}

Теперь, если пользователь ничего не введет в соответствующие поля формы, мы получим строку, указывающую на некорректный вход.

Вывод сообщения о неудачном входе

Когда мы перенаправляем пользователей обратно на страницу входа, у нас есть строка ?login=failed. Проверив ее наличие, мы можем вывести на экран сообщение пользователю.

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

<?php
/**
 * Template Name: User Login
 */

$args = array( 'redirect' => site_url() );

if(isset($_GET['login']) && $_GET['login'] == 'failed')
{
	?>
		<div id="login-error" style="background-color: #FFEBE8;border:1px solid #C00;padding:5px;">
			<p>Login failed: You have entered an incorrect Username or password, please try again.</p>
		</div>
	<?php
}

wp_login_form( $args );
?>

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

Источник: www.paulund.co.uk

Блог про WordPress
Комментарии: 16
  1. Дмитрий

    Здравствуйте, отличная статья…только она выглядит не полной без информации как сделать чтобы не перенаправляло на стандартную страницу входа при нажатии ссылки «Забыли пароль?»

    1. Дмитрий (автор)

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

  2. inworld

    Еще бы хоть скрин сделали, что получилось!

  3. Magzhan

    Вообще круто!!! Спосиба за урок! Но у меня как то не получилось. РНР выдает ошибка на экран что делать?

  4. Kolass

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

    1. Дмитрий (автор)

      Пожалуйста!

  5. Dimple

    Здравствуйте! Спасибо большое за статью, очень помогла! У меня только вопрос по поводу формы для смены пароля, которая появляется при клике по ссылке «Забыли пароль?». Как ее можно кастомизировать?

  6. Павел

    Подскажите, а как можно сделать свою страницу регистрации и восстановления пароля? То одна страница входа — не полноценно получается. Спасибо.

    1. Дмитрий (автор)

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

      https://wordpress.org/plugins/profile-builder/

  7. Виталий

    А как сделать кнопку «выйти» ?:)
    Статья отличная. Спасибо!

    1. Дмитрий (автор)

      За это отвечает функция http://codex.wordpress.org/Function_Reference/wp_logout_url. Можно сделать блок div, создать кнопку и привязать к ней URL на выход, который как раз и реализуется с помощью представленной выше функции. Примеры приведены в статье по ссылке.

  8. Виталий

    Дмитрий, цены Вам нет!!!

  9. Максим

    Как сделать регистрацию без пароля на вордпресс??
    Например нужно чтобы ввел Имя например Максим (не логин), и почту ( сама почта и будет логином), пароль при регистрации указывать не нужно, нужно чтобы он сам генерировался и отправлялся на почту.

    1. Дмитрий (автор)

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

  10. Никита

    Не совсем понял, как сделать редирект содержимого этой формы к себе на сайт

    1. Никита

      На страницу входа для обычных пользователей

Добавить комментарий для inworld Отменить ответ

Получать новые комментарии по электронной почте.