WooCommerce: как изменить стоимость товаров в корзине без пересчета

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

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

Типичные симптомы:

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

Пошаговое решение: изменение цены товара в корзине без пересчета

1. Использование хука woocommerce_before_calculate_totals

Для корректной и безопасной модификации стоимости товаров в корзине нужно использовать хук woocommerce_before_calculate_totals. Он вызывается перед подсчетом итогов и позволяет изменить цену «на лету».

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

add_action('woocommerce_before_calculate_totals', 'custom_change_cart_item_price', 20, 1); 
function custom_change_cart_item_price($cart_object) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    foreach ($cart_object->get_cart() as $cart_item_key => $cart_item) {
        // Пример: уменьшаем цену на 10% для товара с ID 123
        if ($cart_item['product_id'] === 123) {
            $original_price = $cart_item['data']->get_price();
            $new_price = $original_price * 0.9;
            $cart_item['data']->set_price($new_price);
        }
    }
}

2. Обеспечиваем стабильность изменения

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

add_action('woocommerce_before_calculate_totals', 'custom_change_cart_item_price_once', 20, 1);
function custom_change_cart_item_price_once($cart_object) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    foreach ($cart_object->get_cart() as $cart_item_key => $cart_item) {
        if (isset($cart_item['custom_price_applied'])) continue;

        if ($cart_item['product_id'] === 123) {
            $original_price = $cart_item['data']->get_price();
            $new_price = $original_price * 0.9;
            $cart_item['data']->set_price($new_price);
            $cart_item['custom_price_applied'] = true;
        }
    }
}

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

  • Добавьте в корзину товар с ID 123;
  • Откройте страницу корзины — цена товара должна быть уменьшена на 10%;
  • Обновите страницу — цена должна остаться изменённой, не вернуться к оригинальной;
  • Проверьте итоговую сумму заказа — она должна правильно отражать новые цены;
  • Если включен кэш, очистите его и проверьте повторно.

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

  • Ошибка: Цена меняется на странице корзины, но возвращается к старой после обновления.
    Причина: изменение цены происходит вне хука или не учитывается повторный вызов.
    Исправление: использовать woocommerce_before_calculate_totals с проверкой флага изменения.
  • Ошибка: Конфликты с другими плагинами, меняющими цены.
    Причина: хук вызывается в неправильном приоритете.
    Исправление: изменить приоритет вызова (например, 20 или выше) для правильного порядка.
  • Ошибка: Изменения не применяются при AJAX обновлении корзины.
    Причина: проверка is_admin() или некорректные условия.
    Исправление: убедиться, что код не блокируется при AJAX-запросах.

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

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

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

МетодОписаниеПлюсыМинусы
Изменение метаданных товараМенять цену в базе или через метаполяПостоянное изменениеНарушает логику WooCommerce, сбрасывается при обновлении
Хук woocommerce_before_calculate_totalsИзменение цены в объекте корзиныБезопасно, временно, совместимо с ядром и плагинамиТребует правильной реализации и проверки
Использование плагинов для скидокГотовые решения для динамических изменений ценыПросто внедрять, много функцийМожет быть избыточным, влияет на производительность
WooCommerce: как установить контроль размера изображений товаров в корзине
22.06.2026
Как удалить или заблокировать плагин WordPress, если стандартные методы не работают
24.01.2026
WooCommerce: как использовать хуки для кастомизации корзины
16.05.2026
Как добавить пользовательское поле в блок Gutenberg в WordPress
16.12.2025
WooCommerce: как автоматически удалять старые заказы и корзины
06.07.2026