Что такое хук 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означает, что сбор облагается налогом)
Проверка результата после внедрения
Чтобы убедиться, что сбор добавлен:
- Добавьте товары в корзину с общей стоимостью ниже 3000 рублей
- Перейдите на страницу корзины — там должен появиться новый сбор с указанным названием и суммой
- Перейдите к оформлению заказа, проверьте, что сбор отображается в итогах и в заказе в админке WooCommerce
- Попробуйте увеличить сумму корзины выше 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 | Полный контроль над отображением | Не всегда корректно учитывает итоговые суммы, сложность поддержки |