Проблема: необходимость динамически менять стоимость оплаты в WooCommerce
В стандартном WooCommerce стоимость оплаты не меняется в зависимости от выбранного способа оплаты. Часто возникает задача добавить дополнительную комиссию или скидку, чтобы корректно отразить расходы или стимулировать выбор определённого способа. Например, добавить 3% комиссии при оплате картой или скидку при выборе оплаты наличными.
Диагностика задачи: как понять, что стандартных настроек недостаточно
WooCommerce позволяет устанавливать фиксированные стоимости доставки, но нет встроенных опций для динамического изменения комиссии за оплату. Если в настройках платежных шлюзов нет такой опции, значит, нужно использовать код или плагины.
Проверить, что стоимость оплаты не меняется:
- Перейдите в корзину/оформление заказа;
- Выберите разные способы оплаты;
- Проследите, что итоговая сумма не меняется.
Пошаговое решение: добавление комиссии через хук woocommerce_cart_calculate_fees
Для изменения стоимости оплаты используем хук woocommerce_cart_calculate_fees, который позволяет добавлять дополнительные сборы к корзине. Это наиболее надежный и рекомендованный способ.
Пример кода, который добавляет комиссию 3% при выборе способа оплаты «Оплата картой» (например, метод ID cod замените на ваш):
add_action('woocommerce_cart_calculate_fees', 'add_payment_gateway_fee', 20, 1);
function add_payment_gateway_fee( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
if ( isset( WC()->session ) ) {
$chosen_gateway = WC()->session->get('chosen_payment_method');
if ( $chosen_gateway === 'bacs' ) { // замените 'bacs' на ID вашего способа оплаты
$percentage = 0.03; // 3% комиссия
$fee = $cart->subtotal * $percentage;
$cart->add_fee( __('Комиссия за оплату картой', 'woocommerce'), $fee, true, '' );
}
}
}Ключевые моменты:
- Проверяем текущий способ оплаты через сессию WooCommerce;
- Добавляем комиссию, вычисляемую как процент от subtotal;
- Третий параметр
trueозначает, что комиссия облагается налогом (измените при необходимости).
Как узнать ID способа оплаты
Перейдите в WooCommerce → Настройки → Оплаты и наведите на название способа, в URL будет параметр section=payment_method_id. Или используйте следующий сниппет для отладки в functions.php:
add_action('woocommerce_cart_calculate_fees', 'debug_chosen_payment_method', 1);
function debug_chosen_payment_method( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;
error_log('Chosen payment method: ' . WC()->session->get('chosen_payment_method') );
}Проверка результата после внедрения
Чтобы убедиться, что комиссия применяется:
- Очистите кеш сайта и браузера;
- Перейдите на страницу оформления заказа;
- Выберите способ оплаты, для которого добавлена комиссия;
- Проверьте итоговую сумму и наличие дополнительной строки с комиссией;
- Смените способ оплаты и убедитесь, что комиссия исчезает или меняется корректно.
Частые ошибки и как их исправить
- Комиссия не появляется: проверьте, что хук добавлен в
functions.phpактивной темы или в плагине, убедитесь, что ID способа оплаты правильный. - Комиссия не меняется при переключении способа оплаты без перезагрузки страницы: WooCommerce не всегда обновляет стоимость автоматически. Добавьте поддержку обновления через JavaScript или используйте плагин для динамического обновления.
- Комиссия не учитывается в налогах: параметр
$cart->add_feeтретий аргумент должен бытьtrue, если комиссия облагается налогом. - Ошибка сессии: убедитесь, что сессия WooCommerce активна, код не должен выполняться в административной части без AJAX.
Практические советы по оптимизации и безопасности
- Не храните логику комиссии в плагинах сторонних разработчиков без проверки — всегда тестируйте на локальном сервере.
- Добавляйте локализацию в строку комиссии для поддержки многоязычности.
- Кэширование страниц оформления заказа отключайте или исключайте, чтобы сумма менялась корректно.
- Используйте Transient API для кеширования сложных вычислений комиссии при необходимости, чтобы уменьшить нагрузку.
Сравнение вариантов решения
| Вариант | Плюсы | Минусы | Рекомендуемая ситуация |
|---|---|---|---|
Код на woocommerce_cart_calculate_fees | Гибкость, контроль, бесплатный | Требует навыков PHP, может потребовать доработки JS | Небольшие доработки, кастомизация под проект |
| Плагин комиссии (например, WooCommerce Fees Plugin) | Простота настройки, готовый интерфейс | Могут быть платными, ограниченная кастомизация | Быстрый запуск без программиста |
| Изменение в платежном шлюзе | Часто встроено, поддерживается разработчиком | Не всегда есть опция, зависит от провайдера | Если нужен фиксированный процент, поддерживаемый шлюзом |