Диагностика проблемы: почему нужно исключать товары из поиска WooCommerce
Поиск товаров в стандартном WooCommerce выводит все товары, включая те, которые не должны отображаться покупателям — например, товары из категории "Скрытые", товары для внутреннего использования или устаревшие позиции. Это мешает юзабилити и снижает конверсию. Выясним, как проверить, что поиск действительно выводит нежелательные товары, и как это исправить программно.
Как проверить, что поиск WooCommerce выводит лишние товары
- Перейдите на страницу поиска и введите запрос, который должен вернуть товар из категории, которую хотите скрыть.
- Посмотрите, появляется ли товар в результатах.
- Если да, значит стандартная логика поиска включает этот товар.
Для точной проверки можно временно вывести ID товаров и их категории прямо в шаблоне search.php или через pre_get_posts хук, отладив запрос.
Пошаговое решение: исключение товаров из поиска по категории через фильтр pre_get_posts
Мы будем использовать хук pre_get_posts, чтобы модифицировать WP_Query на странице поиска и исключить из результатов товары из указанных категорий.
function exclude_categories_from_search( $query ) {
if ( ! is_admin() && $query->is_main_query() && $query->is_search() ) {
// Категории товаров, которые нужно исключить из поиска
$excluded_cats = array('skrytye', 'vnutrennie-tovary');
// Получаем ID категорий по слагу
$excluded_terms = get_terms( array(
'taxonomy' => 'product_cat',
'slug' => $excluded_cats,
'fields' => 'ids',
'hide_empty' => false
) );
if ( ! is_wp_error( $excluded_terms ) && ! empty( $excluded_terms ) ) {
// Добавляем таксономию в запрос
$tax_query = (array) $query->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'product_cat',
'field' => 'term_id',
'terms' => $excluded_terms,
'operator' => 'NOT IN',
);
$query->set('tax_query', $tax_query);
}
}
}
add_action('pre_get_posts', 'exclude_categories_from_search');Этот код исключит из результатов поиска все товары из категорий с слагами skrytye и vnutrennie-tovary.
Подсказка по добавлению слагов категорий
Убедитесь, что указанные слаги категорий точно совпадают с теми, что есть в WooCommerce. Для проверки можно зайти в Товары > Категории в админке.
Проверка результата после внедрения
- Очистите кэш сайта и браузера, если используете кеширующие плагины.
- Выполните поиск по ключевым словам, которые раньше возвращали товары из исключённых категорий.
- Товары из этих категорий не должны отображаться в результатах.
- Для дополнительной проверки можно добавить временный вывод
var_dump($query->tax_query)в функцию, чтобы убедиться, что фильтр применяется.
Частые ошибки и как их исправить
- Ошибка: Товары не исключаются из поиска.
Причина: Фильтр не применяется из-за неправильной проверки условий (is_search(),is_main_query(),! is_admin()) или ошибки в слагах категорий.
Решение: Проверьте, что функция подключена правильно и слаги категорий актуальны. - Ошибка: Все товары пропали из поиска.
Причина: Некорректно построенtax_query, например, ошибка в формате массива.
Решение: Используйте стандартный формат массива дляtax_query, избегайте вложенных ошибок. - Ошибка: Изменения не видны из-за кеширования.
Решение: Очистите кэш сайта и браузера, отключите кеш на время отладки.
Практические советы по производительности и безопасности
- Производительность: Использование
tax_queryсNOT INвлияет на производительность при большом количестве товаров и категорий. Если набор категорий для исключения большой, рассмотрите вариант с тегами или отдельным метаполем для более быстрого фильтра. - Безопасность: Избегайте включения пользовательских данных напрямую в запрос без проверки. В нашем примере данные берутся из настроек, поэтому риска SQL-инъекции нет.
- Кэширование: После внедрения фильтра убедитесь, что плагин кеширования корректно обновляет результаты поиска.
Альтернативы: плагин vs код
| Метод | Плюсы | Минусы |
|---|---|---|
Код через pre_get_posts | Быстро, без плагинов, контроль над логикой | Нужны базовые знания PHP, ошибки могут привести к потере результатов |
| Плагин (например, Search Exclude) | Простая настройка через UI, подходит для новичков | Дополнительная нагрузка, может конфликтовать с другими плагинами |