Диагностика задачи: зачем исключать товары по атрибуту из поиска и фильтров
Иногда в магазине WooCommerce требуется скрыть из результатов поиска и фильтров товары с определённым атрибутом. Например, товары с атрибутом "Скрытый" или "Снят с продажи" не должны отображаться в каталоге, но при этом остаются в базе для отчетности или повторного актива.
Стандартными средствами WooCommerce такой функционал реализован не полностью. Поиск и фильтрация товаров учитывают все опубликованные товары, и исключить часть из них по атрибуту можно только через кастомные фильтры.
Как проверить, что товары отображаются по атрибуту
Для начала убедитесь, что у товаров есть нужный атрибут и он корректно присвоен. В админке WordPress перейдите в Товары > Атрибуты, выберите нужный атрибут, нажмите "Настроить термины" и проверьте, что товары действительно имеют этот атрибут.
Далее перейдите на фронтенд и выполните поиск по каталогу или примените фильтры. Если товары с этим атрибутом отображаются, значит, задача актуальна.
Пошаговое решение: исключаем товары по атрибуту из поиска и фильтра
1. Перехват запроса поиска и фильтрации WooCommerce
Для исключения товаров по атрибуту необходимо изменить WP_Query, который отвечает за выборку товаров на странице каталога, поиска и фильтрации.
2. Используем фильтр woocommerce_product_query
Добавьте следующий код в файл functions.php вашей дочерней темы или в кастомный плагин:
add_action('woocommerce_product_query', 'exclude_products_by_attribute_from_query');
function exclude_products_by_attribute_from_query($query) {
// Название атрибута без префикса 'pa_'
$attribute_slug = 'skrytyy'; // замените на ваш slug атрибута
$tax_query = (array) $query->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'pa_' . $attribute_slug,
'field' => 'slug',
'terms' => array('yes'), // замените на термин, который обозначает скрытые товары
'operator' => 'NOT IN',
);
$query->set('tax_query', $tax_query);
}В этом примере исключаются товары, у которых в атрибуте pa_skrytyy установлен термин yes. Это значит, что товары с этим термином не попадут в выборку WooCommerce.
3. Проверка корректности кода
Очистите кэш сайта и браузера, обновите страницу каталога или поиска. Товары с указанным атрибутом должны исчезнуть из списка.
Как проверить результат после внедрения
- Выполните поиск по каталогу — товары с исключённым атрибутом не должны отображаться.
- Проверьте фильтры — примените фильтрацию по другим атрибутам, исключённые товары не должны появляться.
- Протестируйте прямой доступ по URL товара с исключённым атрибутом — он должен оставаться доступен, если не требуется скрывать полностью.
Частые ошибки и как их исправить
Ошибка 1: Товары не исключаются
- Неверный slug атрибута или термин. Проверьте точное имя таксономии (должно быть
pa_имя_атрибута). - Термин атрибута отсутствует или неправильно указан в массиве
'terms'. - Код добавлен не в правильное место или не активирован.
Ошибка 2: Исключены все товары
- Неправильный оператор в
tax_query. Для исключения должен быть'NOT IN', а не'IN'. - Массив
tax_queryперезаписывается, а не дополняется — используйтеarray_mergeили приводите к массиву, как в примере выше.
Практические советы по производительности и безопасности
- Проверяйте, что фильтр
woocommerce_product_queryне добавляет избыточных таксономических запросов, чтобы не ухудшать скорость загрузки. - Для сайтов с большим количеством товаров и сложными атрибутами рассмотрите кэширование запросов на уровне объекта или плагина кеширования.
- Не используйте жёстко заданные термины, если они могут измениться — лучше хранить их в настройках или опциях.
Сравнение способов исключения товаров по атрибуту
| Метод | Плюсы | Минусы | Рекомендации |
|---|---|---|---|
Код в functions.php (через woocommerce_product_query) | Гибко, быстро, не требует сторонних плагинов | Требует базовых навыков PHP, может конфликтовать с другими плагинами | Лучше использовать в дочерней теме или кастомном плагине |
| Плагин для управления видимостью товаров | Удобный интерфейс, дополнительные возможности | Нагрузка на сайт, зависит от обновлений плагина | Подходит для пользователей без навыков программирования |
| Изменение статуса публикации товара | Полностью скрывает товар | Не подходит, если товар нужен для отчетности или повторного включения | Использовать, если товар окончательно не продается |