WordPress: проверка прав пользователей

· WordPress, Пользователи и Разработка плагинов · 6 мин чтения

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

Права и роли пользователей

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

Каждый пользователь во время авторизации в WordPress автоматически получает определенные права в зависимости от его роли.

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

Например, основные пользователи сайта могут иметь роль «Администратор», когда остальные пользователи могут иметь такие как «Редактор» или «Автор». Вы можете назначать безграничное количество пользователей к роли, например, у вас может быть два пользователя с группой «Администратор».

Права пользователя — это разрешения или права, которые даются каждому пользователю или группе.

Например, у администраторов есть право под названием manage_options, которая разрешает просматривать, изменять и сохранять опции на сайте. У редакторов таких прав нет и тем самым у них не будет доступа к опциям.

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

Тем самым, не забывайте проверять права пользователя перед тем как запускать основной код.

Иерархия

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

Например, группа «Администратор», которая является самой высокой и создается по умолчанию после свежей установки WordPress, наследует так же следующие роли и права: «Подписчик», «Помощник», «Автор» и «Редактор».

Примеры

Без ограничений

Пример ниже создает ссылку публичной части сайта, которая дает возможность удалять посты. И из-за того, что этот код не проверят права, любой пользователь сайта может удалять посты.

<?php
/**
 * создаем ссылку удаления поста
 */
function bologer_generate_delete_link($content)
{
    // запускать только в открытом посте
    if (is_single() && in_the_loop() && is_main_query()) {
        // добавляем аргументы в запрос: action, post
        $url = add_query_arg(
            [
                'action' => 'wporg_frontend_delete',
                'post'   => get_the_ID(),
            ],
            home_url()
        );
        return $content . ' <a href="' . esc_url($url) . '">' . esc_html__('Delete Post', 'bologer') . '</a>';
    }
    return null;
}
 
/**
 * обработчик запроса
 */
function bologer_delete_post()
{
    if (isset($_GET['action']) && $_GET['action'] === 'wporg_frontend_delete') {
 
        // проверить если ли у нас ID поста
        $post_id = (isset($_GET['post'])) ? ($_GET['post']) : (null);
 
        // проверить есть ли у нас пост с таким ID 
        $post = get_post((int)$post_id);
        if (empty($post)) {
            return;
        }
 
        // удалить пост
        wp_trash_post($post_id);
 
        // сделать редирект на страницу администратора
        $redirect = admin_url('edit.php');
        wp_safe_redirect($redirect);
 
        // завершили
        die;
    }
}
 
/**
 * добавить ссылку удаления после текста поста
 */
add_filter('the_content', 'bologer_generate_delete_link');
 
/**
 * зарегистрируем наш запрос в обработчике хука init
 */
add_action('init', 'bologer_delete_post');

Ограничения на определенные права

Пример выше позволяет любому пользователя нажимать на ссылку «Удалить» и тем самым удалить пост. Но, мы хотим разрешить это действие только «Редакторам» и группы, которые выше совершать это действие.

Для того, чтобы сделать это, нам нужно проверить есть ли у текущего пользователя права edit_others_posts, которые у групп «Редакторов» и выше должны быть:

<?php
/**
 * создаем ссылку удаления поста
 */
function bologer_generate_delete_link($content)
{
    // запускать только в открытом посте
    if (is_single() && in_the_loop() && is_main_query()) {
        // добавляем аргументы в запрос: action, post
        $url = add_query_arg(
            [
                'action' => 'wporg_frontend_delete',
                'post'   => get_the_ID(),
            ],
            home_url()
        );
        return $content . ' <a href="' . esc_url($url) . '">' . esc_html__('Delete Post', 'wporg') . '</a>';
    }
    return null;
}
 
/**
 * обработчик запроса
 */
function bologer_delete_post()
{
    if (isset($_GET['action']) && $_GET['action'] === 'wporg_frontend_delete') {
 
        // проверить если ли у нас ID поста
        $post_id = (isset($_GET['post'])) ? ($_GET['post']) : (null);
 
        // проверить есть ли у нас пост с таким ID 
        $post = get_post((int)$post_id);
        if (empty($post)) {
            return;
        }
 
        // удалить пост
        wp_trash_post($post_id);
 
        // сделать редирект на страницу администратора
        $redirect = admin_url('edit.php');
        wp_safe_redirect($redirect);
 
        // завершили
        die;
    }
}
 
if (current_user_can('edit_others_posts')) {
    /**
     * добавить ссылку удаления после текста поста
     */
    add_filter('the_content', 'bologer_generate_delete_link');
 
    /**
     * зарегистрируем наш запрос в обработчике хука init
     */
    add_action('init', 'bologer_delete_post');
}