В 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, но только как инструмент для типовых оптимизаций, а не как замена точечной правке кода.
Короткий рабочий план
- Проверить, где именно появляются вариации: основной каталог, поиск, блоки темы.
- Определить, это проблема запроса или шаблона.
- Скрыть вариации через фильтр видимости или исключить их из запроса.
- Проверить карточку товара, фильтры и поиск.
- Очистить кэш и протестировать в приватном окне.
Если задача ограничивается только каталогом, не трогайте логику вариаций внутри товара. В WooCommerce это как раз тот случай, когда точечная правка надежнее, чем попытка «починить все сразу».