Я хочу автоматически применять код купона при оформлении заказа, если вес всех продуктов превышает 10 кг и только на платежном шлюзе «cod». Я получаю код из других ответов, и он почти работает, но есть странная вещь. После заявления if при использовании купона моя корзина не рассчитывается, а просто замораживается. Второе, если утверждение работает правильно. Я не понимаю, почему это происходит. Что я делаю неправильно?
На основе " Применить купон программно в Woocommerce " код ответа, вот моя попытка:
add_action('woocommerce_before_calculate_totals', 'discount_based_on_weight_threshold');
function discount_based_on_weight_threshold( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Initializing variables
$coupon_code = 'predoplata'; // Coupon code
$weight_threshold = 10; // Total weight threshold
$total_weight = $cart->get_cart_contents_weight();
$applied_coupons = $cart->get_applied_coupons();
$coupon_code = sanitize_text_field( $coupon_code );
$payment_method = 'cod';
$chosen_payment_method = WC()->session->get('chosen_payment_method');
$payment = false;
if ($payment_method == $chosen_payment_method) {
$payment = true;
}
// Applying coupon
if( (! in_array($coupon_code, $applied_coupons) && $total_weight >= $weight_threshold) && ($payment) ){
$cart->add_discount( $coupon_code );
}
// Removing coupon
elseif ( (in_array($coupon_code, $applied_coupons) && $total_weight < $weight_threshold) || (! $payment) ) {
$cart->remove_coupon($coupon_code);
}
}
Затем я проверяю, если пользователь измененный платежный шлюз
add_action( 'woocommerce_review_order_before_payment', 'payment_methods_trigger_update_checkout' );
function payment_methods_trigger_update_checkout(){
// jQuery code
?>
<script type="text/javascript">
(function($){
$( 'form.checkout' ).on( 'change', 'input[name^="payment_method"]', function() {
setTimeout(function(){
$(document.body).trigger('update_checkout');
}, 250 );
});
})(jQuery);
</script>
<?php
}
add_action( 'woocommerce_checkout_update_order_review', 'refresh_shipping_methods' );
function refresh_shipping_methods( $post_data ){
WC()->cart->calculate_shipping();
}
Вот что происходит, когда применяется купон: