Woocommerce-以编程方式在add_discount之后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,它将应用代码

谢谢

解决方法

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...