wordpress - 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 );
时,它运行成功,所以我很确定添加折扣是触发器。
我使用的流程是
- 去结帐,条件满足,
add_discount
错误,另一个功能重新运行update_order_review
,优惠券应用。 - 更改运输方式,未满足条件,应用的优惠券被删除
- 更改运输方式,满足条件,
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();
}
}
}
推荐阅读
- reactjs - 如何使它只有一个函数 fetchData?
- swift - 通过代码以模态方式实例化 viewcontrolelr 时出错
- c# - 如何按升序对具有逗号分隔字符串的数组进行排序
- netty - 将 jdk.tls.client.protocols 系统属性设置为 TLSv1.2 在 netty 4.1.48 中不起作用
- matplotlib - 如何使用 Matplotlib 在小数点后 2 位进行注释
- python - Python:嵌套字典一次更改所有值
- java - KafkaConsumer.commitSync() 实际上提交了什么?
- excel - 如何通过更改功能区选项卡触发宏?
- typescript - 使用 typescript 本地测试 firebase 函数
- c++ - 矩阵乘法在 C++ 犰狳中不起作用