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

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

В WooCommerce стандартными средствами невозможно менять стоимость товара в зависимости от выбранного клиентом способа оплаты. Однако в реальных интернет-магазинах часто возникает задача добавить наценку или скидку в зависимости от метода оплаты — например, комиссия за оплату картой или бонус при оплате наличными.

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

Как реализовать изменение стоимости товара по способу оплаты в WooCommerce

Основной подход и ограничения

Мы будем менять итоговую стоимость корзины, добавляя дополнительную строку с наценкой или скидкой, которая зависит от выбранного способа оплаты. Это проще и надежнее, чем менять цену каждого товара динамически, особенно если в корзине несколько товаров.

Обратите внимание, что способ оплаты выбирается на странице оформления заказа, а стоимость корзины рассчитывается до этого. Поэтому нам нужно отслеживать изменение способа оплаты и обновлять итоговую сумму с помощью AJAX.

Пошаговое решение с примером кода

  1. Добавляем пользовательскую комиссию в корзину:
add_action('woocommerce_cart_calculate_fees', 'custom_fee_based_on_payment_method', 20, 1);function custom_fee_based_on_payment_method( $cart ) {    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {        return;    }    if ( ! is_checkout() ) {        return;    }    $chosen_payment_method = WC()->session->get( 'chosen_payment_method' );    if ( ! $chosen_payment_method ) {        return;    }    // Пример наценки для оплаты картой 'stripe'    if ( $chosen_payment_method === 'stripe' ) {        $percentage = 0.03; // 3% наценка        $fee = $cart->subtotal * $percentage;        $cart->add_fee( 'Комиссия за оплату картой', $fee, true, '' );    }    // Можно добавить условия для других способов оплаты}
  1. Обновляем стоимость при смене способа оплаты с помощью AJAX:
add_action( 'wp_footer', 'custom_payment_method_script' );function custom_payment_method_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}

Этот скрипт заставляет WooCommerce пересчитывать корзину при смене способа оплаты, чтобы применить нашу комиссию.

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

  • Перейдите на страницу оформления заказа;
  • Выберите способ оплаты "Карта" (или тот, что вы указали в коде, например "stripe");
  • Убедитесь, что в итоговой сумме появилась дополнительная строка "Комиссия за оплату картой" с правильной суммой (3% от корзины);
  • Смените способ оплаты на другой (например, "наличными"), и проверьте, что комиссия исчезла;
  • Оформите заказ и проверьте, что сумма сохраняется в заказе.

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

  • Комиссия не появляется: Проверьте, что в сессии корректно сохраняется chosen_payment_method. Иногда сессия не обновляется, если checkout не перезагружается (решается скриптом обновления выше).
  • Наценка считается неверно: Убедитесь, что вы используете $cart->subtotal или $cart->subtotal_ex_tax в зависимости от необходимости. Проверьте, что проценты указаны в десятичном формате (0.03 = 3%).
  • Комиссия добавляется несколько раз: WooCommerce сбрасывает сборы при каждом пересчете, но если ваш код вызывается вне нужного хука, могут накапливаться суммы. Используйте woocommerce_cart_calculate_fees и проверяйте условия.
  • Не обновляется при смене способа оплаты: Добавьте JS-скрипт, который триггерит update_checkout при смене способа оплаты.

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

  • Не используйте пользовательские сборы для передачи конфиденциальных данных — это только для отображения и расчёта сумм.
  • В хуке woocommerce_cart_calculate_fees избегайте тяжелых запросов к базе — расчет должен быть быстрым.
  • Кэш страниц (например, с помощью плагинов) может мешать динамическому обновлению стоимости — исключите страницу оформления заказа из кеширования.
  • Для сложных тарифов и условий рассмотрите готовые платные расширения, если не хотите писать собственный код.

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

МетодОписаниеПлюсыМинусы
Код на хуке woocommerce_cart_calculate_fees + JS обновленияДобавляет комиссию как дополнительный сбор в корзинуЛегко реализовать, бесплатно, гибкоНужно писать код, требует поддержки
Платные плагины (например, WooCommerce Payment Gateway Based Fees)Готовые решения с UI для настройки комиссийПростота, поддержка, дополнительные функцииСтоимость, возможно избыточный функционал
Изменение цен товаров динамически (через фильтры)Меняет цену каждого товара в зависимости от оплатыТочная настройка ценыСложно реализовать, баги с кешем и корзиной
Оптимизация изображений в WordPress для ускорения сайта
24.12.2025
Как удалить пустые термины в WordPress: практическое руководство
23.03.2026
Как добавить собственный тип записи в WordPress
25.11.2025
Автоматическое создание резервных копий в WordPress с помощью плагинов и кода
14.01.2026
Как изменить стоимость товара в WooCommerce в зависимости от пользователя
22.04.2026