Управление условными купонами и дополнительными сборами на корзине / оформлении заказа Woocommerce

У меня возникли проблемы с управлением купонами, которые не используются в настоящее время, и настраиваемыми дополнительными полями на странице корзины и оформления заказа.

Я создал функцию, которая добавляет скидку только в том случае, если в корзине присутствует товар с более чем одним вариантом, и скидка применяется только ко второму (или третьему) варианту, а НЕ к первому. Вы можете найти мой последний код здесь Woocommerce условная скидка на корзину запчастей на тот же товар, который есть ›1 вариант

Однако пришлось пойти дальше, так как у меня особая непростая ситуация. Обычно описанное выше условие не может применяться, когда в корзине есть другие скидки (например, стандартные купоны на скидку). Поэтому я добавил эти две строки сразу после того, как получил корзину

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

    if(!$has_coupons) {
    //here goes the function that I did
    } else return;

Все нормально, работает. Однако есть особая ситуация, в которой я должен применить купон к корзине (не%), который уменьшает всю корзину на определенную сумму. Этот конкретный купон МОЖЕТ идти вместе со скидкой, созданной в функции, которую я написал!

  /* get coupon code*/
function get_coupon_code() {
    global $woocommerce;
    if ( !empty( $woocommerce->cart->applied_coupons ) ) {
         $my_coupon_code = $woocommerce->cart->get_coupons() ;
         foreach($my_coupon_code as $coupon){

            if ( $post = get_post( $coupon->id ) ) {
                    $coupon_code= $coupon->code;
            }
        }
    }
    return $coupon_code;
}  
  /* get coupon amount*/
function get_coupon_amount() {
    global $woocommerce;
    if ( ! empty( $woocommerce->cart->applied_coupons ) ) {
         $my_coupon_amount = $woocommerce->cart->get_coupons() ;
         foreach($my_coupon_amount as $coupon){
                        $coupon_amount =$coupon->coupon_amount;
        }
    }
    return $coupon_amount;
} 

function cart_discount() {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;
    global $woocommerce;
    //get the code and amount of the coupon applied
    $coupon_code =  get_coupon_code();
    $coupon_amount = get_coupon_amount();
    //check if the code corresponds to the coupon exception I want to accept 
    if ($coupon_code == 'wa-1'){
        //if it is the code I need to apply, then I remove it from the cart
        WC()->cart->remove_coupon($coupon_code);
          //I use the amount to add it as additional fee at negative 
          $coupon_discount = -($coupon_amount);
          //I add the ex-coupon amount to an additional field
          $discount_agency_text = __( 'Detracted agency fee', 'woocommerce' );
          WC()->cart->add_fee( $discount_agency_text, $coupon_discount, false );
      }
  //and following the function previously mentioned

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

      $has_coupons = count(WC()->cart->applied_coupons)>0?true:false;
      //check if there are other coupons or if the coupon applied are the case I want to pass through my function
      if(!$has_coupons || $coupon == 'wa-1')          {

        //here follows the strings to apply a 10% discount on the second (third) variation of the product and not on the first one

            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"];

                    //product id to be considered for this discount
                    //$product = 1394 = Spedizioni CSR eng
                    //$product = 1389 = Spedizioni IDP eng
                    //$product = 13888 = Spedizioni CSR ita
                    //$product = 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); //counts the number of items in teh cart 
                // percent is 5%
                $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' );

Проблема, с которой я столкнулся, заключается в том, что часть, касающаяся управления купоном на скидку, не работает. Он получает $ coupon_code и $ coupon_amount, но не добавляет их в раздел дополнительных полей.

Кто-нибудь может мне помочь?


person Elena Politi    schedule 01.12.2016    source источник


Ответы (2)


Красиво оформлено!

Этот плагин может легко решить проблему, он позволяет вам взимать дополнительную плату в корзине на основе комбинации нескольких условных правил, которые вы настраиваете в своем магазине woocommerce.

Надеюсь, это поможет!

Условная плата за продукт WooCommerce при оформлении заказа

person tirth parikh    schedule 11.01.2017
comment
Ссылки очень приветствуются в ответах, но ответы всегда должны содержать важную информацию из ссылки, поскольку ссылки могут изменяться. Спасибо! - person AJT82; 11.01.2017

Я все еще придерживаюсь этой аргументации, но сейчас я пытаюсь ее упростить.

На самом деле я могу просто использовать купонную скидку, которая работает вместе с моей функцией (которая, если у меня есть продукт с> then вариацией, она добавляет 10% скидку только на следующий вариант, а не на первый).

Проблема в том, что если я использую купон (= 80 €), примененный к корзине, он все равно распространяется на различные товары, и 10% скидка рассчитывается по более низкой цене (а не по обычной цене).

Моя проблема будет решена, если я смогу применить купон к итоговой сумме корзины, а не на отдельные товары. Это возможно?

Чтобы привести вам пример, мой массив $ cart_array перед применением купона

Array
(
    [0] => Array
        (
            [0] => 1394 //product_id
            [1] => 1851 //variation_id
            [2] => 1 //quantity
            [3] => 906 //regular price
        )

    [1] => Array
        (
            [0] => 1394 //product_id
            [1] => 1852 //variation_id
            [2] => 1 //quantity
            [3] => 906 //regular price
        )

)

Если на этом этапе я применю купон, массив изменится на:

Array
(
    [0] => Array
        (
            [0] => 1394
            [1] => 1851
            [2] => 1
            [3] => 866 //price after coupon
        )

    [1] => Array
        (
            [0] => 1394
            [1] => 1852
            [2] => 1
            [3] => 866 //price after coupon
        )

)

Как видите, второй товар не больше 906, а 866, поэтому скидка 10% меньше.

Есть ли способ применить купон только к первому элементу массива? Или применить его по окончательной сумме (после расчета дополнительной комиссии)?

person Elena Politi    schedule 02.12.2016