Cómo mostrar un mensaje mientras WooCommerce procesa un pedido

Tabla de Contenidos

Al revisar Analytics es frecuente encontrar muchas visitas a la página de checkout, pero bastantes menos a la página de pedido completado. Esto puede deberse a diferentes motivos, aunque uno de ellos es especialmente fácil de evitar: el cliente no sabe si WooCommerce está procesando correctamente su pedido.

Algunas pasarelas necesitan varios segundos para validar el pago y crear el pedido. Durante ese tiempo, el botón permanece cargando, pero WooCommerce no siempre ofrece una explicación clara. El cliente puede pensar que la página se ha bloqueado, volver a pulsar el botón, recargarla o cerrarla antes de que termine el proceso.

En este tutorial aprenderás a mostrar un mensaje mientras WooCommerce procesa un pedido, indicando al cliente que debe esperar y no recargar la página.

Por qué conviene mostrar un aviso durante el pago

Cuando una tienda tarda unos segundos en completar un pedido, la ausencia de información genera incertidumbre. Esto resulta especialmente problemático en compras realizadas desde conexiones lentas o cuando la pasarela de pago necesita comunicarse con servicios externos.

Un mensaje como este deja claro que el proceso continúa:

Espera un momento mientras procesamos tu pedido
No cierres ni recargues esta página.

El aviso no hace que WooCommerce procese el pago más rápido, pero mejora la experiencia de compra y reduce la posibilidad de que el cliente interrumpa accidentalmente el pedido.

Snippet para mostrar un mensaje mientras WooCommerce procesa un pedido

El siguiente código muestra una ventana superpuesta después de que el cliente pulse el botón para realizar el pedido.

				
					/**
 * Muestra un mensaje mientras WooCommerce procesa el pedido.
 *
 * El mensaje solo aparece cuando el formulario es válido.
 *
 * Compatible con:
 * - Checkout por bloques de WooCommerce
 * - Checkout clásico de WooCommerce
 */

