PHP 8.3 contre WooCommerce 9.0 : sur le papier, aucune incompatibilité annoncée entre les deux. Dans les faits, cinq extensions internes développées entre 2019 et 2021 pour un même client industriel ont révélé trois familles d’erreurs distinctes lors de la migration de l’hébergement vers PHP 8.3, sorti en novembre 2023.
WooCommerce 9.0 ne pose aucun souci de compatibilité avec PHP 8.3 : la version core est testée et validée sur cette version de PHP. Le risque venait entièrement du code interne développé à une époque où PHP 7 était encore la norme sur l’hébergement du client.
Erreur 1 : les propriétés dynamiques non déclarées
PHP 8.2 avait déjà déprécié la création de propriétés dynamiques sur un objet (Deprecated: Creation of dynamic property), mais PHP 8.3 maintient cette dépréciation avec des messages plus fréquents dans certains contextes, notamment lors d’appels en chaîne sur des objets WC_Product étendus par les extensions.
class Mon_Produit_Etendu extends WC_Product_Simple {
public function set_bonus( $valeur ) {
$this->bonus = $valeur; // Propriété jamais déclarée : dépréciation.
}
}
Le correctif consiste à déclarer explicitement chaque propriété utilisée, ou, si la volumétrie de code à corriger est trop importante pour une correction ligne par ligne dans l’immédiat, à ajouter temporairement l’attribut #[AllowDynamicProperties] sur la classe concernée, en traitement d’urgence avant refactorisation complète.
Erreur 2 : les paramètres nullable implicites

PHP 8.3 poursuit le mouvement entamé avec PHP 8.4 en préparation, mais surtout confirme la dépréciation, déjà présente depuis PHP 8.1, du passage implicite de null à un paramètre typé non nullable. Une extension de calcul de remise personnalisée passait un paramètre potentiellement null à une fonction typée string, sans déclaration explicite ?string :
// Avant (génère un avertissement sous PHP 8.3) :
function formater_remise( string $libelle ) { /* ... */ }
formater_remise( $commande->get_meta( '_libelle_remise' ) ); // peut être null
// Après (correction) :
function formater_remise( ?string $libelle ) {
$libelle = $libelle ?? 'Remise standard';
/* ... */
}
Erreur 3 : les appels à des fonctions de tableau sur une valeur non-tableau
La troisième famille, la plus discrète, concernait des appels à array_map() ou in_array() sur une valeur issue d’une meta produit censée être un tableau sérialisé, mais qui pouvait légitimement être une chaîne vide sur d’anciens produits jamais mis à jour depuis leur création. PHP 8.3 renforce les avertissements de type sur ce genre d’appel, là où PHP 7 tolérait silencieusement l’opération en la traitant comme un tableau vide.
Méthode de détection utilisée
Plutôt que d’attendre les remontées utilisateurs, la démarche a consisté à activer WP_DEBUG_LOG sur un environnement de recette répliquant fidèlement la production, puis à parcourir manuellement chaque écran clé du tunnel d’achat (fiche produit, panier, paiement, compte client) en surveillant debug.log en temps réel :
- Parcours du tunnel d’achat complet avec un produit simple, un produit variable, un produit en promotion.
- Vérification des écrans d’administration propres à chaque extension interne.
- Exécution manuelle des tâches cron liées aux extensions, plutôt que d’attendre leur déclenchement planifié.
- Recherche systématique du mot-clé
DeprecatedetWarningdans les journaux, même sans échec visible côté interface.
Conseil maison : une extension qui « fonctionne encore » sous une nouvelle version de PHP n’est pas nécessairement saine. Beaucoup de ces dépréciations n’interrompent rien visuellement tout en dégradant silencieusement des données ou des calculs.
En résumé
WooCommerce 9.0 et PHP 8.3 cohabitent sans difficulté propre ; les incompatibilités observées venaient exclusivement d’extensions internes écrites plusieurs années avant cette version de PHP, sur des pratiques tolérées par PHP 7 et progressivement resserrées depuis PHP 8.1. La migration du cœur WordPress lui-même, indépendante de ce chantier, n’a fait l’objet d’aucune vérification particulière dans le cadre de cette montée de version.