Как сделать наценку за вид оплаты в Woocommerce?
Здравствуйте, я только начинаю потихоньку делать сайты на Wordpress и я хотел бы узнать, как можно добавить наценку к общей сумме чека на странице оплаты.
Есть 3 вида оплаты:
- Наличный расчёт
- Без НДС
- С НДС
У каждого товара есть 3 цены для каждого вида оплаты, но нужно сделать так, чтобы выбор оплаты менял сразу для всех товаров цену по своему прайсу
Допустим, товар "Уголь 1"
Наличный расчёт - 180₽
Без НДС - 200₽
С НДС - 240₽
Товар "Уголь 2"
Наличный расчёт - 100₽
Без НДС - 110₽
С НДС - 132₽
Заранее большое спасибо тому кто поможет!
Дополнительные вопросы
Ответы:
Использовать скидочные плагины с отрицательной скидкой
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Если у каждого товара уже есть три разные цены под тип оплаты, то это не совсем «наценка за оплату». Это скорее разные прайсы. В WooCommerce лучше не пытаться менять цену только на финальном шаге оплаты, потому что итог корзины, налоги, доставка, письма и заказы должны видеть одну и ту же рассчитанную цену.
Есть два подхода:
- если нужно просто добавить процент/фиксированную комиссию к заказу — используйте
add_fee; - если для каждого товара своя цена под «нал», «без НДС», «с НДС» — храните эти цены в meta товара и пересчитывайте цену позиции корзины.
Для простой комиссии за способ оплаты:
add_action('woocommerce_cart_calculate_fees', function ($cart) { if (is_admin() && ! defined('DOING_AJAX')) { return; } $payment = WC()->session ? WC()->session->get('chosen_payment_method') : ''; if ($payment === 'bacs') { $cart->add_fee('Комиссия за выбранный способ оплаты', 200, true); } }); |
add_action('woocommerce_cart_calculate_fees', function ($cart) { if (is_admin() && ! defined('DOING_AJAX')) { return; } $payment = WC()->session ? WC()->session->get('chosen_payment_method') : ''; if ($payment === 'bacs') { $cart->add_fee('Комиссия за выбранный способ оплаты', 200, true); } });
Но в вашем случае больше похоже на разные цены товара. Тогда можно хранить meta, например _price_cash, _price_no_vat, _price_vat, и при расчёте корзины менять цену:
add_action('woocommerce_before_calculate_totals', function ($cart) { if (is_admin() && ! defined('DOING_AJAX')) { return; } $payment = WC()->session ? WC()->session->get('chosen_payment_method') : ''; foreach ($cart->get_cart() as $item) { $product = $item['data']; $meta_key = ''; if ($payment === 'cod') { $meta_key = '_price_cash'; } elseif ($payment === 'bacs') { $meta_key = '_price_no_vat'; } if ($meta_key) { $new_price = get_post_meta($product->get_id(), $meta_key, true); if ($new_price !== '') { $product->set_price((float) $new_price); } } } }); |
add_action('woocommerce_before_calculate_totals', function ($cart) { if (is_admin() && ! defined('DOING_AJAX')) { return; } $payment = WC()->session ? WC()->session->get('chosen_payment_method') : ''; foreach ($cart->get_cart() as $item) { $product = $item['data']; $meta_key = ''; if ($payment === 'cod') { $meta_key = '_price_cash'; } elseif ($payment === 'bacs') { $meta_key = '_price_no_vat'; } if ($meta_key) { $new_price = get_post_meta($product->get_id(), $meta_key, true); if ($new_price !== '') { $product->set_price((float) $new_price); } } } });
После смены способа оплаты нужно обновлять checkout:
jQuery(function ($) {
$('form.checkout').on('change', 'input[name="payment_method"]', function () {
$('body').trigger('update_checkout');
});
}); |
jQuery(function ($) { $('form.checkout').on('change', 'input[name="payment_method"]', function () { $('body').trigger('update_checkout'); }); });
Главное — заранее решить юридическую и бухгалтерскую логику. «С НДС» и «без НДС» часто нельзя оформлять как простую наценку кнопкой, потому что меняются документы, налоги и условия продажи.

Наценку за вид оплаты в WooCommerce можно добавить через комиссию в корзине. Делается это хуком
woocommerce_cart_calculate_fees, где проверяется выбранный метод оплаты и добавляется нужная сумма или процент.Пример: добавить 3% при оплате конкретным способом:
add_action('woocommerce_cart_calculate_fees', function ($cart) { if (is_admin() && ! defined('DOING_AJAX')) { return; } $chosen = WC()->session ? WC()->session->get('chosen_payment_method') : ''; if ($chosen === 'cod') { $fee = $cart->get_subtotal() * 0.03; $cart->add_fee('Комиссия за выбранный способ оплаты', $fee, true); } });
Чтобы сумма пересчитывалась сразу при смене способа оплаты, на checkout обычно нужен стандартный JS-триггер WooCommerce. В большинстве тем он уже работает. Если нет, можно добавить обновление:
jQuery(function ($) { $('form.checkout').on('change', 'input[name="payment_method"]', function () { $('body').trigger('update_checkout'); }); });jQuery(function ($) { $('form.checkout').on('change', 'input[name="payment_method"]', function () { $('body').trigger('update_checkout'); }); });
Перед запуском проверьте юридическую сторону: в некоторых сценариях комиссия за способ оплаты должна быть явно показана клиенту до оформления заказа.