Как исключить товары по атрибутам из списка и поиска WooCommerce

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

В интернет-магазинах на WooCommerce часто возникает необходимость скрыть из каталога или поиска товары с определёнными атрибутами — например, товары с пометкой «Скрытый», «Распродажа» или «Закрытая коллекция». По умолчанию WooCommerce не предоставляет простой настройки для такой фильтрации, поэтому приходится вмешиваться в запросы WordPress.

Задача: исключить из результатов каталога и поиска все товары, у которых задан определённый атрибут (например, цвет «Черный» или статус «Скрытый»). При этом товары должны оставаться доступными по прямой ссылке.

Как проверить, что товары не фильтруются

  • Откройте страницу магазина и поиск по сайту.
  • Проверьте наличие товаров с нужным атрибутом в результатах.
  • Убедитесь, что по прямой ссылке на товар он открывается корректно.

Решение: фильтрация запросов WooCommerce по атрибутам товаров

Чтобы исключить товары с определённым атрибутом, нужно использовать хук pre_get_posts WordPress и дополнительно подстроить WP_Query для товаров WooCommerce.

1. Получаем ID термина атрибута

Для фильтрации по атрибутам WooCommerce использует таксономии вида pa_{slug}. Например, атрибут «Цвет» с ярлыком color будет таксономией pa_color.

Сначала нужно получить ID термина, который хотим исключить:

$term = get_term_by( 'slug', 'chernyj', 'pa_color' );
if ( ! $term ) {
    return; // термин не найден
}
$term_id = $term->term_id;

2. Фильтрация основного запроса

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

add_action('pre_get_posts', 'exclude_products_by_attribute');
function exclude_products_by_attribute( $query ) {
    if ( is_admin() || ! $query->is_main_query() ) {
        return;
    }

    // Применяем только к архиву товаров и поиску
    if ( ( is_post_type_archive( 'product' ) || is_search() ) ) {

        $tax_query = (array) $query->get( 'tax_query' );

        // Получаем ID термина
        $term = get_term_by( 'slug', 'chernyj', 'pa_color' );
        if ( ! $term ) {
            return;
        }

        // Добавляем условие исключения товаров с данным атрибутом
        $tax_query[] = array(
            'taxonomy' => 'pa_color',
            'field'    => 'term_id',
            'terms'    => array( $term->term_id ),
            'operator' => 'NOT IN',
        );

        $query->set( 'tax_query', $tax_query );
    }
}

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

  • Очистите кеш сайта и браузера.
  • Перейдите на страницу каталога WooCommerce — товары с атрибутом «черный» должны исчезнуть из списка.
  • Выполните поиск по сайту с запросом, который обычно возвращал товары с этим атрибутом — они не должны отображаться.
  • Проверьте прямую ссылку на товар с данным атрибутом — он должен открываться без изменений.

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

  • Товары не скрываются: Проверьте правильность таксономии атрибута (должна быть pa_slug). Используйте var_dump(get_taxonomies()) для проверки.
  • Код не работает в админке или на других типах страниц: Не забудьте проверять is_admin() и is_main_query(), чтобы не ломать запросы в админке.
  • Появляются ошибки таксономии: Убедитесь, что атрибут зарегистрирован и термин существует.
  • Кэширование мешает проверить изменения: Отключите плагины кеширования или очистите кеш после внесения изменений.

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

  • Не добавляйте сложные фильтры в pre_get_posts без условий — это может замедлить работу сайта.
  • Сохраняйте ID терминов в transient или опциях, если фильтрация выполняется часто, чтобы уменьшить число запросов к базе.
  • Тестируйте код на staging-сервере перед внедрением на рабочий сайт.

Альтернативные способы: плагин vs код

МетодПлюсыМинусыРекомендации
Код в functions.phpПолный контроль, без лишних плагиновТребует знаний, возможны ошибки при обновленияхИдеально для разработчиков, умеющих работать с WP_Query
Плагин фильтрации товаров (напр. WooCommerce Product Filter)Простой интерфейс, дополнительные функцииЧасто платные, могут влиять на скоростьПодходит для магазинов без разработчика
Как добавить автоматическое сохранение данных в формах WordPress
27.02.2026
Как создать автоматический отчет в WordPress с помощью WP-Cron и REST API
28.03.2026
Изменение атрибутов товара в WooCommerce через REST API
17.05.2026
Создание подробного лога ошибок в WordPress для эффективной отладки
31.03.2026
Как избежать конфликтов между плагинами в WordPress
31.01.2026