Как использовать custom capabilities для ограничения доступа в WordPress

Диагностика проблемы: зачем нужны 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Удобно для админов, не требует кодаМожет замедлять сайт, риск конфликтов с кастомными решениями
Как создать собственный виджет в WordPress с поддержкой AJAX
07.02.2026
Как создать настройку в WordPress для пользователя
01.11.2025
Как настроить автоматическое сохранение данных в формах WordPress
25.01.2026
Как удалить неиспользуемые метаданные в WordPress для оптимизации базы данных
29.12.2025
Как добавить автоподпись в WordPress с помощью PHP
26.11.2025