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

WooCommerce按类别隐藏价格异常:无论是否设置类别,所有价格均被隐藏

解决WooCommerce按类别隐藏价格但条件失效的问题

嘿,我之前也踩过这个坑!你说的“不管指定啥类别,所有产品价格都被隐藏”的情况,大概率是条件判断的写法不对,或者没区分归档页和单个商品页的判断逻辑。咱们一步步来修复:

常见的错误原因

最容易犯的两个错:

  • 用错了类别判断函数:is_product_category() 只在产品类别归档页生效,单个商品页用它永远返回false,逻辑写错就会导致所有价格被误隐藏。
  • 把类别名称当成Slug用:比如类别显示名是“高端定制”,但实际Slug是“high-end-custom”,用名称的话has_term()会直接判断失败。

正确的代码实现

把下面的代码添加到你的主题functions.php文件里,或者自定义插件中(推荐用自定义插件,避免主题更新丢失代码):

// 根据产品类别隐藏价格(适配归档页和单个商品页)
add_action('woocommerce_before_single_product_summary', 'custom_hide_price_by_category', 1);
add_action('woocommerce_after_shop_loop_item', 'custom_hide_price_by_category', 1);

function custom_hide_price_by_category() {
    // 替换成你需要隐藏价格的产品类别SLUG,多个类别用数组:array('cat-slug-1', 'cat-slug-2')
    $target_categories = array('your-target-category-slug');

    // 分场景判断:单个商品页 + 归档页(商店页/类别归档页)
    $is_target_product = false;
    if (is_product()) {
        // 单个商品页:判断当前产品是否属于目标类别
        $is_target_product = has_term($target_categories, 'product_cat');
    } elseif (is_shop() || is_product_category()) {
        // 归档页:判断当前循环中的产品是否属于目标类别
        $is_target_product = has_term($target_categories, 'product_cat', get_the_ID());
    }

    // 如果是目标类别产品,移除价格相关钩子
    if ($is_target_product) {
        // 移除单个商品页的价格
        remove_action('woocommerce_single_product_summary', 'woocommerce_template_single_price', 10);
        // 移除归档页的价格
        remove_action('woocommerce_after_shop_loop_item_title', 'woocommerce_template_loop_price', 10);
        
        // 若需隐藏可变产品的价格区域,解开下面两行注释
        // remove_action('woocommerce_single_variation', 'woocommerce_single_variation', 10);
        // remove_action('woocommerce_single_variation', 'woocommerce_single_variation_add_to_cart_button', 20);
    }
}

关键细节说明

  1. has_term()函数:这是判断产品所属类别的正确姿势,在单个商品页和归档页都能正常工作。参数分别是:目标类别Slug数组、固定分类法product_cat、产品ID(归档页需传get_the_ID()指定当前循环的产品)。
  2. 钩子优先级:用优先级1触发自定义函数,确保在WooCommerce输出价格前就执行移除操作,避免价格先显示再隐藏的闪烁问题。
  3. Slug确认:去WooCommerce产品类别管理页,查看目标类别的Slug,绝对不能用显示名称替代!

调试和排查技巧

如果还是没生效,试试这些方法:

  • 在函数里加一句var_dump($is_target_product);,刷新页面看输出是true还是false,确认条件是否正确触发。
  • 清空所有缓存(浏览器缓存、缓存插件缓存),很多时候修改代码后缓存没清导致看不到效果。
  • 暂时切换到默认主题(比如Storefront)测试,排查是否是主题代码冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:20:45