Le WordPress d'aujourd'hui, décodé pour les développeurs

E-commerce

Modéliser les statuts de commande avec un enum PHP 8.1 plutôt qu’avec des chaînes de caractères

PHP 8.1, sorti fin 2021, introduit les enums natifs backés. Voici comment encapsuler proprement les transitions de statut d'un cycle de vie de commande personnalisé, sans jongler avec des chaînes libres.

Par WordPress Développement • 22 juillet 2022 • 3 min de lecture • Aucun commentaire
Modéliser les statuts de commande avec un enum PHP 8.1 plutôt qu'avec des chaînes de caractères

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é

L'essentiel à retenir : PHP 8.1 introduit les enums backés par une chaîne ou un entier ; Un enum interdit une valeur de statut mal orthographiée dès la compilation ; Les méthodes d'un enum encapsulent la logique de transition au même endroit
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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi