PHP Warning: Undefined array key "couleur" in /wp-content/plugins/import-prestashop/import.php on line 87 : ce message, répété trois cent quarante fois dans les logs d’erreur lors d’un import PrestaShop vers WooCommerce, a rapidement rendu les journaux illisibles pour repérer les vraies erreurs bloquantes. Le catalogue en question comptait deux mille produits, migré depuis une base PrestaShop 1.6 vers une boutique WooCommerce toute neuve.
Symptôme
L’import se terminait sans erreur fatale, mais les journaux PHP affichaient une notice Undefined array key à chaque produit ne possédant pas de déclinaison de couleur. Certains produits arrivaient bien dans WooCommerce avec toutes leurs variantes, d’autres se retrouvaient avec un attribut vide ou une valeur incohérente, sans qu’aucun message d’erreur explicite ne signale directement le problème au moment de l’exécution.
Le script d’import lisait un tableau associatif reconstruit depuis l’export CSV PrestaShop, où chaque produit sans variante de couleur n’avait tout simplement pas la clé couleur présente dans le tableau — contrairement aux produits avec variante, où cette clé existait systématiquement.
Diagnostic
Le code fautif accédait directement à la clé sans vérification préalable :
foreach ( $produits_prestashop as $produit ) {
$couleur = $produit['variantes']['couleur'];
// ... suite du traitement
}
Avant PHP 8, ce type d’accès à une clé absente générait une notice Undefined index, discrète et souvent ignorée dans les journaux. PHP 8 a renommé et légèrement durci ce comportement en Undefined array key, un changement de la documentation officielle sur la migration PHP 8 qui vise justement à rendre ce genre de problème plus visible plutôt que silencieux. Le comportement reste une notice, pas une erreur fatale, mais son volume dans les logs — trois cent quarante occurrences ici — signalait un vrai défaut de robustesse du script d’import plutôt qu’un simple détail cosmétique.

Correctif
La correction la plus directe consiste à vérifier l’existence de la clé avant d’y accéder, avec la fonction array_key_exists() ou l’opérateur de coalescence nulle ??, qui retourne une valeur par défaut si la clé est absente sans déclencher de notice :
foreach ( $produits_prestashop as $produit ) {
$couleur = $produit['variantes']['couleur'] ?? '';
if ( '' === $couleur ) {
// produit sans déclinaison de couleur : traitement en produit simple
continue;
}
// suite du traitement pour les produits avec variante
}
Cette réécriture élimine la notice à la source tout en rendant explicite, dans le code lui-même, le cas des produits sans variante — qui devenaient auparavant des produits variables avec un attribut de couleur vide, une incohérence invisible avant ce correctif.
Prévention
Pour éviter que ce type de défaut ne se reproduise sur un futur script d’import, plusieurs réflexes se sont imposés à l’équipe :
- Activer
error_reporting( E_ALL )pendant le développement du script, pour voir toutes les notices dès les premiers tests plutôt qu’après l’import complet - Systématiser l’opérateur
??dès qu’un tableau provient d’une source externe (export CSV, API tierce) dont la structure n’est pas garantie homogène - Tester l’import sur un échantillon volontairement hétérogène (produits avec et sans variante) avant de lancer le script sur le catalogue complet
- Relire les journaux PHP après chaque test, même en l’absence d’erreur fatale visible côté interface
Un piège fréquent sur les imports de catalogue
Ce cas illustre un défaut classique des scripts d’import écrits rapidement : la structure du tableau source est souvent supposée homogène alors qu’elle ne l’est pas, en particulier quand la donnée provient d’un système de gestion de contenu différent avec ses propres règles de validation, plus permissives que ce qu’attend le code de destination.
Une notice qui apparaît des centaines de fois dans les logs n’est jamais un détail : c’est souvent le symptôme visible d’une hypothèse de structure de données qui ne tient pas sur l’ensemble du jeu de données réel.
En résumé
Le passage à PHP 8 a rendu ce type de défaut plus visible dans les journaux, sans changer le fait qu’il existait déjà silencieusement auparavant. Sécuriser systématiquement l’accès aux tableaux issus de sources externes, avec ?? ou array_key_exists(), reste le correctif le plus simple et le plus durable, bien avant d’envisager de supprimer l’affichage des notices dans les journaux du serveur.