Диагностика проблемы: почему нужно исключать товары по атрибутам
В WooCommerce иногда возникает задача скрыть из результатов поиска и архива определённые товары по атрибутам. Например, товары с атрибутом «Скрыть из поиска» или с определённой категорией могут быть неактуальны для пользователей или предназначены только для внутреннего использования. По умолчанию WooCommerce не предоставляет настроек для фильтрации товаров по атрибутам в поиске и архивах, поэтому приходится делать это программно.
Как определить, что товары не исключаются
- В админке создайте товар с нужным атрибутом, например,
hide_from_searchсо значениемyes. - Перейдите на страницу поиска или архив категории и проверьте, виден ли этот товар.
- Если товар отображается, значит фильтрация не работает.
Пошаговое решение: исключаем товары по атрибутам из поиска и архивов
1. Узнаём slug атрибута и значение
Перейдите в WooCommerce > Товары > Атрибуты. Найдите нужный атрибут, например, hide_from_search. Значения атрибута можно посмотреть при редактировании или добавлении товара.
2. Добавляем фильтр в functions.php или в кастомный плагин
Используем хук pre_get_posts, чтобы модифицировать запрос и исключить товары с нужным атрибутом.
add_action('pre_get_posts', 'exclude_products_by_attribute_from_search_and_archive');
function exclude_products_by_attribute_from_search_and_archive($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
// Применяем только на поиске и архивах товаров
if (($query->is_search() || is_post_type_archive('product') || is_tax('product_cat') || is_tax('product_tag')) ) {
// Параметры атрибута
$taxonomy = 'pa_hide_from_search'; // slug атрибута с префиксом pa_
$term_slug = 'yes'; // значение атрибута, исключаемое из вывода
$tax_query = $query->get('tax_query');
if (!is_array($tax_query)) {
$tax_query = [];
}
$tax_query[] = [
'taxonomy' => $taxonomy,
'field' => 'slug',
'terms' => [$term_slug],
'operator' => 'NOT IN',
];
$query->set('tax_query', $tax_query);
}
}3. Проверяем работу фильтра
Очистите кэш сайта и браузера. Зайдите на страницу поиска и выполните поиск по товару с атрибутом hide_from_search = yes. Такой товар не должен отображаться. Аналогично проверьте страницы архива.
Проверка результата после внедрения
- Создайте тестовый товар с атрибутом
hide_from_search = yes. - Перейдите на страницу поиска — товар не должен появляться.
- Перейдите в категории и теги — товар также не должен отображаться.
- Проверьте другие товары без такого атрибута — они должны быть видны.
Частые ошибки и как их исправить
- Неправильный slug атрибута: Атрибуты товаров в WooCommerce хранятся как таксономии с префиксом
pa_. Проверьте правильный slug через админку (например,pa_hide_from_search). - Неправильное значение термина: Значение атрибута должно совпадать со slug термина, а не с его названием.
- Фильтр применяется в админке: Добавьте проверку
is_admin(), чтобы исключить применение фильтра в административной части. - Конфликты с плагинами кэширования: Очистите кэш и отключите сторонние плагины кэширования для теста.
- Фильтр не применился из-за других таксономий: Используйте
'relation' => 'AND'вtax_queryдля точного комбинирования условий.
Практические советы по безопасности и производительности
- Добавляйте фильтр только на фронтенде и для главного запроса, чтобы избежать лишних расходов ресурсов.
- Если атрибутов много, используйте кеширование результатов или transient для уменьшения нагрузки.
- Тестируйте изменения на staging-сервере, чтобы избежать проблем на живом сайте.
- Регулярно обновляйте WooCommerce и тему, чтобы избежать несовместимостей с функциями фильтрации.
Сравнение способов исключения товаров по атрибутам
| Метод | Плюсы | Минусы | Пример |
|---|---|---|---|
Код на pre_get_posts | Гибко, бесплатно, без плагинов | Требует знаний PHP, может конфликтовать с темой | Выше в статье |
| Плагин фильтрации выдачи (например, Search Exclude) | Простой в настройке, UI | Может тормозить, меньше контроля | Search Exclude |
| Настройка видимости товара через статус | Просто скрыть товар полностью | Не подходит для выборочной фильтрации по атрибутам | Меняем статус товара на "черновик" |