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
相关产品推荐
相关产品推荐

