Пользовательские роли и права доступа в WordPress: полный разбор

Пользовательские роли и права доступа в WordPress: полный разбор

Кратко: Роли пользователей в WordPress — это именованные наборы прав (capabilities), которые определяют, что человек может делать в админке: писать записи, устанавливать плагины, менять темы. По умолчанию в системе пять ролей — Администратор, Редактор, Автор, Участник и Подписчик (WooCommerce добавляет ещё две). Права проверяются функцией current_user_can(), новая роль создаётся через add_role(), а add_cap() и remove_cap() точечно выдают или забирают возможности. Ниже — полный разбор: таблица ролей, готовые сниппеты для functions.php, обзоры плагинов и частые ошибки новичков.

Когда вы отдаёте доступ к сайту копирайтеру, менеджеру или подрядчику, возникает вопрос: а что он сможет сделать внутри админки? Один щелчок при выборе роли — и человек либо получит возможность удалить половину сайта, либо не сможет даже загрузить картинку. Разбираемся, как устроена система ролей и прав в WordPress, как посмотреть текущие настройки и как создать собственную роль с точным набором возможностей — кодом или плагином.

Материал рассчитан на новичков: каждый шаг объясняется простыми словами, а весь код можно вставить в functions.php дочерней темы без правок ядра. Если вы только настраиваете защиту сайта, начните со статьи про безопасность WordPress для новичков, а потом вернитесь сюда — правильные роли это вторая линия обороны после бэкапов и обновлений.

Как устроена система ролей в WordPress

В WordPress нет размытых «уровней доступа» вроде «модератор чуть повыше автора». Всё построено на двух понятных сущностях: роль (role) — это контейнер с названием, а возможность (capability) — конкретное разрешение, например «публиковать записи» или «управлять плагинами». Роль — просто набор таких разрешений, записанный в базу данных (таблица опций wp_options, ключ wp_user_roles).

У каждого пользователя указана роль (обычно одна, хотя технически можно присвоить несколько). Когда человек заходит в админку, WordPress смотрит на список возможностей его роли и на основании этого рисует меню: у кого-то есть пункт «Плагины», у кого-то — только «Записи». Если роль не даёт возможность manage_options, пункт «Настройки» в меню просто не появится — и прямым заходом по ссылке тоже не получится ничего изменить, потому что сервер снова проверит права.

Важно понять: иерархия «админ выше редактора» — это условность для человека. Для WordPress роли не связаны автоматически: каждая роль имеет собственный явный список capabilities. То есть, создавая свою роль, вы не «наследуете» права редактора, а честно перечисляете каждое разрешение. Это чуть больше работы, зато полный контроль — вы никогда случайно не дадите лишнего.

Пять стандартных ролей: кто что может

После установки WordPress создаёт пять ролей. Если стоит WooCommerce, добавляются ещё две — «Менеджер магазина» и «Клиент». Вот полная таблица с расшифровкой:

Роль Что может Кому подходит
Администратор (Administrator) Всё: плагины, темы, пользователи, настройки, импорт-экспорт, правка кода через редактор Владелец сайта и максимум один-два доверенных человека
Редактор (Editor) Все записи и страницы — свои и чужие: создание, правка, публикация, удаление; модерация комментариев; работа с медиафайлами Контент-менеджер, главный редактор блога
Автор (Author) Свои записи: написать, опубликовать, отредактировать; загрузка изображений Штатный автор блога, копирайтер
Участник (Contributor) Пишет черновики и отправляет на проверку, но публиковать не может и файлы загружать не может Гостевые авторы, стажёры
Подписчик (Subscriber) Только свой профиль и комментирование Читатели, участники закрытого раздела, клиенты с личным кабинетом
Менеджер магазина (Shop Manager, WooCommerce) Товары, заказы, купоны, отчёты магазина; правка записей Администратор интернет-магазина на WooCommerce
Клиент (Customer, WooCommerce) Личный кабинет, история заказов, повторные покупки Покупатели интернет-магазина

Где это смотреть в админке: раздел «Пользователи → Все пользователи» — в списке есть колонка «Роль», а над таблицей выпадающий список «Изменить роль на…». Выделите пользователя, выберите роль, нажмите «Применить» — и права обновятся мгновенно, без кода.

