Como exibir uma mensagem enquanto o WooCommerce processa um pedido

Como exibir uma mensagem enquanto o WooCommerce processa um pedido

Sumário

Ao analisar o Analytics, é comum encontrar muitas visitas à página de checkout, mas bem menos à página de pedido concluído. Isso pode acontecer por vários motivos, mas um deles é especialmente fácil de evitar: o cliente não sabe se o WooCommerce está processando o pedido corretamente.

Alguns gateways de pagamento precisam de vários segundos para validar o pagamento e criar o pedido. Durante esse tempo, o botão continua carregando, mas o WooCommerce nem sempre fornece uma explicação clara. O cliente pode pensar que a página travou, clicar novamente no botão, recarregá-la ou fechá-la antes de o processo terminar.

Neste tutorial, você aprenderá a exibir uma mensagem enquanto o WooCommerce processa um pedido, orientando o cliente a aguardar e não recarregar a página.

Por que vale a pena exibir um aviso durante o pagamento

Quando uma loja leva alguns segundos para concluir um pedido, a falta de informação gera incerteza. Isso é especialmente problemático em compras feitas com conexões lentas ou quando o gateway de pagamento precisa se comunicar com serviços externos.

Uma mensagem como esta deixa claro que o processo continua:

Aguarde enquanto processamos seu pedido
Não feche nem recarregue esta página.

O aviso não faz o WooCommerce processar o pagamento mais rapidamente, mas melhora a experiência de compra e reduz a possibilidade de o cliente interromper o pedido acidentalmente.

Snippet para exibir uma mensagem enquanto o WooCommerce processa um pedido

O código a seguir exibe uma janela sobreposta depois que o cliente clica no botão para fazer o pedido.

				
					/**
 * Exibe uma mensagem enquanto o WooCommerce processa o pedido.
 *
 * A mensagem aparece somente quando o formulário é válido.
 *
 * Compatível com:
 * - Checkout em blocos do WooCommerce
 * - Checkout clássico do WooCommerce
 */

add_action( 'wp_footer', function () {

	// Carregar somente na página de checkout.
	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>
				<!-- Você pode alterar este título -->
				Aguarde enquanto processamos seu pedido
			</h3>

			<p>
				<!-- Você pode alterar esta mensagem -->
				Não recarregue nem feche esta página.
			</p>

		</div>
	</div>

	<style>

		/* Camada que cobre toda a tela */
		#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;
		}

		/* Caixa da mensagem */
		.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 carregamento */
		.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;

		/**
		 * Verifica se o WooCommerce encontrou algum erro.
		 */
		function checkoutHasErrors() {

			return Boolean(
				document.querySelector(
					/*
					 * Campos HTML obrigatórios ou inválidos.
					 * Inclui a caixa de seleção dos termos.
					 */
					'.wc-block-checkout :invalid,' +
					'form.checkout :invalid,' +

					/*
					 * Campos marcados como inválidos
					 * por meio de atributos de acessibilidade.
					 */
					'.wc-block-checkout [aria-invalid="true"],' +
					'form.checkout [aria-invalid="true"],' +

					/*
					 * Erros do checkout em blocos.
					 */
					'.wc-block-components-validation-error,' +
					'.wc-block-components-notice-banner.is-error,' +
					'.wc-block-store-notice.is-error,' +

					/*
					 * Erros do checkout clássico.
					 */
					'.woocommerce-error'
				)
			);
		}

		/**
		 * Exibir o aviso.
		 */
		function showProcessingMessage() {

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

			/*
			 * Medida de segurança:
			 * se o WooCommerce não responder, o aviso será fechado
			 * automaticamente após 60 segundos.
			 */
			clearTimeout(safetyTimer);

			safetyTimer = setTimeout(
				hideProcessingMessage,
				60000
			);
		}

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

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

			clearTimeout(safetyTimer);
		}

		/**
		 * Detectar o botão de fazer o 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;
				}

				/*
				 * Aguardar o WooCommerce validar os campos.
				 *
				 * Se os termos não forem aceitos ou algum campo
				 * for inválido, o WooCommerce mostrará o erro
				 * durante esse intervalo.
				 */
				setTimeout(function () {

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

					showProcessingMessage();

				}, 400);

			},
			true
		);

		/**
		 * Se o WooCommerce mostrar um erro posteriormente,
		 * ocultar o aviso imediatamente.
		 */
		const observer = new MutationObserver(function () {

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

		});

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

		/**
		 * Ocultar o aviso ao retornar usando o botão
		 * Voltar do navegador.
		 */
		window.addEventListener(
			'pageshow',
			hideProcessingMessage
		);

	})();
	</script>

	<?php
}, 100 );
				
			

