WooCommerce: как автоматически исключать товары из каталога по атрибуту без плагинов

Диагностика проблемы: почему нужно исключать товары из каталога по атрибуту

Часто в интернет-магазинах на WooCommerce возникает задача скрыть из публичного каталога товары с определёнными характеристиками — например, товары, которые не продаются в конкретном регионе, сезонные товары или продукты с ограничениями. При этом важно не удалять товар из базы, чтобы сохранить статистику и возможность редактирования.

Без использования плагинов это можно сделать, применив фильтрацию запроса товаров в каталоге по определённому атрибуту или мета-данным.

Как проверить, что товар имеет нужный атрибут

Для начала убедитесь, что товары имеют нужный атрибут. Перейдите в админке WooCommerce в карточку товара, и проверьте, установлен ли атрибут, например Скрыть из каталога с значением Да.

Атрибуты в WooCommerce хранятся как таксономии. Например, «pa_hide-from-catalog» — префикс pa_ плюс слаг атрибута. Чтобы узнать точный слаг, перейдите в Товары > Атрибуты и найдите нужный.

Пошаговое решение: код для исключения товаров из каталога по атрибуту

Добавьте следующий код в файл functions.php вашей дочерней темы или в отдельный плагин для кастомных функций:

add_action('pre_get_posts', 'exclude_products_by_attribute_from_shop');
function exclude_products_by_attribute_from_shop($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }
    // Проверяем, что это каталог WooCommerce или главная страница магазина
    if ($query->is_post_type_archive('product') || $query->is_tax('product_cat') || $query->is_shop()) {
        // ID термина атрибута, который нужно исключить
        $excluded_term_slug = 'da'; // слаг значения атрибута
        $attribute_taxonomy = 'pa_hide-from-catalog'; // слаг атрибута

        // Добавляем параметр таксономии в запрос
        $tax_query = (array) $query->get('tax_query');
        $tax_query[] = array(
            'taxonomy' => $attribute_taxonomy,
            'field' => 'slug',
            'terms' => array($excluded_term_slug),
            'operator' => 'NOT IN',
        );
        $query->set('tax_query', $tax_query);
    }
}

Объяснение:

  • pre_get_posts изменяет основной WP_Query для каталога товаров.
  • Проверяем, что это фронтенд и именно запрос каталога или категории товаров.
  • Добавляем условие tax_query, исключающее товары с атрибутом hide-from-catalog=da.

Проверка результата после внедрения

  1. Очистите кэш сайта и браузера.
  2. Перейдите на страницу магазина или категорию товаров.
  3. Убедитесь, что товары с атрибутом Скрыть из каталога = Да не отображаются.
  4. Для проверки можно временно снять атрибут с товара и обновить страницу — товар должен появиться.

Частые ошибки и как их исправить

  • Товары не скрываются: Проверьте правильность слага атрибута и значения. В админке атрибуты и термины чувствительны к регистру.
  • Код не работает на страницах пагинации: Убедитесь, что проверяется is_main_query() и что кэш очищен.
  • Код влияет на админку: В коде предусмотрена проверка is_admin(), не удаляйте её.
  • Другие фильтры конфликтуют: Проверьте другие плагины и коды, которые могут менять запрос товаров.

Практические советы по безопасности и производительности

  • Добавляйте код в дочернюю тему или отдельный плагин, чтобы не потерять изменения при обновлении.
  • Проверяйте производительность сайта после внедрения — фильтрация по таксономиям обычно не замедляет запросы, но с большими базами стоит контролировать.
  • Используйте транзиенты или кэширование, если каталог очень большой и нагрузка возрастает.

Сравнение вариантов решения

МетодПлюсыМинусы
Код в functions.php (как в статье)Нет зависимостей, гибкость, контрольТребует технических навыков
Плагины для фильтрации товаровПростота установки, дополнительные функцииМогут замедлять сайт, зависимость от поддержки
Ручное снятие видимости товара (статус)Простота, не требует кодаНе автоматизировано, сложно при большом каталоге
Автоматическое удаление неиспользуемых шорткодов в WordPress
03.04.2026
WooCommerce: как автоматически удалять товары из каталога при отсутствии на складе
15.06.2026
Удаление старых ревизий записей в WordPress для оптимизации базы данных
10.02.2026
WooCommerce: как автоматически отключить отложенные оплаты при превышении срока
21.06.2026
Как удалить по умолчанию скрипты и стили в WooCommerce для ускорения сайта
13.05.2026