Marquer automatiquement comme terminé les commandes WooCommerce

Mis à jour le :

Lorsque vous gérez une boutique en ligne WooCommerce, il peut être fastidieux de devoir marquer manuellement chaque commande comme terminée une fois qu’elle a été expédiée. Heureusement, il existe une solution pratique pour automatiser ce processus et gagner du temps précieux.

En ajoutant des lignes de code sur des hooks

Je vous présente plusieurs techniques pour agir par le code. Ces méthodes sont réservées aux développeurs.

Sachez d’abord que WooCommerce termine déjà automatiquement certaines commandes : celles qui ne contiennent que des produits à la fois virtuels et téléchargeables passent directement au statut Terminée dès que leur paiement en ligne est confirmé. Toutes les autres commandes payées s’arrêtent au statut En cours.

Les extraits ci-dessous passent uniquement par les fonctions et les crochets de WooCommerce. Ils fonctionnent donc avec le stockage des commandes haute performance (HPOS), activé par défaut sur les nouvelles boutiques depuis WooCommerce 8.2, comme avec l’ancien stockage. N’utilisez jamais wp_update_post() ou update_post_meta() pour modifier une commande : avec HPOS, les commandes sont enregistrées dans leurs propres tables, et non plus dans celle des articles que modifient ces fonctions.

À chaque changement de statut

Pour marquer automatiquement les commandes comme terminées dans WooCommerce à chaque changement de statut, vous pouvez utiliser le code suivant :

/* Auto Complete Paid Orders */
function wpc_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id ) {
        return;
    }
    
    $order = wc_get_order( $order_id );
    
    if ( $order->has_status( 'processing' ) ) {
        $order->update_status( 'completed' );
    }
}
add_action( 'woocommerce_order_status_changed', 'wpc_auto_complete_paid_order' );

En agissant sur le crochet woocommerce_order_status_changed, le statut passera comme terminé aussi bien après une commande par un visiteur que par une action en back-office de la part du gestionnaire de la boutique.

Ajoutez ce code dans un plugin de fonctions globales ou dans le fichier functions.php d’un thème enfant, pour qu’une mise à jour de votre thème ne l’efface pas. Une fois en place, toutes les commandes WooCommerce qui arrivent au statut En cours passeront automatiquement au statut Terminée.

Attention, cela vaut quel que soit le moyen de paiement : une commande en paiement à la livraison est terminée dès sa validation, de même qu’une commande payée par virement que vous passez vous-même au statut En cours. Le client reçoit par ailleurs deux e-mails, Commande en cours puis Commande terminée.

Uniquement après un paiement en ligne

Si vous ne souhaitez pas automatiser le changement pour les actions opérées en back-office ni pour les paiements manuels, il faut agir au moment où le paiement en ligne est confirmé. WooCommerce choisit alors le statut de la commande payée à l’aide du filtre woocommerce_payment_complete_order_status : il suffit de remplacer En cours par Terminée.

Dans une version précédente de ce tutoriel, j’utilisais le crochet woocommerce_thankyou, qui se déclenche quand le visiteur arrive sur la page de confirmation de commande, en excluant les virements, les chèques et les paiements à la livraison. Je ne le recommande plus : si le client ferme son navigateur après avoir payé, ou si le paiement n’est confirmé qu’après coup, par exemple pour un prélèvement SEPA, la commande reste au statut En cours.

/* Auto-complete orders as soon as their online payment is confirmed */
function wpc_complete_order_after_payment( $status ) {
	if ( 'processing' === $status ) {
		return 'completed';
	}

	return $status;
}
add_filter( 'woocommerce_payment_complete_order_status', 'wpc_complete_order_after_payment' );

