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

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

Ниже — рабочий сценарий: как скрыть вариацию в корзине и заменить её отображение на родительский товар, не ломая расчёт стоимости и не вмешиваясь в сам механизм WooCommerce.

Когда это действительно нужно

Чаще всего задача возникает в магазинах, где вариации нужны только для выбора характеристик, а не для визуального отображения в корзине. Типичные случаи:

  • один товар, много вариантов по цвету/размеру, но в корзине нужен единый заголовок;
  • менеджеру неудобно собирать заказы, когда в корзине отображаются длинные названия вариаций;
  • нужно убрать из корзины технические атрибуты, но оставить их в заказе как метаданные;
  • в шаблоне корзины конфликтует кастомный вывод вариаций и стандартный формат WooCommerce.

Диагностика проблемы: что именно отображается сейчас

Перед правкой кода проверьте, как WooCommerce хранит товар в корзине. У вариативного товара в массиве корзины обычно есть:

  • product_id — ID родительского товара;
  • variation_id — ID конкретной вариации;
  • variation — массив выбранных атрибутов;
  • data — объект товара, который WooCommerce использует для расчёта цены.

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

Быстро проверить структуру можно через временный лог в functions.php или в мини-плагине:

add_action( 'woocommerce_before_calculate_totals', function( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }

    foreach ( $cart->get_cart() as $cart_item ) {
        error_log( print_r( [
            'product_id'   => $cart_item['product_id'] ?? null,
            'variation_id'  => $cart_item['variation_id'] ?? null,
            'variation'     => $cart_item['variation'] ?? [],
        ], true ) );
    }
}, 10, 1 );

После теста не забудьте убрать логирование, чтобы не засорять журнал.

Пошаговое решение: показываем родительский товар в корзине

Самый безопасный путь — переопределить только заголовок и подпись вариации в корзине. Для этого подойдёт фильтр woocommerce_cart_item_name. Он позволяет заменить название товара в списке корзины, не затрагивая цену, количество и оформление заказа.

Шаг 1. Добавьте фильтр для имени товара

add_filter( 'woocommerce_cart_item_name', function( $product_name, $cart_item, $cart_item_key ) {
    if ( empty( $cart_item['variation_id'] ) ) {
        return $product_name;
    }

    $parent_id = $cart_item['product_id'] ?? 0;
    $parent    = $parent_id ? wc_get_product( $parent_id ) : false;

    if ( ! $parent ) {
        return $product_name;
    }

    $parent_name = $parent->get_name();
    $variation   = wc_get_product( $cart_item['variation_id'] );

    if ( ! $variation ) {
        return esc_html( $parent_name );
    }

    return sprintf(
        '%s <small class="variation-hidden-note">(%s)</small>',
        esc_html( $parent_name ),
        esc_html__( 'выбрана вариация', 'woocommerce' )
    );
}, 10, 3 );

Этот вариант не удаляет вариацию из данных заказа. Он только меняет то, что видит покупатель в корзине.

Шаг 2. Уберите стандартный вывод атрибутов, если он мешает

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

add_filter( 'woocommerce_get_item_data', function( $item_data, $cart_item ) {
    if ( ! empty( $cart_item['variation_id'] ) ) {
        return [];
    }

    return $item_data;
}, 10, 2 );

Это уже более жёсткий вариант: атрибуты не будут видны в корзине и на странице оформления заказа. Используйте его только если менеджеру не нужны эти данные на экране.

Шаг 3. Если нужно оставить атрибуты в заказе, но скрыть только в корзине

Иногда важно показать покупателю только родительский товар в корзине, но сохранить атрибуты в админке заказа. Тогда не трогайте woocommerce_get_item_data. Лучше ограничьтесь фильтром имени товара и, при необходимости, CSS-скрытием конкретного блока в шаблоне темы.

Если тема выводит вариации через собственный шаблон, проверьте переопределения в your-theme/woocommerce/cart/cart.php и cart/cart-item-data.php. Часто проблема не в WooCommerce, а в кастомной теме, которая дублирует стандартный вывод.

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

ПодходЧто меняетПлюсыМинусы
Фильтр woocommerce_cart_item_nameТолько название в корзинеБезопасно, быстро, не ломает расчётыВариация остаётся в данных заказа
Фильтр woocommerce_get_item_dataВывод атрибутов в корзине и checkoutЧистый интерфейсМожно скрыть полезные данные для менеджера
Правка шаблона корзиныHTML-вывод на страницеПолный контроль над версткойСложнее поддерживать после обновлений WooCommerce

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

После добавления кода проверьте не только внешний вид, но и поведение корзины:

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

Если у вас включён кэш страниц, проверьте корзину в режиме без кэша или в приватном окне. Для WooCommerce это критично: визуально всё может выглядеть правильно в одной сессии и ломаться в другой из-за кэширования HTML.

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

Путают отображение и логику товара

Самая частая ошибка — менять только HTML, не понимая, что WooCommerce продолжает считать товар вариацией. Это нормально, если цель только в интерфейсе. Но если вам нужно объединить несколько вариаций в один SKU или одну позицию в заказе, нужен другой сценарий, и простого фильтра здесь недостаточно.

Используют variation_id там, где нужен product_id

Для родительского товара берите product_id, а не variation_id. Если перепутать их, можно получить пустой объект товара или неправильное название.

Скрывают атрибуты без проверки темы

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

Оставляют отладочный лог в продакшене

error_log() полезен для диагностики, но в рабочем магазине его нужно убрать. Иначе журнал быстро разрастается, а на некоторых хостингах это влияет на производительность и место на диске.

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

Если вы вносите такие правки, лучше не держать код в functions.php активной темы. Для точечных изменений безопаснее использовать небольшой mu-plugin или собственный мини-плагин. Тогда код не пропадёт после смены темы и проще контролировать его версию.

Ещё два момента, которые стоит проверить:

  • не используйте тяжёлые запросы к базе внутри фильтров корзины;
  • не вызывайте wc_get_product() без необходимости в цикле по всем позициям, если корзина у вас большая и логика сложная.

Если в магазине много кастомных правок WooCommerce, полезно держать под рукой инструмент для чистки дублей и технического мусора. В экосистеме WordPress для этого часто используют Clearfy Pro: он помогает упростить часть типовых оптимизаций и убрать лишнее, когда проект уже оброс настройками. Но конкретно для задачи с вариациями в корзине всё равно нужен точечный код, а не «универсальная кнопка».

Когда лучше не скрывать вариации вообще

Есть сценарии, где скрытие вариаций в корзине только запутает процесс:

  • если цена зависит от атрибута и менеджеру важно видеть, что именно заказали;
  • если разные вариации отгружаются с разного склада;
  • если в заказе критично различать размеры, цвета или материалы без открытия карточки товара.

В таких случаях лучше не прятать вариацию полностью, а лишь сократить её отображение: оставить название родителя и короткую подпись с ключевым атрибутом, например размером. Это обычно даёт лучший баланс между чистым интерфейсом и рабочей информацией для обработки заказа.

Как добавить автоматическое сообщение при регистрации в WordPress
03.04.2026
WooCommerce: решение проблемы с отображением товаров после обновления кеша
23.07.2026
WordPress: как удалить все активные сеансы пользователей
19.11.2025
Отложенная загрузка картинок в WordPress: настройка и примеры
26.02.2026
WordPress: как создать и использовать собственные таксономии
18.01.2026