
在 woocommerce 中,订单项(`wc_order_item_product`)对象本身不直接提供 `get_weight()` 方法,需通过关联的商品对象调用 `get_weight()` 才能安全获取重量值。
WooCommerce 的订单结构采用分层设计:订单(WC_Order)包含多个订单项(WC_Order_Item_Product),而每个订单项仅存储交易快照(如购买数量、单价、总金额等),并不直接持有商品的元数据(如重量、尺寸、SKU)。这些属性仍归属于原始商品(WC_Product)对象。
因此,当你在循环中直接调用 $item->get_weight() 时,PHP 会抛出 Fatal error: Call to undefined method WC_Order_Item_Product::get_weight(),因为该方法并不存在于订单项类中。
✅ 正确做法是:先通过 $item->get_product() 获取对应的商品实例(返回 WC_Product 或其子类对象),再调用其 get_weight() 方法:
foreach ($order->get_items() as $item) {
$product = $item->get_product();
$weight = $product ? $product->get_weight() : ''; // 防止商品已删除或不可用
fputs($file, implode("|", array(
$item->get_quantity(),
$item->get_total(),
$weight,
)) . PHP_EOL);
}⚠️ 注意事项:
- 始终使用 $order->get_items()(推荐)而非 $order->items(已弃用且可能为空),确保兼容 WooCommerce 3.0+;
- get_product() 可能返回 null(例如商品已被删除、库存同步异常或权限限制),务必做空值检查;
- get_weight() 返回字符串(如 "0.5"),单位由 WooCommerce 设置决定(默认 kg),如需数值计算,请配合 floatval() 处理;
- 若需带单位(如 "0.5 kg"),可使用 $product->get_weight() . ' ' . get_option('woocommerce_weight_unit')。
? 小结:获取订单中商品的重量,本质是“从订单项回溯到原始商品”,这是 WooCommerce 数据快照机制的设计原则。掌握这一逻辑,也能类推解决 get_dimensions()、get_sku()、get_stock_quantity() 等类似需求。