add_action( 'wp_footer', function () {

	// Cargar únicamente en la página de finalizar compra.
	if (
		! function_exists( 'is_checkout' ) ||
		! is_checkout() ||
		is_order_received_page()
	) {
		return;
	}
	?>

	<div
		id="order-processing-message"
		aria-hidden="true"
	>
		<div class="order-processing-box">

			<div class="order-processing-spinner"></div>

			<h3>
				<!-- Puedes modificar este título -->
				Espera mientras procesamos tu pedido
			</h3>

			<p>
				<!-- Puedes modificar este mensaje -->
				No recargues ni cierres esta página.
			</p>

		</div>
	</div>

	<style>

		/* Capa que cubre toda la pantalla */
		#order-processing-message {
			position: fixed;
			inset: 0;
			z-index: 999999;
			display: flex;
			align-items: center;
			justify-content: center;
			padding: 20px;
			background: rgba(0, 0, 0, 0.45);
			opacity: 0;
			visibility: hidden;
			pointer-events: none;
			transition:
				opacity 0.2s ease,
				visibility 0.2s ease;
		}

		#order-processing-message.show {
			opacity: 1;
			visibility: visible;
			pointer-events: auto;
		}

		/* Caja del mensaje */
		.order-processing-box {
			width: 100%;
			max-width: 440px;
			padding: 32px 24px;
			border-radius: 10px;
			background: #ffffff;
			color: #222222;
			text-align: center;
			box-shadow: 0 12px 35px rgba(0, 0, 0, 0.18);
		}

		.order-processing-box h3 {
			margin: 0 0 10px;
			font-size: 20px;
			font-weight: 600;
			line-height: 1.4;
		}

		.order-processing-box p {
			margin: 0;
			color: #666666;
			font-size: 15px;
			line-height: 1.5;
		}

		/* Indicador de carga */
		.order-processing-spinner {
			width: 36px;
			height: 36px;
			margin: 0 auto 20px;
			border: 4px solid #dddddd;
			border-top-color: #555555;
			border-radius: 50%;
			animation: order-processing-spin 0.8s linear infinite;
		}

		@keyframes order-processing-spin {
			to {
				transform: rotate(360deg);
			}
		}

	</style>

	<script>
	(function () {

		const overlay = document.getElementById(
			'order-processing-message'
		);

		if (!overlay) {
			return;
		}

		let safetyTimer;

		/**
		 * Comprueba si WooCommerce ha encontrado algún error.
		 */
		function checkoutHasErrors() {

			return Boolean(
				document.querySelector(
					/*
					 * Campos HTML obligatorios o incorrectos.
					 * Incluye el checkbox de términos.
					 */
					'.wc-block-checkout :invalid,' +
					'form.checkout :invalid,' +

					/*
					 * Campos marcados como incorrectos
					 * mediante accesibilidad.
					 */
					'.wc-block-checkout [aria-invalid="true"],' +
					'form.checkout [aria-invalid="true"],' +

					/*
					 * Errores del checkout por bloques.
					 */
					'.wc-block-components-validation-error,' +
					'.wc-block-components-notice-banner.is-error,' +
					'.wc-block-store-notice.is-error,' +

					/*
					 * Errores del checkout clásico.
					 */
					'.woocommerce-error'
				)
			);
		}

		/**
		 * Mostrar el aviso.
		 */
		function showProcessingMessage() {

			overlay.classList.add('show');
			overlay.setAttribute('aria-hidden', 'false');

			/*
			 * Medida de seguridad:
			 * si WooCommerce no responde, el aviso se cerrará
			 * automáticamente después de 60 segundos.
			 */
			clearTimeout(safetyTimer);

			safetyTimer = setTimeout(
				hideProcessingMessage,
				60000
			);
		}

		/**
		 * Ocultar el aviso.
		 */
		function hideProcessingMessage() {

			overlay.classList.remove('show');
			overlay.setAttribute('aria-hidden', 'true');

			clearTimeout(safetyTimer);
		}

		/**
		 * Detectar el botón de realizar el pedido.
		 */
		document.addEventListener(
			'click',
			function (event) {

				const button = event.target.closest(
					'.wc-block-components-checkout-place-order-button, #place_order'
				);

				if (!button || button.disabled) {
					return;
				}

				/*
				 * Esperamos a que WooCommerce valide los campos.
				 *
				 * Si faltan los términos o hay algún campo
				 * incorrecto, WooCommerce mostrará el error
				 * durante este intervalo.
				 */
				setTimeout(function () {

					if (checkoutHasErrors()) {
						hideProcessingMessage();
						return;
					}

					showProcessingMessage();

				}, 400);

			},
			true
		);

		/**
		 * Si WooCommerce muestra posteriormente un error,
		 * ocultamos inmediatamente el aviso.
		 */
		const observer = new MutationObserver(function () {

			if (checkoutHasErrors()) {
				hideProcessingMessage();
			}

		});

		observer.observe(
			document.body,
			{
				childList: true,
				subtree: true,
				attributes: true,
				attributeFilter: [
					'aria-invalid',
					'class'
				]
			}
		);

		/**
		 * Ocultar el aviso al regresar mediante el botón
		 * Atrás del navegador.
		 */
		window.addEventListener(
			'pageshow',
			hideProcessingMessage
		);

	})();
	</script>

	<?php
}, 100 );
				
			

El snippet funciona tanto con el checkout por bloques de WooCommerce como con el checkout clásico. Cuando comienza el procesamiento, muestra un fondo superpuesto con un indicador de carga y un mensaje para el cliente.

Si WooCommerce detecta un campo incompleto, unos términos sin aceptar o cualquier otro error de validación, el aviso desaparece automáticamente para que el cliente pueda corregir la información.

Cómo añadir el código a WordPress

Puedes instalar el snippet mediante un plugin de fragmentos de código, como Code Snippets, sin modificar directamente los archivos del tema. 

Crea un nuevo snippet, pega el código completo, guarda los cambios y actívalo para que se ejecute en el frontal de la web. Si utilizas otro sistema para añadir PHP personalizado, asegúrate de que el código no se cargue únicamente en el área de administración.

