Диагностика проблемы: зачем менять цену товара по способу оплаты
В WooCommerce стандартными средствами невозможно менять стоимость товара в зависимости от выбранного клиентом способа оплаты. Однако в реальных интернет-магазинах часто возникает задача добавить наценку или скидку в зависимости от метода оплаты — например, комиссия за оплату картой или бонус при оплате наличными.
Если вы столкнулись с проблемой, что цены не меняются при выборе способа оплаты, значит, нужно внедрять кастомное решение. Готовых настроек в WooCommerce для этого нет, а плагины часто слишком громоздкие или платные.
Как реализовать изменение стоимости товара по способу оплаты в WooCommerce
Основной подход и ограничения
Мы будем менять итоговую стоимость корзины, добавляя дополнительную строку с наценкой или скидкой, которая зависит от выбранного способа оплаты. Это проще и надежнее, чем менять цену каждого товара динамически, особенно если в корзине несколько товаров.
Обратите внимание, что способ оплаты выбирается на странице оформления заказа, а стоимость корзины рассчитывается до этого. Поэтому нам нужно отслеживать изменение способа оплаты и обновлять итоговую сумму с помощью AJAX.
Пошаговое решение с примером кода
- Добавляем пользовательскую комиссию в корзину:
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, '' ); } // Можно добавить условия для других способов оплаты}- Обновляем стоимость при смене способа оплаты с помощью 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 для настройки комиссий | Простота, поддержка, дополнительные функции | Стоимость, возможно избыточный функционал |
| Изменение цен товаров динамически (через фильтры) | Меняет цену каждого товара в зависимости от оплаты | Точная настройка цены | Сложно реализовать, баги с кешем и корзиной |