Диагностика проблемы: зачем отключать категории и товары из поиска и фильтров WooCommerce
В стандартном WooCommerce поиск и фильтры выводят все опубликованные товары и категории. Но бывают задачи, когда нужно скрыть определённые товары или целые категории из результатов поиска и фильтрации, например:
- товары, которые временно не продаются, но не хочется их удалять;
- товары для внутренних нужд или оптовых клиентов;
- категории, которые не должны быть видны в публичном каталоге;
- исключение дублей или устаревших позиций из выборки.
Без правильной настройки поиск и фильтры не будут учитывать эти исключения, что приводит к путанице пользователей и снижению конверсии.
Как проверить текущий результат поиска и фильтров
Перед внесением изменений важно понять, какие товары и категории видны в поиске и фильтрах:
- Воспользуйтесь стандартным поиском WooCommerce на сайте, вводя ключевые слова по товарам, которые хотите скрыть.
- Проверьте видимость категорий в виджетах фильтров или блоках с категориями.
- Для более углублённого анализа можно использовать SQL-запросы к базе данных, например, проверить наличие товаров с нужными категориями и статусами.
Пошаговое решение: исключение категорий и товаров из поиска и фильтров WooCommerce через код
1. Отключение товаров из поиска и фильтров по категориям
Добавьте следующий код в functions.php вашей темы или в кастомный плагин:
function exclude_products_by_category_from_search_and_filters( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_search() || is_post_type_archive( 'product' ) || is_tax( 'product_cat' ) ) {
$tax_query = (array) $query->get( 'tax_query' );
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'skrytye-tovary', 'neaktivnye' ), // укажите слаги категорий для исключения
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'exclude_products_by_category_from_search_and_filters' );Замените 'skrytye-tovary' и 'neaktivnye' на слаги категорий, которые хотите исключить.
2. Исключение отдельных товаров по ID из поиска и фильтрации
Если нужно скрыть конкретные товары, добавьте их ID в массив:
function exclude_products_by_id_from_search_and_filters( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
if ( $query->is_search() || is_post_type_archive( 'product' ) || is_tax( 'product_cat' ) ) {
$post__not_in = (array) $query->get( 'post__not_in' );
$post__not_in = array_merge( $post__not_in, array( 123, 456, 789 ) ); // ID товаров для исключения
$query->set( 'post__not_in', $post__not_in );
}
}
add_action( 'pre_get_posts', 'exclude_products_by_id_from_search_and_filters' );Как проверить результат после внедрения
- Очистите кэш сайта и браузера, если используете кэширование.
- Используйте поиск по ключевым словам, связанным с исключёнными товарами или категориями — они не должны отображаться.
- Проверьте фильтры и категории в сайдбаре — исключённые категории должны отсутствовать или не показывать товары.
- Если используете кастомные фильтры (плагины), убедитесь, что они учитывают параметры
tax_queryиpost__not_in.
Частые ошибки и как их исправить
- Код не работает в админке: убедитесь, что условие
is_admin()корректно используется, чтобы не влиять на запросы в панели управления. - Исключённые товары всё равно видны: проверьте, нет ли конфликтов с другими плагинами, которые модифицируют запросы WooCommerce.
- Категории отображаются в фильтрах, но без товаров: некоторые виджеты или плагины фильтров не учитывают
tax_query— для них может потребоваться отдельная настройка или кастомизация. - Ошибка синтаксиса в коде: используйте IDE с подсветкой PHP или онлайн-валидаторы перед добавлением кода.
Практические советы по производительности и безопасности
- Добавляйте фильтры
pre_get_postsмаксимально целенаправленно, чтобы не замедлять загрузку не относящихся страниц. - Для больших магазинов с тысячами товаров лучше использовать плагины с поддержкой индексации и поиска, например, ElasticPress, которые позволяют гибко настраивать исключения.
- При массовом исключении товаров из выборки рассмотрите возможность использования пользовательских мета-полей и фильтрации по ним — это может быть эффективнее, чем таксономии.
- Тестируйте изменения на тестовом сайте, чтобы не нарушить работу живого магазина.
Сравнение способов исключения товаров и категорий из поиска и фильтров WooCommerce
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Через tax_query (исключение категорий) | Легко реализовать, хорошо работает с таксономиями | Не подходит для исключения отдельных товаров | Когда нужно скрыть целые категории |
post__not_in (исключение товаров по ID) | Точный контроль над товарами | Не масштабируется при большом количестве товаров | Когда нужно скрыть несколько конкретных товаров |
| Плагины поиска и фильтрации (например, ElasticPress) | Быстрая работа с большими базами, расширенные настройки | Требуют установки и настройки, могут быть платными | Крупные магазины с высокой нагрузкой |