Перенаправление пользователей на персональные страницы с помощью ролей

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

По моему опыту разработки веб-приложений, ответ на этот вопрос – обычно «нет».

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

Начнем с настройки

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

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

Создайте новую папку для плагина в вашем каталоге wp-content/plugins и назовите ее cm-redirect-by-role. Добавьте в нее файл с именем cm-redirect-by-role.php. В этот файл мы собираемся добавить базовый заголовок плагина WordPress, приведенный ниже:

<?php
/*
Plugin Name: Redirect Users by Role
Plugin URI:
Description: Redirects users based on their role
Version: 1.0
Author: SFNdesign, Curtis McHale
Author URI: http://sfndesign.ca
License: GPLv2 or later
*/
 
/*
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.
 You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/
// TODO ?>

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

Процесс авторизации пользователя

По умолчанию пользователь может войти в учетную запись на вашем сайте, созданном с помощью WordPress, через http://yoursite.com/wp-login.php. Когда вы вошли на сайт через эту ссылку, сайт отсылает вас в админ панель WordPress.

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

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

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

/**
 * Перенаправление пользователей согласно их роли
 *
 * @since 1.0
 * @author SFNdesign, Curtis McHale
 *
 * @uses wp_get_current_user()          Возвращает объект WP_User для текущего пользователя 
 * @uses wp_redirect()                  Перенаправляет пользователя по определенному адресу 
 */
function cm_redirect_users_by_role() {
 
    $current_user   = wp_get_current_user();
    $role_name      = $current_user->roles[0];
 
    if ( 'subscriber' === $role_name ) {
        wp_redirect( 'http://yoursite.com/dashboard' );
    } // if
 
} // cm_redirect_users_by_role
add_action( 'admin_init', 'cm_redirect_users_by_role' );

Мы запускаем процесс, получая объект нашего текущего пользователя с помощью функции wp_get_current_user(). Из этого объекта мы извлекаем имя нашей роли и присваиваем его переменной $role_name.

Затем проверяем, совпадает ли $role_name с ролью, которую мы хотим перенаправить. Если совпадает, то вызываем функцию wp_redirect, чтобы отправить пользователя в выбранное местоположение. Хотя этот код уже будет работать, нам нужно добавить еще одну деталь.

Делаем код AJAX безопасным

Производя AJAX вызовы в WordPress, вам всегда нужно обращаться к файлу маршрутизации AJAX, который находится в админке WordPress.

Если мы оставим наш код, как он есть, любой вызов AJAX, выполненный от имени соответствующих ролей, будет провален, как только он пройдет проверку на соответствие условию и будет перенаправлен.

Чтобы решить эту проблему, мы должны проверить, не выполняем ли мы на текущий момент AJAX вызов, и если да, то пропускаем проверку роли:

function cm_redirect_users_by_role() {
 
    if ( ! defined( 'DOING_AJAX' ) ) {
 
        $current_user   = wp_get_current_user();
        $role_name      = $current_user->roles[0];
         if ( 'subscriber' === $role_name ) {
            wp_redirect( 'http://yoursite.com/dashboard' );
        } // if $role_name
     } // if DOING_AJAX
 } // cm_redirect_users_by_role
add_action( 'admin_init', 'cm_redirect_users_by_role' );

Теперь мы поместили нашу функцию перенаправления внутрь проверки константы DOING_AJAX. Если она определена – значит мы запустили вызов AJAX и мы хотим пропустить код перенаправления.

Заключение

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

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

Перевод статьи «Redirect Users to Custom Pages by Role» был подготовлен дружной командой проекта Сайтостроение от А до Я.