Come mostrare un messaggio mentre WooCommerce elabora un ordine

Come mostrare un messaggio mentre WooCommerce elabora un ordine

Indice

Analizzando Analytics è frequente trovare molte visite alla pagina di checkout, ma molte meno alla pagina di conferma dell’ordine. Le cause possono essere diverse, ma una è particolarmente facile da evitare: il cliente non sa se WooCommerce sta elaborando correttamente il suo ordine.

Alcuni gateway di pagamento richiedono diversi secondi per convalidare il pagamento e creare l’ordine. Durante questo periodo il pulsante continua a caricare, ma WooCommerce non offre sempre una spiegazione chiara. Il cliente può pensare che la pagina sia bloccata, premere nuovamente il pulsante, ricaricarla o chiuderla prima che il processo sia terminato.

In questo tutorial imparerai a mostrare un messaggio mentre WooCommerce elabora un ordine, indicando al cliente di attendere e di non ricaricare la pagina.

Perché è utile mostrare un avviso durante il pagamento

Quando un negozio impiega alcuni secondi per completare un ordine, la mancanza di informazioni genera incertezza. Questo problema è particolarmente rilevante con connessioni lente o quando il gateway di pagamento deve comunicare con servizi esterni.

Un messaggio come questo chiarisce che il processo è ancora in corso:

Attendi mentre elaboriamo il tuo ordine
Non chiudere o ricaricare questa pagina.

L’avviso non rende più veloce l’elaborazione del pagamento da parte di WooCommerce, ma migliora l’esperienza di acquisto e riduce la possibilità che il cliente interrompa accidentalmente l’ordine.

Snippet per mostrare un messaggio mentre WooCommerce elabora un ordine

Il seguente codice mostra una finestra sovrapposta dopo che il cliente ha premuto il pulsante per effettuare l’ordine.

				
					/**
 * Mostra un messaggio mentre WooCommerce elabora l’ordine.
 *
 * Il messaggio appare solo quando il modulo è valido.
 *
 * Compatibile con:
 * - Checkout a blocchi di WooCommerce
 * - Checkout classico di WooCommerce
 */

add_action( 'wp_footer', function () {

	// Carica solo nella pagina di 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>
				<!-- Puoi modificare questo titolo -->
				Attendi mentre elaboriamo il tuo ordine
			</h3>

			<p>
				<!-- Puoi modificare questo messaggio -->
				Non ricaricare né chiudere questa pagina.
			</p>

		</div>
	</div>

	<style>

		/* Livello che copre l’intero schermo */
		#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;
		}

		/* Riquadro del messaggio */
		.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;
		}

		/* Indicatore di caricamento */
		.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;

		/**
		 * Controlla se WooCommerce ha rilevato errori.
		 */
		function checkoutHasErrors() {

			return Boolean(
				document.querySelector(
					/*
					 * Campi HTML obbligatori o non validi.
					 * Include la casella dei termini.
					 */
					'.wc-block-checkout :invalid,' +
					'form.checkout :invalid,' +

					/*
					 * Campi contrassegnati come non validi
					 * tramite gli attributi di accessibilità.
					 */
					'.wc-block-checkout [aria-invalid="true"],' +
					'form.checkout [aria-invalid="true"],' +

					/*
					 * Errori del checkout a blocchi.
					 */
					'.wc-block-components-validation-error,' +
					'.wc-block-components-notice-banner.is-error,' +
					'.wc-block-store-notice.is-error,' +

					/*
					 * Errori del checkout classico.
					 */
					'.woocommerce-error'
				)
			);
		}

		/**
		 * Mostra l’avviso.
		 */
		function showProcessingMessage() {

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

			/*
			 * Misura di sicurezza:
			 * se WooCommerce non risponde, l’avviso si chiuderà
			 * automaticamente dopo 60 secondi.
			 */
			clearTimeout(safetyTimer);

			safetyTimer = setTimeout(
				hideProcessingMessage,
				60000
			);
		}

		/**
		 * Nascondi l’avviso.
		 */
		function hideProcessingMessage() {

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

			clearTimeout(safetyTimer);
		}

		/**
		 * Rileva il pulsante per effettuare l’ordine.
		 */
		document.addEventListener(
			'click',
			function (event) {

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

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

				/*
				 * Attendi che WooCommerce convalidi i campi.
				 *
				 * Se mancano i termini o un campo non è
				 * valido, WooCommerce mostrerà l’errore
				 * durante questo intervallo.
				 */
				setTimeout(function () {

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

					showProcessingMessage();

				}, 400);

			},
			true
		);

		/**
		 * Se WooCommerce mostra successivamente un errore,
		 * nascondi immediatamente l’avviso.
		 */
		const observer = new MutationObserver(function () {

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

		});

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

		/**
		 * Nascondi l’avviso tornando con il pulsante
		 * Indietro del browser.
		 */
		window.addEventListener(
			'pageshow',
			hideProcessingMessage
		);

	})();
	</script>

	<?php
}, 100 );
				
			

