【问题标题】:Woocommerce - update_order_review become 502 after add_discount programmaticallyWoocommerce - 以编程方式添加折扣后 update_order_review 变为 502
【发布时间】:2023-03-18 17:38:01
【问题描述】:

我需要一些帮助。我想实现,在满足某些条件时将现有优惠券添加到购物车。我的情况没有任何问题。但是,当该功能要为优惠券添加折扣时,wc-ajax=update_order_review 变为 502。

但是,如果我进行其他操作,例如更改地址或可以重新运行 update_order_review 的操作,它会变为 200。update_order_review 成功运行并将优惠券添加到购物车。

这是我目前的功能代码,我也从*论坛复制了一些代码

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-&gt;add_discount( $coupon_code ); 时,它会成功运行,所以我很确定添加折扣是触发因素。

我使用的流程是

  1. 去结账,条件满足,add_discount 错误,另一个函数重新运行update_order_review,优惠券已应用。
  2. 更改运输方式,未满足条件,已应用的优惠券已删除
  3. 更改运输方式,条件满足,add_discount 错误,update_order_review 变为 502,没有其他功能重新运行 update_order_review,结帐订单审查中无限加载

那么我有任何错误的代码或流程吗?或者有任何方法可以欺骗错误,因为如果重新运行update_order_review,它将应用代码

谢谢

【问题讨论】:

    标签: wordpress woocommerce coupon


    【解决方案1】:

    您是否在浏览器控制台或 wp 错误日志中获得任何有用的信息?

    如果我记得 AJAX 请求上的 502 正确,则表示代码无法为您提供有效响应。 嗯,我还没有有用的答案。

    我对您的代码进行了一些重构以提高可读性。
    这应该与您的代码完全一样。

    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') &&
            $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();
            }
        } 
    }
    

    【讨论】:

    • 感谢您的帮助。我查看了 wp 错误,但除了我的 error_log 调试代码外,它什么也没显示。在浏览器控制台中,我只有POST https://www.[mypage].com/?wc-ajax=update_order_review 502 (Bad Gateway) 我已经将 add_discount 更改为 apply_coupon,但它没有进行任何更改