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

如何在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;
}

方案说明

  1. 通用函数拆分:将角色判断、价格格式化、文本获取拆分为独立函数,逻辑清晰易维护
  2. 价格准确性保障:使用wc_get_price_to_display()获取当前用户对应的实际价格(含批发价、折扣),避免直接调用基础价导致的错误
  3. 全场景覆盖:通过多个钩子分别处理商品页、购物车、结账页的价格显示,确保全站点统一效果
  4. 钩子优先级设置:使用优先级20,确保在WooCommerce默认处理后执行,覆盖原有显示逻辑

内容的提问来源于stack exchange,提问作者Estudiante

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 01:59:56