Диагностика проблемы: почему повышенные тарифы и скидки по купону не работают вместе
В WooCommerce стандартное поведение зачастую блокирует одновременное применение повышенных тарифов (например, наценок или дополнительных сборов) и скидок по купонам. Это происходит из-за порядка вычисления итоговой стоимости заказа и особенностей обработки купонов и дополнительных сборов (fees). В результате пользователь видит либо скидку, либо повышенный тариф, но не оба варианта вместе.
Основные причины:
- Купоны применяются до вычисления дополнительных сборов, или наоборот, в зависимости от настроек.
- Некорректная реализация логики добавления тарифов и скидок в функциях темы или плагина.
- Конфликт плагинов, влияющих на корзину и расчёт стоимости.
Как пошагово разрешить одновременное использование повышенных тарифов и скидок по купону
1. Проверяем, как добавляются повышенные тарифы
Если повышенные тарифы добавляются через хук woocommerce_cart_calculate_fees, убедитесь, что они учитывают текущие скидки по купонам и применяются корректно.
Пример правильного добавления тарифа:
add_action('woocommerce_cart_calculate_fees', 'add_custom_surcharge', 20, 1);
function add_custom_surcharge(\WC_Cart $cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
$surcharge_amount = 10; // Сумма наценки в валюте магазина
// Добавляем наценку после применения купонов
$cart->add_fee(__('Повышенный тариф', 'woocommerce'), $surcharge_amount);
}2. Проверяем порядок применения купонов и тарифов
Купоны WooCommerce по умолчанию применяются до добавления дополнительных тарифов. Чтобы разрешить применять тарифы и купоны в нужном порядке, используйте приоритеты в хуках.
Например, если тарифы добавляются с приоритетом 20, можно попробовать поставить приоритет купонов ниже, например 10, чтобы купоны применялись раньше.
3. Корректируем вычисление итоговой суммы с учётом обоих факторов
Если наценка должна рассчитываться от суммы после скидки, в функции добавления тарифа нужно брать итог корзины с учётом купонов:
add_action('woocommerce_cart_calculate_fees', 'add_custom_surcharge', 20, 1);
function add_custom_surcharge(\WC_Cart $cart) {
if (is_admin() && !defined('DOING_AJAX')) return;
$subtotal_after_coupons = $cart->get_subtotal() - $cart->get_discount_total();
$surcharge_amount = $subtotal_after_coupons * 0.1; // 10% наценка от суммы после скидок
$cart->add_fee(__('Повышенный тариф', 'woocommerce'), $surcharge_amount);
}Проверка результата после внедрения
- Создайте тестовый заказ с товаром, на который действует повышенный тариф.
- Примените купон со скидкой (фиксированной или процентной).
- Проверьте итоговую сумму в корзине и оформлении заказа: должна быть сумма с учётом и скидки, и тарифа.
- Убедитесь, что в админке WooCommerce в деталях заказа отображаются и скидки, и дополнительные сборы.
Частые ошибки и способы их исправления
- Тариф добавляется до применения купона
Проверьте приоритеты хуков, установитеwoocommerce_cart_calculate_feesс приоритетом 20 и используйте проверку, чтобы купон применялся раньше. - Использование неправильных методов для получения суммы корзины
Используйте$cart->get_subtotal()и$cart->get_discount_total()для точного расчёта суммы после скидок. - Не учитываются условия применения купонов
Если купон ограничен по продуктам или категориям, учитывайте это в логике наценки. - Конфликт плагинов
Отключите остальные плагины, влияющие на корзину, и проверьте работу тарифов и купонов отдельно.
Практические советы по безопасности и производительности
- Добавляйте проверки
if (is_admin() && !defined('DOING_AJAX')) return;для предотвращения выполнения кода в админке, уменьшая нагрузку. - Оптимизируйте функции добавления тарифов, избегая излишних циклов и запросов к базе данных внутри хуков.
- Используйте кеширование (например, объектный кеш) если рассчитываете тарифы на основе внешних данных.
Чек-лист для корректной настройки одновременного применения тарифов и купонов
- Проверьте, что тарифы добавляются через
woocommerce_cart_calculate_feesс правильным приоритетом. - Убедитесь, что расчёт тарифа учитывает сумму после скидок.
- Проверьте, что купоны применяются с приоритетом ниже, чем тарифы.
- Протестируйте с разными типами купонов (фиксированная сумма, процент).
- Проверьте отображение итогов в корзине и оформлении заказа.
- Проверьте отсутствие конфликтов с другими плагинами.