Как использовать хук woocommerce_cart_calculate_fees для добавления дополнительных платежей в WooCommerce

Что такое хук woocommerce_cart_calculate_fees и зачем он нужен

Хук woocommerce_cart_calculate_fees позволяет добавлять дополнительные сборы или скидки в корзину WooCommerce на этапе расчёта итоговой суммы. Это самый надёжный способ внедрить кастомные платежи, например, надбавки за обработку заказа, экологические сборы, оплату упаковки и т.п. Использование этого хука гарантирует, что сумма будет корректно учтена в итоговом чеке и в заказе.

Диагностика проблемы: дополнительные платежи не отображаются или считаются неверно

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

  • Вызывается ли хук в вашем коде
  • Используете ли правильный приоритет и параметры функции
  • Корректно ли установлен объект корзины WC_Cart в функции
  • Правильно ли указываете сумму сбора и флаг налогообложения

Пошаговое решение: добавление дополнительного платежа с помощью woocommerce_cart_calculate_fees

Пример добавления фиксированного сбора 100 рублей при сумме заказа меньше 3000 рублей:

add_action('woocommerce_cart_calculate_fees', 'add_custom_fee_for_small_orders');
function add_custom_fee_for_small_orders( WC_Cart $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return;

    // Проверка минимальной суммы заказа
    if ( $cart->subtotal < 3000 ) {
        $fee = 100; // сумма сбора в рублях
        $cart->add_fee( __('Дополнительный сбор за обработку заказа', 'woocommerce'), $fee, true );
    }
}

Объяснение кода:

  • Функция привязана к хуку woocommerce_cart_calculate_fees и получает объект корзины
  • В админке и при AJAX-запросах функция не выполняется, чтобы избежать дублирования
  • Если сумма товаров меньше 3000, добавляется дополнительный сбор с названием и налогом (флаг true означает, что сбор облагается налогом)

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

Чтобы убедиться, что сбор добавлен:

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

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

  • Функция не вызывается: проверьте, что хук подключён в functions.php или в плагине, и что код загружается корректно.
  • Сбор не отображается в корзине: убедитесь, что вызов $cart->add_fee() происходит именно в хуке woocommerce_cart_calculate_fees, а не раньше.
  • Сумма сбора неправильная или равна 0: проверьте тип и значение переменной суммы, она должна быть числом с плавающей точкой или целым.
  • Сбор добавляется несколько раз: добавьте проверку is_admin() && ! defined('DOING_AJAX') для исключения повторного выполнения в админке и при AJAX.

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

  • Не храните вычисляемые сборы в базе вручную — используйте этот хук для динамического расчёта, чтобы избежать рассинхронизации данных.
  • Оптимизируйте условия добавления сбора, чтобы не нагружать лишними проверками при каждом обновлении корзины.
  • При работе с налогами учитывайте настройки WooCommerce — используйте третий параметр add_fee для корректного учёта налогов.
  • Тестируйте на разных темах и с активными плагинами, чтобы исключить конфликты, особенно с кешированием корзины.

Сравнение методов добавления дополнительных сборов в WooCommerce

МетодПреимуществаНедостатки
Хук woocommerce_cart_calculate_feesКорректный расчёт, интеграция с налогами, динамичностьТребует базовых знаний PHP, работает только в корзине и оформлении заказа
Плагины для дополнительных сборовПростота настройки, визуальный интерфейсЗависимость от стороннего кода, возможные конфликты и накладные расходы
Изменение шаблонов WooCommerceПолный контроль над отображениемНе всегда корректно учитывает итоговые суммы, сложность поддержки
Добавление пользовательского поля профиля на фронтенде WordPress
17.03.2026
Как создать функцию автоматического удаления старых записей через WP-Cron в WordPress
07.01.2026
Изменение атрибутов товара в WooCommerce через REST API
17.05.2026
Как решить проблему: не работает AJAX в WordPress
07.12.2025
Как создать настройки плагина WordPress с использованием Settings API
20.12.2025