Замените один купон на другой после добавления купона


У меня есть два купона, один на 10 долларов, другой на 5 долларов. Я хочу сделать следующее, если цена будет меньше 50 долларов, и клиент введет купон на скидку 10 долларов, замените этот купон купоном 5 долларов.

Пример:

Клиент добавил товар в корзину общей стоимостью 40 долларов США и применил купон на скидку 10 долларов. Теперь мне нужно заменить текущий купон на скидку в размере 10 долларов на мой другой купон в размере 5 долларов и продолжить оформление заказа.

Какой самый лучший и простой способ я могу использовать? Я пытаюсь изменить цену со скидкой, например в коде ниже и это работает, но в других местах WC показывает мне старый купон и вычисляет все данные из старого купона (на странице заказа и т. Д.), Поэтому мне действительно нужно ЗАМЕНИТЬ один купон на другой (не вычислять их цену), когда этот купон добавлен. Это похоже на то, как клиент вводит купон на скидку в размере 5 долларов непосредственно в поле скидки

// Change price for discount
if( ! function_exists('custom_discount') ){

  function custom_discount( $price, $values, $instance ) {

    //$price represents the current product price without discount
    //$values represents the product object
    //$instance represent the cart object

    //Get subtotal
    $subtotal = WC()->cart->get_subtotal();
    $coupon = WC()->cart->get_discount_total();

    //if price < 50 and we have active coupon then we need decrease price to $5
    if( $subtotal < 50 && ! empty( WC()->cart->get_applied_coupons() ) ){
      $price = $subtotal  - 5; //Wrong way ...
    }
    return $price;
  }

  add_filter( 'woocommerce_get_discounted_price', 'custom_discount', 10, 3);

}
Author: Brotheryura, 2020-03-14

2 answers

Для этого требуется использовать крючок действия, такой как woocommerce_calculate_totals, который связан с корзиной и Ajax включен, потому что он будет обрабатывать все изменения, внесенные клиентом на странице корзины:

add_action( 'woocommerce_calculate_totals', 'discount_based_on_cart_subtotal', 10, 1 );
function discount_based_on_cart_subtotal( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Avoiding hook repetitions
    if ( did_action( 'woocommerce_calculate_totals' ) >= 2 )
        return;

    // Your coupons settings below
    $coupon_05_off = '$5-Off';
    $coupon_10_off = '$10-Off';

    // When cart subtotal is below 50
    if ( $cart->subtotal < 50 ) {
        if ( $cart->has_discount( $coupon_10_off ) ) {
            $cart->remove_coupon( $coupon_10_off ); // Remove $10.00 fixed discount coupon
            if ( ! $cart->has_discount( $coupon_05_off ) ) {
                 $cart->apply_coupon( $coupon_05_off ); // Add $5.00 fixed discount coupon
            }
        }

    }
    // When cart subtotal is up to 50
    else {
        if ( $cart->has_discount( $coupon_05_off ) ) {
            $cart->remove_coupon( $coupon_05_off ); // Remove $5.00 fixed discount coupon
            if ( ! $cart->has_discount( $coupon_10_off ) ) {
                $cart->apply_coupon( $coupon_10_off ); // Add $10.00 fixed discount coupon
            }
        }
    }
}

Вводится код functions.php файл вашей активной дочерней темы (или активной темы). Проверено и работает.

 1
Author: LoicTheAztec, 2020-03-19 18:12:23

Я протестировал это и могу подтвердить, что это работает, даже после того, как вы измените товары в корзине на сумму ниже или выше 50 долларов США.

<?php
/**
 * @snippet Add / Remove A Coupon Dynamically based on Cart Subtotal with WooCommerce
 * @sourcecode http://wpharvest.com
 * @author Dragos Micu
 * @compatible WooCommerce 2.4.7
 */
add_action( 'woocommerce_calculate_totals', 'wpharvest_apply_coupons' );
function wpharvest_apply_coupons($cart) {
    global $woocommerce;
    // Set your coupon codes
    $coupon10off = '$10-Off';
    $coupon5off = '$5-Off';

    // Get the cart subtotal
    $cart_subtotal = $cart->subtotal;
    // If cart subtotal is less than 50 add or remove coupons
    if ($cart_subtotal < 50) {
        if ( $woocommerce->cart->has_discount( $coupon10off ) ) {
            WC()->cart->remove_coupon( $coupon10off );
            $woocommerce->cart->add_discount( $coupon5off );
        }
    }
    // If cart subtotal is greater 49 add or remove coupons
    if ($cart_subtotal > 49 ) {
        if ( $woocommerce->cart->has_discount( $coupon5off ) ) {
            WC()->cart->remove_coupon( $coupon5off );
            $woocommerce->cart->add_discount( $coupon10off );
        }
    }
}
 0
Author: Dragos Micu, 2020-03-19 17:50:35