HPOS切换后如何修改代码在订单表中添加自定义ERP库存代码字段
HPOS切换后如何修改代码在订单表中添加自定义ERP库存代码字段
嘿,我完全懂你碰到的麻烦——自从切换到HPOS(高性能订单存储)后,原来依赖WordPress文章元数据的代码就不工作了,因为现在WooCommerce把订单数据存在专用的订单表里,不再用wp_postmeta那套了。别担心,咱们把代码改成HPOS兼容的版本就行:
修改后的完整代码
/** * Add current SKU code (ERP Stock code) to orders to skip issues in future */ add_action('woocommerce_thankyou', 'add_erp_stock_code', 4); function add_erp_stock_code($order_id) { // 获取HPOS兼容的订单对象 $order = wc_get_order($order_id); if (!$order) return; // 确保订单对象存在,避免报错 $sku_list = array(); // 遍历订单中的商品项 foreach ($order->get_items() as $item_id => $item) { $product = $item->get_product(); if (!$product) continue; $product_id = $item->get_product_id(); // 只处理复合产品 if ($product->is_type('composite')) { $sku_list[] = array( "sku" => $product->get_sku(), // 改用官方推荐的get_sku()方法,兼容性更强 "product_id" => $product_id, ); } } // 检查订单元数据是否已存在,不存在则添加 if (empty($order->get_meta('erp_stock_code'))) { $order->update_meta_data('erp_stock_code', $sku_list); $order->save(); // 必须调用save(),确保数据写入HPOS专用订单表 } }
关键修改点说明
- 替换元数据操作逻辑:不再用
get_post_meta和update_post_meta这类针对文章表的函数,改用WooCommerce订单对象的get_meta()和update_meta_data()方法,这是HPOS环境下操作订单元数据的标准方式 - 增加显式保存操作:HPOS需要调用
$order->save()才能把元数据写入专用订单表,原来的update_post_meta会自动处理保存,但HPOS环境下必须显式执行这一步 - 规范属性获取方式:把直接调用
$product->sku改成$product->get_sku(),这是WooCommerce官方推荐的产品属性获取方法,能适配更多场景 - 添加安全校验:增加了订单对象和产品对象的存在性判断,避免因数据异常导致的代码报错
这样修改后,你的ERP库存代码就能正确保存到HPOS的订单表中了,以后就算订单结构有变动,基于WooCommerce官方API的代码也能保持良好兼容性~
备注:内容来源于stack exchange,提问作者Ned




