
在 WooCommerce 的订单完成页(Thank You 页面)中,应通过订单对象而非购物车获取已支付的总金额;直接调用 WC()->cart 会导致 $0.00,因为此时购物车已清空。
在 woocommerce 的订单完成页(thank you 页面)中,应通过订单对象而非购物车获取已支付的总金额;直接调用 `wc()->cart` 会导致 `$0.00`,因为此时购物车已清空。
在 WooCommerce 开发中,一个常见误区是:在 woocommerce_thankyou 钩子中错误地使用购物车(WC()->cart)来读取订单金额。由于用户已完成支付,购物车内容已被清空或重置,WC()->cart->get_total() 或 $woocommerce->cart->cart_contents_total 将返回 0.00 —— 这正是你看到 $0.00 的根本原因。
✅ 正确做法是:根据 $order_id 获取真实订单对象,并调用其 get_total() 方法。该方法返回的是已保存的、不可变的订单总金额(含税费、运费等),单位为字符串格式(如 "129.99"),但本质是精确的浮点数值,可直接用于计算或格式化。
以下是推荐的实现代码:
// 在主题 functions.php 或插件中添加
add_action('woocommerce_thankyou', 'shop_message', 5);
function shop_message($order_id) {
$order = wc_get_order($order_id);
// 安全检查:确保订单存在且有效
if (!$order) {
return;
}
$total_price = $order->get_total(); // 返回字符串,如 "89.99",精度准确
$order_number = $order->get_order_number();
echo '<p class="woocommerce-message">';
echo 'ORDER NUMBER: ' . esc_html($order_number) . ' — Your Total Price: ' . wc_price($total_price);
echo '</p>';
}? 关键说明:
- wc_get_order($order_id) 是官方推荐方式,兼容性好,支持订单缓存;
- get_total() 返回的是数据库中存储的最终金额(四舍五入后),非实时计算值,确保一致性;
- 使用 wc_price($total_price) 可自动应用货币符号、千位分隔符和小数位数(遵循 WooCommerce 设置),比手动拼接更可靠;
- 务必使用 esc_html() 对订单号等输出做转义,防止 XSS 风险;
- 若需纯数字(float)参与后续运算,可用 (float) $order->get_total(),但注意 PHP 浮点精度限制——如需高精度计算(如分账),建议以分为单位操作 get_total() * 100 后取整。
⚠️ 注意事项:
- 不要依赖 WC()->cart 在 woocommerce_thankyou 中获取金额;
- 避免在钩子中执行耗时操作(如远程 API 调用),以免阻塞页面渲染;
- 如需获取商品明细、支付方式或用户信息,均可通过 $order 对象安全调用(如 $order->get_items()、$order->get_payment_method_title())。
此方案简洁、健壮,适用于所有 WooCommerce 4.0+ 版本,是订单完成页定制金额展示的标准实践。

















