WooCommerce: ограничение доступа к страницам по ролям пользователей

Диагностика проблемы: зачем ограничивать доступ в 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 (платный)Готовое решение с расширенными функциямиСтоимость, избыточность для простых задач
Как создать кастомный плагин для журналов входов в WordPress
16.03.2026
WooCommerce: автоматическое удаление пользователя при отмене заказа
29.04.2026
WordPress кастомные сообщения об ошибках при входе: настройка и примеры
01.12.2025
Безопасность WordPress: защита от brute force атак
05.11.2025
WordPress установка и настройка OAuth2 сервера: пошаговое руководство с примерами кода
30.12.2025