Диагностика проблемы: почему стандартные методы не работают для исключения товаров из категорий WooCommerce
В WooCommerce часто возникает задача исключить из отображения товары определённых категорий на страницах каталога или поиска. Многие пытаются сделать это через параметры запроса WP_Query или плагины. Однако стандартные параметры tax_query или фильтрация через админку не всегда эффективны, особенно если тема или плагины модифицируют запросы. Это приводит к тому, что товары из нужных категорий всё равно отображаются.
Проверить это можно, временно отключив все плагины кроме WooCommerce и переведя тему на стандартную (например, Storefront). Если проблема сохраняется, значит нужно вмешиваться непосредственно в запросы WordPress через хуки.
Пошаговое решение: использование хука pre_get_posts для исключения категорий товаров
1. Добавление функции фильтрации в файл functions.php вашей темы
function wptemy_exclude_woocommerce_categories( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
// Проверяем, что это страница магазина, архив товаров или поиск по товарам
if ( is_post_type_archive( 'product' ) || is_tax( 'product_cat' ) || is_search() ) {
// ID категорий, которые нужно исключить
$excluded_cats = array( 15, 23 ); // замените на свои ID категорий
// Формируем tax_query для исключения
$tax_query = (array) $query->get( 'tax_query' );
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $excluded_cats,
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'wptemy_exclude_woocommerce_categories' );2. Определение ID категорий
Чтобы узнать ID категорий товаров, зайдите в админку WordPress в раздел Товары > Категории, наведите курсор на нужную категорию и посмотрите ссылку внизу браузера. Там будет параметр tag_ID=число — именно этот ID нужно использовать.
Проверка результата после внедрения
После добавления кода очистите кеш сайта и браузера. Перейдите на страницу магазина, архив категорий товаров и выполните поиск по товарам. Товары из указанных категорий не должны отображаться.
Если хотите дополнительно проверить, добавьте вывод параметра запроса в шаблон, например:
var_dump( $wp_query->query_vars );и убедитесь, что tax_query содержит оператор NOT IN для нужных категорий.
Частые ошибки и как их исправить
- Код не работает на страницах, отличных от главного запроса. Убедитесь, что в функции проверяется
$query->is_main_query(). - Исключение не срабатывает в админке. В начале функции стоит исключать административные запросы с помощью
is_admin(). - Неправильно указаны ID категорий. Проверьте, что вы используете именно ID, а не слаг или название категории.
- Наличие других плагинов, которые модифицируют запросы. Временно отключите их для диагностики.
- Кеширование на уровне сервера или плагина. Очистите кеш, чтобы увидеть изменения.
Практические советы по производительности и безопасности
- Добавляйте фильтр только при необходимости — например, проверяйте
is_post_type_archive('product')иis_search(), чтобы не влиять на другие запросы. - Используйте ID категорий вместо слагов для повышения скорости обработки запроса.
- Если у вас большой каталог, настройте кеширование страниц и запросов, чтобы исключение не замедляло сайт.
- Для тонкой настройки исключения можно добавить дополнительные условия, например, по ролям пользователей или по параметрам URL.
Таблица сравнения вариантов решения
| Метод | Плюсы | Минусы |
|---|---|---|
Использование pre_get_posts | Гибко, без плагинов, быстро | Требует навыков программирования, возможны конфликты |
| Плагины фильтрации товаров | Простота использования, UI для настроек | Дополнительная нагрузка, ограниченные настройки |
| Изменение шаблонов темы | Максимальный контроль над выводом | Требует глубоких знаний PHP и WP-шаблонов |