WooCommerce: как исключить из поиска товары по определённым атрибутам

Диагностика проблемы: почему нужно исключать товары из поиска по атрибутам

В стандартном поиске WooCommerce по умолчанию ищет товары по названию, описанию и иногда по метаданным, включая атрибуты товара. Однако иногда возникает задача исключить из результатов поиска товары с определёнными атрибутами (например, определённого цвета, размера или категории), чтобы улучшить релевантность и пользовательский опыт.

Например, если у вас есть атрибут "color" с терминами "красный", "синий" и "зеленый", и вы хотите, чтобы товары с атрибутом "красный" не отображались в поиске, стандартных настроек WooCommerce для этого нет.

Как проверить, что товары ищутся по атрибутам

  1. Создайте товар с уникальным атрибутом, например, цвет "красный".
  2. Выполните поиск по ключевому слову, которое встречается только в этом атрибуте (например, "красный").
  3. Если товар появляется в результатах, значит поиск учитывает атрибуты.

Пошаговое решение: исключение товаров по атрибутам из поиска

1. Использование фильтра posts_search для модификации запроса

Чтобы при поиске исключить товары, у которых есть определённый атрибут, нужно изменить запрос WP_Query, добавив дополнительное условие. Для этого используем фильтр posts_search и присоединяем tax_query к основному запросу.

2. Пример кода для functions.php вашей темы или отдельного плагина

add_action('pre_get_posts', 'exclude_products_by_attribute_from_search');
function exclude_products_by_attribute_from_search($query) {
    if ( !is_admin() && $query->is_main_query() && $query->is_search() && is_search() ) {
        // Атрибут и термин, который нужно исключить
        $attribute_taxonomy = 'pa_color'; // замените на ваш таксономический атрибут (например, pa_size, pa_material)
        $excluded_terms = array('krasnyj'); // слаги терминов, которые нужно исключить

        // Добавляем tax_query
        $tax_query = array(
            array(
                'taxonomy' => $attribute_taxonomy,
                'field'    => 'slug',
                'terms'    => $excluded_terms,
                'operator' => 'NOT IN',
            ),
        );

        $existing_tax_query = $query->get('tax_query');
        if ( !is_array($existing_tax_query) ) {
            $existing_tax_query = array();
        }

        $existing_tax_query[] = $tax_query[0];
        $query->set('tax_query', $existing_tax_query);
    }
}

3. Подстройка под свои атрибуты

Важно указать правильный таксономический слаг атрибута (обычно это pa_имя_атрибута). Узнать его можно в админке WooCommerce в разделе "Атрибуты".

Проверка результата после внедрения

  1. Очистите кеш сайта и браузера.
  2. Выполните поиск по ключевым словам, связанным с исключённым атрибутом (например, "красный").
  3. Убедитесь, что товары с этим атрибутом не показываются в результатах поиска.
  4. Проверьте, что остальные товары, не имеющие этот атрибут, отображаются корректно.

Частые ошибки и как их исправить

  • Ошибка: Не правильный слаг таксономии атрибута.
    Решение: Проверьте в админке WooCommerce через "Товары → Атрибуты" точное имя (slug) таксономии, например pa_color.
  • Ошибка: Код не срабатывает, потому что поиск не основной запрос.
    Решение: В условии pre_get_posts используйте $query->is_main_query() и $query->is_search(), чтобы изменить именно основной запрос поиска.
  • Ошибка: Кеширование блокирует изменения.
    Решение: Отключите кеширование страниц или очистите кеш, чтобы видеть изменения.

Практические советы по производительности и безопасности

  • Не добавляйте слишком много условий tax_query, чтобы не замедлять поисковый запрос.
  • Если сайт использует плагин кеширования, убедитесь, что страница поиска не кешируется или кеш очищается после изменений.
  • Для сложных условий поиска лучше использовать специализированные поисковые движки (например, ElasticPress), если нагрузка высокая.

Альтернативные методы: сравнение подходов

МетодПлюсыМинусы
Модификация запроса через pre_get_postsГибко, без плагинов, контролируемоНужно знание WP API, возможно замедление поиска при большом объёме данных
Использование плагинов для фильтрации поискаПростота настройки, дополнительные функцииЗависимость от стороннего ПО, возможные конфликты, нагрузка
Использование внешнего поискового движка (Elasticsearch, Algolia)Высокая скорость, масштабируемостьСложность настройки, стоимость, необходимость интеграции
Как сделать безопасный импорт и экспорт данных WooCommerce: практические решения
20.05.2026
Как защитить WordPress от атак Backdoor с использованием пакета WPProtect
06.04.2026
Как избежать проблем с пересозданием контента в WordPress
21.11.2025
Как защитить WordPress от PHP File Injection
02.02.2026
WooCommerce: как использовать хуки для модификации корзины
28.05.2026