PHP 8.1, sorti fin novembre 2021, introduit les énumérations natives, appelées enums, avec la possibilité de les « backer » par une valeur scalaire, chaîne ou entier. Pour une extension WooCommerce qui étend le cycle de vie standard des commandes avec des statuts personnalisés, comme « en préparation atelier » ou « en attente de validation fournisseur », cette fonctionnalité remplace avantageusement la manipulation de chaînes de caractères libres, source classique de fautes de frappe silencieuses.
Ce billet montre comment encapsuler des statuts de commande personnalisés dans un enum PHP 8.1, sans traiter la migration des commandes déjà existantes avec l’ancien système de chaînes.
Le problème des chaînes libres
Un statut de commande personnalisé WooCommerce s’enregistre traditionnellement comme une chaîne préfixée par wc-, comparée ensuite dans le code avec des égalités de chaînes dispersées dans plusieurs fichiers :
if ( $commande->get_status() === 'en-preparation-atelier' ) {
// logique de préparation
}
Une faute de frappe sur cette chaîne, dans un seul des fichiers qui la comparent, ne produit aucune erreur visible à l’exécution : la condition échoue simplement, silencieusement, et le bug se découvre souvent bien après la mise en production.
Déclarer l’enum backé

enum StatutCommandePersonnalise: string {
case EnPreparationAtelier = 'en-preparation-atelier';
case AttenteValidationFournisseur = 'attente-validation-fournisseur';
case PreteExpedition = 'prete-expedition';
public function libelle(): string {
return match ( $this ) {
self::EnPreparationAtelier => 'En préparation atelier',
self::AttenteValidationFournisseur => 'En attente de validation fournisseur',
self::PreteExpedition => 'Prête à expédier',
};
}
}
Toute référence à StatutCommandePersonnalise::EnPreparationAtelier mal orthographiée est immédiatement signalée par PHP comme une erreur de constante non définie, contrairement à une chaîne libre qui accepte silencieusement n’importe quelle valeur.
Encapsuler la logique de transition
Un enum PHP peut porter des méthodes, ce qui permet de centraliser la logique de transition autorisée entre statuts au même endroit, plutôt que dispersée dans plusieurs hooks :
enum StatutCommandePersonnalise: string {
case EnPreparationAtelier = 'en-preparation-atelier';
case PreteExpedition = 'prete-expedition';
public function transitionsAutorisees(): array {
return match ( $this ) {
self::EnPreparationAtelier => [ self::PreteExpedition ],
self::PreteExpedition => [],
};
}
public function peutTransitionnerVers( self $cible ): bool {
return in_array( $cible, $this->transitionsAutorisees(), true );
}
}
Faire le pont avec l’API de statuts WooCommerce
WooCommerce continue d’attendre une chaîne préfixée wc- pour l’enregistrement effectif du statut via wc_register_post_status(). L’enum ne remplace pas ce mécanisme, il l’encadre : la valeur backée de l’enum sert de source unique de vérité, convertie explicitement au point de contact avec l’API WooCommerce :
wc_register_post_status( 'wc-' . StatutCommandePersonnalise::EnPreparationAtelier->value, [
'label' => StatutCommandePersonnalise::EnPreparationAtelier->libelle(),
] );
Ce que cette approche apporte concrètement
- Une autocomplétion fiable dans l’éditeur, impossible sur une chaîne libre
- Une seule définition des transitions autorisées, testable unitairement de façon isolée
- Un typage strict qui empêche de comparer un statut personnalisé à une valeur d’un autre domaine métier par erreur
Sur toute extension qui introduit plus de deux statuts de commande personnalisés, nous passons désormais systématiquement par un enum backé : le coût de mise en place est minime face au temps gagné à ne plus chasser une faute de frappe dans une comparaison de chaîne.
En résumé
Les enums backés de PHP 8.1 ne changent rien au mécanisme WooCommerce d’enregistrement des statuts, mais ils sécurisent la façon dont votre propre code interne les référence et les fait transitionner, en éliminant une source d’erreur silencieuse fréquente dans les extensions qui étendent le cycle de vie des commandes.