WooCommerce: как использовать хук woocommerce_before_calculate_totals для динамического изменения цен в корзине

Диагностика проблемы: почему динамическое изменение цен в корзине не работает

Часто при кастомизации WooCommerce возникает задача изменить цену товаров в корзине на лету, например, применить скидку по сложным условиям или динамически изменить стоимость в зависимости от пользовательских данных. Стандартные методы через промокоды или фиксированные скидки не всегда подходят.

Типичная ошибка — попытка изменить цену товара напрямую в объекте WC_Product без использования правильного хука. Как результат, цена не меняется или изменения видны только на странице товара, но не в корзине и заказе.

Как использовать хук woocommerce_before_calculate_totals для изменения цен в корзине

Хук woocommerce_before_calculate_totals вызывается перед подсчетом итоговой стоимости корзины. В этот момент можно перебрать все товары в корзине и изменить цену у каждого товара, используя метод set_price() объекта WC_Cart_Item.

Пошаговое решение с примером кода

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

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        // Пример условия: если цена товара больше 1000, применить скидку 10%
        if ( $product->get_price() > 1000 ) {
            $new_price = $product->get_price() * 0.9;
            $product->set_price( $new_price );
        }
    }
}

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

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

  • Добавьте в корзину товар с ценой более 1000 руб.
  • Обновите страницу корзины.
  • Убедитесь, что цена товара изменилась на 10% меньше.
  • Проверьте, что итоговая сумма корзины соответствует новым ценам.

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

  • Изменение цены вне хука или в хуках с другим приоритетом — цена не изменится корректно.
  • Не проверяется условие админки — приводит к багам при редактировании заказов в админке.
  • Изменение свойства $cart_item['data'] без вызова set_price() — не сработает.
  • Изменение цены без сохранения данных в сессии — цены сбрасываются при обновлении страницы.

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

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

Сравнение методов изменения цены в WooCommerce

МетодПлюсыМинусы
Хук woocommerce_before_calculate_totals с PHP-кодомГибкость, полный контроль, бесплатное решениеТребует навыков программирования, риски при неправильном коде
Плагины для динамических ценУдобство, поддержка, готовые настройкиПокупка, нагрузка на сайт, ограниченная кастомизация
Использование промокодовПростота реализации, встроено в WooCommerceОграниченные сценарии, не подходит для сложных условий
WooCommerce: решение проблемы нерабочей функции динамического изменения цены товара при промокодах
31.05.2026
Как создать Custom Post Type в WordPress: подробное руководство
01.11.2025
Как создать автоматические уведомления о обновлениях сайта в WordPress
30.03.2026
Как добавить динамические атрибуты в shortcode WordPress
01.03.2026
WooCommerce: как использовать хук woocommerce_before_calculate_totals для динамического изменения цен в корзине
27.05.2026