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

WooCommerce结账字段按产品属性显示异常:Adult属性下Children字段未隐藏

修复WooCommerce结账字段组按产品属性显示/隐藏的问题

问题根源分析

你的现有代码存在三个核心问题:

  1. 未处理Adult商品的优先级:当前只判断购物车是否包含Children商品,若同时存在Adult和Children商品,Children字段组会依然显示,不符合"有Adult则隐藏Children组"的需求。
  2. 未兼容变体产品:原代码直接使用$cart_item['product_id'],但如果是变体产品,属性术语通常关联在变体ID上,而非父产品ID,导致属性判断失效。
  3. 缺失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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 09:44:57