Специальная скидка купона WooCommerce в зависимости от категории продукта

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

Функция работает, но выполняется n раз, где n зависит от количества товаров в корзине.

add_filter( 'woocommerce_coupon_get_discount_amount', 'alter_shop_coupon_data', 1, 5 );
function alter_shop_coupon_data( $discount, $discounting_amount, $cart_item, $single, $instance ){
    $coupons = WC()->cart->get_coupons();
    $cart_items = WC()->cart->get_cart();

    foreach ( $coupons as $code => $coupon ) {
        if ( $coupon->discount_type == 'percent' && $coupon->code == 'newsite' ) {
            foreach ($cart_items as $cart_item){
                $product_id = $cart_item['data']->id;                 
                
                if( has_term( 'cat1', 'product_cat', $product_id ) ){
                    $quantity = $cart_item['quantity'];
                    $price = $cart_item['data']->price;
                    $discount_20 = 0.2 * ($quantity * $price); //  20%

                }else{
                    $quantity = $cart_item['quantity'];
                    $price = $cart_item['data']->price;
                    $discount_10 = 0.1 * ($quantity * $price); //10%
                }
            }
        }
    }
    $discounting_amount = ($discount_20 + $discount_10);
    return $discounting_amount;
}

person Stefano P86    schedule 12.03.2021    source источник


Ответы (1)


Начиная с WooCommerce 3, в вашем коде много ошибок ... Также в функцию включен аргумент $cart_item, поэтому вам не нужно перебирать элементы корзины.

Также обратите внимание, что $coupon->is_type('percent') (тип купона) не требуется, поскольку в вашем коде указан конкретный купон: $coupon->get_code() == 'newsite.

Попробуйте следующее:

add_filter( 'woocommerce_coupon_get_discount_amount', 'alter_shop_coupon_data', 100, 5 );
function alter_shop_coupon_data( $discount, $discounting_amount, $cart_item, $single, $instance ){
    // Loop through applied WC_Coupon objects
    foreach ( WC()->cart->get_coupons() as $code => $coupon ) {
        if ( $coupon->is_type('percent') && $coupon->get_code() == 'newsite' ) {
            $discount = $cart_item['data']->get_price() * $cart_item['quantity'];
 
            if( has_term( 'cat1', 'product_cat', $cart_item['product_id'] ) ){
                $discount *= 0.2; // 20%
            }else{
                $discount *= 0.1; // 10%
            }
        }
    }
    return $discount;
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Он должен работать лучше.

person LoicTheAztec    schedule 12.03.2021