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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:57:15