Dividir los órdenes de WooCommerce programáticamente Puede ser increíblemente útil para los propietarios de tiendas que necesitan administrar flujos de trabajo complejos.
Ya sea que esté tratando con pedidos anticipados, dropshipping o simplemente organizando artículos para múltiples envíos, dividir un pedido basado en sus productos garantiza operaciones más suaves y una mejor experiencia del cliente.
Sin embargo, dividir un pedido no se trata solo de separar elementos; Replicar detalles cruciales como métodos de pago, métodos de envío y totales es igualmente importante para mantener la consistencia.
En este tutorial, exploraremos cómo dividir mediante programación los pedidos en WooCommerce, asegurando que los pedidos clonados incluyan todos los detalles relevantes del original, como el método de pago, el estado del pedido y las direcciones de facturación y envío.
Al final de esta guía, tendrá una solución robusta para automatizar la división de pedidos directamente en su tienda WooCommerce. ¡Vamos a sumergirnos en el código y comenzar!
Php Snippet: Pedir un orden de división mediante programación tras la compra en función de la clase de envío
Por supuesto, puede cambiar el comportamiento dividido y hacer que suceda por identificación del producto, categoría de producto, meta personalizada, etc. Elegí la clase de envío porque cada producto solo puede tener una clase de envío (o ninguna, en tal caso es igual a 0 ), y es un escenario de caso muy común.
/** * @snippet Split Woo Order Based on Shipping Class * @tutorial Get CustomizeWoo.com FREE * @author Rodolfo Melogli, Business Bloomer * @compatible WooCommerce 9 * @community https://businessbloomer.com/club/ */ add_action( 'woocommerce_thankyou', 'bbloomer_split_order_after_checkout', 9999 ); function bbloomer_split_order_after_checkout( $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( 'Splitted from order ' . $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(); } } }
Descripción general de la función
La función bbloomer_split_order_after_checkout
está enganchado al WooCommerce woocommerce_thankyou
acción. Esto significa que el código se ejecuta una vez que se ha completado un pedido y el usuario se redirige a la página «Gracias».
Desglose paso a paso
- Compruebe si el pedido ya está dividido
- La función primero verifica si el pedido ya se ha dividido (usando un meta campo personalizado
_order_split
). Si es así, omite el proceso de división para evitar la duplicación.
- La función primero verifica si el pedido ya se ha dividido (usando un meta campo personalizado
- Artículos grupales por clase de envío
- Los artículos del pedido se recorren, y están agrupados por su clase de envío (
get_shipping_class_id
). Esto es útil cuando desea dividir el pedido en función de diferentes métodos o clases de envío.
- Los artículos del pedido se recorren, y están agrupados por su clase de envío (
- Verifique si se necesita división
- Si hay más de una clase de envío en el pedido, procede a dividir el pedido en múltiples pedidos más pequeños.
- Crear nuevos pedidos para cada clase de envío
- Para cada grupo de artículos en una clase de envío (que no sea el primero), se crea un nuevo pedido (
wc_create_order
). - Las direcciones de facturación y envío se copian del pedido original al nuevo pedido.
- Los elementos se clonan y el nuevo pedido está poblado con estos elementos, junto con todos los detalles relevantes, como la cantidad, el precio total, los impuestos y los meta datos.
- El pedido original tiene los artículos retirados después de haber sido transferidos al nuevo pedido.
- Para cada grupo de artículos en una clase de envío (que no sea el primero), se crea un nuevo pedido (
- Nota de pedido y totales
- Se agrega una nota al nuevo orden para indicar que se dividió del orden original.
- Los totales del nuevo pedido se recalculan y el método de pago se copia de la orden original.
- Finalizando los pedidos originales y nuevos
- El orden original tiene sus totales recalculados y el
_order_split
Se agrega meta para marcarlo como dividido. - El pedido original se guarda para reflejar los cambios, y el nuevo pedido se finaliza con el método de pago correcto, el estado y los totales.
- El orden original tiene sus totales recalculados y el
Este código es ideal para situaciones en las que un pedido debe dividirse en múltiples pedidos más pequeños en función de ciertas condiciones, como diferentes clases de envío. Asegura que cada nuevo pedido retenga los detalles relevantes del original, como la dirección de facturación/envío, el método de pago y la información del artículo. Esto puede ser útil en escenarios como dropshipping o pedidos que requieren envíos separados.