Seleccionar página

WooCommerce – Como cambiar automáticamente el estado de un pedido a COMPLETADO

por | Abr 7, 2016 | Woocommerce

Í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

WooCommerce pedido COMPLETADO

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.

WooCommerce pedido COMPLETADO  

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

Pasarelas pago

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»

Pedidos-estados

Pedidos-estados

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

 

32 Comentarios

  1. johan castillo

    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

    Responder
    • Lph by Nerea Liébana

      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

      Responder
  2. Cesar

    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.

    Responder
    • Lph by Nerea Liébana

      Hola César, quizá eso lo puedas gestionar desde «usuarios». Un saludo

      Responder
  3. Miquel

    ¿En qué parte del archivo functions.php se puede poner esto?

    Responder
    • Lph by Nerea Liébana

      Hola Miquel,
      dónde quieras pero no rompas otra función, puedes colocarlo al final.
      Saludos,

      Responder
  4. Andrés Zapata

    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’ );
    }

    Responder
  5. Maryori

    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

    Responder
  6. senen

    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…..

    Responder
  7. Anthony Michelle

    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?

    Responder
  8. Gustavo

    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

    Responder
    • Lph by Nerea Liébana

      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,

      Responder
  9. Juanjo1642

    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

    Responder
  10. Roberto

    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

    Responder
  11. Jose

    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

    Responder
    • Lph by Nerea Liébana

      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,

      Responder
  12. Brenda atto

    Hola, muy buen articulo, consulta, una función que me ayude a crear pedidos masivos de todos los usuarios?

    Responder
    • Lph by Nerea Liébana

      Buenos días Brenda, no entiendo muy bien tu consulta, puedes explicar un poco más tu duda?

      Responder
  13. Vero

    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’ );
    }

    Responder
    • Lph by Nerea Liébana

      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,

      Responder
  14. Ales

    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?

    Responder
    • Lph by Nerea Liébana

      Hola Ales, perdona la tardanza, he tenido un mes complicado. Sigues con el mismo problema?

      Responder
  15. Paolo Pinedo

    Hola, como hago para notificarle desde estas notificacioesn al cliente que su pedido ha sido anulado? (Cancelled order )

    Responder
    • Lph by Nerea Liébana

      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,

      Responder
  16. David

    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?

    Responder
    • Lph by Nerea Liébana

      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.

      Responder
  17. Nan

    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

    Responder
    • Lph by Nerea Liébana

      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,

      Responder
  18. jon

    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

    Responder
    • Lph by Nerea Liébana

      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,

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *