WordPress Hosting

Completar automáticamente los pedidos en WooCommerce

En WooCommerce, cuando alguien te hace un pedido de un producto virtual, los pedidos se quedan en espera, y debes cambiarlos tú mismo manualmente el estado al de completado.

Esto ocurre igualmente en todo tipo de producto para los métodos de pago que no sean directos, como contra reembolso o transferencia bancaria, pero en estos casos es casi normal que no se completen automáticamente pues antes debes comprobar si te han pagado mediante la comprobación en el mundo real, que no virtual.

Este comportamiento de WooCommerce es especialmente molesto, como te comentaba, cuando se refiere a productos virtuales y si todos los pagos se realizan mediante pasarelas de pago online, pues por mucho que hayas configurado al final tienes que pasarte cada dos por tres por la lista de pedidos e ir completándolos manualmente, y esto se aleja del concepto de tienda online un poco ¿no?

pagar con tarjeta woocommerce

Afortunadamente puedes forzar a que WooCommerce autocomplete los pedidos, para ello solo tienes que copiar y pegar uno de los siguientes códigos en el archivo functions.php del tema activo (mejor si es tema hijo) o, lo que siempre te recomiendo, en tu plugin de utilidades.

Autocompletar pedidos virtuales de WooCommerce

La opción más segura y lógica es forzar que se autocompleten los pedidos virtuales, el código es el siguiente:

/**
 * Autocompleta todos los pedidos virtuales
 * 
 */
 
add_filter( 'woocommerce_payment_complete_order_status', 'virtual_order_payment_complete_order_status', 10, 2 );
function virtual_order_payment_complete_order_status( $order_status, $order_id ) {
  $order = new WC_Order( $order_id );
  if ( 'processing' == $order_status &&
       ( 'on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status ) ) {
    $virtual_order = null;
    if ( count( $order->get_items() ) > 0 ) {
      foreach( $order->get_items() as $item ) {
        if ( 'line_item' == $item['type'] ) {
          $_product = $order->get_product_from_item( $item );
          if ( ! $_product->is_virtual() ) {
            // cuando encontramos un producto no virtual terminamos y rompemos el loop
            $virtual_order = false;
            break;
          } else {
            $virtual_order = true;
          }
        }
      }
    }
    // pedido virtual, marcado como completo
    if ( $virtual_order ) {
      return 'completed';
    }
  }
  // pedido no virtual, lo devolvemos al estado original
  return $order_status;
}

Autocompletar los pedidos pendientes de WooCommerce

El siguiente nivel de confianza sería forzar el autocompletado de los pedidos que estén en espera, pendientes, con este código:

/**
 * Autocompleta los pedidos pagados
 */
add_filter( 'woocommerce_payment_complete_order_status', 'bryce_wc_autocomplete_paid_orders' );
function bryce_wc_autocomplete_paid_orders( $order_status, $order_id ) {
	
	$order = wc_get_order( $order_id );
	if ( $order_status == 'processing' && ( $order->status == 'on-hold' || $order->status == 'pending' || $order->status == 'failed' ) ) {
		return 'completed';
	}
	
	return $order_status;
}

Autocompletar todos los pedidos de WooCommerce

Y, si lo tienes claro, igual el código que necesitas es el siguiente, que autocompleta todos los pedidos, independientemente de su estado:

/**
 * Autocompleta todos los pedidos de 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' );
}

Estados de pedido en WooCommerce

Una nota importante para que comprendas lo que hace cada código es saber los estados de pedido de WooCommerce, que son estos:

  • Completo (completed): Pedido finalizado y completo. No requiere ninguna acción.
  • 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 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
  • Reembolsado (refunded): Se ha devuelto todo o parte del importe al cliente editando el pedido para introducir un reembolso (manual o mediante la pasarela de pago)
  • Fallido (failed): El pago falló o se rechazó

Autocompletar pedidos en WooCommerce con plugins

Cómo no, si prefieres usar un plugin en vez de liarte con códigos puedes hacerlo. Tienes el plugin Autocomplete WooCommerce Orders, que viene a hacer lo mismo que en el último código.

Y, si lo prefieres, también puedes descargarte los códigos anteriores como plugins, que puedas instalar y activar fácilmente, aquí los tienes…

Compartir en redes
Resumir con IA

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en las estrellas para valorarlo!

Promedio de puntuación 4.7 / 5. Total de votos: 11

¡Todavía no hay votos! Sé el primero en valorar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en las redes sociales!

¿Te gustó este artículo? ¡Ni te imaginas lo que te estás perdiendo en YouTube!

AVISO: Esta publicación hace 3 años o más que no se actualiza. Si es un código o un plugin podría no funcionar en las últimas versiones de WordPress, y si es una noticia podría estar ya obsoleta. Luego no digas que no te hemos avisado. ¡Ah! ¿te sirvió?, pues entonces nada :-)


Sobre el autor

25 comentarios en “Completar automáticamente los pedidos en WooCommerce”

  1. Hola una pregunta con este plugin nos despleocupamos de estar pendiente
    si el cliente cuando comple,algun producto tenga uno que ir a porcesar
    el pago es automatico yo lo isntale y lo tengo en modo Off. pregunto de
    las cuatro variables que tiene esa es la correcta pues biene por defecto
    gracias.

  2. Hola, estoy tratando de utilizar el código para modificar el status solo de los pendientes (no on hold o processing), pero no funciona, podrías indicarme que falta? Mil gracias!
    El problema principal es que no se envía email de notificación al administrador de que se realizó una compra y está pendiente (tickets de Mercadopago).
    Por ello la idea sería que automáticamente se modifique el estado de pendiente que utiliza Mercadopago para los tickets, a on-hold y estimo que de esa manera el admin recibiría una notificación…

    /**
     * Autocompleta los pedidos pagados */
    add_filter( 'woocommerce_payment_complete_order_status', 'bryce_wc_autocomplete_paid_orders' );
    function bryce_wc_autocomplete_paid_orders( $order_status, $order_id ) {
        
        $order = wc_get_order( $order_id );
        if ( $order_status == 'pending' ) {
            return 'on-hold';
        }
        
        return $order_status;
    }
  3. Hola Fernando,

    He utilizado el código para que todos los pedidos se pongan automáticamente como Completado y funciona bien, pero claro, me está llegando el mail de «Espera mientras confirmamos el pago». Este mail se puede quitar que se envíe?, total, el pedido se confirma automáticamente.

    Gracias por todo tu trabajo.

    1. Hola Dani, este correo lo puedes desactivar en las opciones de correos que se envian desde los ajustes de Woocommerce

  4. pipe calderon

    Hola, muy interesante tu entrada, te felicito, todo muy bien explicado, solo queria preguntar si en woocommerce existe la posibilidad de auto completar un pedido sobre un producto en especifico, no por metodo de pago o por clasificación si es virtual o no, si no por x producto en especifico, agradezco tu atención

      1. pipe calderon

        Muchas gracias Fernando, me pondre manos a la obra, gracias por tu tiempo y respuesta. Muchas gracias

  5. Antonio Ortiz

    Buenos días Fernando:

    Vuelves a aparecer en mi vida, cuando busco una solución en WP 😉

    Aunque imagino que, esta ocasión, el código ha quedado obsoleto. He probado el código para productos virtuales y no cambia el estatus a completado.

    Tampoco funciona el enlace que aparece comentado en el código.

    Seguiré buscando.

    Un abrazo

  6. Gracias Fernando por tanta colaboración desinteresada!!!!!!!!!!
    Acabo de subir tu código para cambiar el estado de los pedidos virtuales a «completado» y funciona perfectamente.
    Gracias nuevamente, por esta ayuda y por las otras que obtengo leyendo tu blog.
    Te sigo siguiendo Master!!!!! Mil gracias!!!!!

  7. Hola Fernando,
    Muchas gracias por esto, lo he probado y funciona perfectamente el código. He probado el código para «Autocompletar pedidos virtuales de WooCommerce
    » y los pedidos de productos virtuales efectivamente se marcan directamente como completados. Lo único que veo que no funciona ( o por lo menos a mí no me funciona en los tests que he hecho ) es que no se envía el correo de Pedido completado al cliente. Debería hacerse automáticamente , no?

    Muchas gracias de nuevo!

  8. hola, olvidalo. acabo de probarlo de nuevo y funciona como un guante, se manda el correo. Muchísimas gracias!

  9. Hola, los plugins que mencionas en la parte de abajo funcionan también con Mercado Pago? He realizado pruebas y no funcionan, algún consejo?

  10. He probado los tres códigos y ninguno me ha funcionado, a alguien le funciona a la fecha?
    Saludos….

      1. Hola Fernando, los códigos los copié y pegue en el function.php probé uno por uno y nada, que puede ser lo que me esté afectando? Muchas gracias de antemano.

  11. Hola Fernando,

    Estoy probando el código para pasar todos los pedidos pagados a Completados, pero me da el siguiente error:

    PHP Fatal error: Uncaught ArgumentCountError: Too few arguments to function bryce_wc_autocomplete_paid_orders(), 1 passed

  12. quiero algo mas sofisticado que pase a epayco procesado que es el estado que manejamos luego de |0 minutos este compleado eso se puede ?????llevo semanas en eso

  13. y cuando tienes pago con tarjeta y transferencia bancaria en woocommerce que sucede?
    Si no haces nada, los pedidos pagados con tarjeta se quedan en «procesando» y no en «completado» y si haces esta modificación, todos los pedidos se marcarán siempre como «completados» aunque el cliente haya elegido transferencia bancaria y aún no te haya pagado…

  14. Hola!! El código para pasar los productos virtuales a completados me funciona cuando el producto no tiene coste (es como hice las pruebas. Si el producto se paga con tarjeta (Redsys) no pasa a completado.
    No quiero poner el código que pase todos los productos a completados, sólo los virtuales, por lo que no quiero usar el segundo código.
    Cómo debería hacerlo? Muchísimas gracias!

Los comentarios están cerrados.

Scroll al inicio