Php 为购物车中的每个项目创建单独的订单

Php 为购物车中的每个项目创建单独的订单,php,wordpress,woocommerce,cart,orders,Php,Wordpress,Woocommerce,Cart,Orders,我基本上需要能够为购物车中的每个项目创建多个订单,但保留默认的结账过程 对于用户来说,这看起来像是签出多个项目,但在后端,它会创建多个订单。这和我需要做的事情有很大关系 我假设我需要删除单击“立即付款”按钮时触发的操作,以防止自动创建订单,并手动创建订单。我可以使用以下过滤器访问购物车信息,这可能是一个起点 add_filter('woocommerce_checkout_create_order','wp_handle_multiple_order',10,1); 函数wp_handle_多个

我基本上需要能够为购物车中的每个项目创建多个订单,但保留默认的结账过程

对于用户来说,这看起来像是签出多个项目,但在后端,它会创建多个订单。这和我需要做的事情有很大关系

我假设我需要删除单击“立即付款”按钮时触发的操作,以防止自动创建订单,并手动创建订单。我可以使用以下过滤器访问购物车信息,这可能是一个起点

add_filter('woocommerce_checkout_create_order','wp_handle_multiple_order',10,1);
函数wp_handle_多个订单($order){
全球商业;
打印(计数(WC()->cart->get_cart());
//处理多个订单的创建
}
或者,我可能会加入结帐流程:

add_action('woocommerce_checkout_process'、'wp_handle_multiple_orders');
我知道这个过程并不理想,有很多不同的事情要考虑,但希望有另一种方法来实现这一目标。任何链接将不胜感激

这个答案包含:

  • 在原始订单中仅保留1个产品,从该订单中删除其他产品
  • 将拆下的产品(每个单独)放入新的订单中
  • 解释通过添加到代码中的注释标记,如果需要,可以轻松地进一步扩展代码
function action\u woodcommerce\u checkout\u order\u processed($order\u id,$posted\u data,$order){
//获取订单货币
$order\u currency=$order->get\u currency();
//获取订单付款方式
$order\u payment\u gateway=$order->get\u payment\u method();
//地址
$order\u地址=数组(
'first\u name'=>$order->get\u billing\u first\u name(),
'last\u name'=>$order->get\u billing\u last\u name(),
'email'=>$order->get_billing_email(),
'phone'=>$order->get\u billing\u phone(),
'address_1'=>$order->get_billing_address_1(),
'address_2'=>$order->get_billing_address_2(),
“城市”=>$order->get\u billing\u city(),
'state'=>$order->get\u billing\u state(),
'postcode'=>$order->get\u billing\u postcode(),
'country'=>$order->get\u billing\u country()
);
//船运
$order\u shipping=数组(
'first\u name'=>$order->get\u shipping\u first\u name(),
'last\u name'=>$order->get\u shipping\u last\u name(),
'address_1'=>$order->get_shipping_address_1(),
'address_2'=>$order->get_shipping_address_2(),
“城市”=>$order->get\u shipping\u city(),
'state'=>$order->get_shipping_state(),
'postcode'=>$order->get\u shipping\u postcode(),
'country'=>$order->get\u shipping\u country()
);
//柜台
$counter=1;
//循环浏览订单项
foreach($order->get\u items()作为$item\u id=>$item){
//从第二个产品开始
如果($counter>=2){
//获取WC_产品对象
$product=$item->get_product();
//获取产品数量
$product_quantity=$item->get_quantity();
//创建新订单
$new_order=wc_create_order();
//将产品添加到新订单
$new\u order->add\u product($product,$product\u quantity);
//设定地址
$new_order->set_address($order_address,'billing');
$new_order->set_address($order_shipping,'shipping');
//设置正确的货币和支付网关
$new\u order->set\u currency($order\u currency);
$new\u order->set\u payment\u method($order\u payment\u gateway);
//计算总数
$new_order->计算_总计();
//使用原始ID设置订单注释
$new\u order->add\u order\u note('Automated order.Created from origing order ID:'。$order\u ID);
//设置正确的状态
$new_order->update_status('processing');
//从原始订单中删除产品
$order->remove_item($item_id);
}
//计数器=计数器+1
$counter++;
}
//重新计算并保存
$order->计算_总计();
$order->save();
}
添加操作('woocommerce\u checkout\u order\u processed'、'action\u woocommerce\u checkout\u order\u processed',10,3);

将一个订单拆分为多个订单本身并不是问题,仅此而已。如果您想在订单接收(谢谢)页面上将原始订单显示为1个订单,则通常在该操作发生之前,订单已拆分为多个订单。如果您要在订单接收页面后拆分订单,则订单已完全创建,并且原始订单(包含所有产品)的电子邮件已发送。。简言之,我认为你应该寻找一个插件,可以做到这一点,因为它不会工作与几行代码。除非我在俯瞰something@7uc1f3r是的,如果订单在感谢页面上显示为一个订单,这无关紧要,因为我们有一个定制的感谢页面。它纯粹用于后端,因此可以单独管理订单。谢谢,希望我能找到一个现成的插件,可能已经涵盖了这一点。我已经回答了你的问题,但后来删除了我的答案,因为它不是(完全)你想要的,(我使它再次可见)也许它可以帮到你的方式?我相信它包含了你想要的东西