Woocommerce conditional part cart discount on the same product present with > 1 variation

只愿长相守 提交于 2019-12-12 03:48:16

问题


My woocommerce products are actually cruise expeditions (two products = two expedition types). For each product, the variations consists of the weeks in which cruises take place (= dates). So I have Ligurian Sea Expeditions with 20 different weeks and Greece Expeditions with other 20 weeks. Fortunately I have just 2 products like that to deal with (a very simple situation)

The customer usually chooses one week expedition. However I need to apply a 10% discount on the second (or third) week in case a customer decides to apply for > 1 week. Hence the first week is paid full price, but the second and (in case there is) the third week will be discounted 10%.

I have come out with a function that enables to apply the discount in the case of two weeks.

function cart_discount() {

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

    global $woocommerce; $cat_count = 0; 

    $cart = WC()->cart->get_cart();

    foreach($cart as $cart_item_key => $values) { 
        $product_id = $values['product_id']; // product ID (= cruise type)
        $variation_id = $values['variation_id']; // variation (=week)
        $cart_lines_total = $values["line_total"]; //variation total price
        $cart_lines_quantity = $values["quantity"];// variation quantity

            //$product = 1394 = Expedition Ligurian eng
            //$product = 1389 = Expedition Greece eng
            //$product = 13888 = Expedition Ligurian ita
            //$product = 13910 = Expedition Greece ita

        //I hereby add a condition as we do have the same cruises with students prices which are not eligible to this discount (and are stored with different product_id)
        if($product_id == '1394' || $product_id == '1389' || $product_id == '13888' || $product_id == '13910')
        {
            //put in a new array only the terms I need for the calculation later
            $cart_array []= array( $product_id , $variation_id, $cart_lines_quantity, $cart_lines_total);
        }
    }


        // discount percent is 10%
        $percent = -0.10;

    if ($cart_array[0][0] == $cart_array[1][0]) //if in the cart the same product is present two times
    {
        $discount = $percent * $cart_array[1][2] * $cart_array[1][3];
        $discount_text = __( 'Quantity discount', 'woocommerce' );
        WC()->cart->add_fee( $discount_text, $discount, false );
    }


}
add_action( 'woocommerce_cart_calculate_fees','cart_discount' );

This code has many limitations as I said before, as it doesn't take in acccount some scenarios such as:

1) it deals only if in the cart tere are only two variations of the same product: in case a customer decides for x weeks to be purchased I should be able to check if the same product is present with > 2 variations;

2) It doesn't take into account the possibility having the two products with 2 ore more variations (ie.a person buying let's say two weeks in Ligurian Sea and two weeks in Greece)

If somebody can help me in improving the code I wrote I would be very happy!!


回答1:


Just to make sure i got it right, you want to apply a discount if the customer buys more than 1 variation of the same product. Correct?




回答2:


Here is the final code I wrote (it works, I have tested it)

function cart_discount() {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    global $woocommerce; 


            $cart = WC()->cart->get_cart();

            $has_coupons = count(WC()->cart->applied_coupons)>0?true:false;

            if(!$has_coupons) //verifies that other discounts are not added
            {
                  foreach($cart as $cart_item_key => $values) { 
                      $product_id = $values['product_id']; // product ID
                      $variation_id = $values['variation_id']; // product quantity
                      $cart_lines_total = $values["line_total"];
                      $cart_lines_quantity = $values["quantity"];

                          //products for which this kind of discount must be applicable:
                          //$product_id = 1394 = Spedizioni CSR eng
                          //$product_id = 1389 = Spedizioni IDP eng
                          //$product_id = 13888 = Spedizioni CSR ita
                          //$product_id = 13910 = Spedizioni IDP ita

                      if($product_id == '1394' || $product_id == '1389' || $product_id == '13888' || $product_id == '13910')
                      {
                          $cart_array []= array( $product_id , $variation_id, $cart_lines_quantity, $cart_lines_total);
                      }
                  }

                      $conteggio = count($cart_array); //conta il numero di prodotti nel carrello 
                      // percent is 10%
                      $percent = -0.10;

                  if ($conteggio < 3 && $cart_array[0][0] == $cart_array[1][0])
                  { 
                      $discount = $percent *  $cart_array[1][3];
                      $discount_text = __( '10% discount on subsequent week(s)', 'woocommerce' );
                      WC()->cart->add_fee( $discount_text, $discount, false );
                  }
                  if ($conteggio < 4 && $cart_array[0][0] == $cart_array[1][0] && $cart_array[0][0] == $cart_array[2][0])
                  {
                      $discount = ($percent * $cart_array[1][3]) + ($percent * $cart_array[2][3]);
                      $discount_text = __( '10% discount on subsequent week(s)', 'woocommerce' );
                      WC()->cart->add_fee( $discount_text, $discount, false );
                  }
                  if ($conteggio < 5 && $cart_array[0][0] == $cart_array[1][0] && $cart_array[0][0] == $cart_array[2][0] && $cart_array[0][0] == $cart_array[3][0])
                  {
                      $discount = ($percent * $cart_array[1][3]) + ($percent * $cart_array[2][3]) + ($percent * $cart_array[3][3]);
                      $discount_text = __( '10% discount on subsequent week(s)', 'woocommerce' );
                      WC()->cart->add_fee( $discount_text, $discount, false );
                  }
            } else return;


}
add_action( 'woocommerce_cart_calculate_fees','cart_discount' );

As you see, I had to specify the product_id of the products that are interested in this particular kind of discount, which is fine for me, although it would be nicier if we could set it to categories (I didn't have the time to develop that condition) Secondly, the part I don't like is the following

if ($conteggio < 3 && $cart_array[0][0] == $cart_array[1][0])

and all the following conditions: I was looking for a function that may go through the $cart_array and find the relations thta I set manually in each if() condition.

Thanks



来源:https://stackoverflow.com/questions/40833494/woocommerce-conditional-part-cart-discount-on-the-same-product-present-with-1

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!