В WordPress система ролей и возможностей (capabilities) позволяет гибко управлять доступом пользователей к различным функциям сайта. Иногда возникает необходимость изменить стандартные возможности ролей или добавить новые, чтобы точнее контролировать права пользователей. В этой статье мы рассмотрим, как это делать без плагинов, используя только встроенные функции WordPress и собственный код.
Что такое возможности и роли в WordPress
Роли — это наборы возможностей, которые назначаются пользователям. Например, роль «Автор» имеет возможность создавать и публиковать свои записи, а «Редактор» — управлять чужими записями и страницами. Возможности — это конкретные права, например, edit_posts или delete_pages.
WordPress предоставляет API для управления ролями и возможностями через функции add_role(), remove_role(), add_cap() и remove_cap(). Используя их, можно создавать кастомные роли или модифицировать стандартные.
Как изменить возможности стандартной роли
Часто требуется добавить или убрать права у существующих ролей, например, повысить права редактора или ограничить автора. Для этого используется объект роли, который можно получить через функцию get_role().
Пример добавления возможности upload_files роли «Автор»:
function wpmagazin_add_upload_to_author() {
$role = get_role('author');
if ($role && ! $role->has_cap('upload_files')) {
$role->add_cap('upload_files');
}
}
add_action('init', 'wpmagazin_add_upload_to_author');Этот код добавит возможность загружать медиафайлы для авторов, что по умолчанию запрещено. Аналогично можно удалить возможности с помощью remove_cap().
Удаление возможности у роли
Например, запретим редактору удалять страницы:
function wpmagazin_remove_delete_pages_from_editor() {
$role = get_role('editor');
if ($role && $role->has_cap('delete_pages')) {
$role->remove_cap('delete_pages');
}
}
add_action('init', 'wpmagazin_remove_delete_pages_from_editor');Важно выполнять такие изменения в хуке init, чтобы все роли уже были загружены.
Создание новой роли с кастомными возможностями
Если стандартных ролей недостаточно, можно создать свою. Например, создадим роль «Гостевой Автор» с минимальными правами для создания и редактирования собственных записей:
function wpmagazin_add_guest_author_role() {
add_role('guest_author', 'Гостевой Автор', array(
'read' => true,
'edit_posts' => true,
'delete_posts' => false,
'publish_posts' => false,
'upload_files' => false,
));
}
add_action('init', 'wpmagazin_add_guest_author_role');При необходимости позже можно добавить или убрать возможности у этой роли, используя описанные выше методы.
Удаление собственной роли
Если роль больше не нужна, её можно удалить функцией remove_role(). Например:
function wpmagazin_remove_guest_author_role() {
remove_role('guest_author');
}
// Вызывать только при необходимости, например, при деактивации темы или плагинаКак проверить, есть ли у пользователя возможность
Для контроля доступа в коде часто нужно проверить, обладает ли текущий пользователь определённым правом. Это делается функцией current_user_can(). Например:
if (current_user_can('edit_others_posts')) {
// Пользователь может редактировать чужие записи
} else {
// Ограниченный доступ
}Используйте эту проверку в своих шаблонах и плагинах, чтобы обеспечить безопасность и удобство.
Пример: добавление возможности для роли через wpShop Clearfy Pro
Если вы используете плагин Clearfy Pro, он позволяет управлять ролями и их возможностями в удобном интерфейсе. Однако, если вы хотите автоматизировать процесс в коде, приведённые выше примеры отлично подходят для кастомизации.
Резюме по безопасности и практике
Изменение ролей и возможностей должно выполняться аккуратно, чтобы не дать пользователям избыточный доступ. Рекомендуется тестировать изменения на тестовом сайте. Для постоянных изменений лучше использовать собственный плагин или файл functions.php дочерней темы.
Ниже пример функции, которая позволяет добавить возможность, если её нет, и удалить, если она есть, для быстрой настройки:
function wpmagazin_toggle_capability($role_name, $capability) {
$role = get_role($role_name);
if (!$role) return;
if ($role->has_cap($capability)) {
$role->remove_cap($capability);
} else {
$role->add_cap($capability);
}
}Вызывайте эту функцию с нужными параметрами для управления правами в любом месте кода.