Как исключить товары по атрибутам из списка и поиска 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 на основе Customizer
11.04.2026
Создать динамические формы в WordPress без плагинов
29.11.2025
Как добавить автоматическое удаление спам-комментариев в WordPress
24.03.2026
Как создать автоматическое сообщение после отзыва в WordPress
07.03.2026
Руководство по созданию пользовательских типов записей в WordPress
19.11.2025