Índice de contenidos
WooCommerce pedido COMPLETADO de forma automática en pasarelas de pago
Cómo modifica WooCommerce el estado de un pedido
WooCommerce crea automáticamente los pedidos u ordenes cuando un cliente compra un producto en nuestra tienda y completa el proceso de compra. Los pedidos sólo son visibles por el administrador o usuarios con permisos de acceso.
Cuando un cliente completa el proceso de compra, podemos visualizar los pedidos y los detalles de los mismos entrando en la administración de la página y pulsando sobre el menú WooCommerce >> Pedidos
Observa que al crear el pedido el plugin ha añadido un ID o identificador único además de otros datos como precio total, fecha de compra, nombre del cliente, email…
A cada orden de compra se le asigna un estado. Este estado asignado depende de la fase en la cual se encuentre el proceso de compra. WooCommerce utiliza los siguientes estados:
- Pendiente: Orden recibida (el pago no se ha recibido)
- Error: El pago ha fallado o se ha rechazado (error al efectuar el pago)
- Procesamiento: Pago recibido y el artículo se ha descontado del inventario. La orden está a la espera de completar el proceso por parte del administrador (proceso que tienes que realizar manual)
- Completa: Orden cumplida y completa. (pago recibido, pedido enviado… a terminado todo el proceso de compra y venta)
- En espera: Pendiente de pago. El artículo se descuenta del inventario, pero es necesario confirmar el pago. (para cambiarlo hay que realizar un proceso manual por parte del administrador)
- Cancelado: Cancelado por un administrador o el cliente.
- Reembolso: Esta acción es aplicada por el administrador. (Devolución de un producto)
Puedes ver los diferentes estados de los pedidos de tu tienda si entras en la administración de WordPress en el menú WooCommerce >> Pedidos, la primera columna indica mediante un símbolo el estado del pedido.
Cuándo WooCommerce NO asigna el estado COMPLETADO a un pedido
PROBLEMA: WooCommerce no asigna el estado COMPLETADO a los pedidos realizados mediante pasarelas de pago (por ejemplo paypal, redsis…), a estos pedidos les asigna los siguientes estados: «en espera» o «procesando«. Para modificar el estado y marcar el pedido como «completado» hay que hacerlo de forma manual entrando en el administrados de WordPress.
SOLUCIÓN: añadir un pequeño código a tu archivo functions.php. Este código o función cambia de forma automática el estado del pedido de procesando o en espera a completado.
(para no perder los cambios de este archivo en futuras actualizaciones lo más recomendable es que trabajes con temas hijos)
Función para cambiar de forma automática el estado de un pedido
Copia y pega el siguiente código
Abre tu archivo functions.php y copia y pega el siguiente código.
Encontrarás el archivo functions.php en la siguiente ruta:
wp-content/themes/tutheme/functions.php
// 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, te lo explico a continuación $paymentMethods = array( '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' ); }
Aclaraciones sobre el código
Funcionamiento del código
add_action( 'woocommerce_order_status_processing', 'cambiar_estado_de_pedidos_a_completado' ); add_action( 'woocommerce_order_status_on-hold', 'cambiar_estado_de_pedidos_a_completado' );
Las dos primeras líneas del código están indicando que cuando un pedido está en estado procesado (woocommerce_order_status_processing) o en espera (woocommerce_order_status_on-hold) entonces se ejecutará la función: function cambiar_estado_de_pedidos_a_completado. La función recibe el ID de la orden ( $order_id ), si el ID existe dentro del array de métodos de pago ($paymentMethods = array( ‘bacs’, ‘cheque’, ‘cod’, ‘paypal’ );), es decir si el pedido se ha pagado con alguno de los siguientes métodos de pago (‘bacs’, ‘cheque’, ‘cod’, ‘paypal’), entonces asignar al pedido el estado «Completado».
Array de ID de métodos de pago
$paymentMethodsID = array( 'bacs', 'cheque', 'cod', 'paypal' );
Este array guarda todos los métodos de pago que tenemos disponibles en nuestra tienda WooCommerce, podemos añadir o quitar algunos métodos de pago según nuestra configuración, lo lógico es que este array coincida con los métodos de pago que estamos usando.
Para ver esto debes ir a WooCommerce >> Ajustes >> Finalizar Compra >> Pedido opciones, navega hacia la parte de abajo de la página y encontrarás la siguiente tabla
en el array debes incluir los nombres de cada método de pago (columna Pasarela ID) que tengan la V en la columna activado.
Los IDs de pasarelas de pago suelen ser los siguientes:
- Transferencia bancaria directa: ‘bacs’
- Contra reembolso: ‘cod’
- Pago con cheque: ‘cheque’
- PayPal: ‘paypal’
- PayPal Express: ‘ppec_paypal’
- Stripe: ‘stripe’
- RedSys: ‘redsys’
Si trabajas con WooCommerce y necesitas modificar el formulario de envío te puede ser útil el siguiente artículo.
Modificar ajustes de correo electrónico que le llegan al cliente
Al principio del post he explicado como WooCommerce va a asignar a la orden de compra un estado, si el estado asignado es: procesando, además enviará un email al cliente indicando que su pedido se encuentra en proceso, después nuestra tienda ejecutará la función nueva que hemos añadido y cambiará el estado a completado y enviará un nuevo email al cliente.
El cliente recibirá dos emails seguidos, uno que le indica que el pedido está en proceso y un segundo email que le indica que su pedido está completado.
No tiene sentido que el cliente reciba los dos emails seguidos ya que el estado procesando es un estado de transición y no necesitamos que el cliente reciba ningún email. Para que WooCommerce no envíe este primer email debemos cambiar la configuración en: WooCommerce >> Ajustes >> Correos electrónicos, ir a configuración (ruedita de la derecha) y desmarcar la casilla « Habilitar esta notificación por correo electrónico»
Por último es recomendable realizar pruebas de compras para comprobar que todo funciona correctamente, presta atención al cambio de estado automático y a recibir sólo un email de estado.
Te puede interesar:
WooCommerce eliminar campos de formularios envío y facturación
hola buenas tardes mira uso el código para hacer el cambio automático del estado de mis pedidos pero no funciona, no se si es porque el estado en donde esta que dando es pendiente de pago a pesar de que el pago ya se realizo, pero no entiendo que sucede, podrías ayudarme
Hola Johan, ¿has mirado si hay algún error al copiar el código?, ¿has comprobado los IDs de la pasarela de pago? en el código yo pongo unos de ejemplo pero estos deben coincidir con los de tu tienda. ¿Para que tipo de pasarela lo estás utilizando?. Necesito más datos para poder ayudarte. Saludos
Hola, muy buen articulo lo apliqué y me funcionó perfecto. Mi pregunta es tengo un plugin que cobra mensualmente, se podría volver a cambiar el rol en caso de que el usuario se atrase por ejemplo 10 días.
Hola César, quizá eso lo puedas gestionar desde «usuarios». Un saludo
¿En qué parte del archivo functions.php se puede poner esto?
Hola Miquel,
dónde quieras pero no rompas otra función, puedes colocarlo al final.
Saludos,
Este código me fue muy útil para CANCELAR pedidos, de forma automática, cuando están en espera, pero la cancelación del pedido es inmediata, es decir, cuando el usuario ejecuta el botón Finalizar Compra en el Checkout el pedido queda registrado en WooCommerce pero como cancelado.
¿Es posible que este código se ejecute tras unos minutos?
Es decir, lo que quiero es que el usuario pueda montar su pedido, cuando el pago sea por transferencia, el pedido quedará en estado EN ESPERA, y pasados unos 30 minutos si no se ha verificado el pago y se ha puesto manualmente como completado, entonces que el sistema ejecute el código y lo pase a CANCELADO.
¿Esto es posible? Agradezco de antemano la ayuda.
// Actualiza automáticamente el estado de los pedidos EN ESPERA a CANCELADO
add_action( ‘woocommerce_order_status_on-hold’, ‘actualiza_estado_pedidos_a_cancelado’ );
function actualiza_estado_pedidos_a_cancelado( $order_id ) {
global $woocommerce;
//ID’s de las pasarelas de pago a las que afecta, te lo explico a continuación
$paymentMethods = array( ‘bacs’, ‘cheque’, ‘cod’);
if ( !$order_id ) return;
$order = new WC_Order( $order_id );
if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( ‘cancelled’ );
}
Hola Andrés, una transferencia tarde en ocasiones un par de días en hacerse efectiva. Tienes plugins que pueden cancelar una transferencia bancaria y su pedido pasado X días, por ejemplo: https://es.wordpress.org/plugins/woo-cancel-abandoned-order/
Saludos
Hola! justo intente con el código
pero el id del método de pago es para pse(en colombia), no se si no es el adecuado el nombre del id. pero no se cumple la función. no cambia. Se queda que pendiente de pago. si me puedes colaborar. te lo agradezco
Hola , como puedo hacer para que la pasarela de pago Stripe, no me devuelva automáticamente el importe pagado por el cliente, cuando paso de completado a cancelado, a veces cancelamos predichos completados para diferentes gestiones, y resulta que Stripe hace un refundé automáticamente!!!! no hay ningún parámetro en woocomerce que s pueda cambiar [para que no lo haga? por ejemplo redsys automáticamente devuelve 0€ es decir, no devuelve si cambias el estado del pedidos quieres hacer una devolución la heces tu de otro modo, a través del banco era, pero la pasarela no te la juega como hace Stripe…..
hola, de maravilla el codigo, pero quiero que funcione cuando elijan el metodo de pago de transferencia o deposito bancario los cambie a pendiente de pago, es posible esto?
Buenas tardes,
yo tengo el problema exactamente al revés. Es decir cuando entra una imagen, automaticamente me pasa a completado. El caso es que quiero volver al estado en que me aparecian los pedidos, porque cuando entra un pedido, si no es por el correo, no me entero y no hay forma, en ninguno de los miles archivos function.php que tengo en mi directorio me aparece justo esa parte. Como puedo hacer para ubicarlo? Gracias desde luego
Hola Gustavo,
puedes manejar en el script los estados
$order->status = ‘pending’;
Estos son los estados que puedes configurar:
Pending – Order received (unpaid)
Failed – Payment failed or was declined (unpaid)
Processing – Payment received and stock has been reduced- the order is awaiting fulfilment
Completed – Order fulfilled and complete – requires no further action
On-Hold – Awaiting payment – stock is reduced, but you need to confirm payment
Cancelled – Cancelled by an admin or the customer – no further action required
Refunded – Refunded by an admin – no further action required
Un saludo,
Buenas, alguién me puede decir cual sería el id de los pagos mediante monedero¿? De monedero utilizo el plugin de Tera Wallet.
Un Saludo y muy buen post
Hola Juanjo,
no he trabajado con Tera Wallet, igual en el foro de soporte pueden ayudarte.
https://wordpress.org/support/plugin/woo-wallet/
Un saludo
Hola que tal, tengo un problema tengo configurado woocomerce para productos descargables, pero al momento de realizar el check out en paypal u otro método de pago lo redirecciona a la página de agradeciemiento pero no aparece el producto para descargar. Sabes como podría hacer que el archivo aparezca para la descargar luego del pago ? muchas gracias
Hola Nerea, en mi plugin de Woocommerce no me aparecen los ID de los metodos de pago por lo que desconozco el ID de redsys.
He probado con varios nombres aleatorios y no encuentro el adecuado, además de buscar por la red.
Agradecería si sabes el ID me lo hagas saber.
Tiene muy buena pinta esta entrada, pero no he conseguido ahcerlo funcionar.
Saludos
Buenos días Jose, tienes razón, en algunas versiones de WooCommerce no se muestra el ID de las pasarelas de pago. Los habituales son los siguientes:
Transferencia bancaria directa: ‘bacs’
Contra reembolso: ‘cod’
Pago con cheque: ‘cheque’
PayPal: ‘paypal’
PayPal Express: ‘ppec_paypal’
Stripe: ‘stripe’
RedSys: ‘redsys’
Que tengas un buen día,
Hola, muy buen articulo, consulta, una función que me ayude a crear pedidos masivos de todos los usuarios?
Buenos días Brenda, no entiendo muy bien tu consulta, puedes explicar un poco más tu duda?
Hola Nerea! Muchas gracias por tu post!
He probado el código en el functions-php del child-theme y no me funciona :/
Tengo Wc 3.3 y la última verisónd el plugin de Redsys..lo he puesto así y aún así los pedidos me quedan en «pendients de pago», alguna idea?:
// Actualiza automticamente 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
$paymentMethods = array( ‘redsys’ );
if ( !$order_id ) return;
$order = new WC_Order( $order_id );
if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( ‘completed’ );
}
Buenas tardes Vero, es complicado ayudarte sin conocer tu web o el error que te lance. No sé si estás capturando los errores y me puedes dar más indicaciones.
Un saludo,
Hola,
Muy buen post, enhorabuena!
A mi me pasa que PayPal me funciona pero con el pago por tarjeta no.
He puesto el mismo id en el array pero nada.
————————————————————–
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( ‘ceca_gw’, ‘paypal’ );
if ( !$order_id ) return;
$order = new WC_Order( $order_id );
if ( !in_array( $order->payment_method, $paymentMethods ) ) return;
$order->update_status( ‘completed’ );
}
————————————————————–
Pasarela ID de la pasarela
Transferencia bancaria directa bacs
Pagos por cheque cheque
Contra reembolso cod
PayPal paypal
Pago por tarjeta ceca_gw
Alguna idea?
Hola Ales, perdona la tardanza, he tenido un mes complicado. Sigues con el mismo problema?
Hola, como hago para notificarle desde estas notificacioesn al cliente que su pedido ha sido anulado? (Cancelled order )
Hola Pablo, en versiones anteriores a 3.0.8 de WooCommerce cuando un envío cambia a estado cancelado envía un error. Supongo que en tu caso tienes esta versión o superior y no tienes el email de cancelado. En ese caso puedes instalar algún plugin como:
https://es.wordpress.org/plugins/woo-custom-emails/
También hay una función que puedes agregar a tu archivo functions.php, si te da resultado te evitas tener otro plugin.
[php]
/* * Add customer email to Cancelled Order recipient list */
function wc_cancelled_order_add_customer_email( $recipient, $order ){
return $recipient . ‘,’ . $order->billing_email;
}
add_filter( ‘woocommerce_email_recipient_cancelled_order’, ‘wc_cancelled_order_add_customer_email’, 10, 2 );
[/php]
Un saludo,
Hola, excelente aporte muchas gracias. tengo una pregunta puntual, Yo envío al cliente a una pasarela de pagos externa ¿Cómo puedo hacer que el mail de pedido completado le llegue al cliente cuando regrese de a la página de pago realizado exitosamente?
Hola David, gracias a ti por comentar.
Si has realizado los cambios de pedido automático Completado ya se le envía al cliente un email:
Orden Completa significa: Orden cumplida y completa. (pago recibido, pedido enviado… a terminado todo el proceso de compra y venta)
por otro lado supongo que la pasarela también envía una notificación al cliente.
Has realizado pruebas para controlar que emails llegan?
También puedes editar la plantilla de completado con datos.
Hola, cambié el paymentmethods al que me indica mi forma de pago (TPV) pero no me ha funcionado. He leído muchas webs con posibles soluciones pero ninguna me ha funcionado, siempre se queda el pedido en Pendiente de pago y solo se puede cambiar manual… es muy poco práctico
Gracias
Buenos días, has comprobado que en el paymentmethods tienes el ID que aparece en WooCommerce >> Ajustes >> Finalizar Compra >> Pedido opciones? Tienes algún otro método de pago como paypal para comprobar si con paypal funciona? el código te muestra algún error? para ayudarte necesito más información.
Un saludo,
Hola,
Estoy usando el WordPress 4.6.3 porque la pasarela de pago que utilizo en Woocommercer es Redsys, puede valer este código para estas características?
Un saludo
Buenos días Jon, te ánimo a que pruebes el código no tiene por que dar problemas, recuerda completar bien el array de métodos de pago. Si tienes algún problema entre los dos lo solucionamos.
Feliz lunes,