如何检测WooCommerce订单关联商品是否存在,处理已删除商品?
解决WooCommerce遍历订单商品时遇到已删除商品卡住的问题
这问题我之前做订单导出功能时也碰到过!核心原因是当商品被删除后,$item_data->get_product()不会返回有效的WC_Product对象,而是false或者null,这时候直接调用get_name()、get_sku()这类方法就会触发致命错误,导致脚本直接卡住终止。
咱们只需要在代码里加个商品有效性判断,就能跳过已删除的商品,继续处理其他商品,同时给用户友好提示。修改后的代码如下:
foreach ($order->get_items() as $item_id => $item_data) { // 获取对应WC_Product对象实例 $product = $item_data->get_product(); // 先判断商品是否有效存在 if ( ! $product || ! $product instanceof WC_Product ) { // 获取原始商品ID(即使商品被删,订单item里还会保留这个ID) $original_product_id = $item_data->get_meta('_product_id'); // 显示提示信息 echo '1 x 商品已不存在(原商品ID:' . $original_product_id . ')<br />'; // 跳过当前商品,继续处理下一个 continue; } // 商品正常存在时的逻辑 $product_name = $product->get_name(); $item_quantity = $item_data->get_quantity(); $product_sku = $product->get_sku(); echo $item_quantity . ' x ' . $product_name . ' (' . $product_sku . ')<br />' ; }
关键细节说明:
- 有效性判断:用
! $product || ! $product instanceof WC_Product双重判断,确保覆盖所有商品不存在的情况(比如返回false、null或者非WC_Product的对象)。 - 保留原始商品ID:即使商品被删除,订单的item数据里依然会存储原始的商品ID(存在
_product_id元数据里),显示这个ID能帮助管理员定位问题。 - continue语句:遇到无效商品时,直接跳过后续逻辑,进入下一次循环,避免脚本报错终止。
这样修改后,不管订单里有没有已删除的商品,代码都能顺畅运行,同时给用户清晰的提示信息。
内容的提问来源于stack exchange,提问作者realvinner
相关产品推荐
相关产品推荐

