WooCommerce自定义字段显示异常:如何按商品属性设置触发条件?
解决WooCommerce结账页自定义字段因商品属性失效及添加属性触发条件的问题
问题原因
当你给商品添加属性(比如钻石数量)后,商品变成了可变产品(Variable Product),此时购物车中的$cart_item['data']对应的是子变体产品,而商品分类通常是设置在父产品上的。你原来的代码直接用变体ID调用has_term(),自然找不到对应的分类,导致触发条件判定为false,自定义字段不显示。
解决方案
修改代码,同时处理父/子产品的分类判断和商品属性的触发条件,具体代码如下:
add_filter('woocommerce_checkout_fields', 'add_custom_field_based_on_category_and_attribute'); function add_custom_field_based_on_category_and_attribute($fields) { // 目标分类slug $target_category = 'clash-of-clans'; // 目标属性slug(WooCommerce属性slug默认以pa_开头,比如钻石数量的slug是pa_diamond-quantity) $target_attribute = 'pa_diamond-quantity'; $has_target_product = false; foreach (WC()->cart->get_cart() as $cart_item) { $product = $cart_item['data']; // 变体产品取父产品ID,普通产品用自身ID $product_id = $product->is_type('variation') ? $product->get_parent_id() : $product->get_id(); // 检查商品是否属于目标分类 $has_target_category = has_term($target_category, 'product_cat', $product_id); // 检查商品是否包含目标属性 $product_attributes = $product->get_attributes(); $has_target_attribute = isset($product_attributes[$target_attribute]); // 满足分类或属性任一条件即可触发(需同时满足则改为&&) if ($has_target_category || $has_target_attribute) { $has_target_product = true; break; } } // 满足条件则添加自定义字段 if ($has_target_product) { $fields['billing']['billing_custom_field'] = array( 'type' => 'text', 'label' => '密码', 'required' => true, 'class' => array('form-row-wide'), 'clear' => true, ); } return $fields; }
代码说明
- 变体产品兼容:通过
$product->is_type('variation')识别变体产品,自动切换到父产品ID进行分类判断,避免因变体无分类导致的判断失效。 - 属性判断逻辑:用
get_attributes()获取商品所有属性,通过属性slug(带pa_前缀)判断是否包含目标属性,可在后台产品属性设置页查看具体slug。 - 触发条件灵活调整:代码中用
||表示满足分类或属性任一条件就显示字段,若需要同时满足两个条件,将||改为&&即可。 - 字段自定义:可根据不同商品类型修改
label(比如软件类改为“软件ID”)、type等参数。
使用注意
- 替换
$target_category为你的目标分类slug。 - 替换
$target_attribute为你的目标属性slug(必须带pa_前缀)。 - 将代码添加到主题的
functions.php文件或自定义插件中。
内容的提问来源于stack exchange,提问作者REZA SAEEDI
相关产品推荐
相关产品推荐

