Tecnología y Coaching para Emprendedores

WooCommerce: Cómo Validar un Pedido Automáticamente

woocommerce

Después de dos meses validando todos los pedidos de los cursos de eSandra de manera manual, se me ha encendido el piloto automático de por qué no programar Woocommerce para que los pedidos se autovaliden solos. Antes que se me ocurriera esta maravillosa idea me he pasado más de dos meses mirando si había pedidos a todas horas, al despertarme, al acostarme, al pasear al perro… vamos, que algo que cuesta ni 30 minutos implementar yo lo había convertido en mi rosario habitual.

Así que, si no te apetece hacer de los pedidos de Woocommerce tu pesadilla habitual, sufriendo por si alguien compra un curso o producto digital y no tiene acceso instantáneo, este tutorial es para ti. Se puede aplicar también a productos físicos haciendo una pequeña modificación en el código, y sólo se validarán automáticamente los pedidos que se hayan procesado correctamente.


Cómo Validar un Pedido de WooCommerce Automáticamente

Para validar un pedido de manera automática con Woocommerce puedes hacer dos cosas: una, modificar el código del archivo functions.php de tu tema y dos, comprar un plugin que lo hace por ti. La ventaja de editar el código es que no cargas tu WordPress con un plugin más, con lo que es de agradecer. La ventaja de comprar un plugin es que si Woocommerce hace una actualización masiva y este código deja de funcionar, tendrás acceso a las actualizaciones del plugin, mientras que si lo haces manual deberás volver a implementarlo.

El código que te presento aquí funciona con Woocommerce 2+, si usas versiones anteriores no te va a funcionar. Yo lo he probado con la última versión disponible hasta la fecha, la 2.2.7 y funciona a la perfección.

Lo que has de hacer es añadir a tu archivo functions.php el siguiente código:

// Validar pedidos woocommerce automaticamente
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order' );
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() ) {
            // si no hay productos virtuales, sal del bucle
            $virtual_order = false;
            break;
          } else {
            $virtual_order = true;
          }
        }
      }
    }

    // orden virtual, marcar completada
    if ( $virtual_order ) {
      return 'completed';
    }
  }

  // producto físico, dejar procesando
  return $order_status;
}

Fíjate en las últimas líneas de código, sólo se valida el producto de manera automática si lo tienes configurado como virtual. Para ello has de ir a la ficha de producto y marcar la casilla de pedido virtual:

woocoomerce producto virtual

Te recomiendo dejarlo así porque si se trata de un producto físico que has de enviar, es mejor que no lo des por completado hasta que hayas procedido a realizar el envío, aunque esto ya es cosa de cada uno.


Para acabar..

Espero que este tutorial te haya sido útil, yo todavía estoy tirándome de los pelos de los más de dos meses validando todo manual, es una tendencia que siempre he tenido, saber facilitar la vida de los demás en extremo y complicar la mía hasta el infinito y más allá (sí, he visto Toy Story, jeje). Te agradeceré que dejes un comentario y que compartas este post en las redes sociales.

¡Gracias por compartir!


Comentarios

  • Antonio

    Hola Sandra,

    Muchas gracias por compartir este tip.

    Es de gran ayuda. Sobre todo, como bien dices, para el caso de productos virtuales donde no tienes que gestionar los gastos de envío.

    Supongo que se podría aplicar también para productos externos o afiliados donde tampoco se gestiona el stock, ni los gastos de envío.

    Enhorabuena por tu trabajo. Te sigo desde hace tiempo y me encanta la filosofía que intentas transmitir a través de tu blog.

    Un saludo!

    • Sandra

      Muchas gracias, Antonio! La verdad es que este pequeño truco a mí me ha salvado la vida, jeje. Un saludo!

  • DIego

    Mil gracias Sandra! es un gran script que te soluciona la vida. Agracer es lo ménos que puedo hacer.

    Saludos

    • Sandra

      Hola Diego, pues también gracias por tomarte el tiempo de dejar un comentario, se agradece!

  • Ismael

    Muchas gracias por compartirlo. He realizado tus pasos pero no me sale. El problema que tengo es que cuando le doy a la pestaña de “finalizar pedido” después de hacer una prueba de pedido, me lleva directamente a la pagina de “carrito” completamente vació y lo suyo seria que me llevara a una pagina de “agradecimiento”. También te quería decir que utilizo gastos de envio y no puedo darle a la pestaña “virtual”. Si me pudieras ayudar te lo agradecería porque me tiene un poco desesperado.

    Gracias y un saludo.

    • eSandra

      Hola Ismael, sin verlo es imposible decirte dónde está el error, si finalizas el pedido es normal que el carrito se quede vacío.. revisa también que lo tengas como producto virtual cuando creas el producto.. suerte!

  • Luis

    Hola. He probado el scrip y no me funciona. Me da el siguiente error

    Warning: call_user_func_array() expects parameter 1 to be a valid callback, function ‘custom_woocommerce_auto_complete_order’ not found or invalid function name in /home/danieles/public_html/es/wp-includes/plugin.php on line 496

    La version de woocommerce es la 2.3.10 , quizas ya no es compatible. Si tienes alguna sugerencia te lo agradeceria.

    • eSandra

      Yo lo sigo usando con la última versión de Woocommerce y sigue funcionando, debe haber algún error en tu código, pues te indica que no encuentra el nombre de la función en el archivo indicado.. suerte!