WooCommerce: как правильно изменить цену вариации товара в корзине

Диагностика проблемы с изменением цены вариаций в корзине WooCommerce

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

Основные признаки проблемы:

  • Цена вариации в каталоге и на странице товара отображается корректно.
  • В корзине цена товара не меняется или возвращается к исходной после обновления.
  • Использование хука woocommerce_before_calculate_totals не даёт ожидаемого результата.

Почему так происходит?

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

Пошаговое решение: изменяем цену вариации в корзине

1. Используем хук woocommerce_before_calculate_totals

Этот хук срабатывает перед подсчётом итоговой суммы корзины. Здесь можно изменить цену элемента корзины.

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

    // Проверяем, что корзина не пуста
    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) {
        return;
    }

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        // Проверяем, что это вариация
        if ( isset( $cart_item['variation_id'] ) && $cart_item['variation_id'] > 0 ) {
            // Пример: увеличиваем цену вариации на 10%
            $original_price = $cart_item['data']->get_price();
            $new_price = $original_price * 1.10;
            $cart_item['data']->set_price( $new_price );
        }
    }
}

2. Проверяем правильность условий применения

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

if ( $cart_item['variation_id'] === 123 ) {
    $cart_item['data']->set_price( 999 );
}

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

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

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

  • Изменение цены вне хука woocommerce_before_calculate_totals: приводит к сбросу цены, так как WooCommerce пересчитывает значения позже.
  • Изменение цены для неправильного объекта: нужно менять цену через $cart_item['data']->set_price(), а не напрямую в массиве.
  • Повторный вызов хука: если функция срабатывает несколько раз, цена может умножиться ошибочно. Добавляйте защиту через did_action.
  • Отсутствие проверки контекста: в админке или во время AJAX-редактирования корзины изменения могут вызвать ошибки — добавляйте проверку is_admin() и DOING_AJAX.

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

  • Не используйте тяжелые запросы или сложные вычисления внутри хука — это сказывается на скорости загрузки корзины.
  • Кэшируйте результаты, если вычисление цены зависит от внешних данных.
  • Всегда проверяйте, что пользователь имеет доступ к изменённым данным, если цена зависит от ролей или пользовательских меток.
  • Тестируйте изменения на staging-сайте, чтобы избежать ошибок на рабочем магазине.

Сравнение способов изменения цены вариации в корзине

МетодОписаниеПлюсыМинусы
Хук woocommerce_before_calculate_totalsИзменение цены непосредственно в объекте корзиныТочный контроль, работает без плагиновНужно аккуратно избегать повторных вызовов
Плагины динамического ценообразованияГотовые решения с интерфейсом для скидок и условийУдобство, поддержка, быстрый стартСтоимость, ограниченная гибкость, нагрузка
Перезапись цены через JavaScriptВизуальное изменение цены на фронтендеПростота реализацииЦена не учитывается в заказе, риск ошибок
Как использовать хуки в WordPress: практическое руководство
10.11.2025
Как установить ограничения на регистрацию в WordPress по домену и email
17.03.2026
WooCommerce: решение проблемы неактивных вариантов товаров
08.06.2026
WooCommerce: автоматическое изменение стоимости товара при выполнении условий
16.05.2026
Как добавить поле Google reCAPTCHA в форму регистрации WordPress
12.03.2026