Возможности (capabilities): главный ключ к правам

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

Возможность Что разрешает У кого есть по умолчанию
manage_options Экран «Настройки» и изменение конфигурации сайта Администратор
edit_posts Создание записей (черновиков) Участник и выше
publish_posts Самостоятельная публикация записей Автор и выше
edit_others_posts Редактирование чужих записей Редактор и выше
edit_pages Работа со страницами Редактор и выше
moderate_comments Модерация комментариев Редактор и выше
upload_files Загрузка изображений и файлов в медиатеку Автор и выше
edit_theme_options Кастомайзер, меню, виджеты Администратор
manage_plugins Установка, включение и удаление плагинов Администратор
edit_users Управление учётными записями пользователей Администратор

Проверка в коде всегда идёт через функцию current_user_can() — ей передают название возможности, а она возвращает true или false для текущего пользователя:

<?php
if ( current_user_can( 'publish_posts' ) ) {
    echo 'Вы можете публиковать записи.';
} else {
    echo 'Ваша роль не позволяет публиковать записи.';
}
?>

Обратите внимание: проверять нужно именно возможность, а не роль. Сравнение вида «пользователь — администратор?» хрупко: как только на сайте появится кастомная роль с правами админа (или владелец переименует роль), логика сломается. А current_user_can( 'manage_options' ) работает в любом случае — она спрашивает про суть разрешения, а не про название контейнера.

Как управлять ролями без кода: плагины

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

Плагин Что умеет Когда выбрать
User Role Editor Галочками добавляет и убирает любые возможности у любой роли; может создать новую роль с нуля Нужно точечно докрутить права — например, разрешить редактору менять меню
Members Роли и возможности плюс ограничение доступа к контенту по ролям Нужны не только права, но и закрытые разделы сайта

Порядок действий в User Role Editor: установите плагин, откройте «Пользователи → User Role Editor», выберите роль слева, поставьте галочки напротив нужных возможностей и сохраните. Изменения записываются в базу сразу — сниппеты не нужны. Единственный нюанс: плагин не откатывает изменения при удалении, поэтому фиксируйте, что и кому выдали, в отдельной заметке.

Создаём свою роль через код: add_role()

Код даёт воспроизводимость: роль описана сниппетом, и при переносе сайта на новый хостинг она создаётся заново сама. Классическая задача — роль «Контент-менеджер»: может всё по контенту, включая чужие записи, но не видит плагины, темы и настройки.

<?php
add_action( 'init', 'ds_add_content_manager_role' );
function ds_add_content_manager_role() {
    if ( get_role( 'content_manager' ) ) {
        return; // роль уже существует, не дублируем
    }
    add_role(
        'content_manager',
        'Контент-менеджер',
        array(
            'read'              => true,
            'upload_files'      => true,
            'edit_posts'        => true,
            'edit_others_posts' => true,
            'delete_posts'      => true,
            'publish_posts'     => true,
            'edit_pages'        => true,
            'moderate_comments' => true,
        )
    );
}
?>

Как это работает: хук init запускает функцию при каждой загрузке WordPress. Функция сначала проверяет через get_role(), существует ли уже такая роль (роль хранится в базе, поэтому достаточно создать её один раз), и если да — выходит. Если нет — add_role() создаёт контейнер с техническим именем content_manager (только латиница и подчёркивания), человекочитаемым названием «Контент-менеджер» и массивом возможностей. После создания роль сразу появится в выпадающем списке «Роль» в карточке пользователя — можно назначать её прямо из админки, без кода.

Назначить роль пользователю можно в админке или кодом:

<?php
$user = new WP_User( 12 );      // 12 — ID пользователя
$user->set_role( 'content_manager' );
?>

Куда вставлять код: в functions.php дочерней темы или в mu-plugin. Не вставляйте такой сниппет во «временные» места вроде плагина-заглушки, который потом удалите, — сама роль при этом не исчезнет (она в базе), а вот документация по проекту перепутается.

Выдаём и забираем отдельные возможности: add_cap() и remove_cap()

