Что такое custom capabilities и зачем они нужны в WooCommerce
В WooCommerce и WordPress в целом, capabilities — это права, которые определяют, какие действия может выполнять пользователь. По умолчанию WooCommerce использует стандартные роли и capabilities, но иногда нужна более тонкая настройка доступа, например, ограничить показ определённых разделов или функций для конкретных пользователей или групп пользователей без создания новых ролей.
Custom capabilities позволяют задавать уникальные права, которые можно назначать ролям или отдельным пользователям. Это ключ к гибкой настройке доступа в WooCommerce.
Диагностика: как понять, нужны ли custom capabilities
Если вы хотите:
- Ограничить доступ к определённым страницам WooCommerce (например, управление заказами или отчетам) для существующих ролей.
- Добавить новый уровень доступа для менеджеров без полного доступа администратора.
- Изменить поведение плагинов, которые проверяют capabilities.
Тогда custom capabilities — ваш вариант.
Проверить текущие capabilities роли можно с помощью кода:
global $wp_roles;
print_r( $wp_roles->roles['shop_manager']['capabilities'] );Это покажет список прав для роли «shop_manager».
Пошаговое решение: как добавить custom capabilities и назначить их ролям
1. Добавление custom capability
Для начала добавим новую capability, например, view_special_reports:
function add_custom_capability() {
$role = get_role('shop_manager');
if ( !$role->has_cap('view_special_reports') ) {
$role->add_cap('view_special_reports');
}
}
add_action('init', 'add_custom_capability');2. Использование capability для ограничения доступа к разделу
Допустим, у вас есть страница с отчетами, доступ к которой должен быть только у пользователей с этой capability. Проверим доступ в шаблоне или хуке:
function restrict_special_reports_page() {
if ( is_page('special-reports') && ! current_user_can('view_special_reports') ) {
wp_redirect(home_url());
exit;
}
}
add_action('template_redirect', 'restrict_special_reports_page');3. Добавление проверки capability в WooCommerce админку
Если нужно скрыть пункты меню или страницы в админке для ролей без права view_special_reports:
function remove_reports_menu_for_no_cap() {
if (!current_user_can('view_special_reports')) {
remove_menu_page('wc-reports'); // ID страницы отчетов WooCommerce
}
}
add_action('admin_menu', 'remove_reports_menu_for_no_cap', 999);Проверка результата после внедрения
- Войдите под пользователем с ролью
shop_managerи убедитесь, что доступ к страницеspecial-reportsесть. - Войдите под пользователем без этой capability и проверьте, что происходит редирект на главную или страницу 403.
- В админке для пользователя без capability пункт меню «Отчёты» должен отсутствовать.
Частые ошибки и как их исправить
- Capability не добавляется к роли: Проверьте, что функция вызвана на правильном хуке (
init) и что роль существует. Используйтеget_role()для проверки перед добавлением capability. - Пользователь не получил новую capability: После добавления capability роли, если пользователь был залогинен, выйдите и зайдите заново, чтобы обновить сессию.
- Редирект вызывает зацикливание: Убедитесь, что условие редиректа корректно, и страница редиректа не совпадает с защищённой страницей.
- Меню не скрывается: Проверьте правильность ID страницы в
remove_menu_page()и приоритет хукаadmin_menu(лучше ставить 999).
Практические советы по безопасности и производительности
- Используйте capabilities, а не роли, для гибкой и масштабируемой настройки доступа.
- Не добавляйте лишние capabilities всем пользователям — это снижает безопасность.
- Для массовых изменений ролей используйте WP-CLI, чтобы избежать ошибок.
- Если добавляете много новых capabilities, делайте это через плагин или mu-плагин, чтобы изменения не терялись при обновлении темы.
- Кэшируйте результаты проверок capabilities, если используете их часто в фронтенде.
Сравнение способов ограничения доступа в WooCommerce
| Метод | Преимущества | Недостатки |
|---|---|---|
| Использование стандартных ролей | Простота, поддержка из коробки | Мало гибкости, нет тонкой настройки |
| Добавление custom capabilities | Гибкий контроль доступа, подходит для сложных сценариев | Требует программирования, риск ошибок при неправильной настройке |
| Плагины для управления доступом (например, User Role Editor) | Удобный интерфейс, быстрое добавление | Зависимость от сторонних плагинов, возможные конфликты |