
当使用 `wc_get_order()` 获取订单失败时,该函数会返回 `false` 而非订单对象,直接调用 `->get_data()` 将触发“call to a member function on boolean”致命错误。本文详解原因、修复方案及最佳实践。
在 WooCommerce 开发中,wc_get_order( $order_id ) 是获取订单实例的标准方式。但它并非总是返回 WC_Order 对象——当传入的 $order_id 不存在、已被删除、ID 类型错误(如字符串未转整型)、或数据库异常时,该函数将返回布尔值 false。
你遇到的报错:
Fatal error: Uncaught Error: Call to a member function get_data() on boolean
正是源于以下代码未做类型校验:
$order_id = 12; $order = wc_get_order( $order_id ); $order_data = $order->get_data(); // ❌ $order 可能为 false!
✅ 正确做法:始终检查订单对象有效性
推荐使用严格比较 !== false(而非 !$order,避免误判 ID 为 0 的订单):
$order_id = 12;
$order = wc_get_order( $order_id );
if ( $order !== false && $order instanceof WC_Order ) {
$order_data = $order->get_data(); // ✅ 安全调用
$order_id = $order_data['id'];
$order_parent_id = $order_data['parent_id'];
$order_status = $order_data['status'];
// 后续逻辑(如输出、日志、状态判断等)
error_log( "Order #{$order_id} status: {$order_status}" );
} else {
error_log( "⚠️ Failed to load order with ID: {$order_id}" );
// 可选:抛出异常、返回默认值、重定向或显示用户友好提示
}? 补充排查建议
- 确认订单真实存在:登录 WordPress 后台 → WooCommerce → 订单,核实 ID 12 是否存在且未被彻底删除(回收站中的订单仍可获取)。
-
检查 ID 类型:确保 $order_id 是整数。若来自 URL 参数(如 ?order=12),请强制转换:
$order_id = absint( $_GET['order'] ?? 0 );
- 避免硬编码 ID:生产环境应动态获取订单 ID(如通过 $woocommerce->session->get('order_awaiting_payment') 或钩子上下文)。
- 启用调试:在 wp-config.php 中开启 WP_DEBUG_LOG,便于捕获底层错误。
? 总结
WooCommerce 的 wc_get_order() 是一个“防御性”函数——它优先保障健壮性,而非抛出异常。开发者有责任在调用其返回值的方法前,显式验证对象有效性。加上 !== false && instanceof WC_Order 双重检查,即可彻底规避此类致命错误,并提升代码的稳定性与可维护性。










