如何安全调用 WooCommerce 订单对象的 get_data() 方法

如何安全调用 WooCommerce 订单对象的 get_data() 方法

当使用 `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

正是源于以下代码未做类型校验:

Picsart

Picsart

Picsart是全球最大的数字创作平台。

下载

$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 双重检查,即可彻底规避此类致命错误,并提升代码的稳定性与可维护性。

https://www.php.cn/faq/2028389.html

发表回复

Your email address will not be published. Required fields are marked *