WooCommerce指定分类显示Call for price钩子异常问题求解
问题原因
woocommerce_get_price_html是过滤器类型钩子,所有走该钩子的商品都必须返回对应的价格渲染内容。你之前的代码仅在商品属于call-for-price分类时返回了自定义文本,非该分类的商品没有返回值,会被过滤为空内容,因此价格无法显示。
除此之外原有代码还有几个兼容问题:
- 回调函数没有接收钩子传入的原有价格内容、商品对象参数,直接调用
get_the_id()在购物车、ajax加载、商品列表模块等场景会出现ID获取错误 - 过滤器场景下需要返回内容,不能用直接输出文本的
_e()函数,否则会导致文本渲染位置错乱,应改用返回翻译文本的__()函数 - 缺少价格有效性判断,无法区分商品是否真的设置了有效价格
正确实现代码
替换你之前添加的woocommerce_get_price_html相关代码,保留原有空价格逻辑即可:
// 商品价格为空时显示Call for price add_filter('woocommerce_empty_price_html', 'snaj_replace_empty_price_text'); function snaj_replace_empty_price_text() { return __('Call for price', 'admin_texts_xts-woodmart-options'); } // 归属指定分类且已设置有效价格的商品,替换价格显示为Call for price add_filter('woocommerce_get_price_html', 'snaj_replace_price_text_by_cat', 99, 2); function snaj_replace_price_text_by_cat($price_html, $product) { $target_categories = array('call-for-price'); // 满足两个条件才替换:属于指定分类、商品设置了大于0的有效价格 if (has_term($target_categories, 'product_cat', $product->get_id()) && $product->get_price() > 0) { return __('Call for price', 'admin_texts_xts-woodmart-options'); } // 不满足条件的商品返回原有价格内容,解决其他商品价格不显示的问题 return $price_html; }
代码说明
- 钩子优先级设为99,用于覆盖主题、其他插件对价格的修改逻辑,保证自定义文本正常生效
- 保留了原有的空价格显示逻辑,未设置价格的商品依然会正常显示Call for price
- 用钩子传入的
$product对象获取商品ID,兼容购物车、商品列表、ajax筛选等多种场景,不会出现分类判断错乱 - 增加了价格有效性校验,只有商品本身设置了非零有效价格时才会触发分类替换逻辑,符合需求
内容的提问来源于stack exchange,提问作者Lenaj
相关产品推荐
相关产品推荐

