Woocommerce — update_order_review становится 502 после add_discount программно

#wordpress #woocommerce #coupon

#wordpress #woocommerce #купон

Вопрос:

Мне нужна помощь. Я хочу реализовать, добавить существующий купон в корзину, когда будут выполнены некоторые условия. У меня нет ничего плохого в этом условии. Но, когда функция собирается добавить скидку к купону, wc-ajax=update_order_review становится 502.

Однако, если я делаю другие вещи, такие как изменение адреса или что-то, что может быть запущено повторно update_order_review , оно становится 200. update_order_review успешно запущен, и купон добавлен в корзину.

Пока это мой код функции, и я скопировал некоторый код с форума stackoverflow

 add_action('woocommerce_before_calculate_totals', 'discount_based_on_weight_threshold');
function discount_based_on_weight_threshold( $cart ) {
    if (  ! defined( 'DOING_AJAX' ) )
        return;

    // Your settings
    $coupon_code      = 'freeongkir8krpx'; // Coupon code

    // Initializing variables
    $applied_coupons  = $cart->get_applied_coupons();
    $coupon_code      = sanitize_text_field( $coupon_code );
    $methods = WC()->session->get( 'chosen_shipping_methods' );
    $method = isset( $methods[ 0 ] ) ? $methods[ 0 ] : false;
    $kupon = new WC_Coupon('freeongkir10k');
    
    if($method !== 'jne_shipping_test'){
        if($cart->get_subtotal() <= $kupon->get_minimum_amount()){
            $user = wp_get_current_user();
                error_log( 'CHECK USER ROLES');
                error_log( print_r($user->roles, TRUE) );
                if(in_array( 'administrator', (array) $user->roles )){
                    // Applying coupon
                    if( ! in_array($coupon_code, $applied_coupons)  ){
                        $cart->add_discount( $coupon_code );
                        wc_clear_notices();
                    }
                }
        } else {
            if( in_array($coupon_code, $applied_coupons) ){
                $cart->remove_coupon( $coupon_code );
            }   
        }
    } else {
        if( in_array($coupon_code, $applied_coupons) ){
            $cart->remove_coupon( $coupon_code );
        }
    }
}
  

Когда я отключаю $cart->add_discount( $coupon_code ); , он работает успешно, поэтому я уверен, что добавление скидки является триггером.

И поток, который я использовал

  1. Перейдите к оформлению заказа, условия выполнены, add_discount ошибка, повторный запуск другой функции update_order_review , применен купон.
  2. Изменить методы доставки, условия не выполнены, примененный купон удален
  3. Изменение методов доставки, выполнение условий, add_discount ошибка, update_order_review становится 502, повторный запуск другой функции update_order_review невозможен, бесконечная загрузка при проверке заказа

Итак, у меня есть какой-либо неправильный код или поток? или есть какие-либо способы обойти ошибку, поскольку при повторном запуске будет применен код update_order_review

Спасибо

Ответ №1:

Получаете ли вы какую-либо полезную информацию в консоли вашего браузера или в журнале ошибок wp?

Если я правильно помню, 502 в запросе AJAX означает, что код не может дать вам правильный ответ. Хм, у меня пока нет полезного ответа.

Я немного переработал ваш код, чтобы улучшить читаемость.
Это должно делать именно то, что делает ваш код.

add_discount() был переименован apply_coupon() — возможно, попробуйте это.

 <?php
add_action('woocommerce_before_calculate_totals', 'discount_based_on_weight_threshold');
function discount_based_on_weight_threshold( $cart ) {
    if (  ! defined( 'DOING_AJAX' ) )
        return;

    // Your settings
    $coupon_code      = 'freeongkir8krpx'; // Coupon code

    // Initializing variables
    $applied_coupons = $cart->get_applied_coupons();
    $coupon_code     = sanitize_text_field( $coupon_code );
    $methods         = WC()->session->get( 'chosen_shipping_methods' );
    $method          = isset( $methods[ 0 ] ) ? $methods[ 0 ] : false;
    $kupon           = new WC_Coupon('freeongkir10k');

    // remove code if already applied
    if( in_array($coupon_code, $applied_coupons) ){
       $cart->remove_coupon( $coupon_code );
    }
    
    if(
        $method !== 'jne_shipping_test') amp;amp;
        $cart->get_subtotal() <= $kupon->get_minimum_amount()
    ){
        $user = wp_get_current_user();
        error_log( 'CHECK USER ROLES');
        error_log( print_r($user->roles, TRUE) );
        if( in_array( 'administrator', (array) $user->roles ) ){
            // Applying coupon
            $cart->apply_coupon( $coupon_code );
            wc_clear_notices();
        }
    } 
}
  

Комментарии:

1. Спасибо за вашу помощь. Я посмотрел на ошибку wp, но она ничего не показывает, кроме моего error_log кода отладки. И в консоли браузера у меня есть только то POST https://www.[mypage].com/?wc-ajax=update_order_review 502 (Bad Gateway) , что я уже изменил add_discount на apply_coupon, но это не дало никаких изменений