You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 15:36:06