WooCommerce价格显示自定义冲突解决:分类隐藏/可变产品价格/格式修改兼容
WooCommerce 价格格式化钩子冲突修复方案
问题根因
- 你给价格格式化功能设置的
9999高优先级,会覆盖其他低优先级钩子对woocommerce_get_price_html的返回结果。原有隐藏逻辑(sold分类隐藏价格、可变产品隐藏区间)会先返回空的价格HTML,但你的高优先级钩子忽略了前置修改结果,直接重新生成了格式化后的价格,导致隐藏功能失效。
修复后代码示例
add_filter( 'woocommerce_get_price_html', 'custom_price_format_short_unit', 9999, 2 ); function custom_price_format_short_unit( $price_html, $product ) { // 优先保留前置逻辑的空价格返回结果,不覆盖原有隐藏规则 if ( empty( $price_html ) ) { return $price_html; } // 双重校验原有隐藏规则,避免漏判 // 校验1:商品属于sold分类直接返回空 if ( has_term( 'sold', 'product_cat', $product->get_id() ) ) { return ''; } // 校验2:可变产品未选变体时隐藏价格,可根据原有逻辑调整判断条件 if ( $product->is_type( 'variable' ) && ! is_product() ) { return ''; } // 执行价格格式化逻辑 $raw_price = $product->get_price(); if ( empty( $raw_price ) ) { return $price_html; } // 单位映射规则 $units = [ 1e12 => 'T', 1e9 => 'M', 1e6 => 'Juta', 1e3 => 'Ribu' ]; $formatted_price = 'Rp '; foreach ( $units as $divider => $unit ) { if ( $raw_price >= $divider ) { $value = $raw_price / $divider; // 按要求处理不同单位的小数位数 if ( $unit === 'Juta' ) { $value = round( $value, 1 ); $formatted_value = str_replace( '.', ',', $value ); // 小数位为0时自动省略 if ( str_ends_with( $formatted_value, ',0' ) ) { $formatted_value = rtrim( $formatted_value, ',0' ); } } elseif ( $unit === 'M' ) { $value = round( $value, 2 ); $formatted_value = str_replace( '.', ',', $value ); // 末尾为0的小数位自动省略 if ( str_ends_with( $formatted_value, ',00' ) ) { $formatted_value = rtrim( $formatted_value, ',00' ); } elseif ( str_ends_with( $formatted_value, '0' ) ) { $formatted_value = rtrim( $formatted_value, '0' ); } } else { $formatted_value = str_replace( '.', ',', round( $value ) ); } $formatted_price .= $formatted_value . ' ' . $unit; break; } } return $formatted_price; }
注意事项
- 如果你原有逻辑要求商品详情页的可变产品也默认隐藏价格,仅选中变体后显示,可删掉上述代码中
&& ! is_product()的判断条件,变体选中后的价格是WooCommerce单独调用接口返回的,不会被该钩子影响 - 如
sold分类的实际slug不是sold,替换为你后台设置的对应分类slug即可 - 小数位处理规则可根据实际展示需求灵活调整,当前代码已对齐你给出的示例要求
内容的提问来源于stack exchange,提问作者carlozsan
相关产品推荐
相关产品推荐