Часто создавать новую роль не нужно — достаточно чуть подправить существующую. Например, разрешить редактору управлять меню и виджетами, а у автора забрать возможность удалять свои опубликованные записи:

<?php
add_action( 'init', 'ds_tune_role_caps' );
function ds_tune_role_caps() {
    $editor = get_role( 'editor' );
    if ( $editor && ! $editor->has_cap( 'edit_theme_options' ) ) {
        $editor->add_cap( 'edit_theme_options' );
    }
    $author = get_role( 'author' );
    if ( $author && $author->has_cap( 'delete_published_posts' ) ) {
        $author->remove_cap( 'delete_published_posts' );
    }
}
?>

Здесь та же логика, что и с ролями: изменения сохраняются в базу данных и остаются там после удаления сниппета. Поэтому проверки has_cap() нужны, чтобы не гонять лишние записи в базу при каждой загрузке страницы — защита уже стоит, дублировать нечего.

Два практических следствия. Первое: перед экспериментами с правами сделайте резервную копию — восстановить случайно отнятые у админа возможности вручную неприятнее, чем развернуть бэкап. Второе: если хотите вернуть роль к заводскому состоянию, проще всего удалить её через remove_role() и пересоздать стандартный набор — у User Role Editor есть кнопка сброса к значениям по умолчанию.

Проверка прав в своём коде: меню, AJAX, front-end

Когда вы пишете свой функционал, права проверяются в трёх типичных местах. Первое — регистрация пунктов меню в админке: параметр capability в add_menu_page() автоматически скрывает пункт у тех, кому нельзя:

<?php
add_action( 'admin_menu', 'ds_register_reports_menu' );
function ds_register_reports_menu() {
    add_menu_page(
        'Отчёты магазина',
        'Отчёты',
        'manage_options',   // увидят только администраторы
        'ds-reports',
        'ds_render_reports_page',
        'dashicons-chart-bar',
        3
    );
}
?>

Второе — AJAX-обработчики: сам по себе admin-ajax.php не проверяет права, это делает ваш код. Всегда начинайте обработчик с проверки current_user_can():

<?php
add_action( 'wp_ajax_ds_like_post', 'ds_like_post_handler' );
function ds_like_post_handler() {
    if ( ! current_user_can( 'read' ) ) {
        wp_send_json_error( array( 'message' => 'Недостаточно прав' ), 403 );
    }
    $post_id = absint( $_POST['post_id'] ?? 0 );
    wp_send_json_success( array( 'post_id' => $post_id ) );
}
?>

Третье — интерфейс на фронтенде: кнопку «Редактировать» показываем только тем, кто реально может редактировать. Со стороны браузера запрос к обработчику выглядит так:

fetch('/wp-admin/admin-ajax.php', {
  method: 'POST',
  credentials: 'same-origin',
  body: new URLSearchParams({ action: 'ds_like_post', post_id: '12' })
})
  .then(response => response.json())
  .then(data => console.log(data));

Скрытие кнопки на фронтенде — только косметика: нельзя рассчитывать, что «кто не видит кнопку, тот и не нажмёт». Проверка на сервере в обработчике обязательна всегда, потому что запрос можно подделать. Если интегрируете сайт с внешними сервисами, посмотрите разбор REST API WordPress — там доступ к данным тоже ограничивается проверками прав, а за основу асинхронных запросов на стороне сервера часто берут тот же admin-ajax.php.

Частые ошибки новичков при работе с ролями

Разбор типовых граблей сэкономит вам несколько вечеров:

  1. Дать всем администратора «чтобы не возиться». Админ может удалить плагины, сменить тему, отредактировать файлы и пользователей. Один скомпрометированный аккаунт — и сайт потерян. Для контента есть редактор, для магазина — shop_manager.
  2. Проверять роль вместо возможности. Конструкция «если роль = administrator» ломается при кастомных ролях и переносе сайта. Всегда current_user_can() с конкретной возможностью.
  3. Забывать, что роли живут в базе. Удалили сниппет с add_role(), а роль никуда не делась. Созданные роли и выданные capabilities — это данные, а не код, и «чинить» их нужно тоже данными или плагином.
  4. Вызывать add_role() без проверки на существование. WordPress молча пропустит повторное создание, и вы никогда не узнаете, что старая версия роли с устаревшим набором прав всё ещё работает. Всегда проверяйте get_role() перед созданием.
  5. Ограничиваться проверкой прав без валидации данных. Право «read» ещё не значит, что в $_POST пришло безопасное число. Приводите входные данные через absint() и проверяйте nonce — иначе дыра останется даже при идеальных ролях.
  6. Править роли напрямую в базе без бэкапа. Опция wp_user_roles сериализована; одна опечатка в phpMyAdmin — и все пользователи могут потерять доступ. Сначала копия, потом эксперименты.

