Диагностика проблемы: зачем ограничивать доступ в WooCommerce
В проектах на WooCommerce часто возникает задача ограничить доступ к определённым страницам магазина для разных групп пользователей. Например, скрыть цены и возможность покупки для гостей, разрешить просмотр только для зарегистрированных клиентов или выделить отдельные страницы для оптовиков с особым ассортиментом.
Стандартный функционал WordPress и WooCommerce не предусматривает гибкую настройку доступа по ролям к страницам магазина, товарам и категориям. Без дополнительной настройки или кода пользователи видят всё одинаково.
Как проверить текущие права доступа и роли пользователей
- В админке WordPress перейдите в "Пользователи" и посмотрите назначенные роли.
- Проверьте, какие страницы доступны при разных ролях, открыв сайт в режиме инкогнито (гость) и под учётной записью.
- Используйте плагин Clearfy Pro для аудита ролей и прав.
Пошаговое решение: ограничение доступа к страницам WooCommerce по ролям
1. Добавление кастомных ролей (если нужно)
Для начала добавим, например, роль «Оптовик»:
function add_wholesale_role() {
add_role('wholesale_customer', 'Оптовик', array(
'read' => true,
'level_0' => true
));
}
add_action('init', 'add_wholesale_role');
Роль добавлена с базовыми возможностями чтения. Можно расширить права по необходимости.
2. Ограничение доступа через хук template_redirect
Добавим проверку на доступ к страницам и перенаправление пользователей без нужной роли:
function restrict_pages_by_role() {
if (is_page(array('wholesale-area', 'private-offers'))) { // список страниц для ограничения
if (!is_user_logged_in()) {
wp_redirect(wp_login_url());
exit;
}
$user = wp_get_current_user();
if (!in_array('wholesale_customer', (array) $user->roles)) {
wp_redirect(home_url());
exit;
}
}
}
add_action('template_redirect', 'restrict_pages_by_role');
Этот код перенаправит гостей на страницу входа, а пользователей без роли «Оптовик» — на главную.
3. Скрытие элементов WooCommerce (цен, кнопок) для определённых ролей
Чтобы дополнительно скрыть цены и кнопки добавления в корзину для гостей или других ролей, используйте фильтр:
function hide_price_and_add_to_cart() {
if (!is_user_logged_in() || !current_user_can('wholesale_customer')) {
remove_action('woocommerce_after_shop_loop_item', 'woocommerce_template_loop_add_to_cart', 10);
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10);
remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_add_to_cart', 30);
}
}
add_action('wp', 'hide_price_and_add_to_cart');
Проверка результата после внедрения
- Зайдите на ограниченные страницы как гость — вы должны быть перенаправлены на страницу входа.
- Залогиньтесь под пользователем без роли «Оптовик» — доступ к страницам ограничен редиректом на главную.
- Войдите под пользователем с ролью «Оптовик» — страницы и содержимое доступны.
- Проверьте отображение цен и кнопок на страницах магазина для разных ролей.
Частые ошибки и как их исправить
- Код не срабатывает на страницах: Проверьте точность указания слагов страниц в
is_page(). Используйте ID или массив. - Перенаправление в бесконечный цикл: Убедитесь, что страницы для входа и главная не попадают под ограничение, иначе будет бесконечный редирект.
- Цены и кнопки не скрываются: Проверьте, что хук
wpвызывается и ваши вызовыremove_actionвыполняются после подключения WooCommerce. - Роль не назначается: После добавления роли в коде удалите/добавьте пользователя заново или пересоздайте роль, так как add_role работает один раз.
Практические советы по безопасности и производительности
- Кэширование страниц: если на сайте используется кэширование (например, WP Super Cache, Varnish), настройте исключения для страниц с ограниченным доступом, чтобы пользователи не увидели чужие данные.
- Используйте nonce и проверяйте права доступа при выполнении AJAX-запросов, если они используются для управления корзиной или заказами.
- Минимизируйте количество проверок ролей и условий — выполняйте их только на нужных страницах для уменьшения нагрузки.
Сравнение вариантов реализации ограничения доступа
| Метод | Преимущества | Недостатки |
|---|---|---|
| Код на template_redirect | Гибкий, не требует плагинов, полный контроль | Требует навыков, легко сделать ошибку с редиректами |
| Плагины (например, Members, User Role Editor + Restrict Content) | Простой интерфейс, быстро настроить | Дополнительная нагрузка, ограниченная кастомизация |
| Использование WooCommerce Memberships (платный) | Готовое решение с расширенными функциями | Стоимость, избыточность для простых задач |