Диагностика задачи: зачем ограничивать доступ к товарам и страницам WooCommerce
В интернет-магазинах на WooCommerce часто возникает необходимость скрыть отдельные страницы, категории или товары от определённых групп пользователей. Например, показывать эксклюзивные товары только зарегистрированным клиентам, или ограничить доступ к оптовым ценам для обычных посетителей.
Стандартного функционала WooCommerce для тонкой настройки доступа нет. Без дополнительных настроек или плагинов пользователи видят весь каталог и страницы магазина.
В этой статье разберём, как точечно ограничить доступ к категориям и страницам WooCommerce с помощью кода, сохранив при этом производительность и безопасность.
Как определить, что доступ к категории или странице не ограничен
- Перейдите на страницу категории товаров в режиме неавторизованного пользователя или пользователя с низкими правами.
- Проверьте, виден ли каталог и товары.
- Если защищаемая категория или страница доступна, значит ограничения нет.
- Для страниц магазина и ключевых страниц WooCommerce (корзина, оформление заказа) также проверьте доступ.
Пошаговое решение: ограничение доступа к категориям WooCommerce и страницам
1. Добавляем проверку в шаблон каталога и страниц
Для ограничения доступа к категориям можно использовать хук template_redirect, который срабатывает перед загрузкой шаблона. В функции проверим категорию и роль пользователя.
add_action('template_redirect', function() {
if (is_product_category('optovye-tovary')) { // замените на вашу категорию
if (!is_user_logged_in() || !current_user_can('customer')) {
wp_redirect(home_url());
exit;
}
}
if (is_page('eksklyuzivnye-tovary')) { // замена на slug страницы
if (!is_user_logged_in() || !current_user_can('customer')) {
wp_redirect(wp_login_url(get_permalink()));
exit;
}
}
});
Этот код проверит, если пользователь не авторизован или не имеет права customer (роль покупателя), то его перенаправит на главную или страницу входа.
2. Скрываем товары из категорий для неподходящих пользователей
Чтобы товары из ограниченной категории не показывались в других местах (виджеты, поиск), фильтруем запросы WP_Query через хук pre_get_posts:
add_action('pre_get_posts', function($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
if (!is_user_logged_in() || !current_user_can('customer')) {
// Исключаем категорию optovye-tovary из запросов на фронте
$tax_query = (array) $query->get('tax_query');
$tax_query[] = [
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => ['optovye-tovary'],
'operator' => 'NOT IN',
];
$query->set('tax_query', $tax_query);
}
});
Проверка результата после внедрения
- Выйдите из аккаунта и попробуйте перейти к защищённой категории и странице — должна быть переадресация.
- Зайти под учетной записью с ролью
customer— доступ должен быть. - Проверьте поиск и виджеты — товары из запрещенной категории не должны отображаться.
- Проверьте консоль браузера — ошибок JavaScript быть не должно.
Частые ошибки и как исправить
- Переадресация не срабатывает: проверьте, что код добавлен в functions.php или подключен через плагин, и что нет конфликтов плагинов с редиректами.
- Товары всё равно отображаются в виджетах: убедитесь, что условие для исключения категорий в
pre_get_postsправильно настроено и срабатывает только на фронтенде. - Пользователи с нужной ролью не видят товары: проверьте, что роль указана верно и пользователь действительно ей обладает.
- Проблемы с SEO из-за переадресаций: используйте редиректы с кодом 302 для временного ограничения, чтобы не потерять индексацию.
Практические советы по безопасности и производительности
- Не используйте плагины с избыточным функционалом, если задача проста — код легче поддерживать и быстро работает.
- Кэширование страниц может мешать проверке доступа — отключите кэш для страниц с ограниченным доступом или настройте исключения.
- Для более гибких правил доступа рассмотрите использование ролей и capabilities, а также пользовательских мета-полей.
- Регулярно проверяйте логи ошибок, чтобы быстро находить сбои в редиректах и доступе.
- Протестируйте работу на мобильных устройствах и разных браузерах — чтобы исключить проблемы с кэшированием и редиректами.
Сравнение вариантов реализации ограничения доступа
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Код в functions.php | Добавление условий в хуки template_redirect и pre_get_posts | Легко кастомизируется, нет лишних плагинов, быстро работает | Требует знаний PHP, сложно для новичков |
| Плагины ограничения доступа | Использование плагинов типа Members, User Role Editor | Удобный интерфейс, много функций | Может нагружать сайт, конфликтовать с другими плагинами |
| Комбинирование | Плагины для ролей + кастомный код для тонкой настройки | Гибкость и удобство настройки | Сложнее поддерживать, возможны конфликты |