Диагностика проблемы: почему нужно исключать товары из поиска по атрибутам
В стандартном поиске WooCommerce по умолчанию ищет товары по названию, описанию и иногда по метаданным, включая атрибуты товара. Однако иногда возникает задача исключить из результатов поиска товары с определёнными атрибутами (например, определённого цвета, размера или категории), чтобы улучшить релевантность и пользовательский опыт.
Например, если у вас есть атрибут "color" с терминами "красный", "синий" и "зеленый", и вы хотите, чтобы товары с атрибутом "красный" не отображались в поиске, стандартных настроек WooCommerce для этого нет.
Как проверить, что товары ищутся по атрибутам
- Создайте товар с уникальным атрибутом, например, цвет "красный".
- Выполните поиск по ключевому слову, которое встречается только в этом атрибуте (например, "красный").
- Если товар появляется в результатах, значит поиск учитывает атрибуты.
Пошаговое решение: исключение товаров по атрибутам из поиска
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 в разделе "Атрибуты".
Проверка результата после внедрения
- Очистите кеш сайта и браузера.
- Выполните поиск по ключевым словам, связанным с исключённым атрибутом (например, "красный").
- Убедитесь, что товары с этим атрибутом не показываются в результатах поиска.
- Проверьте, что остальные товары, не имеющие этот атрибут, отображаются корректно.
Частые ошибки и как их исправить
- Ошибка: Не правильный слаг таксономии атрибута.
Решение: Проверьте в админке WooCommerce через "Товары → Атрибуты" точное имя (slug) таксономии, напримерpa_color. - Ошибка: Код не срабатывает, потому что поиск не основной запрос.
Решение: В условииpre_get_postsиспользуйте$query->is_main_query()и$query->is_search(), чтобы изменить именно основной запрос поиска. - Ошибка: Кеширование блокирует изменения.
Решение: Отключите кеширование страниц или очистите кеш, чтобы видеть изменения.
Практические советы по производительности и безопасности
- Не добавляйте слишком много условий
tax_query, чтобы не замедлять поисковый запрос. - Если сайт использует плагин кеширования, убедитесь, что страница поиска не кешируется или кеш очищается после изменений.
- Для сложных условий поиска лучше использовать специализированные поисковые движки (например, ElasticPress), если нагрузка высокая.
Альтернативные методы: сравнение подходов
| Метод | Плюсы | Минусы |
|---|---|---|
Модификация запроса через pre_get_posts | Гибко, без плагинов, контролируемо | Нужно знание WP API, возможно замедление поиска при большом объёме данных |
| Использование плагинов для фильтрации поиска | Простота настройки, дополнительные функции | Зависимость от стороннего ПО, возможные конфликты, нагрузка |
| Использование внешнего поискового движка (Elasticsearch, Algolia) | Высокая скорость, масштабируемость | Сложность настройки, стоимость, необходимость интеграции |