Диагностика задачи: почему нужно исключать товары по атрибуту
В интернет-магазинах на WooCommerce часто требуется скрывать из каталога товары с определёнными характеристиками — например, товары с атрибутом "Состояние" равным "Брак" или с цветом "Черный" для сезонной распродажи. Официальные настройки WooCommerce не позволяют автоматически исключать товары из каталога по атрибутам, а ручное редактирование становится невозможным при большом количестве товаров.
Основная проблема: нужно динамически скрывать товары с определённым значением атрибута без использования тяжёлых плагинов и без нарушения работы фильтров и поиска.
Пошаговое решение: автоматическое исключение товаров с атрибутом из каталога
1. Определяем slug атрибута и значение
Для начала необходимо узнать системный идентификатор (slug) атрибута и его терма. Допустим, атрибут называется pa_condition, а значение для исключения — defective.
2. Добавляем фильтр для исключения товаров
В файл functions.php активной темы или в собственный плагин добавьте следующий код:
add_action('pre_get_posts', function($query) {
if (is_admin() || !$query->is_main_query()) {
return;
}
// Проверяем, что это каталог WooCommerce
if ($query->is_post_type_archive('product') || $query->is_tax('product_cat') || $query->is_tax('product_tag')) {
// Устанавливаем мета-запрос для исключения товаров с атрибутом pa_condition = defective
$tax_query = (array) $query->get('tax_query');
$tax_query[] = [
'taxonomy' => 'pa_condition',
'field' => 'slug',
'terms' => ['defective'],
'operator' => 'NOT IN'
];
$query->set('tax_query', $tax_query);
}
});Этот фильтр добавляет условие, исключающее товары с указанным термином атрибута из основных страниц каталога и категорий.
3. Тестируем на страницах каталога, категории и поиска
После добавления кода откройте каталог магазина, категории товаров и выполните поиск — товары с атрибутом defective не должны отображаться.
Проверка результата после внедрения
- Перейдите на страницу магазина
site.ru/shopи убедитесь, что товары с указанным атрибутом отсутствуют. - Откройте категорию, в которой есть такие товары, они не должны показываться.
- Попробуйте поискать по названию исключённого товара — он также не должен отображаться.
Если товары продолжают отображаться, проверьте, что код добавлен в активную тему или плагин, и что кэш сайта и браузера очищен.
Частые ошибки и как их исправить
- Неправильный slug атрибута или терма. В WooCommerce атрибуты имеют префикс
pa_. Проверьте slug в разделе «Товары → Атрибуты» и в админке терминов. - Фильтр не срабатывает на страницах поиска. Поиск WooCommerce — отдельный запрос. Добавьте условие для
$query->is_search()в фильтр, если нужно исключать и там. - Плагин кэширования мешает. Очистите кэш и отключите временно плагины кэширования при тестах.
- Код добавлен не в активную тему. Убедитесь, что правите файл
functions.phpименно активной темы или создайте плагин с этим кодом.
Практические советы по производительности и безопасности
- Используйте таксономии, а не мета-поля для атрибутов, чтобы запросы были быстрее и проще.
- Минимизируйте количество условий в
pre_get_posts, чтобы не создавать лишнюю нагрузку. - Проверяйте, что фильтр не применяется в административной части, чтобы не мешать работе редакторов.
- Храните свои кастомные решения в плагине, а не в теме для удобства поддержки и обновлений.
Сравнение вариантов реализации
| Метод | Преимущества | Недостатки |
|---|---|---|
Фильтр pre_get_posts с tax_query | Лёгкий код, быстро работает, не требует сторонних плагинов | Требует точного знания slug, может не охватывать все запросы без доработок |
| Плагин для скрытия товаров по атрибутам | Простота настройки через админку, гибкие условия | Дополнительная нагрузка на сайт, возможные конфликты с другими плагинами |
| Изменение статуса товара на "черновик" | Полное исключение из сайта, не показывается нигде | Требует ручного или автоматического обновления, влияет на отчёты и аналитику |