WooCommerce: как разрешить использование повышенных тарифов и скидок по купону одновременно

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

В 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; для предотвращения выполнения кода в админке, уменьшая нагрузку.
  • Оптимизируйте функции добавления тарифов, избегая излишних циклов и запросов к базе данных внутри хуков.
  • Используйте кеширование (например, объектный кеш) если рассчитываете тарифы на основе внешних данных.

Чек-лист для корректной настройки одновременного применения тарифов и купонов

  1. Проверьте, что тарифы добавляются через woocommerce_cart_calculate_fees с правильным приоритетом.
  2. Убедитесь, что расчёт тарифа учитывает сумму после скидок.
  3. Проверьте, что купоны применяются с приоритетом ниже, чем тарифы.
  4. Протестируйте с разными типами купонов (фиксированная сумма, процент).
  5. Проверьте отображение итогов в корзине и оформлении заказа.
  6. Проверьте отсутствие конфликтов с другими плагинами.
Как закрыть дубли страниц с помощью canonical и noindex в WordPress
14.08.2026