Cambiar estado del pedido en WooCommerce automáticamente

Cuando desarrollamos una tienda online necesitamos configurar algunas opciones que nos permitan tener algunas opciones automatizadas y gestionar mejor el tiempo.

En WooCommerce, cuando alguien realiza una compra, esta orden se añade automáticamente en la lista de pedidos y le asigna un estado en función del método de pago que el cliente haya seleccionado.

Los estados de los pedidos permiten que identifiquemos en que paso se encuentra cada una de las órdenes que tenemos en nuestra tienda, si un pedido está en Espera quiere decir que los productos de ese pedido se han disminuido del stock, pero aún no se ha recibido el pago por ellos.

WooCommerce asigna por defecto un estado a cada pedido que ingrese en nuestra tienda, pero no actualiza el estado aun cuando se haya recibido el dinero y el cliente ya tenga su paquete. Esta tarea queda siempre a cargo del administrador del sitio web o la tienda y son ellos quienes deben actualizar los estados a Completado de forma manual.

Es por ello que vamos a verificar como podemos cambiar el estado del pedido en WooCommerce de forma automática.

¿Como cambiamos el estado de forma automática en WooCommerce?

A excepción de la pasarela de pago PayPal si la hemos configurado de forma correcta, el resto de los métodos de pago no se actualizan de forma automática a Completado, sino que se quedan en un estado de Procesando.

Para modificar estos estados tenemos dos opciones, una a través de plugin y otra con un código que puedes añadir en el function.php de tu tema o a través de un complemento como code snippets

Para la primera opción tenemos disponible el plugin Autocomplete WooCommerce Orders

Autocomplete WooCommerce Orders

Una vez instalas y activas el plugin debes acceder al apartado WooCommerce -> Ajustes -> Completar automáticamente los pedidos

De esta forma las órdenes que se procese el pago se marcaran como completadas de forma atomística.

Para la segunda opción usaremos un código que añadiremos con el plugin de code snippets

Code Snippets

Para ello solo tenemos que instalar el plugin y acceder al apartado Fragmento de Código -> Añadir nuevo

Para ello tendremos dos opciones un código para completar todas las órdenes de forma automática y otro código para seleccionar cuáles métodos de pago se completan las órdenes.

Todo esto dependerá de como queremos configurar nuestra tienda.

Método 1: Auto completar todas las ordenes en woocommerce

/**
* Auto completar todas las ordenes en woocommerce
*/
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order' );
function custom_woocommerce_auto_complete_order( $order_id ) {
if ( ! $order_id ) {
return;
}

$order = wc_get_order( $order_id );
$order->update_status( 'completed' );
}

Método 2: Actualiza automáticamente el estado de los pedidos a Completado  con ID’s de Pasarela

// Actualiza automáticamente el estado de los pedidos a Completado
add_action( 'woocommerce_order_status_processing', 'actualiza_estado_pedidos_a_completado' );
add_action( 'woocommerce_order_status_on-hold', 'actualiza_estado_pedidos_a_completado' );
function actualiza_estado_pedidos_a_completado( $order_id ) {
global $woocommerce;

//ID's de las pasarelas de pago a las que afecta
$paymentMethods = array( 'redsys', 'bacs', 'cheque', 'cod', 'paypal' );

if ( !$order_id ) return;
$order = new WC_Order( $order_id );

if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( 'completed' );
}

En este código vemos que se añaden las pasarelas

  • Transferencia Bancaria Directa (ID = ‘bacs‘)
  • Pago mediante cheques (ID = ‘cheque‘)
  • Pago en entrega (ID = ‘cod‘)
  • Paypal (ID = ‘paypal‘)
  • Redsys (ID = ‘redsys‘)

De esta forma de acuerdo a lo que deseamos implementar podemos marcar como completado todos los métodos de pago que tenemos disponibles o solo algunos.

Como autocompletar pedidos Virtuales

Para completar los pedidos virtuales de forma automática puedes usar el siguiente código

add_action('woocommerce_thankyou', 'we_autocomplete_virtual_orders', 10, 1 );
function we_autocomplete_virtual_orders( $order_id ) {
if( ! $order_id ) return;
// Get order
$order = wc_get_order( $order_id );
// get order items = each product in the order
$items = $order->get_items();
// Set variable
$only_virtual = true;
foreach ( $items as $item ) {
// Get product id
$product = wc_get_product( $item['product_id'] );
// Is virtual
$is_virtual = $product->is_virtual();
// Is_downloadable
$is_downloadable = $product->is_downloadable();
if ( ! $is_virtual && ! $is_downloadable ) {
$only_virtual = false;
}
}
// true
if ( $only_virtual ) {
$order->update_status( 'completed' );
}
}

Si este codigo no funciona puedes probar con algun otro como:

add_filter( 'woocommerce_payment_complete_order_status', 'auto_complete_virtual_orders', 10, 3 );

function auto_complete_virtual_orders( $payment_complete_status, $order_id, $order ) {
$current_status = $order->get_status();
// Solo queremos actualizar el estado a 'completado' si proviene de uno de los siguientes estados:
$allowed_current_statuses = array( 'on-hold', 'pending', 'failed' );

if ( 'processing' === $payment_complete_status && in_array( $current_status, $allowed_current_statuses ) ) {

$order_items = $order->get_items();

// Crear una matriz de productos en el pedido
$order_products = array_filter( array_map( function( $item ) {
// Obtenga el producto asociado para cada artículo de línea
return $item->get_product();
}, $order_items ), function( $product ) {
// Eliminar no productos
return !! $product;
} );

if ( count( $order_products > 0 ) ) {
// Comprobar si cada producto es 'virtual'
$is_virtual_order = array_reduce( $order_products, function( $virtual_order_so_far, $product ) {
return $virtual_order_so_far && $product->is_virtual();
}, true );

if ( $is_virtual_order ) {
$payment_complete_status = 'completed';
}
}
}
return $payment_complete_status;
}

Si deseas modificar el estado por otro, solo debes modificar la línea que indica  » $order->update_status( ‘completed’ ); «

Puedes poner el estado que quieras:

Completo (completed): Pedido finalizado y completo.
Pendiente (pending payment): Pedido recibido, sin recibir aún el pago
Procesando (processing): El pago se ha recibido y se ha actualizado el inventario para eliminar la unidad de artículo. El pedido está pendiente de completar manualmente
En espera (on hold): Pendiente de que se realice el pago. El artículo se descuenta del inventario, pero antes de que se complete hay que confirmar el pago y completarlo (manualmente)
Cancelado (cancelled): Pedido cancelado, ya sea por parte del cliente o de un gestor de la tienda

Conclusiones:

Como vemos hay diferentes maneras con las que podemos añadir una administración más eficiente de nuestra tienda; sin embargo, si quieres mantener todo el control sobre que pedidos se completan y cuáles no te sugiero, uses las configuraciones por defecto de WooCommerce.

 

 

 

 

Updated on 25 mayo, 2022

Related Articles