Диагностика задачи: зачем исключать товары и варианты по атрибуту
В интернет-магазинах на WooCommerce часто возникает необходимость скрыть из каталога или поиска определённые товары или их варианты по конкретным атрибутам. Например, скрыть все товары с атрибутом «Сезон: Зима» или варианты с определённым цветом без удаления из базы. Такое исключение помогает управлять ассортиментом без потери данных и удобнее, чем удаление или создание сложных условий видимости.
Как проверить, что товары и варианты нужно исключить именно по атрибуту
Для начала убедитесь, что нужные атрибуты и термины правильно назначены товарам и их вариациям. Это можно сделать через админку WooCommerce:
- Перейдите в Товары > Атрибуты и проверьте список атрибутов и терминов.
- Откройте отдельный товар, переключитесь на вкладку Атрибуты, убедитесь, что нужный термин назначен.
- Для вариаций откройте вкладку Вариации и проверьте назначенные атрибуты.
Если атрибуты установлены корректно, можно переходить к программному исключению.
Пошаговое решение: исключение товаров и вариантов через фильтр запроса WooCommerce
Реализуем исключение товаров и вариантов по атрибуту на уровне запроса каталога и поиска. Для этого используем хук pre_get_posts. Пример кода, который исключит все товары с атрибутом pa_sezon и значением zima (slug термина):
add_action('pre_get_posts', function($query) {
if (!is_admin() && $query->is_main_query() && (is_shop() || is_product_category() || is_product_tag() || is_search())) {
$tax_query = (array) $query->get('tax_query');
$tax_query[] = array(
'taxonomy' => 'pa_sezon',
'field' => 'slug',
'terms' => array('zima'),
'operator' => 'NOT IN',
);
$query->set('tax_query', $tax_query);
}
});Этот код добавляет дополнительное условие, исключающее товары с указанным атрибутом из каталога и поиска.
Исключение отдельных вариантов с помощью шаблона фильтрации на фронтенде
WooCommerce не позволяет на уровне WP_Query скрыть вариации — только сам товар. Чтобы скрыть конкретные варианты, можно убрать их из выпадающих списков вариаций на странице товара с помощью JavaScript или фильтров PHP.
Пример фильтра для исключения варианта по атрибуту на странице товара:
add_filter('woocommerce_variation_is_active', function($active, $variation) {
$terms = wp_get_post_terms($variation->get_id(), 'pa_cvet', array('fields' => 'slugs'));
if (in_array('krasnyj', $terms)) {
return false; // скрываем варианты с цветом "красный"
}
return $active;
}, 10, 2);Проверка результата после внедрения
- Очистите кэш сайта и браузера.
- Перейдите в каталог WooCommerce и убедитесь, что товары с атрибутом
pa_sezon=zimaне отображаются. - На странице товара проверьте, что варианты с атрибутом
pa_cvet=krasnyjне отображаются в селекторе вариаций. - Проверьте поиск по сайту — исключённые товары также не должны показываться.
Частые ошибки и как их исправить
- Кэширование мешает проверить изменения
Решение: отключите плагин кеширования или очистите кеш после внесения изменений. - Неправильный слаг атрибута или термина
Решение: проверьте точные значения slug вТовары > Атрибутыи в терминах. - Код добавлен в неправильное место
Решение: вставьте код в файлfunctions.phpдочерней темы или используйте сниппет-плагин. - Исключение вариаций не работает
Причина: WooCommerce не фильтрует вариации на уровне WP_Query.
Решение: используйте фильтрwoocommerce_variation_is_activeили JavaScript для скрытия вариантов. - Ошибка в логах после добавления кода
Решение: проверьте синтаксис PHP, используйтеerror_logдля отладки.
Практические советы по безопасности и производительности
- Не добавляйте тяжелые запросы в
pre_get_postsбез условий, чтобы не замедлять фронтенд. - Используйте кэширование объектов и страниц, чтобы снизить нагрузку на сервер.
- Проверяйте код на тестовом сайте перед внедрением в продакшен.
- Для сложных условий фильтрации рассмотрите создание пользовательского поля (post meta) и фильтрацию по нему, если таксономии не подходят.
- Для управления ассортиментом безопаснее использовать дочерние темы или сниппеты, а не править плагины WooCommerce напрямую.
Сравнение вариантов реализации исключения товаров
| Метод | Плюсы | Минусы |
|---|---|---|
Фильтрация WP_Query через pre_get_posts | Простота реализации; исключение из каталога и поиска | Не скрывает вариации; возможно влияние на производительность при сложных запросах |
Фильтр woocommerce_variation_is_active | Скрывает варианты на странице товара | Не исключает товары полностью; требует доп. проверки на совместимость с темой |
| JavaScript на фронтенде | Гибко, можно скрывать любые элементы | Менее надёжно, зависит от клиента; не подходит для SEO |
| Создание пользовательских полей и фильтрация по ним | Более точечный контроль; гибкость | Требует дополнительной настройки; сложнее для поддержки |