WooCommerce按配送日期校验优惠券自定义函数失效求解决方案
WooCommerce 配送日期关联优惠券功能失效排查修复方案
常见失效原因及修复点
- 优惠券实例化方法过时:WooCommerce 3.0+版本更推荐使用
wc_get_coupon()函数获取优惠券实例,直接new WC_Coupon在部分高版本中可能出现元数据读取异常。 - 日期比较逻辑错误:原代码使用
d-m-Y格式的字符串直接比较,会出现跨月/跨年时比较结果不符合预期的问题,应转为时间戳或DateTime对象进行数值比较。 - 循环逻辑提前终止:原代码在foreach循环内任意分支都直接调用
wp_die(),如果用户同时应用了多张优惠券,仅会校验第一张就终止流程,完全不符合多优惠券使用场景。 - 全局变量冗余调用:代码中声明的
global $woocommerce完全未使用,且WooCommerce高版本已不推荐直接调用该全局变量,统一使用WC()方法获取实例即可。 - 缺少请求安全校验:高版本WordPress/WooCommerce会对未携带nonce校验的AJAX请求做拦截处理,需补充校验逻辑避免请求被拦截。
修复后代码
add_action('wp_ajax_validate_coupon_delivery', 'validate_coupon_delivery' ); add_action('wp_ajax_nopriv_validate_coupon_delivery', 'validate_coupon_delivery' ); function validate_coupon_delivery() { // 补充nonce校验,根据你前端提交的nonce字段名调整 if ( ! isset( $_POST['delivery_nonce'] ) || ! wp_verify_nonce( $_POST['delivery_nonce'], 'check_delivery_coupon' ) ) { echo "非法请求"; wp_die(); } $datesel = isset( $_POST['sel_date'] ) ? sanitize_text_field( $_POST['sel_date'] ) : ''; if ( empty( $datesel ) ) { echo "未获取到配送日期"; wp_die(); } $applied_coupons = WC()->cart->get_applied_coupons(); $removed_flag = false; if( ! empty( $applied_coupons ) ) { foreach ( $applied_coupons as $coupon_code ) { $coupon = wc_get_coupon( $coupon_code ); if ( ! $coupon ) { continue; } $value = $coupon->get_meta('include_stats'); if( $value == "yes" ) { $coupon_expiry = $coupon->get_meta("delivery_based_expiry_date"); if ( empty( $coupon_expiry ) ) { continue; } // 转时间戳比较,避免字符串比较错误 $expiry_timestamp = strtotime( $coupon_expiry ); $delivery_timestamp = strtotime( $datesel ); if ( $delivery_timestamp >= $expiry_timestamp ) { WC()->cart->remove_coupon( $coupon_code ); $removed_flag = true; } } } } // 所有优惠券校验完成后统一返回结果 echo $removed_flag ? "已移除不符合规则的优惠券" : "无需要移除的优惠券"; wp_die(); }
额外排查项
- 检查前端配送日期选择器的
change事件绑定是否正常,WooCommerce更新后结算页DOM结构、类名可能发生变化,导致事件未触发、未提交sel_date参数到AJAX接口。 - 可通过浏览器控制台的网络面板,查看
validate_coupon_delivery请求的提交参数、返回结果是否符合预期,快速定位是请求未触发还是接口逻辑错误。
内容的提问来源于stack exchange,提问作者Emperial
相关产品推荐
相关产品推荐

