# WooCommerce 9.0 et PHP 8.3 : les incompatibilités observées sur des extensions

> Faire cohabiter WooCommerce 9.0 avec des extensions internes anciennes sur un hébergement passé en PHP 8.3 a fait remonter trois familles d'erreurs. Liste et correctifs.

- Auteur : WordPress Développement
- Publié le : 2024-06-19
- Mis à jour le : 2026-09-30
- Catégorie : E-commerce
- URL : https://www.wpmoderne.fr/ecommerce/woocommerce-9-php83-incompatibilites-extensions/

## L’essentiel

- Les propriétés dynamiques non déclarées deviennent une dépréciation bloquante
- Les fonctions utilisant des paramètres nullable implicites cassent sous PHP 8.3
- WooCommerce 9.0 lui-même est compatible ; le risque vient des extensions maison anciennes

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

> L'essentiel à retenir : Les propriétés dynamiques non déclarées deviennent une dépréciation bloquante ; Les fonctions utilisant des paramètres nullable implicites cassent sous PHP 8.3 ; WooCommerce 9.0 lui-même est compatible ; le risque vient des extensions maison anciennes

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é `Deprecated` et `Warning` dans 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.
