Скидка на корзину WooCommerce со второго товара только на обычные товары

Я нашел этот фрагмент кода в stackoverflow, он делает то, что мне нужно, за исключением того, что мне нужно применить скидку -5 € для каждого продукта сразу после добавления 2 продуктов в корзину.

Пример:

  • за 1 товар в корзине пользователь получит скидку 0€
  • за 2 товара в корзине пользователь получит скидку 5€
  • за 3 товара в корзине пользователь получит скидку 10€
  • за 4 товара в корзине пользователь получит скидку 15€
  • за 5 товаров в корзине пользователь получит скидку 20€

и так далее...

add_action('woocommerce_cart_calculate_fees' , 'custom_discount', 10, 1);
function custom_discount( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) && ! is_user_logged_in() )
    // if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    // Only when there is 2 or more items in cart
    if( $cart->get_cart_contents_count() >= 2):

        // Initialising variable
        $is_on_sale = false;

        // Iterating through each item in cart
        foreach( $cart->get_cart() as $cart_item ){
            // Getting an instance of the product object
            $product =  $cart_item['data'];

            // If a cart item is on sale, $is_on_sale is true and we stop the loop
            if($product->is_on_sale()){
                $is_on_sale = true;
                break;
            }
        }

        ## Discount calculation ##
        // fixed reduction price
        $reduction = 5;


        ## Applied discount (no products on sale) ##
        if(!$is_on_sale )
            $cart->add_fee( '-5€ à partir du 2ème article commandé', -$reduction);

    endif;
}

Любая помощь приветствуется.


person user832375    schedule 04.05.2020    source источник


Ответы (2)


Вам лучше использовать следующее, которое будет учитывать только обычные товары (не товары со скидкой) и будет применять скидку на основе этого конкретного количества, начиная со 2-го товара:

add_action('woocommerce_cart_calculate_fees' , 'progressive_fixed_discount', 10, 1);
function progressive_fixed_discount( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) && ! is_user_logged_in() )
    // if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // Initialising variable
    $regular_items_count = -1;

    // Iterating through each item in cart
    foreach( $cart->get_cart() as $cart_item ){

        // Count only on regular items (not "on sale" items)
        if( ! $cart_item['data']->is_on_sale() ){
            $regular_items_count += $cart_item['quantity'];
        }
    }
    
    // Only for regular items starting on the 2nd item (not "on sale" items)
    if ( $regular_items_count > 0 ) {

        // Progressive fixed discount calculation on regular items only
        $discount = 5 * $regular_items_count;


        // Apply a discount for "on sale" items only 
        $cart->add_fee( __("-5€ à partir du 2ème article commandé", "woocommerce"), -$discount );
    }
}

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


Некоторые связанные похожие темы ответов:


Дополнение — Исключение категории товаров:

Заменять:

if( ! $cart_item['data']->is_on_sale() ){

с:

if( ! $cart_item['data']->is_on_sale() && ! has_term( array( 5537 ), 'product_cat', $cart_item['product_id'] ) ) {
person LoicTheAztec    schedule 04.05.2020
comment
это работает как шарм. Сначала я проверил первый ответ, и он, похоже, работал, за исключением товаров со скидкой. - person user832375; 04.05.2020
comment
Чтобы исключить категорию продукта: см. в конце этого ответа, я сделал для вас дополнение (обновлено) - person LoicTheAztec; 04.05.2020

Вы так близко. Вы знаете количество товаров в корзине $cart->get_cart_contents_count() и хотите, чтобы скидка начиналась после первого товара.

Заменить $reduction = 5;

с этим $reduction = 5*($cart->get_cart_contents_count() - 1);

Ваш полный код должен выглядеть так:

add_action('woocommerce_cart_calculate_fees' , 'custom_discount', 10, 1);
function custom_discount( $cart ){
    if ( is_admin() && ! defined( 'DOING_AJAX' ) && ! is_user_logged_in() )
    // if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    // Only when there is 2 or more items in cart
    if( $cart->get_cart_contents_count() >= 2):

        // Initialising variable
        $is_on_sale = false;

        // Iterating through each item in cart
        foreach( $cart->get_cart() as $cart_item ){
            // Getting an instance of the product object
            $product =  $cart_item['data'];

            // If a cart item is on sale, $is_on_sale is true and we stop the loop
            if($product->is_on_sale()){
                $is_on_sale = true;
                break;
            }
        }

        ## Discount calculation ##
        // fixed reduction price
        $reduction = 5*($cart->get_cart_contents_count() - 1);


        ## Applied discount (no products on sale) ##
        if(!$is_on_sale )
            $cart->add_fee( '-5€ à partir du 2ème article commandé', -$reduction);

    endif;
}
person kaize    schedule 04.05.2020