Oferta SiteGround Black Friday

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…

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

¡Haz clic en los emoticonos para valorarlo!

Promedio de puntuación 5 / 5. Total de votos: 10

Hasta ahora ¡no hay votos!. Sé el primero en valorar este contenido.

Ya que has encontrado útil este contenido...

¡Sígueme en las redes sociales!

¡Siento que este contenido no te haya sido útil!

¡Ayúdame a mejorar este contenido!

Por favor, dime, ¿cómo puedo mejorarlo?

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

AVISO: Esta publicación es de hace 3 años o más. 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 funciona? pues entonces no he dicho nada :)

Sobre el autor

24 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

  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, los plugins que mencionas en la parte de abajo funcionan también con Mercado Pago? He realizado pruebas y no funcionan, algún consejo?

      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.

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

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

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

Deja un comentario

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

Información base sobre privacidad:
- Responsable: Fernando Tellado ([email protected])
- Fin del tratamiento: Moderación de comentarios para evitar spam
- Legitimación: Tu consentimiento
- Comunicación de los datos: No se comunicarán los datos a terceros salvo por obligación legal
- Derechos: Acceso, rectificación, portabilidad, olvido

 

Scroll al inicio