Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Cancelar automáticamente los pedidos que nunca se pagan en WooCommerce

En toda tienda se acumulan pedidos que nunca se pagan: alguien empezó a pagar con tarjeta y cerró la ventana, o eligió transferencia y nunca transfirió. Además de ensuciar la lista, bloquean stock: esas unidades no se pueden vender a otra persona.

Lo que WooCommerce ya hace solo

Los pedidos pendientes de pago (el cliente empezó el pago con tarjeta u otro medio en línea y no lo terminó) se cancelan automáticamente según este ajuste:

WooCommerce → Ajustes → Productos → Inventario → Mantener inventario (minutos)

Con un valor de 60, si después de una hora el pedido sigue pendiente, WooCommerce lo cancela y devuelve el stock. Si el campo está vacío, nunca se cancelan.

Esta cancelación usa las tareas programadas de WordPress. Si tu sitio tiene el cron desactivado sin una tarea real en el servidor, no se ejecutará. Revisa la guía sobre ?doing_wp_cron para dejarlo bien configurado.

Lo que no cancela: los pedidos en espera

Cuando alguien paga por transferencia bancaria, el pedido queda en espera hasta que tú confirmes el pago. WooCommerce nunca cancela esos pedidos solo, porque no puede saber si la transferencia llegó.

Si no revisas, se quedan ahí para siempre, con el stock reservado.

Un mu-plugin para cancelar los «en espera» antiguos

Este código revisa una vez al día los pedidos en espera pagados con transferencia que tengan más de 3 días, los cancela, devuelve el stock y deja una nota en el pedido. Guárdalo como wp-content/mu-plugins/cwp-cancelar-en-espera.php:

<?php
/**
 * Plugin Name: Cancelar pedidos en espera antiguos (Curso WordPress)
 */

const CWP_DIAS_EN_ESPERA = 3;

// Programar la tarea diaria con el sistema de acciones de WooCommerce.
add_action( 'init', function () {
	if ( function_exists( 'as_has_scheduled_action' ) && ! as_has_scheduled_action( 'cwp_cancelar_en_espera' ) ) {
		as_schedule_recurring_action( strtotime( 'tomorrow 09:00' ), DAY_IN_SECONDS, 'cwp_cancelar_en_espera' );
	}
} );

add_action( 'cwp_cancelar_en_espera', function () {
	$pedidos = wc_get_orders( array(
		'status'         => 'on-hold',
		'payment_method' => 'bacs', // Transferencia bancaria.
		'date_created'   => '<' . ( time() - CWP_DIAS_EN_ESPERA * DAY_IN_SECONDS ),
		'limit'          => 50,
	) );
	foreach ( $pedidos as $pedido ) {
		$pedido->update_status(
			'cancelled',
			sprintf( 'Cancelado automáticamente: sin pago después de %d días.', CWP_DIAS_EN_ESPERA )
		);
	}
} );

Al cambiar a Cancelado, WooCommerce devuelve el stock de los productos y, si está activado, envía el correo de pedido cancelado (por defecto, ese correo va a la tienda, no al cliente).

El código procesa hasta 50 pedidos por día para no sobrecargar el servidor. Si tienes muchos acumulados, se irán cancelando en los días siguientes.

Avisar antes de cancelar

Es más amable recordar antes de cancelar. Una buena práctica:

  1. Día 1: el correo de pedido en espera ya incluye los datos de transferencia.
  2. Día 2: un recordatorio («Tu pedido está reservado hasta mañana»). Se puede enviar con un plugin de correos automatizados o agregando una segunda acción programada parecida a la de arriba que envíe un correo con wp_mail() o agregue una nota al cliente con $pedido->add_order_note( $texto, true ), que WooCommerce envía por correo.
  3. Día 3: cancelación automática.

Y dilo claramente en la página de pago: «Los pedidos con transferencia se reservan por 3 días hábiles».

Antes de activarlo, revisa a mano los pedidos en espera antiguos: puede haber transferencias que sí llegaron y nadie marcó como pagadas. Cancelarlos por error generaría un problema con un cliente que ya pagó.

Comprueba que la tarea existe

En WooCommerce → Estado → Acciones programadas, busca cwp_cancelar_en_espera. Debería aparecer como pendiente para el día siguiente. Desde ahí también puedes ejecutarla a mano para probar.

¿Cuántos días le das a una transferencia antes de cancelar? Cuéntanos en el foro qué plazo usas en tu tienda.