简体   繁体   中英

Add a discount for specific selected payment method in WooCommerce

Without a using coupon functionality I would like to apply a 15% discount for a specific payment method ID like 'xyz'.

I would like help identifying which hooks to use. The general idea of what I would like to achieve is:

if payment_method_hook == 'xyz'{
    cart_subtotal = cart_subtotal - 15%
}

The customer does not need to see the discount on this page. I would like the discount to be submitted properly, only for the specific payment method.

You can use this custom function hooked in woocommerce_cart_calculate_fees action hook, that will make a discount of 15% for a defined payment method.

You should need to set in this function your real payment method ID (like 'bacs', 'cod', 'cheque' or 'paypal') .

The 2nd function will refresh checkout data each time that a payment method is selected.

The code:

add_action( 'woocommerce_cart_calculate_fees','shipping_method_discount', 20, 1 );
function shipping_method_discount( $cart_object ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) ) return;

    // HERE Define your targeted shipping method ID
    $payment_method = 'bacs';

    // The percent to apply
    $percent = 15; // 15%

    $cart_total = $cart_object->subtotal_ex_tax;
    $chosen_payment_method = WC()->session->get('chosen_payment_method');

    if( $payment_method == $chosen_payment_method ){
        $label_text = __( "Shipping discount 15%" );
        // Calculation
        $discount = number_format(($cart_total / 100) * $percent, 2);
        // Add the discount
        $cart_object->add_fee( $label_text, -$discount, false );
    }
}

add_action( 'woocommerce_review_order_before_payment', 'refresh_payment_methods' );
function refresh_payment_methods(){
    // jQuery code
    ?>
    <script type="text/javascript">
        (function($){
            $( 'form.checkout' ).on( 'change', 'input[name^="payment_method"]', function() {
                $('body').trigger('update_checkout');
            });
        })(jQuery);
    </script>
    <?php
}

Code goes in function.php file of your active child theme (or active theme).

Tested and works.

这可能会对其他人有所帮助。我需要检查两种付款方式,并检查用户是否是特定角色。

if (($chosen_payment_method == 'stripe' || $chosen_payment_method == 'paypal') && current_user_can('dealer')) {

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM