Мне нужно разделить заказ, прежде чем просматривать страницу с благодарностью, в зависимости, например, от продавцов товаров. Если заказ содержит 5 товаров от разных поставщиков - 2 товара от поставщика X - 2 товара от поставщика Z - 1 товар от поставщика S, поэтому мне нужносгенерировать 3 разных заказа из исходных данных заказа и сохранить сгенерированные заказы вместо исходного заказа. Я использую плагин WCFM marketplace, и я обнаружил премиальный плагин, который делает это, но для другого мультивендорного плагина
Здесьэто то, что я сделал в коде, но я получаю внутреннюю ошибку сервера
add_action( 'woocommerce_checkout_create_order', 'HF_before_checkout_create_order', 20, 2 );
function HF_before_checkout_create_order( $order, $data ){
global $wpdb;
global $WCFM;
global $woocommerce;
$vendors = array();
foreach( $order->get_items() as $key => $item ) {
$product_id = $item['product_id'];
$vendor = $WCFM->wcfm_vendor_support->wcfm_get_vendor_id_from_product( $product_id );
if( $vendor ) {
$vendors[] = $vendor;
// wc_delete_order_item( $key );
}
if( count($vendors) ) :
foreach( $vendors as $vendor_order ) :
$order_seller = new WC_Order();
foreach( $data['line_items'] as $line_item ) {
$args = $line_item['args'];
$product = wc_get_product( isset($args['variation_id']) && $args['variation_id'] > 0 ? $$args['variation_id'] : $args['product_id'] );
$product_vendor = $WCFM->wcfm_vendor_support->wcfm_get_vendor_id_from_product( $product->ID );
if( $product_vendor == $vendor_order ) :
$order_seller->add_product( $product, $line_item['quantity'], $line_item['args'] );
endif;
}
$order_seller->set_address( $order->get_address( 'billing' ), 'billing' );
$order_seller->set_address( $order->get_address( 'shipping' ), 'shipping' );
$order_seller->calculate_taxes();
$order_seller->calculate_totals();
$order_seller->save();
endforeach;
endif;
}
$order->update_status(
'cancelled',
__( 'This order has been splitted to separate orders' )
);
$history = $order->addStatusHistoryComment('Order marked as cancelled.', false);
$history->setIsCustomerNotified(false);
$order->save();
}