Как сделать наценку за вид оплаты в Woocommerce?

Ссылка скопирована
2 ответов

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

Есть 3 вида оплаты:

- Наличный расчёт
- Без НДС
- С НДС

У каждого товара есть 3 цены для каждого вида оплаты, но нужно сделать так, чтобы выбор оплаты менял сразу для всех товаров цену по своему прайсу

Допустим, товар "Уголь 1"
Наличный расчёт - 180₽
Без НДС - 200₽
С НДС - 240₽

Товар "Уголь 2"
Наличный расчёт - 100₽
Без НДС - 110₽
С НДС - 132₽

Заранее большое спасибо тому кто поможет!

Дополнительные вопросы

Ответы:

Использовать скидочные плагины с отрицательной скидкой

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
2
Есть ответ! Ответ

Наценку за вид оплаты в 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);
    }
});

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'); }); });

Перед запуском проверьте юридическую сторону: в некоторых сценариях комиссия за способ оплаты должна быть явно показана клиенту до оформления заказа.

Другие ответы (1) Ответить на вопрос
Павел Админов

Если у каждого товара уже есть три разные цены под тип оплаты, то это не совсем «наценка за оплату». Это скорее разные прайсы. В 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'); }); });

Главное — заранее решить юридическую и бухгалтерскую логику. «С НДС» и «без НДС» часто нельзя оформлять как простую наценку кнопкой, потому что меняются документы, налоги и условия продажи.

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно