WooCommerce: автоматическое изменение стоимости товаров при оплате с поддержкой купонов

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

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

Задача: реализовать автоматическое изменение стоимости товаров при оплате с поддержкой купонов, учитывая комплексные условия, используя кастомный PHP-код.

Как проверить текущую проблему

  • Создайте купон с фиксированной скидкой или процентом в WooCommerce.
  • Примените купон в корзине и оформите заказ с разными способами оплаты.
  • Проверьте, что скидка применяется одинаково и без условий, которые вы хотите учесть.

Если вы хотите изменить цену только при определённом методе оплаты или при наличии купонов, стандартный функционал не позволит это сделать.

Пошаговое решение: изменение цены с учётом купонов и оплаты

1. Отслеживаем применение купона и метод оплаты

Используем хук woocommerce_cart_calculate_fees для добавления корректировки цены. В этом хуке можно проверить применённые купоны и выбранный способ оплаты (если он уже выбран).

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

add_action('woocommerce_cart_calculate_fees', 'custom_discount_with_coupon_and_payment', 20, 1);
function custom_discount_with_coupon_and_payment($cart) {
    if (is_admin() && !defined('DOING_AJAX')) return;

    // Проверяем, применён ли нужный купон
    $target_coupon = 'specialdiscount'; // замените на ваш купон
    $applied_coupons = $cart->get_applied_coupons();
    if (!in_array($target_coupon, $applied_coupons)) return;

    // Получаем выбранный метод оплаты из сессии
    $chosen_payment_method = WC()->session->get('chosen_payment_method');
    if ($chosen_payment_method !== 'cod') { // например, только для оплаты при получении
        return;
    }

    // Рассчитываем скидку - например, 10% от суммы товаров
    $discount = $cart->subtotal * 0.10;

    // Добавляем отрицательный сбор, чтобы снизить итог
    $cart->add_fee(__('Дополнительная скидка', 'woocommerce'), -$discount);
}

3. Обновление цены при смене способа оплаты на странице оформления заказа

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

add_action('wp_footer', 'custom_payment_method_change_script');
function custom_payment_method_change_script() {
    if (!is_checkout()) return;
    ?>
    <script type="text/javascript">
    jQuery(function($){
        $('form.checkout').on('change', 'input[name="payment_method"]', function(){
            $('body').trigger('update_checkout');
        });
    });
    </script>
    <?php
}

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

  • Создайте купон с кодом specialdiscount.
  • Добавьте товары в корзину и примените купон.
  • Перейдите к оформлению заказа, выберите способ оплаты Оплата при получении (код метода cod).
  • Убедитесь, что дополнительная скидка 10% от суммы товаров появляется в итогах заказа.
  • Попробуйте сменить способ оплаты на другой — скидка должна исчезнуть.

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

  • Скидка не появляется при применении купона
    — Проверьте совпадение кода купона в коде и в админке WooCommerce.
    — Убедитесь, что хук woocommerce_cart_calculate_fees добавлен правильно и не конфликтует с другими плагинами.
  • Скидка не обновляется при смене метода оплаты
    — Проверьте подключение JavaScript, который обновляет корзину при смене оплаты.
    — Убедитесь, что на странице оформления используется стандартный checkout WooCommerce без кастомных шаблонов, нарушающих события.
  • Сумма скидки рассчитана неверно
    — Проверьте логику расчёта скидки и используемые свойства объекта корзины ($cart->subtotal, $cart->total).

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

  • Всегда проверяйте, что код не выполняется в административной части сайта, чтобы избежать лишней нагрузки (is_admin() и DOING_AJAX).
  • Используйте точечные условия для применения скидок, чтобы избежать конфликтов и ошибок.
  • Не храните критичные данные в сессии без проверки — используйте безопасные методы доступа к данным WooCommerce.
  • Минимизируйте количество JavaScript-обработчиков на странице оформления заказа для улучшения скорости.

Сравнение подходов изменения цены с учётом купонов и оплаты

МетодПреимуществаНедостаткиПример использования
Стандартные купоны WooCommerceПростота, встроенная поддержкаОграниченные условия, нельзя учитывать метод оплатыСкидка 10% на все товары
Плагины скидок с условиямиГибкая логика, интерфейс для условийДополнительная нагрузка, возможные конфликтыСкидка при оплате конкретным методом
Кастомный код через хукиМаксимальный контроль, минимальная нагрузкаТребует навыков разработки, сложно поддерживатьАвтоматическое изменение цены с учётом купона и оплаты
WooCommerce: автоматическое изменение стоимости товаров при оплате
30.04.2026
Как создать интерактивные формы в WordPress без плагинов
01.12.2025
Как создать автоматический системный логгер в WordPress для отладки и мониторинга
12.03.2026
Как удалить неиспользуемые таблицы базы данных WordPress
24.11.2025
Как создать автоматическую систему отслеживания ошибок в WordPress
03.04.2026