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

Что делает хук woocommerce_before_calculate_totals и зачем он нужен

Хук woocommerce_before_calculate_totals срабатывает перед пересчетом итоговой суммы корзины. Это удобное место для динамического изменения цены товара в корзине перед финальным расчетом. Например, можно сделать скидку, добавить наценку или изменить цену по другим условиям.

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

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

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

  • Правильно ли получен объект товара корзины ($cart_item['data']).
  • Меняете ли вы цену через метод set_price() объекта WC_Product.
  • Нет ли конфликтов с другими плагинами или кастомным кодом, которые сбрасывают цену после вашего изменения.

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

Ниже пример кода, который снижает цену каждого товара в корзине на 10%:

add_action('woocommerce_before_calculate_totals', 'custom_discount_cart_items', 10, 1);
function custom_discount_cart_items( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
        return;
    }
    // Обрабатываем каждый товар в корзине
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $product = $cart_item['data'];
        // Получаем оригинальную цену
        $original_price = $product->get_regular_price();
        // Считаем новую цену с 10% скидкой
        $new_price = $original_price * 0.9;
        // Устанавливаем измененную цену
        $product->set_price( $new_price );
    }
}

Ключевые моменты:

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

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

Чтобы убедиться, что изменение цены работает, выполните следующие шаги:

  1. Добавьте товары в корзину на фронтенде.
  2. Откройте страницу корзины и проверьте цены товаров — они должны быть уменьшены на 10%.
  3. При изменении количества товара убедитесь, что итоговая сумма пересчитывается корректно.
  4. Посмотрите исходный код страницы корзины или используйте консоль браузера для проверки, что цена в объекте товара изменилась.

Частые ошибки при изменении цены через woocommerce_before_calculate_totals

  • Изменение цены вне хука или после расчета totals. Изменения должны происходить именно в хуке woocommerce_before_calculate_totals. После него цена не пересчитается.
  • Изменение цены напрямую в базе или через свойства объекта без метода set_price(). Это не влияет на корзину.
  • Не исключение админской части. Изменения могут мешать работе админки и создавать ошибки.
  • Кэширование цены в плагинах кэширования или оптимизации. При активном кэше изменения могут не отображаться сразу.

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

  • Не используйте сложные вычисления внутри хука, чтобы не замедлять загрузку корзины.
  • Проверяйте, что изменение цены не ломает логику скидок и купонов WooCommerce.
  • Тестируйте на совместимость с плагинами кэширования и ускорения сайта.
  • Используйте is_admin() && ! defined( 'DOING_AJAX' ), чтобы избежать влияния на админку.

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

МетодОписаниеПреимуществаНедостатки
Изменение цены через woocommerce_before_calculate_totalsДинамическое изменение цены в корзинеГибко, не влияет на базу, работает для каждого пользователяТребует точного кода, возможны конфликты
Изменение цены в базе (например, update_post_meta)Изменение цены товара в базе данныхПростота, эффект на все заказыМеняет базу, влияет на все пользователей
Использование плагинов скидокПлагины для управления скидками и ценамиУдобство, готовые решенияМожет быть избыточно, нагрузка на сайт
Как удалить заказы WooCommerce по статусу и датам через код
07.05.2026
Как создать собственный тип данных (Custom Post Type) в WordPress
10.03.2026
Как удалить и заблокировать спам в комментариях WordPress
20.03.2026
Как отключить загрузку Google Fonts в WordPress для ускорения сайта
20.12.2025
Как использовать хук woocommerce_order_status_changed для автоматизации в WooCommerce
31.05.2026