blog webempresa

Cambiar estado del pedido en WooCommerce automáticamente

por | Ago 16, 2022 | WooCommerce

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.

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 comocode snippets

¿Cómo cambiamos el estado de forma automática en WooCommerce con plugin?


Actualmente existe algunos complementos que nos puedes facilitar esta tarea, uno de ellos puede ser AutoComplete WooCommerce Orders plugin el cual solo tendremos que buscar en el repositorio de WordPress instalar y activar.

Autocomplete WooCommerce Orders

Una vez tenemos instalado y activo el plugin necesitamos acceder a WooCommerce   Ajustes   Completar automáticamente los pedidos

Dentro de este tenemos tres opciones diferentes de configuración, dependiendo de nuestra necesidad solo necesitamos seleccionar uno y activar la opción, en este caso recomendamos activar la opción All paid orders of any product

  • Paid Orders of Virtual Products only
  • All paid orders of any product
  • Any order (paid or unpaid)

De este forma el plugin autoprocesara todas las órdenes que ingresen en tu tienda de forma automática.

 Ten en cuenta que 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.

 ¿Cómo cambiamos el estado de forma automática en WooCommerce con código?


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: Autocompletar todas las órdenes en woocommerce

/**
* Autocompletar todas las órdenes 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

Como puedes ver en este segundo método estaremos utilizando el ID de las pasarelas de pago para identificar de acuerdo al método de pago seleccione el cliente autocompletar la orden, antes que nada necesitamos saber cual es el ID de nuestras paraselas de pago, para localizar esta información tenemos que ir a WooCommerce   Ajustes   Pagos donde veremos el listado completo de las pasarelas de pago que ahora tenemos en nuestro sitio web.

 Identificando los ID de las pasarlas

Existe dos formas para identificar el ID de nuestras pasarelas, la primera sera posicionando el puntero sobre alguna de ellas donde veremos una URL que se muestra en la parte inferior izquuierda de nuestras pantallas, dentro de esta URL tendremos el ID de nuestra pasarela al final del todo, por ejemplo

La segunda opción para obtener el ID de nuestras pasarelas es editando el mento de pago e identificarla desde la URL que nos indica el navegador.

Te compartimos algunos de los ID más comunes que se añaden por defecto en WooCOommece

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

Una vez tenemos identifocada el ID de nuestras pasarelas podremos continuar apñadiendo el codigo en nuestro sitio web para configurar las opciones de autocompletar de acuerdo a nuestro método de pago.

// 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' );
}

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 código no funciona puedes probar con algún 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 configurar 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.

¿Te ha resultado útil este artículo?

Promo abril