Lo snippet funziona sia con il checkout a blocchi di WooCommerce sia con il checkout classico. Quando inizia l’elaborazione, mostra uno sfondo sovrapposto con un indicatore di caricamento e un messaggio per il cliente.

Se WooCommerce rileva un campo incompleto, termini non accettati o qualsiasi altro errore di convalida, l’avviso scompare automaticamente affinché il cliente possa correggere le informazioni.

Come aggiungere il codice a WordPress

Puoi installare lo snippet tramite un plugin per frammenti di codice, come Code Snippets, senza modificare direttamente i file del tema.

Crea un nuovo snippet, incolla il codice completo, salva le modifiche e attivalo affinché venga eseguito nel front-end del sito. Se utilizzi un altro sistema per aggiungere PHP personalizzato, assicurati che il codice non venga caricato soltanto nell’area di amministrazione.

Prima di utilizzarlo in un negozio attivo, effettua sempre un ordine di prova.

Cosa vedrà il cliente durante l’elaborazione

Dopo aver premuto il pulsante di pagamento, il cliente vedrà l’avviso sovrapposto mentre WooCommerce crea ed elabora l’ordine. Durante questo periodo gli verrà chiesto di non chiudere o ricaricare la pagina.

Se l’ordine viene completato correttamente, WooCommerce lo reindirizzerà alla pagina di conferma. In caso di errore, l’avviso si chiuderà affinché possa controllare il checkout e riprovare.

Questo comportamento aiuta a evitare clic ripetuti e trasmette maggiore fiducia durante una delle fasi più delicate di un acquisto online.

Come personalizzare l’avviso

All’interno dello snippet puoi modificare facilmente il titolo, il testo e i colori per adattarli al design del tuo negozio. Non è necessario modificarne il funzionamento per apportare questi cambiamenti visivi.

È consigliabile utilizzare un messaggio breve e rassicurante. L’obiettivo è far capire immediatamente al cliente che l’ordine è in fase di elaborazione e che deve mantenere aperta la pagina.

Come verificare che funzioni correttamente

Apri il negozio in una finestra di navigazione in incognito, aggiungi un prodotto al carrello e completa il checkout come farebbe un cliente. Premendo il pulsante per effettuare l’ordine, l’avviso deve apparire e rimanere visibile finché WooCommerce non mostra la conferma.

Prova inoltre il modulo lasciando vuoto un campo obbligatorio o senza accettare i termini. In questo caso, l’avviso deve chiudersi per consentire la correzione dell’errore.

Infine, verifica il processo sia su computer sia su dispositivi mobili e, se il negozio offre più gateway, prova ciascuno di essi.

Un piccolo miglioramento che può evitare ordini abbandonati

Non tutti gli abbandoni del checkout hanno una soluzione tecnica semplice. Tuttavia, quando il problema è l’incertezza durante l’elaborazione, un messaggio chiaro può fare una differenza importante.

Mostrare un messaggio mentre WooCommerce elabora un ordine non riduce il tempo di attesa reale, ma migliora la percezione del processo. Il cliente sa che il negozio sta lavorando, capisce di dover attendere e ha meno motivi per chiudere o ricaricare la pagina.

È una piccola modifica, compatibile con i principali tipi di checkout di WooCommerce e particolarmente utile nei negozi in cui il pagamento richiede diversi secondi.

Domande frequenti

Sì. Il codice è predisposto per rilevare sia il pulsante del checkout a blocchi di WooCommerce sia quello del checkout classico. Prima di utilizzarlo in un negozio attivo, è consigliabile effettuare un ordine di prova con la configurazione specifica del sito.

No. Lo snippet non velocizza il server né il gateway di pagamento. La sua funzione è informare il cliente che l’ordine è in fase di elaborazione, ridurre l’incertezza ed evitare che ricarichi la pagina o prema più volte il pulsante durante l’attesa.

Il codice attende che WooCommerce convalidi il modulo. Se manca un dato obbligatorio, il metodo di pagamento non è valido o i termini non sono stati accettati, l’avviso viene nascosto e il cliente può correggere l’errore prima di effettuare nuovamente l’ordine.

Sì. Puoi modificare il titolo, il testo secondario, lo sfondo, la finestra, la tipografia e il colore dell’indicatore di caricamento. I punti principali sono contrassegnati da commenti per consentirti di adattare l’avviso al design del tuo negozio.

No. Puoi installarlo tramite il plugin gratuito Code Snippets, senza modificare i file del tema. Se preferisci gestire il codice manualmente, puoi anche aggiungerlo al file functions.php di un tema child.

L’avviso non dipende direttamente da un gateway specifico, quindi può funzionare con carta, PayPal, bonifico bancario e altri metodi. Tuttavia, alcuni gateway utilizzano reindirizzamenti o convalide proprie, perciò è consigliabile provare ogni metodo di pagamento disponibile prima di pubblicare le modifiche.

Non hai ancora Elementor Pro?

Condividilo sui tuoi social media

Facebook
Twitter
LinkedIn
Pinterest
WhatsApp