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

Диагностика задачи: зачем менять цену товара при оплате

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

Как реализовать автоматическое изменение цены товара при оплате

Выбор правильного хука для корректировки цены

Для изменения цены товара в заказе во время оформления подходит хук woocommerce_before_calculate_totals. Он позволяет вмешаться в объект корзины (Cart) и модифицировать цены товаров непосредственно перед подсчётом итогов.

Пример кода для добавления фиксированной скидки к каждому товару

add_action('woocommerce_before_calculate_totals', 'custom_change_product_price_on_payment', 10, 1);
function custom_change_product_price_on_payment( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) {
        return;
    }

    // Проверяем, что корзина не пуста
    if ( did_action('woocommerce_before_calculate_totals') >= 2 ) {
        return;
    }

    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        $original_price = $cart_item['data']->get_price();

        // Пример: уменьшаем цену на 10% при выборе метода оплаты "cheque"
        $chosen_payment_method = WC()->session->get('chosen_payment_method');
        if ( $chosen_payment_method === 'cheque' ) {
            $new_price = $original_price * 0.9; // 10% скидка
            $cart_item['data']->set_price( $new_price );
        }
    }
}

Как определить выбранный метод оплаты во время изменения цены

Для доступа к выбранному способу оплаты используют сессию WooCommerce через WC()->session->get('chosen_payment_method'). Этот параметр устанавливается после выбора пользователем способа оплаты на странице оформления заказа.

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

  • Очистите кэш сайта и браузера.
  • Перейдите на страницу оформления заказа, добавьте товар в корзину.
  • Выберите нужный способ оплаты (например, "Чек").
  • Обратите внимание, изменилась ли цена товара на странице корзины и оформления заказа.
  • Завершите заказ и проверьте итоговую сумму в панели администратора WooCommerce.

Если цена изменилась в соответствии с логикой, значит решение работает корректно.

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

  • Изменение цены не отображается: возможно, хук woocommerce_before_calculate_totals вызывается несколько раз, и цена сбрасывается. В коде используйте проверку did_action('woocommerce_before_calculate_totals') < 2, чтобы избежать повторного изменения.
  • Цена меняется в админке или на странице заказа, где не нужно: добавьте проверку if ( is_admin() && ! defined('DOING_AJAX') ) return; чтобы исключить влияние в админке.
  • Неверное получение метода оплаты: убедитесь, что метод оплаты выбирается и сохраняется в сессии корректно, иначе условие не сработает.
  • Конфликты с другими плагинами: проверяйте, не переопределяют ли другие плагины цены в корзине.

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

  • Избегайте сложных и длительных вычислений внутри хука, так как он вызывается при каждом обновлении корзины.
  • Не храните чувствительные данные в сессии без шифрования.
  • Тестируйте логику на тестовом сайте перед внедрением на продакшен.
  • Используйте детальный логгер, например, через error_log(), для отладки изменения цен.

Сравнение способов изменения цены товара при оплате

МетодГде применяетсяПлюсыМинусы
Изменение цены в корзине (woocommerce_before_calculate_totals)Перед расчетом итогов корзиныГибкий, работает с любыми условиямиНужно аккуратно контролировать повторные вызовы, возможны конфликты
Использование плательщиками купонов и скидокНа уровне купонов WooCommerceПростая настройка без кодаМенее гибко, сложно задать сложные условия
Изменение цены на уровне заказа после созданияВ админке или через хуки заказаПодходит для постфактум измененийНе влияет на цену в корзине, неудобно для клиента
Как создать автообновляемый плагин для WordPress с собственным сервером обновлений
28.03.2026
Как сделать многоязычный сайт на WordPress с помощью Polylang
22.03.2026
Оптимизация работы с кэшем в WordPress: практические советы и примеры
12.01.2026
Как автоматически удалять старые черновики в WordPress
02.03.2026
Как создать динамический виджет в WordPress с примерами кода
06.01.2026