Как отключить отображение вариаций в каталоге WooCommerce и оставить их на странице товара

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

Когда это действительно проблема

Сценарий обычно выглядит так: у товара есть несколько вариаций, а в каталоге вы хотите показывать только родительский товар. Но тема или плагин выводят вариации в архиве, в блоках рекомендаций или в виджетах. Иногда это происходит после импорта товаров, иногда — из-за кастомного шаблона каталога, который не различает типы товаров.

Что именно нужно проверить перед правкой

  • В каталоге отображаются именно вариации, а не только родительские товары.
  • На странице товара вариации должны остаться доступными через стандартную форму выбора.
  • Фильтры по атрибутам не должны ломаться после скрытия вариаций.
  • Если используется кэш, нужно понимать, что старые страницы могут продолжать показывать прежний вывод.

Диагностика: где WooCommerce берет этот вывод

Сначала проверьте, не меняет ли поведение тема или плагин. Самый быстрый способ — временно переключиться на стандартную тему WooCommerce-совместимого уровня и отключить плагины, которые вмешиваются в каталог: фильтры, конструкторы архивов, плагины для витрин и мерчандайзинга.

Если проблема исчезает, значит, дело не в WooCommerce как таковом, а в шаблоне или хуке. Если вариации все равно видны, ищите кастомный код в functions.php, плагине сниппетов или дочерней теме.

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

add_action( 'woocommerce_before_shop_loop_item', function () {
    global $product;

    if ( $product instanceof WC_Product ) {
        error_log( 'Product ID: ' . $product->get_id() . ' type: ' . $product->get_type() );
    }
} );

Если в каталоге логируются variation, значит, источник проблемы найден: в цикл попадают дочерние вариации, а не только родительские товары.

Рабочее решение: исключить вариации из каталога

Самый надежный путь — отфильтровать список товаров на уровне запроса и отдельно подстраховать вывод в шаблоне. Так вы не зависите от того, как тема собирает карточки.

Вариант 1. Скрыть вариации из основного каталога

Если у вас в архиве должны оставаться только простые и родительские вариативные товары, можно исключить записи типа product_variation из основного запроса WooCommerce.

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

    if ( ! function_exists( 'is_shop' ) ) {
        return;
    }

    if ( is_shop() || is_product_taxonomy() ) {
        $tax_query = (array) $query->get( 'tax_query' );
        $tax_query[] = array(
            'taxonomy' => 'product_type',
            'field'    => 'slug',
            'terms'    => array( 'variation' ),
            'operator' => 'NOT IN',
        );

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

Этот вариант полезен, если вариации реально попадают в каталог как отдельные элементы. Но если тема выводит их не через основной запрос, а отдельным шаблоном, одного фильтра может быть мало.

Вариант 2. Не показывать вариации в карточках каталога

Если вариации уже попали в цикл, можно отрезать их на этапе рендера. Для WooCommerce это безопаснее делать через фильтр, который влияет на вывод карточки товара.

add_filter( 'woocommerce_product_is_visible', function( $visible, $product_id ) {
    $product = wc_get_product( $product_id );

    if ( $product && $product->is_type( 'variation' ) ) {
        return false;
    }

    return $visible;
}, 10, 2 );

Такой подход не меняет сам товар в базе, а только скрывает его из витрины. Это важно, если вариации используются в заказах, остатках и аналитике.

Вариант 3. Оставить вариации только на странице товара

Если вам нужно жестко ограничить показ вариаций только карточкой товара, проверьте шаблоны архива и блоки, где используются собственные WP_Query. Частая ошибка — разработчик делает запрос по post_type=product, но потом вручную подмешивает дочерние записи.

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

$args = array(
    'post_type'      => 'product',
    'post_status'    => 'publish',
    'posts_per_page' => 12,
    'tax_query'      => array(
        array(
            'taxonomy' => 'product_type',
            'field'    => 'slug',
            'terms'    => array( 'variable', 'simple' ),
        ),
    ),
);

$query = new WP_Query( $args );

Здесь важно не добавлять variation в terms. Вариации — это дочерние записи, и для каталога они обычно не нужны.

Сравнение подходов

СпособЧто делаетКогда подходитМинус
Фильтр запросаНе дает вариациям попасть в каталогЕсли проблема в основном архивеНе спасает от отдельных шаблонов темы
Фильтр видимостиСкрывает вариации на этапе выводаЕсли вариации уже попали в циклНужно проверить совместимость с плагинами витрины
Правка кастомного WP_QueryУбирает вариации из собственных блоковЕсли каталог собран вручнуюТребует найти все места с запросами

Как проверить, что решение сработало

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

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

Если у вас подключен плагин кэширования или CDN, обновление может быть не видно сразу. В таких случаях сначала очищают кэш, потом тестируют в приватном окне.

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

Скрыли вариации, но сломали страницу товара

Так бывает, если фильтр применили слишком широко и он зацепил не только архив, но и саму карточку товара. Ограничивайте проверку условиями is_shop() и is_product_taxonomy(), а не глобально на весь сайт.

Вариации исчезли из каталога, но остались в поиске

Поиск WooCommerce и WordPress может использовать отдельные запросы. Тогда нужен дополнительный фильтр для поисковой выдачи или правка логики поиска в теме. Не пытайтесь решить это только через CSS: скрытие в интерфейсе не убирает запись из результата.

Фильтры по атрибутам перестали работать

Если вы слишком агрессивно исключили тип товара, некоторые плагины фильтрации могут потерять данные для построения фасетов. В этом случае лучше скрывать вариации на уровне вывода, а не вырезать их из всех запросов подряд.

После обновления темы все вернулось обратно

Значит, правка была сделана в родительской теме. Перенесите код в дочернюю тему или в небольшой mu-plugin, чтобы он не зависел от обновлений.

Безопасность и производительность

Если решение делаете кодом, не вставляйте его в случайный сниппет без контроля версий. Лучше хранить правку в дочерней теме или в собственном мини-плагине. Так проще откатить изменение, если тема обновится или поменяется структура каталога.

Для магазинов с большим количеством товаров важно не плодить тяжелые запросы. Не запускайте дополнительные WP_Query в каждом товаре цикла, если можно решить задачу фильтром на уровне основного запроса. Это дешевле по ресурсам и проще для поддержки.

Если нужен более широкий аудит WooCommerce-сайта — например, чистка дублей, лишних скриптов и технического мусора — имеет смысл сначала привести в порядок базовую структуру каталога. В таких задачах часто помогает Clearfy Pro, но только как инструмент для типовых оптимизаций, а не как замена точечной правке кода.

Короткий рабочий план

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

Если задача ограничивается только каталогом, не трогайте логику вариаций внутри товара. В WooCommerce это как раз тот случай, когда точечная правка надежнее, чем попытка «починить все сразу».

Создание кастомных типов записей и таксономий в WordPress с примерами кода
12.12.2025
Автоматизация установки и настройки темы WordPress: пошаговое руководство
16.03.2026
Как изменить URL страницы регистрации WordPress без плагинов
13.01.2026
Как создать собственный плагин для WordPress с примерами кода
02.12.2025
Как создать адаптивные шаблоны WordPress с использованием атрибута srcset
30.03.2026