Диагностика задачи: зачем ограничивать доступ к категориям товаров по ролям
В интернет-магазинах на WooCommerce иногда необходимо показывать разные товары разным группам пользователей. Например, оптовым покупателям доступны одни категории товаров, розничным — другие, а гостям — еще меньший набор. Стандартно WooCommerce не предоставляет гибкого контроля доступа по категориям товаров. Для решения этой задачи применяют кодовые решения или специализированные плагины.
Как реализовать ограничение доступа к категориям товаров по ролям — пошаговое решение
1. Определяем роли пользователей и категории товаров
Убедитесь, что нужные роли созданы. Если нет, добавьте их через add_role() или плагин User Role Editor. Запомните слаги ролей, например wholesale_customer для оптовиков.
2. Фильтруем отображение товаров на витрине
Добавьте в файл functions.php вашей темы или в отдельный плагин следующий код, который исключит из каталога товары из запрещённых категорий для текущей роли:
function wh_filter_products_by_role( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( is_shop() || is_product_category() ) {
$user = wp_get_current_user();
$role = (array) $user->roles;
// Пример ограничения для роли wholesale_customer
if ( in_array( 'wholesale_customer', $role ) ) {
// Разрешённые категории для wholesale_customer
$allowed_cats = array( 'optovye-tovary', 'special-products' );
// Получаем ID категорий
$term_ids = array();
foreach ( $allowed_cats as $slug ) {
$term = get_term_by( 'slug', $slug, 'product_cat' );
if ( $term ) {
$term_ids[] = $term->term_id;
}
}
// Фильтруем товары по этим категориям
$tax_query = array(
array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $term_ids,
'operator' => 'IN',
),
);
$query->set( 'tax_query', $tax_query );
}
}
}
add_action( 'pre_get_posts', 'wh_filter_products_by_role' );3. Ограничиваем доступ к страницам категорий напрямую
Чтобы предотвратить доступ к запрещённым категориям по прямой ссылке, добавьте проверку и редирект:
function wh_restrict_category_access() {
if ( is_product_category() ) {
$user = wp_get_current_user();
$role = (array) $user->roles;
$restricted_cats_for_wholesale = array( 'roznichnye-tovary' ); // примеры запрещённых категорий
$current_cat = get_queried_object();
if ( in_array( 'wholesale_customer', $role ) && in_array( $current_cat->slug, $restricted_cats_for_wholesale ) ) {
wp_redirect( home_url() );
exit;
}
}
}
add_action( 'template_redirect', 'wh_restrict_category_access' );Проверка результата после внедрения
- Войдите под пользователем с ролью
wholesale_customer. Откройте страницу магазина и проверьте, что отображаются только товары из разрешённых категорий. - Попробуйте перейти по прямой ссылке на запрещённую категорию — должна произойти переадресация на главную.
- Войдите под другим пользователем без роли
wholesale_customer— все категории должны отображаться как обычно.
Частые ошибки и их исправления
- Ошибка: Фильтр не работает, товары из запрещённых категорий всё равно видны.
Причина: Не учитывается условиеis_main_query()или код добавлен не в правильный хук.
Решение: Используйтеpre_get_postsи проверяйтеis_main_query(). - Ошибка: Редирект на главную вызывает бесконечный цикл.
Причина: Редирект срабатывает на странице, куда происходит переадресация.
Решение: Добавьте проверку, чтобы не редиректить, если уже на главной. - Ошибка: Пользователи без роли видят меньше товаров.
Причина: Неправильно задан массив разрешённых категорий.
Решение: Добавьте условие, чтобы фильтрация применялась только для нужных ролей.
Практические советы по безопасности и производительности
- Для повышения производительности используйте кеширование результатов запросов, например, через Transients API, если фильтрация сложная.
- Не добавляйте слишком много условий в
pre_get_posts, чтобы не замедлять загрузку страниц. - Для безопасности убедитесь, что проверки ролей и редиректы выполняются на стороне сервера, чтобы нельзя было обойти фильтр через прямые запросы.
- Если у вас много ролей и категорий, рассмотрите использование специализированных плагинов контроля доступа, например Clearfy Pro с функцией управления доступом.
Сравнение вариантов реализации ограничения доступа
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
Код на pre_get_posts и template_redirect | Самописное решение на PHP для фильтрации товаров и редиректа | Полный контроль, нет зависимости от плагинов | Требует навыков программирования, возможны ошибки при обновлениях |
| Плагины контроля доступа (например, Members, User Role Editor) | Использование готовых плагинов для управления видимостью товаров | Простота настройки, удобный интерфейс | Дополнительная нагрузка на сайт, возможные конфликты с темой |