Частые вопросы о ролях и правах в WordPress

Где в админке посмотреть и изменить роль пользователя?

Раздел «Пользователи → Все пользователи»: в таблице есть колонка «Роль». Чтобы изменить, наведите курсор на пользователя и нажмите «Изменить», либо выделите галочками нескольких людей, выберите роль в выпадающем списке над таблицей и нажмите «Применить» — массовая смена ролей занимает секунды.

Можно ли переименовать или удалить стандартную роль?

Технически да: функции remove_role() и фильтры переводов позволяют и удалять, и переименовывать. Но делать это не стоит: плагины и темы рассчитывают на стандартные роли, а после обновлений могут появиться конфликты. Если название «Автор» не нравится — создайте свою роль, а стандартную просто не назначайте никому.

Сколько администраторов должно быть на сайте?

Минимум: один-два. Владелец и, при необходимости, технический подрядчик. Каждый дополнительный администратор — это доступ к плагинам, темам, базе и пользователям сразу. Для всех остальных задач существует роль по месту: редактор для контента, менеджер магазина для WooCommerce, подписчик для читателей.

Что произойдёт с ролями, если удалить плагин Members или User Role Editor?

Ничего: роли и возможности хранятся в базе данных WordPress, а не в файлах плагина. Созданные роли останутся работать, но исчезнет удобный интерфейс управления. Иногда после удаления остаются ненужные «мусорные» роли — их можно убрать функцией remove_role() или снова установить плагин на время чистки.

Как дать подрядчику доступ, не отдавая аккаунт администратора?

Создайте отдельную учётную запись с ролью по задаче: «Редактор» для контента, «Менеджер магазина» для товаров и заказов. Если подрядчику нужны точечные дополнительные права — добавьте их конкретной возможности через User Role Editor. Никогда не передавайте свой личный админский аккаунт: для разовой технической работы проще временно повысить его отдельную учётку, а после приёмки вернуть роль обратно.

Чем управление ролями отличается в WooCommerce?

WooCommerce добавляет две роли: «Клиент» (customer) — для покупателей с личным кабинетом и историей заказов, и «Менеджер магазина» (shop_manager) — для администраторов магазина. Менеджер работает с товарами, заказами, купонами и отчётами, но не может менять темы и плагины, поэтому передача магазина сотруднику на эту роль безопаснее, чем выдача полных прав администратора.

TimeWeb

Вывод: настройте роли один раз — и забудьте о страхе за сайт

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

  1. Аудит: откройте «Пользователи → Все пользователи» и проверьте, нет ли лишних администраторов;
  2. Минимальные права: каждому работающему с сайтом — роль по задаче, а не админку «чтобы проще»;
  3. Автоматизация: либо галочки в User Role Editor, либо сниппеты add_role/add_cap в дочерней теме;
  4. Контроль: весь свой код начинайте с current_user_can(), а входные данные проверяйте отдельно.

Настройка ролей отлично дополняет базовые меры из гайда по безопасности WordPress, а понимание хуков из статьи про actions и filters поможет строить на проверках прав собственную логику. Если работаете с мультисайтовой сетью WordPress, учитывайте: там роли действуют в пределах каждого сайта сети отдельно. Больше практических материалов о разработке — в блоге delai-sait.ru, а если нужен сайт под ключ с продуманной структурой доступа для команды — посмотрите услуги разработки и напишите нам через форму контактов или загляните в портфолио.

Clearfy

Поделиться:
Telegram ВКонтакте