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Визуальное изменение цены на фронтендеПростота реализацииЦена не учитывается в заказе, риск ошибок
WooCommerce: автоматическое изменение стоимости товара при добавлении в корзину по условиям
20.05.2026
Как использовать REST API WordPress для создания кастомных приложений
13.11.2025
Как удалить версии записей в WordPress для оптимизации базы данных
18.11.2025
WooCommerce: решение проблемы неработающей функции изменения стоимости товара при добавлении в корзину
22.04.2026
Как добавить автоматическое удаление старых комментариев в WordPress
04.03.2026