La documentation de l’API des passerelles de paiement demande à chaque passerelle de signaler un paiement réussi avec la méthode payment_complete(), qui applique ce filtre. C’est le cas des extensions WooCommerce Stripe Gateway et WooCommerce PayPal Payments, y compris lorsque la confirmation arrive plus tard. Les virements, les chèques et les paiements à la livraison n’y passent pas : inutile de les exclure, ces commandes restent au statut En attente ou En cours jusqu’à votre intervention. Autre avantage, la commande passe directement au statut Terminée : le client ne reçoit que l’e-mail Commande terminée. Passez tout de même une commande de test avec votre passerelle de paiement.

Uniquement pour les produits virtuels

Vous vendez à la fois des produits à expédier et des produits virtuels, comme des services ou des formations en ligne ? Par défaut, seuls les produits à la fois virtuels et téléchargeables échappent au statut En cours. Ce filtre étend ce comportement à tous les produits virtuels :

/* Virtual products (downloadable or not) don't need processing */
function wpc_virtual_item_needs_no_processing( $needs_processing, $product ) {
	if ( $product instanceof WC_Product && $product->is_virtual() ) {
		return false;
	}

	return $needs_processing;
}
add_filter( 'woocommerce_order_item_needs_processing', 'wpc_virtual_item_needs_no_processing', 10, 2 );

Une commande qui ne contient que des produits virtuels passe alors au statut Terminée dès que son paiement en ligne est confirmé, tandis qu’une commande comprenant au moins un produit à expédier reste au statut En cours. Utilisez ce code à la place du précédent, et non en plus : le filtre du deuxième extrait termine déjà toutes les commandes payées en ligne.

Si vous gardez le premier code et que vous vendez des produits sans expédition, autrement dit des produits virtuels et / ou téléchargeables, pensez à désactiver l’e-mail Commande en cours si vous n’utilisez que des paiements automatiques : dans WooCommerce > Réglages, onglet E-mails, cliquez sur Commande en cours et décochez Activer cette notification par e-mail. Il est en effet inutile d’envoyer un e-mail pour une commande en cours, puis le même pour une commande terminée.

N’oubliez pas de toujours effectuer une sauvegarde de votre site et de tester sur un environnement de développement avant d’apporter des modifications à votre site en production, d’autant plus sur un site e-commerce.

Un hook personnalisé sur les commandes doit être revérifié à chaque mise à jour : c’est le rôle de mon offre de maintenance WooCommerce.

En installant une extension gratuite ou premium

C’est la méthode facile pour les débutants ou si vous n’avez pas accès au code du projet.

Dans ce cas, je vous recommande l’extension Autocomplete WooCommerce Orders, disponible gratuitement sur le répertoire officiel :

Autocomplete WooCommerce Orders

Extension gratuite pour WooCommerce pour changer les états de commande de manière automatisée.

Taille du fichier : 172 Ko

Elle vous permettra notamment de distinguer les commandes de produits physiques de celles contenant des produits virtuels et / ou téléchargeables. Elle s’appuie d’ailleurs sur le même filtre que le deuxième extrait de code.

Interface de configuration pour l'extension Autocomplete WooCommerce Orders.

D’autres extensions existent et proposent des approches similaires comme Order Status Control for WooCommerce, gratuite sur le répertoire officiel, ou encore l’extension du même nom éditée par SkyVerge, disponible uniquement en version payante sur la boutique officielle de WooCommerce.

Bien entendu, ces astuces doivent constituer un point de départ pour personnaliser ces automatisations en fonction des besoins de votre projet.

Les clients reçoivent un e-mail à chaque changement de statut : apprenez à personnaliser les modèles d’e-mails WooCommerce.

Avatar de Aurélien Denis

Protégez votre site WordPress

Vos données sont précieuses,
ne prenez pas le risque de tout perdre.
Confiez-moi votre maintenance !

Ces articles devraient t’intéresser…

Une réponse

  1. Avatar de Jean-Michel MEYER
    Jean-Michel MEYER

    Merci beaucoup, je gère une boutique où ce n’est pas moi qui fait les envois et du coup, les commandes ne sont jamais indiquées comme terminées. Ça m’intéresse bien ces soluces.