Управление условными купонами и дополнительными комиссиями на корзину / оформление заказа 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, но не добавляет его в раздел дополнительных полей.
Кто-нибудь может мне помочь, пожалуйста?
2 ответа
Я все еще застрял в аргументе, но сейчас я пытаюсь сделать его проще.
На самом деле я могу просто использовать купонную скидку, которая работает вместе с моей функцией (которая, если у меня есть продукт с> затем вариацией, добавляет 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% меньше. Есть ли способ применить купон только к первому элементу массива? Или применить его к итоговой сумме (после расчета дополнительной платы)?
Красиво представлено!
Этот плагин может решить проблему легко, он позволяет вам взимать дополнительную плату в корзине, основываясь на комбинации нескольких условных правил, которые вы настраиваете в своем магазине woocommerce.
Я надеюсь, что это может помочь!