Динамическая информация, основанная на способе доставки и общей сумме заказа в Woocommerce

Кажется, это должно быть просто, но я не могу туда добраться.

Цель: мне нужно отображать уведомление пользователям, когда они меняют способ доставки, если общее количество корзин меньше требуемого предела.

Я написал функцию в файле functions.php

function min_delivery(){

//Get Chosen Shipping Method//
$chosen_methods = WC()->session->get( 'chosen_shipping_methods' );
$chosen_shipping = $chosen_methods[0];
//end method


//check if they've chosen delivery
if ($chosen_shipping == 'flat_rate:2') {

//set cart minimum
$minimum = 15.00;
//get cart total - 2.00 is the delivery fee
$total = WC()->cart->total-2.00;
// check if the total of the cart is less than the minium
if ( $total < $minimum ) {
//check if it's in the cart
if( is_cart() ) {

wc_print_notice(
sprintf( 'Minimum £15.00 for Delivery' ,
wc_price( $minimum ),
wc_price( $total )
), 'error'
);
//else at checkout
} else {

wc_add_notice(
sprintf( 'Min 15.00 for Delivery' ,
wc_price( $minimum ),
wc_price( $total )
), 'error'
);
}

}//end of total less than min

//else they have pick up
} else {
//set cart minimum
$minimum = 4.50;
//get cart total - 2.00 is the delivery fee
$total = WC()->cart->total-2.00;
if ( $total < $minimum ) {
//check if it's in the cart
if( is_cart() ) {

wc_print_notice(
sprintf( 'Minimum £15.00 for Delivery' ,
wc_price( $minimum ),
wc_price( $total )
), 'error'
);
//else at checkout
} else {

wc_add_notice(
sprintf( 'Min 15.00 for Delivery' ,
wc_price( $minimum ),
wc_price( $total )
), 'error'
);
}

}//end of total less than min
}//end pickup/delivery else


}//end function

Теперь вызов этой функции с формой before checkout прекрасно работает

add_action( 'woocommerce_before_checkout_form' , 'min_delivery' );

Однако моя проблема в том, что когда люди обновляют доставку на лету, то есть выбирают между ними. Я подумал, что будет крюк, который я мог бы использовать, например, один из них

//add_action( 'woocommerce_checkout_process', 'min_delivery' );
//add_action( 'update_order_review' , 'min_delivery' );
//add_action( 'woocommerce_review_order_after_shipping' , 'min_delivery' );
add_action( 'woocommerce_before_checkout_form' , 'min_delivery' );
//add_action( 'woocommerce_after_checkout_shipping_form', 'min_delivery' );
//add_action('woocommerce_cart_totals_after_shipping', 'min_delivery');

Однако никто из них не делает эту работу. Когда я смотрю в консоль, при обновлении происходит вызов AJAX ?wc-ajax=update_order_review но я не мог вцепиться в это

Я блуждаю, если я лаю здесь не то дерево, и вы даже можете исправить страницу с помощью хуков и функций, как PHP уже рендерит?

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

1

Решение

Я пересмотрел и попытался упростить ваш код. Следующее добавит условно пользовательское информационное сообщение (обновляется динамически) в таблицу итогов корзины и оформления заказа после строк доставки:

add_action( 'woocommerce_cart_totals_after_shipping', 'shipping_notice_displayed', 20 );
add_action( 'woocommerce_review_order_after_shipping', 'shipping_notice_displayed', 20 );
function shipping_notice_displayed() {
if ( did_action( 'woocommerce_cart_totals_after_shipping' ) >= 2 ||
did_action( 'woocommerce_review_order_after_shipping' ) >= 2 ) {
return;
}

// Chosen Shipping Method
$chosen_shipping_method_id = WC()->session->get( 'chosen_shipping_methods' )[0];
$chosen_shipping_method    = explode(':', $chosen_shipping_method_id)[0];
$cart_subtotal             = WC()->cart->subtotal; // No need to remove the fee

// Settings
$cart_minimum1             = 4.5;
$cart_minimum2             = 15;

// HERE define the cart mininimum (When delivery is chosen)
if ( $cart_subtotal < $cart_minimum2 && $chosen_shipping_method != 'flat_rate' ) {
$cart_minimum = $cart_minimum1;
} elseif ( $cart_subtotal < $cart_minimum2 && $chosen_shipping_method == 'flat_rate' ) {
$cart_minimum = $cart_minimum2;
}

// Display a message
if( isset($cart_minimum) ){
// The message
$message =  sprintf( '%s %s for Delivery' ,
is_cart() ? 'Minimum' : 'Min',
strip_tags( wc_price( $cart_minimum, array('decimals' => 2 ) ) )
);

// Display
echo '</tr><tr class="shipping info"><th>&nbsp;</th><td data-title="Delivery info">'.$message.'</td>';
}
}

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]