O snippet funciona tanto com o checkout em blocos do WooCommerce quanto com o checkout clássico. Quando o processamento começa, ele exibe uma sobreposição com um indicador de carregamento e uma mensagem para o cliente.

Se o WooCommerce detectar um campo incompleto, termos não aceitos ou qualquer outro erro de validação, o aviso desaparecerá automaticamente para que o cliente possa corrigir as informações.

Como adicionar o código ao WordPress

Você pode instalar o snippet usando um plugin de fragmentos de código, como o Code Snippets, sem modificar diretamente os arquivos do tema.

Crie um novo snippet, cole o código completo, salve as alterações e ative-o para que seja executado na parte pública do site. Se você usar outro sistema para adicionar PHP personalizado, certifique-se de que o código não seja carregado apenas na área de administração.

Antes de usá-lo em uma loja ativa, sempre faça um pedido de teste.

O que o cliente verá durante o processamento

Depois de clicar no botão de pagamento, o cliente verá o aviso sobreposto enquanto o WooCommerce cria e processa o pedido. Durante esse período, será solicitado que ele não feche nem recarregue a página.

Se o pedido for concluído corretamente, o WooCommerce redirecionará o cliente para a página de confirmação. Se ocorrer algum erro, o aviso será fechado para que ele possa revisar o checkout e tentar novamente.

Esse comportamento ajuda a evitar cliques repetidos e transmite mais confiança durante uma das etapas mais delicadas de uma compra online.

Como personalizar o aviso

No próprio snippet, você pode alterar facilmente o título, o texto e as cores para adaptá-los ao design da sua loja. Não é necessário modificar o funcionamento para fazer essas alterações visuais.

É recomendável usar uma mensagem curta e tranquilizadora. O objetivo é que o cliente entenda imediatamente que o pedido está sendo processado e que deve manter a página aberta.

Como verificar se está funcionando corretamente

Abra a loja em uma janela anônima, adicione um produto ao carrinho e conclua o checkout como um cliente faria. Ao clicar no botão para fazer o pedido, o aviso deverá aparecer e permanecer visível até que o WooCommerce mostre a confirmação.

Teste também o formulário deixando um campo obrigatório vazio ou sem aceitar os termos. Nesse caso, o aviso deverá fechar para permitir a correção do erro.

Por fim, verifique o processo tanto no computador quanto no celular e, se a loja oferecer vários gateways, faça um teste com cada um deles.

Uma pequena melhoria que pode evitar pedidos abandonados

Nem todo abandono de checkout tem uma solução técnica simples. No entanto, quando o problema é a incerteza durante o processamento, uma mensagem clara pode fazer uma diferença importante.

Exibir uma mensagem enquanto o WooCommerce processa um pedido não reduz o tempo real de espera, mas melhora a percepção do processo. O cliente sabe que a loja está trabalhando, entende que precisa aguardar e tem menos motivos para fechar ou recarregar a página.

É uma pequena alteração, compatível com os principais tipos de checkout do WooCommerce e especialmente útil em lojas onde o pagamento leva vários segundos para ser concluído.

Perguntas frequentes

Sim. O código foi preparado para detectar tanto o botão do checkout em blocos do WooCommerce quanto o botão do checkout clássico. Antes de usá-lo em uma loja ativa, é recomendável fazer um pedido de teste com a configuração específica do site.

Não. O snippet não acelera o servidor nem o gateway de pagamento. Sua função é informar ao cliente que o pedido está sendo processado, reduzir a incerteza e evitar que ele recarregue a página ou clique várias vezes no botão enquanto aguarda.

O código aguarda a validação do formulário pelo WooCommerce. Se faltar uma informação obrigatória, a forma de pagamento for inválida ou os termos não tiverem sido aceitos, o aviso será ocultado para que o cliente possa corrigir o erro antes de fazer o pedido novamente.

Sim. Você pode modificar o título, o texto secundário, o fundo, a janela, a tipografia e a cor do indicador de carregamento. Os principais pontos estão identificados por comentários para que você possa adaptar o aviso ao design da sua loja.

Não. Você pode instalá-lo usando o plugin gratuito Code Snippets, sem editar os arquivos do tema. Também é possível adicioná-lo ao arquivo functions.php de um tema filho caso prefira gerenciar o código manualmente.

O aviso não depende diretamente de um gateway específico, por isso pode funcionar com cartão, PayPal, transferência bancária e outras formas de pagamento. Ainda assim, alguns gateways usam redirecionamentos ou validações próprias. Portanto, é recomendável testar todas as formas de pagamento disponíveis antes de publicar as alterações.

Você ainda não tem o Elementor Pro?

Compartilhe em suas redes sociais

Facebook
Twitter
LinkedIn
Pinterest
WhatsApp