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

|

Проблема: необходимость скрыть категории товаров для определённых ролей пользователей в WooCommerce

В стандартном WooCommerce нет встроенного механизма для ограничения видимости категорий товаров в каталоге и на страницах магазина в зависимости от роли пользователя. Это часто необходимо, например, при создании B2B-сайтов, где оптовые товары должны быть видны только оптовым клиентам, а розничные — остальным.

Диагностика проблемы

Чтобы убедиться, что WooCommerce не скрывает категории по ролям, проверьте следующие моменты:

Пошаговое решение: исключение категорий товаров по ролям пользователей

Реализуем исключение категорий товаров из каталога и поиска WooCommerce с помощью фильтра woocommerce_product_query. Пример кода помещается в файл functions.php вашей дочерней темы или в кастомный плагин.

add_action('woocommerce_product_query', 'exclude_categories_by_user_role', 10, 2); function exclude_categories_by_user_role($query, $query_vars) { if (is_admin() || !is_shop() && !is_product_category() && !is_product_tag()) { return; } $user = wp_get_current_user(); $restricted_categories = array(); if (in_array('wholesale_customer', (array) $user->roles)) { // Для оптовых клиентов показываем только определённые категории // Здесь исключаем розничные категории $restricted_categories = array('retail'); } elseif (in_array('customer', (array) $user->roles)) { // Для розничных клиентов скрываем оптовые категории $restricted_categories = array('wholesale'); } if (!empty($restricted_categories)) { $tax_query = (array) $query->get('tax_query'); $tax_query[] = array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $restricted_categories, 'operator' => 'NOT IN', ); $query->set('tax_query', $tax_query); } }

Пояснения:

Дополнительная настройка: исключение категорий в виджетах и видимости

По умолчанию этот подход не исключит товары из виджетов и других запросов WooCommerce. Для полноты можно добавить фильтр на pre_get_posts с аналогичной логикой.

add_action('pre_get_posts', 'exclude_categories_from_widgets_by_role'); function exclude_categories_from_widgets_by_role($query) { if (is_admin() || !$query->is_main_query()) { return; } if ($query->is_post_type_archive('product') || $query->is_tax('product_cat') || $query->is_tax('product_tag')) { $user = wp_get_current_user(); $restricted_categories = array(); if (in_array('wholesale_customer', (array) $user->roles)) { $restricted_categories = array('retail'); } elseif (in_array('customer', (array) $user->roles)) { $restricted_categories = array('wholesale'); } if (!empty($restricted_categories)) { $tax_query = (array) $query->get('tax_query'); $tax_query[] = array( 'taxonomy' => 'product_cat', 'field' => 'slug', 'terms' => $restricted_categories, 'operator' => 'NOT IN', ); $query->set('tax_query', $tax_query); } } }

Проверка результата после внедрения

Частые ошибки и как их исправить

Практические советы по безопасности и производительности

Сравнение вариантов реализации ограничения видимости категорий

СпособПлюсыМинусы
Использование woocommerce_product_queryПростой и нативный метод, работает на странице магазина и категорииНе покрывает все запросы WooCommerce, требует дополнительных фильтров
Фильтр pre_get_postsРаботает на всех WP_Query, охватывает виджеты и архивыМожно случайно затронуть другие запросы, нужно аккуратно задавать условия
Плагины для ограничения каталога (например, WooCommerce Catalog Visibility Options)Готовое решение с GUI, простая настройкаПлатные, могут добавлять нагрузку, меньше гибкости, чем код
Как сделать иерархию записей с поддержкой разных типов постов в WordPress
05.02.2026
Как создать иерархию кастомных типов постов с поддержкой REST API в WordPress
11.03.2026
Как создать иерархию виджетов с поддержкой AJAX в WordPress
05.04.2026
WooCommerce: исправляем ошибку неправильного присвоения родительской категории товара
20.04.2026
Как создать иерархию коротких URL в WordPress с поддержкой кастомных типов постов
29.03.2026
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее