Comment afficher un message pendant que WooCommerce traite une commande

Comment afficher un message pendant que WooCommerce traite une commande

Sommaire

Lorsque vous consultez Analytics, il est fréquent de constater de nombreuses visites sur la page de paiement, mais beaucoup moins sur la page de confirmation de commande. Cela peut s’expliquer par plusieurs raisons, mais l’une d’elles est particulièrement facile à éviter : le client ne sait pas si WooCommerce traite correctement sa commande.

Certaines passerelles de paiement ont besoin de plusieurs secondes pour valider le paiement et créer la commande. Pendant ce temps, le bouton reste en cours de chargement, mais WooCommerce ne fournit pas toujours d’explication claire. Le client peut penser que la page est bloquée, cliquer à nouveau sur le bouton, la recharger ou la fermer avant la fin du processus.

Dans ce tutoriel, vous apprendrez à afficher un message pendant que WooCommerce traite une commande, afin d’indiquer au client qu’il doit patienter et ne pas recharger la page.

Pourquoi afficher un message pendant le paiement

Lorsqu’une boutique met quelques secondes à finaliser une commande, l’absence d’information crée de l’incertitude. Ce problème est particulièrement important lorsque la connexion est lente ou que la passerelle de paiement doit communiquer avec des services externes.

Un message comme celui-ci indique clairement que le traitement se poursuit :

Veuillez patienter pendant le traitement de votre commande
Ne fermez pas et ne rechargez pas cette page.

Le message n’accélère pas le traitement du paiement par WooCommerce, mais il améliore l’expérience d’achat et réduit le risque que le client interrompe accidentellement la commande.

Snippet pour afficher un message pendant que WooCommerce traite une commande

Le code suivant affiche une fenêtre superposée après que le client a cliqué sur le bouton permettant de passer la commande.

				
					/**
 * Affiche un message pendant que WooCommerce traite la commande.
 *
 * Le message apparaît uniquement lorsque le formulaire est valide.
 *
 * Compatible avec :
 * - Paiement par blocs de WooCommerce
 * - Paiement classique de WooCommerce
 */

add_action( 'wp_footer', function () {

	// Charger uniquement sur la page de paiement.
	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>
				<!-- Vous pouvez modifier ce titre -->
				Veuillez patienter pendant le traitement de votre commande
			</h3>

			<p>
				<!-- Vous pouvez modifier ce message -->
				Ne rechargez pas et ne fermez pas cette page.
			</p>

		</div>
	</div>

	<style>

		/* Calque couvrant tout l’écran */
		#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;
		}

		/* Fenêtre du message */
		.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;
		}

		/* Indicateur de chargement */
		.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;

		/**
		 * Vérifie si WooCommerce a détecté une erreur.
		 */
		function checkoutHasErrors() {

			return Boolean(
				document.querySelector(
					/*
					 * Champs HTML obligatoires ou incorrects.
					 * Inclut la case des conditions.
					 */
					'.wc-block-checkout :invalid,' +
					'form.checkout :invalid,' +

					/*
					 * Champs signalés comme incorrects
					 * par les attributs d’accessibilité.
					 */
					'.wc-block-checkout [aria-invalid="true"],' +
					'form.checkout [aria-invalid="true"],' +

					/*
					 * Erreurs du paiement par blocs.
					 */
					'.wc-block-components-validation-error,' +
					'.wc-block-components-notice-banner.is-error,' +
					'.wc-block-store-notice.is-error,' +

					/*
					 * Erreurs du paiement classique.
					 */
					'.woocommerce-error'
				)
			);
		}

		/**
		 * Afficher le message.
		 */
		function showProcessingMessage() {

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

			/*
			 * Mesure de sécurité :
			 * si WooCommerce ne répond pas, le message se fermera
			 * automatiquement après 60 secondes.
			 */
			clearTimeout(safetyTimer);

			safetyTimer = setTimeout(
				hideProcessingMessage,
				60000
			);
		}

		/**
		 * Masquer le message.
		 */
		function hideProcessingMessage() {

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

			clearTimeout(safetyTimer);
		}

		/**
		 * Détecter le bouton de commande.
		 */
		document.addEventListener(
			'click',
			function (event) {

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

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

				/*
				 * Attendre que WooCommerce valide les champs.
				 *
				 * Si les conditions manquent ou si un champ est
				 * incorrect, WooCommerce affichera l’erreur
				 * pendant cet intervalle.
				 */
				setTimeout(function () {

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

					showProcessingMessage();

				}, 400);

			},
			true
		);

		/**
		 * Si WooCommerce affiche ensuite une erreur,
		 * masquer immédiatement le message.
		 */
		const observer = new MutationObserver(function () {

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

		});

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

		/**
		 * Masquer le message lors du retour avec le bouton
		 * Précédent du navigateur.
		 */
		window.addEventListener(
			'pageshow',
			hideProcessingMessage
		);

	})();
	</script>

	<?php
}, 100 );
				
			

Le snippet fonctionne aussi bien avec le paiement par blocs de WooCommerce qu’avec le paiement classique. Lorsque le traitement commence, il affiche un arrière-plan superposé avec un indicateur de chargement et un message destiné au client.

Si WooCommerce détecte un champ incomplet, des conditions non acceptées ou toute autre erreur de validation, le message disparaît automatiquement afin que le client puisse corriger les informations.

Comment ajouter le code à WordPress

Vous pouvez installer le snippet avec une extension de gestion de code telle que Code Snippets, sans modifier directement les fichiers du thème.

Créez un nouveau snippet, collez le code complet, enregistrez les modifications et activez-le afin qu’il s’exécute sur l’interface publique du site. Si vous utilisez une autre méthode pour ajouter du PHP personnalisé, vérifiez que le code ne se charge pas uniquement dans l’administration.

Effectuez toujours une commande test avant de l’utiliser sur une boutique en production.

Ce que verra le client pendant le traitement

Après avoir cliqué sur le bouton de paiement, le client verra le message superposé pendant que WooCommerce crée et traite la commande. Il lui sera demandé de ne pas fermer ni recharger la page.

Si la commande est validée, WooCommerce le redirigera vers la page de confirmation. En cas d’erreur, le message se fermera afin qu’il puisse vérifier le paiement et réessayer.

Ce fonctionnement évite les clics répétés et renforce la confiance pendant l’une des étapes les plus sensibles d’un achat en ligne.

Comment personnaliser le message

Dans le snippet, vous pouvez facilement modifier le titre, le texte et les couleurs pour les adapter au design de votre boutique. Ces changements visuels ne nécessitent aucune modification de son fonctionnement.

Utilisez un message court et rassurant. Le client doit comprendre immédiatement que sa commande est en cours de traitement et qu’il doit laisser la page ouverte.

Comment vérifier que tout fonctionne correctement

Ouvrez la boutique dans une fenêtre de navigation privée, ajoutez un produit au panier et remplissez le paiement comme le ferait un client. Lorsque vous cliquez sur le bouton de commande, le message doit apparaître et rester visible jusqu’à ce que WooCommerce affiche la confirmation.

Testez également le formulaire en laissant un champ obligatoire vide ou sans accepter les conditions. Dans ce cas, le message doit se fermer afin de permettre la correction de l’erreur.

Enfin, vérifiez le processus sur ordinateur et sur mobile et, si votre boutique propose plusieurs passerelles, testez chacune d’elles.

Une petite amélioration qui peut éviter les abandons de commande

Tous les abandons de paiement n’ont pas une solution technique simple. Cependant, lorsque l’incertitude pendant le traitement est en cause, un message clair peut faire une réelle différence.

Afficher un message pendant que WooCommerce traite une commande ne réduit pas le temps d’attente réel, mais améliore la perception du processus. Le client sait que la boutique fonctionne, comprend qu’il doit patienter et a moins de raisons de fermer ou de recharger la page.

Il s’agit d’une petite modification, compatible avec les principaux types de paiement WooCommerce et particulièrement utile lorsque le règlement nécessite plusieurs secondes.

Questions fréquentes

Oui. Le code est conçu pour détecter aussi bien le bouton du paiement par blocs de WooCommerce que celui du paiement classique. Avant de l’utiliser sur une boutique en production, il est conseillé d’effectuer une commande test avec la configuration propre au site.

Non. Le snippet n’accélère ni le serveur ni la passerelle de paiement. Son rôle est d’indiquer au client que sa commande est en cours de traitement, de réduire l’incertitude et d’éviter qu’il recharge la page ou clique plusieurs fois sur le bouton pendant l’attente.

Le code attend que WooCommerce valide le formulaire. Si une information obligatoire manque, si le mode de paiement n’est pas valide ou si les conditions n’ont pas été acceptées, le message disparaît afin que le client puisse corriger l’erreur avant de passer à nouveau la commande.

Oui. Vous pouvez modifier le titre, le texte secondaire, l’arrière-plan, la fenêtre, la typographie et la couleur de l’indicateur de chargement. Les principaux éléments sont signalés par des commentaires afin de pouvoir adapter le message au design de votre boutique.

Non. Vous pouvez l’installer à l’aide de l’extension gratuite Code Snippets, sans modifier les fichiers du thème. Vous pouvez également l’ajouter au fichier functions.php d’un thème enfant si vous préférez gérer le code manuellement.

Le message ne dépend pas directement d’une passerelle particulière. Il peut donc fonctionner avec les paiements par carte, PayPal, virement bancaire et d’autres moyens. Certaines passerelles utilisent toutefois leurs propres redirections ou validations ; il est donc recommandé de tester chaque mode de paiement disponible avant de publier les modifications.

Vous n'avez pas encore Elementor Pro ?

Partagez sur vos réseaux sociaux

Facebook
Twitter
LinkedIn
Pinterest
WhatsApp