В чём заключается задача исключения товаров из поиска WooCommerce
В стандартной установке WooCommerce поиск по сайту возвращает все товары, которые опубликованы и доступны для продажи. Иногда требуется исключить из результатов поиска определённые товары — например, товары со статусом “черновик”, определённой категории, с конкретенным атрибутом или по другим критериям. Это позволит улучшить релевантность поиска и избежать путаницы для покупателей.
Диагностика проблемы: почему товары не исключаются из поиска
Если вы пробуете скрыть товары с помощью стандартных настроек или плагинов, но товары продолжают отображаться в результатах поиска, возможные причины:
- Запрос поиска не учитывает дополнительные параметры фильтрации WooCommerce.
- Товары опубликованы и имеют статус «publish» — они по умолчанию видны.
- Кэширование страниц или поисковых запросов мешает обновлению результатов.
- Используется сторонний плагин поиска, который не учитывает стандартные фильтры WordPress.
Пошаговое решение: исключение товаров из поиска через функции темы
Лучший способ — использовать фильтр pre_get_posts для изменения запроса поиска и исключения товаров по нужным критериям.
1. Исключение товаров по ID
function exclude_products_from_search_by_id( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$excluded_ids = array(123, 456); // ID товаров, которые нужно исключить
$post__not_in = $query->get('post__not_in');
if ( ! is_array( $post__not_in ) ) {
$post__not_in = array();
}
$post__not_in = array_merge( $post__not_in, $excluded_ids );
$query->set('post__not_in', $post__not_in);
}
}
add_action( 'pre_get_posts', 'exclude_products_from_search_by_id' );2. Исключение товаров по категории
Допустим, нужно исключить товары категории с таксономией product_cat и slug hidden-category:
function exclude_products_from_search_by_category( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$tax_query = $query->get( 'tax_query' );
if ( ! is_array( $tax_query ) ) {
$tax_query = array();
}
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'hidden-category' ),
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'exclude_products_from_search_by_category' );3. Исключение товаров по атрибуту
Для исключения товаров с атрибутом pa_brand и значением example-brand добавьте в запрос таксономию:
function exclude_products_from_search_by_attribute( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
$tax_query = $query->get( 'tax_query' );
if ( ! is_array( $tax_query ) ) {
$tax_query = array();
}
$tax_query[] = array(
'taxonomy' => 'pa_brand',
'field' => 'slug',
'terms' => array( 'example-brand' ),
'operator' => 'NOT IN',
);
$query->set( 'tax_query', $tax_query );
}
}
add_action( 'pre_get_posts', 'exclude_products_from_search_by_attribute' );Проверка результата после внедрения
После добавления кода в файл functions.php вашей темы или в кастомный плагин:
- Очистите кэш сайта и браузера.
- Выполните поиск по ключевым словам, связанным с исключёнными товарами.
- Убедитесь, что товары, соответствующие исключающим условиям, не отображаются в результатах.
- Если товары продолжают появляться — проверьте, нет ли конфликта с плагинами поиска или кэширования.
Частые ошибки и как их исправить
- Ошибка: Фильтр не срабатывает, товары не исключаются.
Причина: Код добавлен вне хукаpre_get_postsили условиеis_search()неправильно определено.
Решение: Проверьте, что код подключён и условие строго для фронтенда и основного запроса. - Ошибка: Исключаются лишние товары.
Причина: Неправильно указаны ID или условия tax_query.
Решение: Проверьте корректность ID и slug категорий/атрибутов. - Ошибка: Конфликт с плагинами кэширования.
Решение: Очистите кэш, временно отключите плагины кэширования, проверьте работу поиска.
Практические советы по производительности и безопасности
- Всегда используйте
pre_get_postsдля изменения запросов WordPress, не меняйте напрямую SQL. - Не добавляйте тяжелые вычисления в фильтры поиска — это замедляет выдачу.
- Храните списки исключаемых товаров в опциях или transient, если они динамические, чтобы не нагружать запрос.
- Ограничьте права доступа к файлу с кодом, если используете кастомный плагин.
Сравнение методов исключения товаров из поиска WooCommerce
| Метод | Преимущества | Недостатки | Когда использовать |
|---|---|---|---|
| Исключение по ID (post__not_in) | Просто реализуется, точечное исключение | Требуется поддержка списка ID вручную | Когда нужно исключить небольшое количество конкретных товаров |
| Исключение по категории (tax_query) | Гибко, можно исключить целую группу товаров | Не подходит для исключения отдельных товаров | Когда товары сгруппированы в отдельной категории |
| Исключение по атрибуту (tax_query) | Удобно для исключения по характеристикам | Зависит от корректного заполнения атрибутов | Когда нужно исключить товары с определёнными свойствами |