You need to enable JavaScript to run this app. WooCommerce为含指定属性项的产品变体设置动态结账订单备注必填
优惠活动
大模型
产品
解决方案
定价
更多

WooCommerce为含指定属性项的产品变体设置动态结账订单备注必填

代码失效问题的修正方案

原代码的核心偏差点

  • 检测对象错误:WooCommerce中变量产品的自定义属性术语是绑定在子变体产品ID上的,原代码使用$cart_item['product_id'](对应父级变量产品ID)调用has_term(),完全无法匹配到变体上挂载的属性值。
  • 匹配目标错误:原代码传入的检测值是属性分类名pa_size,而非分类下的具体选项special,判断逻辑从根源上就没有对准要匹配的业务目标。
  • 未利用购物车内置缓存:变体的属性键值对本身就存储在购物车项的variation数组中,不需要额外调用数据库查询has_term(),原代码的读取路径效率低且容易因为权限、缓存问题失效。

可直接投入使用的修正代码

/**
 * 检测购物车是否存在带special特殊尺码的变体商品
 */
function cart_contains_special_size_item() {
    // 购物车未初始化场景直接返回,避免报错
    if (is_null(WC()->cart)) {
        return false;
    }

    foreach (WC()->cart->get_cart() as $cart_item) {
        // 跳过不属于变体的购物车项
        if (empty($cart_item['variation'])) {
            continue;
        }
        // 直接读取购物车缓存的变体属性值做匹配
        $variant_meta = $cart_item['variation'];
        if (
            isset($variant_meta['attribute_pa_size']) 
            && $variant_meta['attribute_pa_size'] === 'special'
        ) {
            return true;
        }
    }
    return false;
}

/**
 * 按条件设置结账页订单备注为必填
 */
add_filter( 'woocommerce_checkout_fields' , 'conditional_required_order_notes' );
function conditional_required_order_notes( $fields ) {
    if (cart_contains_special_size_item()) {
        // 开启字段必填属性
        $fields['order']['order_comments']['required'] = true;
        // 同步调整字段文案,明确必填原因
        $fields['order']['order_comments']['label'] = '订单备注(含特殊尺码商品时为必填项,请说明您的具体需求)';
    }
    return $fields;
}

/**
 * 服务端二次校验,避免前端规则被篡改绕过
 */
add_action( 'woocommerce_checkout_process', 'validate_special_size_order_note' );
function validate_special_size_order_note() {
    if (cart_contains_special_size_item() && empty(trim($_POST['order_comments']))) {
        wc_add_notice( '您的购物车包含特殊尺码商品,请填写订单备注说明需求后再提交订单。', 'error' );
    }
}

逻辑适配说明

  • 触发规则覆盖所有带special尺码的变体组合:无论搭配了哪款pa_color颜色选项,只要变体的尺码值为special,就会触发必填设置,完全匹配业务判断要求。
  • 无特殊尺码商品时完全不干扰原有流程:当购物车内所有商品都是常规s/m/l尺码时,订单备注字段保持原有非必填状态,不会强制要求用户填写。
  • 规则稳定性增强:通过购物车内置缓存的属性值判断,避免因为产品缓存、术语关联错误导致的判断失效;同时增加服务端校验,防止用户通过前端DOM修改绕过必填限制。
  • 体验优化:配套清晰的提示文案,替代系统默认的“字段为必填”模糊提示,降低用户下单时的困惑。

注意:如果站点中special这个尺码对应的别名不是英文special(比如设置的是中文别名“特殊码”),只需要把代码中匹配的字符串'special'替换成对应的别名值即可,可在pa_size属性的编辑页面查看具体的别名配置。

内容的提问来源于stack exchange,提问作者Kaickul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.10 09:45:03