Antes de utilizarlo en una tienda activa, realiza siempre un pedido de prueba.

Qué verá el cliente durante el procesamiento

Después de pulsar el botón de pago, el cliente verá el aviso superpuesto mientras WooCommerce crea y procesa el pedido. Durante ese tiempo se le pide que no cierre ni recargue la página.

Si el pedido se completa correctamente, WooCommerce lo redirigirá a la página de confirmación. Si existe algún error, el aviso se cerrará para que pueda revisar el checkout e intentarlo de nuevo.

Este comportamiento ayuda a evitar pulsaciones repetidas y transmite mayor confianza durante una de las fases más sensibles de una compra online.

Cómo personalizar el aviso

Dentro del propio snippet puedes cambiar fácilmente el título, el texto y los colores para adaptarlos al diseño de tu tienda. No es necesario modificar su funcionamiento para realizar estos cambios visuales.

Conviene utilizar un mensaje corto y tranquilizador. El objetivo es que el cliente comprenda inmediatamente que su pedido se está procesando y que debe mantener abierta la página.

Cómo comprobar que funciona correctamente

Abre la tienda en una ventana de incógnito, añade un producto al carrito y completa el checkout como lo haría un cliente. Al pulsar el botón para realizar el pedido, el aviso debe aparecer y permanecer visible hasta que WooCommerce muestre la confirmación.

También debes probar el formulario dejando vacío un campo obligatorio o sin aceptar los términos. En ese caso, el aviso debe cerrarse para permitir que se corrija el error.

Por último, comprueba el proceso tanto en ordenador como en móvil y, si tu tienda ofrece varias pasarelas, realiza una prueba con cada una de ellas.

Una pequeña mejora que puede evitar pedidos abandonados

No todos los abandonos del checkout tienen una solución técnica sencilla. Sin embargo, cuando el problema es la incertidumbre durante el procesamiento, un mensaje claro puede marcar una diferencia importante.

Mostrar un mensaje mientras WooCommerce procesa un pedido no reduce el tiempo real de espera, pero sí mejora la percepción del proceso. El cliente sabe que la tienda está trabajando, entiende que debe esperar y tiene menos motivos para cerrar o recargar la página.

Es una modificación pequeña, compatible con los principales tipos de checkout de WooCommerce y especialmente útil en tiendas donde el pago necesita varios segundos para completarse.

Dudas habituales

Sí. El código está preparado para detectar tanto el botón del checkout por bloques de WooCommerce como el botón del checkout clásico. Antes de utilizarlo en una tienda activa, conviene realizar un pedido de prueba con la configuración concreta de la web.

No. El snippet no acelera el servidor ni la pasarela de pago. Su función es informar al cliente de que el pedido se está procesando, reducir la incertidumbre y evitar que recargue la página o pulse varias veces el botón mientras espera.

El código espera a que WooCommerce valide el formulario. Si falta un dato obligatorio, el método de pago no es válido o no se han aceptado los términos, el aviso se oculta y el cliente puede corregir el error antes de volver a realizar el pedido.

Sí. Puedes modificar el título, el texto secundario, el fondo, la ventana, la tipografía y el color del indicador giratorio. Los puntos principales están señalados mediante comentarios para que puedas adaptar el aviso al diseño de tu tienda.

No es obligatorio. Puedes instalarlo mediante el plugin gratuito Code Snippets, sin editar los archivos del tema. También es posible añadirlo al archivo functions.php de un tema hijo si prefieres gestionar el código manualmente.

El aviso no depende directamente de una pasarela concreta, por lo que puede funcionar con tarjeta, PayPal, transferencia bancaria y otros métodos. Aun así, algunas pasarelas aplican redirecciones o validaciones propias, por lo que es recomendable probar cada método de pago disponible antes de publicar los cambios.

¿Aún no tienes Elementor Pro?

Comparte en tus redes sociales

Facebook
Twitter
LinkedIn
Pinterest
WhatsApp