如何在WooCommerce全站点显示2位小数且保留价格附加文本
WooCommerce 前端价格2位小数+角色专属文本解决方案
问题背景
在线商店对接库存与生产系统后,已在WooCommerce「货币选项」设置3位小数避免订单录入四舍五入错误,但前端显示3位小数不够美观。需求:
- 全站点(商品页、购物车、结账页等)价格仅显示2位小数
- 保留角色价格文本:批发客户显示特定文本,普通客户/管理员/未登录用户显示
P.V.P. - 此前代码要么丢失价格文本,要么导致批发客户价格显示错误
正确PHP解决方案
以下代码整合小数格式化与角色文本逻辑,覆盖所有前端价格场景,确保价格计算准确:
// 获取当前用户角色 function get_current_user_roles() { return is_user_logged_in() ? (array)wp_get_current_user()->roles : []; } // 通用价格格式化:统一转为2位小数 function format_price_to_two_decimals($price, $product = null) { // 处理购物车/结账的数值型价格 if (is_numeric($price)) { return wc_price($price, ['decimals' => 2]); } // 处理商品对象,获取用户对应的显示价格 if ($product) { $display_price = wc_get_price_to_display($product); return wc_price($display_price, ['decimals' => 2]); } return $price; } // 根据角色获取价格附加文本 function get_price_suffix_text() { $roles = get_current_user_roles(); // 批发客户返回专属文本(可自行修改内容) if (in_array('wholesale_customer', $roles)) { return ''; // 示例:替换为' 批发价' } // 其他用户及未登录状态显示P.V.P. return ' P.V.P.'; } // 商品页价格:整合小数格式化+附加文本 add_filter('woocommerce_get_price_html', 'custom_product_price_display', 20, 2); function custom_product_price_display($price_html, $product) { $formatted_price = format_price_to_two_decimals(null, $product); $suffix_text = get_price_suffix_text(); return $formatted_price . $suffix_text; } // 购物车项目单价显示2位小数 add_filter('woocommerce_cart_item_price', 'custom_cart_item_price_display', 20, 3); function custom_cart_item_price_display($price_html, $cart_item, $cart_item_key) { return format_price_to_two_decimals($cart_item['data']->get_price(), $cart_item['data']); } // 购物车项目小计显示2位小数 add_filter('woocommerce_cart_item_subtotal', 'custom_cart_item_subtotal_display', 20, 4); function custom_cart_item_subtotal_display($subtotal_html, $cart_item, $cart_item_key, $args) { return format_price_to_two_decimals($cart_item['line_subtotal']); } // 结账页订单总计项显示2位小数 add_filter('woocommerce_get_order_item_totals', 'custom_checkout_total_decimals', 20, 3); function custom_checkout_total_decimals($total_rows, $order, $tax_display) { foreach ($total_rows as $key => $row) { $clean_value = str_replace(['€', '$', ',', ' ', '€'], '', $row['value']); if (is_numeric($clean_value)) { $total_rows[$key]['value'] = wc_price($clean_value, ['decimals' => 2]); } } return $total_rows; }
方案说明
- 通用函数拆分:将角色判断、价格格式化、文本获取拆分为独立函数,逻辑清晰易维护
- 价格准确性保障:使用
wc_get_price_to_display()获取当前用户对应的实际价格(含批发价、折扣),避免直接调用基础价导致的错误 - 全场景覆盖:通过多个钩子分别处理商品页、购物车、结账页的价格显示,确保全站点统一效果
- 钩子优先级设置:使用优先级20,确保在WooCommerce默认处理后执行,覆盖原有显示逻辑
内容的提问来源于stack exchange,提问作者Estudiante
相关产品推荐
相关产品推荐

