Woocommerce修改订单配送方式时WC_API_Orders类未找到如何解决
问题原因及解决方法
报错根因
- 命名空间冲突:你的代码处于
Inc\Api\Callbacks自定义命名空间下,未指定全局命名空间直接实例化WC_API_Orders,会优先在当前命名空间下查找该类,自然找不到 - 选型错误:
WC_API_Orders是WooCommerce为REST API接口封装的类,本地操作订单无需通过API类,直接使用原生订单对象方法即可实现需求,逻辑更简洁稳定
正确实现方案
你不需要引入API相关类,直接用WooCommerce原生订单操作方法就能完成批量更新,修正后代码如下:
private function updateRound() { // 安全校验,nonce字段名和验证规则请和你前端表单提交的配置保持一致 if (!isset($_POST['custom_nonce']) || !wp_verify_nonce($_POST['custom_nonce'], 'update_order_round') || !current_user_can('manage_woocommerce')) { wp_die('非法请求'); } if (empty($_POST['update'])) { return; } $updateRound = $_POST['newRound']; $updateList = $_POST['update']; $toUpdate = []; // 组装待更新列表,增加基础参数校验 foreach ($updateList as $key => $value) { if (isset($updateRound[$key]) && is_numeric($key)) { $toUpdate[] = [ 'orderID' => (int)$key, 'newRound' => sanitize_text_field($updateRound[$key]) ]; } } foreach ($toUpdate as $updateOrder) { // 直接获取原生订单对象 $order = wc_get_order($updateOrder['orderID']); if (!$order) { echo "订单" . $updateOrder['orderID'] . "不存在,跳过更新<br>"; continue; } // 移除原有配送项 foreach ($order->get_items('shipping') as $item_id => $item) { $order->remove_item($item_id); } // 添加新的配送轮次,newRound参数为你已获取到的对应配送方式rateID $shipping_item = new WC_Order_Item_Shipping(); $shipping_item->set_shipping_rate(new WC_Shipping_Rate($updateOrder['newRound'])); $order->add_item($shipping_item); // 保存更新 $order->calculate_shipping(); $order->save(); echo "订单" . $updateOrder['orderID'] . "配送轮次更新成功<br>"; } }
注意事项
- 确保传入的
newRound是WooCommerce后台配送设置中对应轮次的有效rate ID - 如果需要固定配送费用不随配置变动,可以在添加配送项时手动调用
$shipping_item->set_total(对应费用)方法指定金额
内容的提问来源于stack exchange,提问作者DaveyW
相关产品推荐
相关产品推荐

