Скидка на корзину WooCommerce: один товар бесплатно в зависимости от количества товара - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь реализовать специальное правило скидки на корзину. В основном есть WooCommerce и на сайте продаются футболки. В настоящее время действует акция, согласно которой, если вы покупаете 3 футболки, вам нужно заплатить только за 2, а за одну с самой низкой ценой вы получаете бесплатно.

Я создал специальную функцию, используя крючок woocommerce_cart_calculate_fees и пока он работает.

Вот мой код:

add_action( 'woocommerce_cart_calculate_fees', 'iom_add_custom_discount', 10, 1 );
function iom_add_custom_discount( $wc_cart ){
    $discount = 0;
    $product_ids = array();
    $item_prices = array();
    $in_cart = true;

    foreach ( $wc_cart->get_cart() as $cart_item_key => $cart_item ) {
        $cart_product = $cart_item['data'];
        if ( has_term( 'detski-bodita', 'product_cat', $cart_product->get_id() ) ) {
            $in_cart = true;
        }else {
            $product_ids[] = $cart_product->get_id();
            $item_prices[$cart_product->get_id()] = $cart_product->get_price();
        }

    }

    if( $in_cart ) {
        $count_ids = count($product_ids);
        asort( $item_prices ); //Sort the prices from lowest to highest
        
        $count = 0;
        if( $count_ids == 3 ) { 
           foreach( $item_prices as $id => $price ) {
                if( $count >= 1 ) {
                    break;
                }
                //$product = wc_get_product( $id );
                //$price = $product->get_price();
                $discount -= ($price * 100) / 100;
                $count++;
           }
       }

    } 

    if( $discount != 0 ){
        $wc_cart->add_fee( 'Отстъпка', $discount, true  );
        # Note: Last argument in add_fee() method is related to applying the tax or not to the discount (true or false)
    }
}

Скидка отображается и применяется. Но, похоже, это работает, только если у меня в корзине 3 разных продукта. Если у меня есть 1 продукт с количеством 2 и 1 продукт с количеством 1, он не работает.

Как настроить функцию, чтобы вместо этого она работала для подсчета количества предметов?

Вот скриншот страница корзины:

введите описание изображения здесь

Изменить:

Объяснение категорий товаров в скидке:

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

Например, по категориям футболки и худи. Если у меня в корзине 3 футболки, должна действовать скидка. Если у меня 2 футболки и 1 капюшон ie, скидка не применяется.

1 Ответ

0 голосов
/ 04 августа 2020

После некоторых тестов и прочего мне удалось заставить его работать, как описано. Вот код:

add_action( 'woocommerce_cart_calculate_fees', 'iom_add_custom_discount', 10, 1 );
function iom_add_custom_discount( $wc_cart ){
    $discount = 0;
    $product_ids = array();
    $item_prices = array();
    $in_cart = false;

    foreach ( $wc_cart->get_cart() as $cart_item_key => $cart_item ) {
        $cart_product = $cart_item['data'];
        // var_dump($cart_product->get_parent_id());
        // var_dump(has_term( 'detski-bodita', 'product_cat', $cart_product->get_parent_id() ));

        // here we check if the products in the cart are in category 'detski-bodita'.
        // since these are variation products, we check if their parents have the category.
        // if they do we add them the $in_cart boolean to true.
        if ( has_term( 'detski-bodita', 'product_cat', $cart_product->get_parent_id() ) ) {
            $in_cart = true;
            // var_dump($cart_product);
            $product_ids[] = $cart_product->get_id();
            $item_prices[$cart_product->get_id()] = $cart_product->get_price(); 
        } else {
            $product_ids[] = $cart_product->get_id();
            $item_prices[$cart_product->get_id()] = $cart_product->get_price(); 
        }

    }

    // here we chek if we have products with $in_cart boolean to true 
    // and if they are in category 'detski-bodita'
    if( $in_cart && has_term( 'detski-bodita', 'product_cat', $cart_product->get_parent_id() )) {
        // var_dump($item_prices);
        $count_ids = count($product_ids); // We count the items we have
        asort( $item_prices ); //Sort the prices from lowest to highest
        

        $count = 0; // we add another counter for the products that will be discounted.
        // here we check if the minimum amount of products is met for the discount.
        if( $count_ids >= 3 ) { 
            foreach( $item_prices as $id => $price ) {
                if( $count >= 1 ) {
                // var_dump($price)
                    break;
                }
                //$product = wc_get_product( $id );
                //$price = $product->get_price();
                $discount -= ($price * 100) / 100; // this is the discount that we apply - 100%
                $count++; // increase the counter in order to stop after the max amount of discounted products
           }
       }

    }

    if( $discount != 0 ){
        $wc_cart->add_fee( 'Отстъпка', $discount, true  );
        # Note: Last argument in add_fee() method is related to applying the tax or not to the discount (true or false)
    }
}

Я все еще тестирую, но пока работает. Может быть, раньше главная проблема заключалась в том, что я не учел, что у продуктов есть вариации, и анализ категорий давал сбой. Когда я добавил get_parent_id (), я смог получить правильную категорию. Теперь мне просто нужно решить проблему с количеством. Например, если один продукт из категории имеет количество 2, а один - 1, или если один продукт из категории имеет количество 3 или более. Был бы очень признателен за помощь или любые идеи по улучшению. :) Спасибо :)

РЕДАКТИРОВАТЬ: Похоже, что если я выберу 3 продукта из правильной категории и 1 продукт из любой другой, скидка будет применена. Но когда я удаляю один из предметов из нужной категории, скидка все равно применяется, а не должна. :( Как бы это исправить? Спасибо :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...