WordPress Hosting

wooexperts header

Cómo separar un pedido en varios después de la compra con WooCommerce

Son muchas las situaciones en que una tienda real, donde pasa de todo, necesita separar un pedido en varios, y la más habitual es cuando alguno de los productos requiere un tipo o clase de envío diferente.

En el truco de personalización de hoy vamos a ver cómo separar automáticamente un pedido realizado por el cliente en varios, creando un pedido nuevo por cada clase de envío que requiera alguno de los productos del pedido original, como por ejemplo entregas especiales, rutas diferentes, etc.

El siguiente código analiza los pedidos realizados y, en caso de encontrar algún producto con una clase de envío personalizada definida, genera automáticamente un pedido separado por cada clase de envío, incluyendo en cada pedido los productos sujetos a cada clase de envío. Además, para que quede constancia, añade una nota al pedido indicando que se ha separado.

/* Separar pedidos si hay productos con clases de envio */
add_action( 'woocommerce_thankyou', 'ayudawp_separar_pedido_clase_envio', 9999 );

function ayudawp_separar_pedido_clase_envio( $order_id ) {
$order = wc_get_order( $order_id );
if ( ! $order || $order->get_meta( '_order_split' ) ) return;
$items_by_shipping_class = array();

foreach ( $order->get_items() as $item_id => $item ) {
$product = $item->get_product(); 
$class_id = $product->get_shipping_class_id();
$items_by_shipping_class[$class_id][$item_id] = $item;
}

if ( count( $items_by_shipping_class ) > 1 ) {
foreach ( array_slice( $items_by_shipping_class, 1 ) as $class_id => $items ) {

$new_order = wc_create_order(); 
$new_order->set_address( $order->get_address( 'billing' ), 'billing' );
if ( $order->needs_shipping_address() ) $new_order->set_address( $order->get_address( 'shipping' ) ?? $order->get_address( 'billing' ), 'shipping' );

foreach ( $items as $item_id => $item ) {
$new_item = new WC_Order_Item_Product();
$new_item->set_product( $item->get_product() );
$new_item->set_quantity( $item->get_quantity() );
$new_item->set_total( $item->get_total() );
$new_item->set_subtotal( $item->get_subtotal() );
$new_item->set_tax_class( $item->get_tax_class() );
$new_item->set_taxes( $item->get_taxes() );
foreach ( $item->get_meta_data() as $meta ) {
$new_item->add_meta_data( $meta->key, $meta->value, true );
}
$new_order->add_item( $new_item );
$order->remove_item( $item_id );
}
$new_order->add_order_note( 'Separado del pedido ' . $order_id );
$new_order->calculate_totals(); 
$new_order->set_payment_method( $order->get_payment_method() );
$new_order->set_payment_method_title( $order->get_payment_method_title() ); 
$new_order->update_status( $order->get_status() );

$order->calculate_totals();
$order->update_meta_data( '_order_split', true );
$order->save();
}
}
}

Una vez añadido el código anterior a tu web, usando el método que prefieras, cada vez que se realice un pedido, si algún producto tiene asignada una clase de envío, se creará un pedido adicional por cada clase de envío.

pedido 2 productos distinta clase de envio

De este modo por cada pedido pagado por el cliente se crearán tantos como sean necesarios, uno por clase de envío, más el principal, con los productos no sujetos a ninguna clase de envío.

pedido separado productos distinta clase envio

La manera de identificar rápidamente los pedidos creados automáticamente en la pantalla de pedidos es por el método de envío y por el origen del pedido (Directo).

Además, también se genera la nota en el pedido original.

nota pedido separado

Compartir en redes
Resumir con IA

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en las estrellas para valorarlo!

Promedio de puntuación 5 / 5. Total de votos: 3

¡Todavía no hay votos! Sé el primero en valorar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en las redes sociales!

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!



Sobre el autor

Scroll al inicio