Диагностика проблемы: зачем нужны custom capabilities
Стандартные роли и права WordPress часто не подходят для сложных проектов с кастомными требованиями к доступу. Например, нужно разрешить определённым пользователям редактировать только конкретные типы записей или доступ к настройкам плагина. В таких случаях стоит создавать собственные возможности (capabilities) и назначать их ролям.
Проверить, почему стандартные роли не подходят, можно так:
if (current_user_can('edit_posts')) {
// Пользователь может редактировать записи
} else {
// Нет доступа
}Если этого недостаточно — пора создавать custom capabilities.
Как добавить custom capabilities и связать их с ролями
Добавим capability manage_custom_feature и назначим её роли editor для примера.
function add_custom_capabilities() {
// Получаем объект роли
$role = get_role('editor');
if (!$role->has_cap('manage_custom_feature')) {
$role->add_cap('manage_custom_feature');
}
}
add_action('init', 'add_custom_capabilities');Так capability добавляется. Чтобы убрать — используйте $role->remove_cap('manage_custom_feature');.
Как проверить, что capability работает
Используйте функцию current_user_can('manage_custom_feature') в шаблонах или плагинах:
if (current_user_can('manage_custom_feature')) {
echo 'Доступ разрешён';
} else {
echo 'Доступ запрещён';
}Ограничение доступа к административным страницам на основе custom capabilities
Чтобы ограничить доступ к странице настроек плагина, добавьте capability при регистрации страницы:
add_action('admin_menu', function() {
add_menu_page(
'Настройки кастомной функции',
'Custom Feature',
'manage_custom_feature', // Наш кастомный capability
'custom-feature-settings',
'custom_feature_settings_page'
);
});Теперь только пользователи с manage_custom_feature увидят и смогут открыть эту страницу.
Пример: кастомная роль с ограниченным доступом к CPT и админке
Создаём роль custom_manager с возможностью редактировать только определённый кастомный тип записей project:
function create_custom_manager_role() {
add_role('custom_manager', 'Custom Manager', [
'read' => true,
'edit_projects' => true, // capability для CPT project
'publish_projects' => true,
'edit_published_projects' => true,
]);
}
register_activation_hook(__FILE__, 'create_custom_manager_role');При регистрации CPT project нужно указать именно эти capability в capabilities:
$args = [
'capability_type' => ['project', 'projects'],
'map_meta_cap' => true,
'capabilities' => [
'edit_post' => 'edit_project',
'read_post' => 'read_project',
'delete_post' => 'delete_project',
'edit_posts' => 'edit_projects',
'edit_others_posts' => 'edit_others_projects',
'publish_posts' => 'publish_projects',
'read_private_posts' => 'read_private_projects',
],
];
register_post_type('project', $args);Проверка результата после внедрения
- Зайдите под пользователем с ролью
custom_manager(или с добавленным capability). - Попробуйте открыть страницу с ограниченным доступом — должна быть ошибка 403 или «Доступ запрещён».
- Проверьте возможность редактирования CPT — пользователь должен иметь доступ только к нужным типам.
- Для проверки capability используйте
current_user_can()в шаблонах.
Частые ошибки при работе с custom capabilities
- Не указали
map_meta_cap=> true при регистрации CPT — capabilities не работают корректно, доступ либо слишком свободен, либо слишком ограничен. - Добавили capability роли, но не обновили пользователей — иногда роли кешируются, нужно перелогиниться или сбросить кеш.
- Используете capability, которой нет у роли — проверка
current_user_canвсегда возвращает false. - Неправильно указали capability при регистрации страницы меню — страница будет видна всем или никому.
Практические советы по безопасности и производительности
- Не давайте больше прав, чем нужно, чтобы минимизировать риск компрометации.
- Добавляйте и удаляйте capabilities только при активации/деактивации плагина, а не на каждый
init, чтобы не перегружать запросы. - При работе с кастомными ролями и capabilities тестируйте с разными пользователями, чтобы не допустить утечек доступа.
- Используйте плагины для управления ролями, например Clearfy Pro, если нужно быстро добавить/убрать capabilities через интерфейс.
Сравнение методов ограничения доступа в WordPress
| Метод | Как работает | Плюсы | Минусы |
|---|---|---|---|
| Стандартные роли | Используются предустановленные capabilities | Просто использовать, совместимо с большинством плагинов | Нет гибкости, не подходит для точечных задач |
| Custom capabilities | Создание и назначение новых capabilities ролям | Гибкость, точный контроль доступа | Сложнее реализовать, требует правильной настройки CPT и ролей |
| Плагины управления ролями | Интерфейс для редактирования ролей и capabilities | Удобно для админов, не требует кода | Может замедлять сайт, риск конфликтов с кастомными решениями |