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 WooCommerce Autocomplete 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…

VALORA Y COMPARTE ESTE ARTÍCULO PARA MEJORAR LA CALIDAD DEL BLOG…
(1 votos, promedio: 5)

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

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

  1. Pingback: WooCommerce no manda emails ¿qué hago?

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

  3. 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;
    }

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

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

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

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

Deja un comentario

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

 

Ir arriba Ir al contenido