
在 WooCommerce 的订单确认页(Thank You 页面)中,应使用 wc_get_order() 获取订单对象并调用 get_total() 方法获取真实订单金额,而非访问已清空的购物车(WC()->cart),否则将返回 $0.00。
在 woocommerce 的订单确认页(thank you 页面)中,应使用 `wc_get_order()` 获取订单对象并调用 `get_total()` 方法获取真实订单金额,而非访问已清空的购物车(`wc()->cart`),否则将返回 $0.00。
在 WooCommerce 开发中,一个常见误区是:在 woocommerce_thankyou 钩子中错误地依赖 WC()->cart 来获取订单金额。实际上,用户完成支付后,购物车(cart)已被清空,此时 WC()->cart->get_total() 或 $woocommerce->cart->cart_contents_total 均返回 0.00——这正是你看到“$0.00”而非实际订单金额的根本原因。
✅ 正确做法是:通过传入的 $order_id 主动加载对应订单对象,再调用其原生方法获取准确、已保存的订单数据:
// 添加自定义订单确认消息
add_action('woocommerce_thankyou', 'shop_message', 5);
function shop_message($order_id) {
// 根据订单ID安全获取订单对象(自动处理无效ID)
$order = wc_get_order($order_id);
// 检查订单是否存在且有效(推荐健壮性处理)
if (!$order) {
return;
}
// 获取格式化后的总金额(含货币符号,如 "$129.99")
$formatted_total = $order->get_formatted_total();
// 或获取纯数字金额(用于计算或API对接):floatval($order->get_total())
$raw_total = floatval($order->get_total());
echo '<p class="woocommerce-message">';
echo 'ORDER NUMBER: <strong>' . esc_html($order_id) . '</strong> ';
echo 'And Your Total Price: <strong>' . wp_kses_post($formatted_total) . '</strong>';
echo '</p>';
}
? 关键要点说明:
- wc_get_order($order_id) 是 WooCommerce 官方推荐方式,兼容订单缓存与自定义订单类型;
- get_total() 返回不含格式的浮点数(如 129.99),适合后续计算;get_formatted_total() 返回带货币符号和本地化格式的字符串(如 ¥1,299.00),适合前端展示;
- 务必对输出内容进行安全转义(如 esc_html() 和 wp_kses_post()),防止 XSS 风险;
- 不要依赖全局 $woocommerce 变量或 WC()->cart ——它们在 thank-you 页面已无意义;
- 若需获取税额、运费、商品小计等明细,可使用 $order->get_subtotal()、$order->get_shipping_total()、$order->get_total_tax() 等方法。
? 提示:该钩子仅对成功支付的订单触发(包括手动状态设为 completed 或 processing 的订单),不适用于失败或取消的订单。如需扩展逻辑,请结合 $order->get_status() 进行判断。










