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); } }
关键细节说明
has_term()函数:这是判断产品所属类别的正确姿势,在单个商品页和归档页都能正常工作。参数分别是:目标类别Slug数组、固定分类法product_cat、产品ID(归档页需传get_the_ID()指定当前循环的产品)。- 钩子优先级:用优先级
1触发自定义函数,确保在WooCommerce输出价格前就执行移除操作,避免价格先显示再隐藏的闪烁问题。 - Slug确认:去WooCommerce产品类别管理页,查看目标类别的Slug,绝对不能用显示名称替代!
调试和排查技巧
如果还是没生效,试试这些方法:
- 在函数里加一句
var_dump($is_target_product);,刷新页面看输出是true还是false,确认条件是否正确触发。 - 清空所有缓存(浏览器缓存、缓存插件缓存),很多时候修改代码后缓存没清导致看不到效果。
- 暂时切换到默认主题(比如Storefront)测试,排查是否是主题代码冲突。
内容的提问来源于stack exchange,提问作者JeVic
相关产品推荐
相关产品推荐

