WooCommerce结账字段按产品属性显示异常:Adult属性下Children字段未隐藏
修复WooCommerce结账字段组按产品属性显示/隐藏的问题
问题根源分析
你的现有代码存在三个核心问题:
- 未处理Adult商品的优先级:当前只判断购物车是否包含Children商品,若同时存在Adult和Children商品,Children字段组会依然显示,不符合"有Adult则隐藏Children组"的需求。
- 未兼容变体产品:原代码直接使用
$cart_item['product_id'],但如果是变体产品,属性术语通常关联在变体ID上,而非父产品ID,导致属性判断失效。 - 缺失Adult字段组的显示逻辑:只实现了Children组的控制,未对Adult组的显示做对应处理。
修复代码
1. 完善商品属性判断函数(兼容变体)
// 检查购物车是否包含Children属性商品 function cart_contains_children_product() { foreach (WC()->cart->get_cart() as $cart_item) { // 变体产品优先用变体ID,否则用父产品ID $product_id = !empty($cart_item['variation_id']) ? $cart_item['variation_id'] : $cart_item['product_id']; if (has_children_attribute_term($product_id)) { return true; } } return false; } function has_children_attribute_term($product_id) { $term_slug = 'children'; // 确认是你的属性术语slug $product = wc_get_product($product_id); return $product && has_term($term_slug, 'pa_registration-for', $product_id); } // 新增:检查购物车是否包含Adult属性商品 function cart_contains_adult_product() { foreach (WC()->cart->get_cart() as $cart_item) { $product_id = !empty($cart_item['variation_id']) ? $cart_item['variation_id'] : $cart_item['product_id']; if (has_adult_attribute_term($product_id)) { return true; } } return false; } function has_adult_attribute_term($product_id) { $term_slug = 'adult'; // 确认是你的属性术语slug $product = wc_get_product($product_id); return $product && has_term($term_slug, 'pa_registration-for', $product_id); }
2. 调整Children字段组的显示逻辑(增加Adult优先级)
function custom_show_children_section($show, $section_name) { if ($section_name === 'children_selection_data') { // 优先级:只要购物车有Adult商品,直接隐藏Children组 if (cart_contains_adult_product()) { $show = false; } else { // 无Adult商品时,根据是否有Children商品决定显示 $show = cart_contains_children_product(); } } return $show; }
3. 新增Adult字段组的显示逻辑
function custom_show_adult_section($show, $section_name) { if ($section_name === 'adult_selection_data') { // 替换为你的Adult字段组名称 // 购物车有Adult商品则显示该组 $show = cart_contains_adult_product(); } return $show; }
4. 挂载过滤函数到结账字段管理器钩子
确认你的结账字段管理器使用的钩子(通常为cfw_show_section),添加以下代码:
add_filter('cfw_show_section', 'custom_show_children_section', 10, 2); add_filter('cfw_show_section', 'custom_show_adult_section', 10, 2);
额外检查项
- 确认属性分类slug:
pa_registration-for必须与你后台设置的属性分类slug完全一致(属性slug以pa_开头)。 - 清空缓存:测试前清空购物车、WooCommerce缓存及浏览器缓存,避免旧数据干扰。
- 字段组名称:确保
children_selection_data和adult_selection_data与你在结账字段管理器中创建的字段组名称精确匹配。
内容的提问来源于stack exchange,提问作者Steve K.
相关产品推荐
相关产品推荐

