Enrique J. Ros

Cancelar las reservas en carrito de WooCommerce Bookings

Para evitar que dos usuarios realicen la misma reserva a la vez, cuando un usuario pone una reserva en el carrito WooCommerce Bookings crea una reserva temporal con estado «En el carrito», que no se liberará hasta pasados 60 minutos.

En esta entrada vamos a ver cómo podemos cancelar automáticamente las reservas en carrito de WooCommerce Bookings y establecer cuánto tiempo queremos que se mantengan, de forma que éstas no queden bloqueadas durante una hora completa si el usuario no la quita de su carrito.

Las reservas «En el carrito» de WooCommerce Bookings

En principio la idea es buena y tiene su lógica. Imagina que un usuario pone en su carrito una reserva para lo que sea que estés reservando (coches de alquiler, habitaciones de hotel, plazas de excursión, sesiones de asesoría…) y que, al mismo tiempo (o muy poco antes, o muy poco después) otro usuario hace lo mismo, para el mismo producto/servicio y el mismo horario.

Recuerda que puedes descargar gratuitamente WooCommerce Bookings, periódicamente actualizado, desde el área de suscriptores de la web si estás suscrito a los plugins (+info)

El resultado sería que, al llegar al checkout para formalizar la reserva, uno de los dos (el que más haya tardado en finalizar la compra) se encontraría con un error por estar ya previamente reservado. Es más, imagina que uno de ellos completa la reserva mientras que el otro está en el proceso de pago… En fin, un lío.

Reservas temporales en estado «En el carrito»

Para evitar estas situaciones, cuando un usuario añade una reserva al carrito WooCommerce Bookings crea una reserva temporal que bloquea ese slot. De esta forma, ningún otro usuario podrá disponer de esa reserva mientras que este usuario la tiene en el carrito.

Si el usuario formaliza la reserva a través del proceso de checkout, ésta pasa a confirmarse (o a quedar pendiente de confirmación, en función de la configuración que hayas hecho) y, si el usuario elimina dicha reserva del carrito sin llegar a formalizarla, la reserva temporal que se ha creado es igualmente eliminada y la franja vuelve a quedar disponible para otro usuario.

El problema viene cuando un usuario «abandona» el carrito, es decir, cuando no formaliza la reserva, pero tampoco la quita del carrito. Esto puede ser debido a múltiples razones: sólo la ha puesto en el carrito para hacer una prueba y no se molesta en vaciarla, ha tenido problemas con la pasarela de pago y las reserva se ha quedado ahí, la guarda para pensárselo y volver sobre el tema más tarde…

Para evitar que la reserva quede bloqueada sine die, WooCommerce Bookings crea una tarea cron llamada wc-booking-remove-inactive-cart, que pasada una hora comprueba si la reserva temporal sigue ahí y, si es así, la elimina. Podemos verla con algún plugin que nos permita ver y gestionar tareas cron, como WP Control:

Las reservas en estado «En el carrito» no se eliminan

Esto puede ocasionarnos dos problemas diferentes, en función de cuánto tráfico genere nuestro sitio web (i.e. cuántas visitas tiene):

  1. Si tiene poco tráfico, es posible que las tareas cron no se ejecuten correctamente, con lo que estas reservas temporales no son eliminadas.
  2. Si tiene mucho tráfico, pueden haber muchas reservas (que finalmente no se van a formalizar) bloqueadas durante una hora, evitando que otros usuarios puedan contratarlas y dando una falsa apariencia de baja disponibilidad.

Vamos a ver la solución a ambos problemas.

Borrar las reservas caducadas del carro de compra

WooCommerce Bookings incluye una herramienta que permite «limpiar» esas reservas temporales que ya han caducado, es decir, aquellas para las que ya ha pasado el tiempo establecido (60 minutos), pero que por algún motivo (generalmente porque el cron no ha disparado la tarea programada) no se han eliminado.

Pero es una herramienta manual, es decir, es preciso estar pendiente de lanzarla de forma manual. Puedes encontrar esta herramienta en WooCommerce > Estado > Herramientas > Borrar las reservas del carro de compra caducadas.

Sin embargo, este es un proceso manual que, además, sólo elimina las reservas que ya han caducado. Lo que buscamos es un proceso automático que nos permita personalizar el tiempo tras el cual se elimine la reserva creada, que WooCommerce Bookings establece, arbitrariamente y sin posibilidad de cambiarlo, en una hora.

Liberar automáticamente las reservas temporales de WooCommerce Bookings

Para ello vamos a usar un plugin que permite personalizar el tiempo de persistencia del carrito, es decir, el tiempo tras el cual el carrito será vaciado automáticamente si no se ha actualizado, es decir, si no se han producido cambios en él (añadir productos, eliminar productos o modificar cantidades.

Se trata de este plugin:

El plugin sirve para productos normales, claro está, vaciando el carrito de productos si el usuario lo deja abandonado (útil en comercios con mucha rotación de productos y stocks bajos), pero en el caso de las reservas en el carrito de WooCommerce Bookings también las vacía y, además, cancela esta reserva temporal.

Es perfecto para esta tarea porque no sólo permite establecer el tiempo tras el que el carrito se vaciará (y se eliminará la reserva temporal), sino que además permite mostrar un mensaje personalizado en el carrito, advirtiendo al usuario de cuánto tiempo dispone para formalizar su reserva antes de que ésta se elimine del carro:

Vídeo: Liberar las reservas de WooCommerce Bookings del carrito

En este vídeo puedes ver todo el proceso (en la versión actual del plugin las reservas son canceladas, no enviadas a la papelera):

Salir de la versión móvil