Диагностика проблемы: почему нужно исключать товары из поиска WooCommerce
В стандартной конфигурации WooCommerce поиск выводит все товары, включая скрытые, архивные или товары по определённым категориям и тегам. Иногда нужно убрать из выдачи определённые товары — например, товары со статусом "черновик", товары с определёнными метками или товары, не предназначенные для продажи, чтобы улучшить релевантность поиска и UX.
Как работает поиск товаров в WooCommerce
Поиск WooCommerce основан на WP_Query с параметром post_type = 'product'. Чтобы изменить вывод, нужно влиять на параметры запроса, чаще всего через хук pre_get_posts. Это позволяет фильтровать товары, исключая нужные по ID, категории, мета-данным и др.
Пример: исключение товаров по ID из поиска
function exclude_products_from_search( $query ) {
if ( ! is_admin() && $query->is_search() && $query->is_main_query() ) {
$exclude_ids = array(123, 456, 789); // ID товаров, которые нужно исключить
$query->set('post_type', 'product');
$query->set('post__not_in', $exclude_ids);
}
}
add_action( 'pre_get_posts', 'exclude_products_from_search' );Этот код исключит из результатов поиска товары с ID 123, 456 и 789.
Исключение товаров по категории или таксономии
Для исключения товаров из определённых категорий используйте параметр tax_query:
function exclude_category_from_search( $query ) {
if ( ! is_admin() && $query->is_search() && $query->is_main_query() ) {
$tax_query = array(
array(
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => array( 'skidka', 'rasprodazha' ),
'operator' => 'NOT IN',
),
);
$query->set('post_type', 'product');
$query->set('tax_query', $tax_query);
}
}
add_action( 'pre_get_posts', 'exclude_category_from_search' );Пошаговое решение: исключаем товары из поиска WooCommerce
- Определите, по каким критериям исключать товары (ID, категория, мета-ключ).
- Добавьте в файл
functions.phpвашей темы или в отдельный плагин соответствующий код с использованиемpre_get_posts. - Если нужно исключать по мета-значениям (например, скрыть товары с мета-полем
_hide_from_search), дополните запрос параметромmeta_query:
function exclude_meta_hidden_products_from_search( $query ) {
if ( ! is_admin() && $query->is_search() && $query->is_main_query() ) {
$meta_query = array(
array(
'key' => '_hide_from_search',
'value' => '1',
'compare' => '!=',
),
);
$query->set('post_type', 'product');
$query->set('meta_query', $meta_query);
}
}
add_action( 'pre_get_posts', 'exclude_meta_hidden_products_from_search' );Проверка результата после внедрения
Для проверки:
- Перейдите на страницу поиска WooCommerce и выполните поиск по товару, который должен быть исключён.
- Убедитесь, что товар не появляется в результатах.
- Попробуйте найти товар, который не должен исключаться, чтобы проверить, что другие товары отображаются.
Частые ошибки и как их исправить
- Ошибка: Исключаемые товары всё равно отображаются.
Причина: Не проверяется, что запрос — это основной запрос, или условиеis_search()не срабатывает.
Решение: Проверьте, что в вашем коде естьif ( $query->is_main_query() && $query->is_search() ). - Ошибка: Исключение по категории не работает.
Причина: Неверно указан слаг категории или таксономия.
Решение: Проверьте slug категории в админке и используйте правильное название таксономии — для WooCommerce этоproduct_cat. - Ошибка: Фильтр ломает пагинацию или другие типы запросов.
Решение: Добавьте условие! is_admin()и проверяйте, что фильтр применяется только к главному поисковому запросу.
Практические советы по оптимизации и безопасности
- Если исключаете много товаров по ID, лучше использовать таксономии или мета-поля, чтобы не нагружать запрос.
- Для больших магазинов с тысячами товаров используйте индексацию поиска через сторонние сервисы (ElasticSearch, Algolia) — в них исключение реализуется проще и быстрее.
- Всегда тестируйте изменения на тестовой среде, чтобы не сломать поиск на продакшене.
- При использовании
meta_queryучитывайте, что сложные запросы могут замедлять поиск — применяйте кэширование.
Сравнение способов исключения товаров из поиска WooCommerce
| Метод | Плюсы | Минусы | Пример кода |
|---|---|---|---|
| Исключение по ID | Быстро и просто | Нужно вручную обновлять список ID | post__not_in |
| Исключение по категории | Автоматичное исключение всех товаров категории | Нужно правильно указывать таксономию и слаг | tax_query с operator 'NOT IN' |
| Исключение по мета-полю | Гибкий и расширяемый способ | Может замедлить запросы при большом количестве товаров | meta_query с compare '!=' |