WooCommerce自定义price.php模板的小数分隔符及价格展示问题咨询
WooCommerce 自定义价格展示的最优实现方案
你遇到的两个格式问题本质是直接调用了原始价格方法,绕开了WooCommerce自带的价格渲染流程,完全不需要硬修改price.php模板逻辑,通过内置的价格输出钩子就能实现自定义的两行布局,同时100%对齐原生的价格格式、促销划线逻辑。
问题根因定位
- 你之前直接调用
$product->get_regular_price()、$product->get_sale_price()拿到的是数据库存储的原始纯数值(固定用点作为小数分隔符),没有经过WooCommerce的价格格式化流程,所以和原生get_price_html()的输出格式不统一。 - 手动判断促销状态并加划线的逻辑,和WooCommerce原生的促销校验规则(定时促销有效期、会员折扣、优惠券自动抵扣等)不一致,所以会出现划线样式缺失的问题。
具体实现步骤
1. 复用原生价格格式化能力,统一小数分隔符规则
WooCommerce内置的wc_price()函数会自动读取后台的货币配置:包括小数位数、千位分隔符、小数分隔符(支持设置逗号/点)、货币符号位置、含税价计算逻辑,所有价格输出通过这个函数渲染,就能完全和原生get_price_html()的格式对齐,不会出现分隔符不统一的问题。
- 替换原来直接输出原始价格的写法:把
echo $product->get_regular_price()改成echo wc_price( $product->get_regular_price() )即可自动匹配后台设置。
2. 通过内置价格钩子实现自定义两行布局,自动保留促销划线逻辑
WooCommerce提供了woocommerce_price_html过滤器,专门用来修改get_price_html()的最终输出内容,你可以在这个钩子里拿到原生已经渲染完成的价格结构(已经处理好促销状态、原价划线、格式对齐的内容),只需要重新排版为两行布局即可,完全不需要自己重写促销判断逻辑。
将以下代码添加到主题的functions.php文件中即可实现需求:
add_filter( 'woocommerce_price_html', 'custom_two_line_price_layout', 10, 2 ); function custom_two_line_price_layout( $original_price_html, $product ) { // 仅在产品详情页的价格展示场景生效,不影响购物车、结算页等其他场景的价格输出 if ( ! is_product() ) { return $original_price_html; } // 第一行:带VAT标注的价格行 // 优先复用原生已经渲染好的原价展示(带促销划线时自动保留<del>标签) if ( $product->is_on_sale() ) { // 提取原生HTML中已经渲染好的带划线的原价部分,完全对齐原有样式 preg_match( '/<del.*<\/del>/', $original_price_html, $del_matches ); $regular_price_part = $del_matches[0] ?? wc_price( $product->get_regular_price() ); } else { $regular_price_part = wc_price( $product->get_regular_price() ); } $first_line = sprintf( '<div class="price-row price-regular">%s <small>VAT included</small></div>', $regular_price_part ); // 第二行:带每公斤单价标注的价格行 // 这里可以根据你的产品重量属性计算对应每KG的价格,同样通过wc_price格式化保证格式统一 $kg_price_value = // 替换为你的每KG价格计算逻辑,比如根据产品重量字段计算 $second_line = sprintf( '<div class="price-row price-per-kg">%s <small>Price per KG</small></div>', wc_price( $kg_price_value ) ); // 拼接最终的两行布局输出,替换原生的价格结构 return sprintf( '<div class="custom-price-block">%s%s</div>', $first_line, $second_line ); }
方案优势
- 所有价格格式完全和原生输出统一,自动适配后台配置的小数分隔符规则,不会出现点/逗号混用的问题。
- 促销展示逻辑完全复用WooCommerce原生能力,不管是定时促销、会员专属价、插件扩展的折扣逻辑,都会自动给原价加上
<del>划线标签,和站点其他位置的促销样式完全一致。 - 不需要硬修改
price.php核心模板文件,后续WooCommerce版本升级不会出现模板覆盖的兼容问题,也不会和其他价格类插件产生逻辑冲突。
注意:实现过程中不要直接在代码里硬编码判断促销状态、硬写划线标签的逻辑,这类手动判断会遗漏WooCommerce核心的价格计算规则,比如含税价转换、多币种适配、价格后缀显示等功能。
内容的提问来源于stack exchange,提问作者Sallar Rabiei
相关产品推荐
相关产品推荐

