В WordPress по умолчанию есть набор ролей пользователей с определёнными правами: администратор, редактор, автор, подписчик и другие. Однако часто в проектах требуется более гибкая настройка ролей и прав доступа. В этой статье мы подробно разберём, как создавать кастомные роли и назначать им права, а также как управлять ими программно.
Почему стоит создавать кастомные роли и права доступа
Стандартные роли WordPress покрывают большинство сценариев, но иногда они слишком общие или, наоборот, дают слишком много прав. Например, вам может понадобиться роль, которая сможет публиковать записи, но не удалять их, или роль, которая работает только с определённым типом записей.
Создание кастомных ролей поможет:
- Точно контролировать, что может делать пользователь.
- Упростить интерфейс для определённых групп пользователей.
- Повысить безопасность сайта, ограничив доступ к критическим функциям.
Для реализации этого используется API функций WordPress add_role, remove_role, add_cap и remove_cap.
Создание кастомной роли в WordPress: пример кода
Для добавления новой роли используется функция add_role. Ниже пример создания роли «Менеджер контента» с ограниченным набором прав:
function wpunit_add_custom_role() {
add_role('content_manager', 'Менеджер контента', array(
'read' => true,
'edit_posts' => true,
'edit_published_posts' => true,
'publish_posts' => true,
'delete_posts' => false,
'delete_published_posts' => false,
// Можно добавить дополнительные права
));
}
add_action('init', 'wpunit_add_custom_role');Этот код добавляет новую роль, которая сможет создавать и редактировать записи, но не удалять их. Роль можно расширять, добавляя права для работы с другими типами записей, таксономиями и настройками.
Важно: добавлять роли нужно один раз при активации плагина или темы, чтобы не создавать дубликаты при каждом запуске. Обычно код помещают в функцию активации плагина.
Добавление и удаление прав для существующих ролей
Если нужно изменить права у существующей роли, например, добавить возможность модерации комментариев для редактора, используйте методы add_cap и remove_cap:
function wpunit_modify_editor_caps() {
$role = get_role('editor');
if ($role) {
$role->add_cap('moderate_comments');
$role->remove_cap('delete_others_posts');
}
}
add_action('init', 'wpunit_modify_editor_caps');Так вы можете точно настроить, какие возможности у каждой роли.
Пример: кастомная роль с правами для кастомного типа записей
Допустим, у вас есть кастомный тип записей wpunit_project, и вы хотите создать роль, которая сможет управлять только этими записями.
function wpunit_add_project_manager_role() {
add_role('project_manager', 'Менеджер проектов', array(
'read' => true,
'edit_wpunit_projects' => true,
'publish_wpunit_projects' => true,
'edit_published_wpunit_projects' => true,
'delete_wpunit_projects' => false,
));
}
add_action('init', 'wpunit_add_project_manager_role');Для этого кастомного типа записей нужно зарегистрировать права (capabilities) в параметрах register_post_type:
register_post_type('wpunit_project', array(
'labels' => array(
'name' => 'Проекты',
'singular_name' => 'Проект'
),
'public' => true,
'capability_type' => 'wpunit_project',
'map_meta_cap' => true,
'capabilities' => array(
'edit_post' => 'edit_wpunit_project',
'read_post' => 'read_wpunit_project',
'delete_post' => 'delete_wpunit_project',
'edit_posts' => 'edit_wpunit_projects',
'edit_others_posts' => 'edit_others_wpunit_projects',
'publish_posts' => 'publish_wpunit_projects',
'read_private_posts' => 'read_private_wpunit_projects',
),
));Это позволит делегировать управление проектами конкретным пользователям с ролью project_manager.
Как проверить права пользователя в коде
Для проверки прав используйте функции current_user_can() или user_can():
if (current_user_can('edit_wpunit_projects')) {
// Выполняем действия для пользователей с правами редактирования проектов
}Это удобно для условного вывода элементов интерфейса или ограничения выполнения операций.
Рекомендации по безопасности и управлению ролями
При работе с кастомными ролями учитывайте:
- Не давайте избыточные права, чтобы избежать уязвимостей.
- Используйте
map_meta_capи регистрируйте права для кастомных типов записей. - Удаляйте роли только если уверены, что они больше не нужны, чтобы не потерять доступ пользователей.
- Для временного расширения прав используйте фильтры и временные добавления прав.
Плагины для управления ролями и правами
Если не хотите писать код, можно использовать готовые решения:
- User Role Editor — популярный плагин для тонкой настройки ролей и прав.
- Members — плагин для управления доступом и ролями с поддержкой коротких кодов.
Используйте плагины, если хотите быстро и без кода настроить доступы, или комбинируйте их с собственными решениями для максимальной гибкости.