首页 > 解决方案 > Woocommerce - 以编程方式添加折扣后 update_order_review 变为 502

问题描述

我需要一些帮助。我想实现,在满足某些条件时将现有优惠券添加到购物车。我的情况没有任何问题。但是,当该功能要为优惠券添加折扣时,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重新运行,它将应用代码

谢谢

标签: wordpresswoocommercecoupon

解决方案


您是否在浏览器控制台或 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();
        }
    } 
}

推荐阅读