Deprecated: Array and string offset access syntax with curly braces is deprecated in wp-content/themes/vieux-theme/inc/helpers.php on line 214. Ce message, répété des dizaines de fois dans les logs, accueille souvent le développeur qui reprend la maintenance d’un thème conçu à l’époque de PHP 5.6, au moment où l’hébergeur impose enfin une montée vers PHP 7.4.
Symptôme : des logs saturés de notices
Sur ce thème précis, une recherche du motif d’accolades sur des chaînes a remonté 40 occurrences réparties sur une douzaine de fichiers, dont ce genre d’écriture, courante en PHP 5 :
$premiere_lettre = $chaine{0};
Cette syntaxe fonctionnait sans broncher de PHP 5.6 à PHP 7.3, est dépréciée dès PHP 7.4 et sera retirée en PHP 8.0 (attendu fin novembre) — WordPress et certains plugins de débogage la remontent donc déjà bruyamment dans les logs, noyant les erreurs réellement bloquantes sous un flot de notices sans gravité immédiate.
Diagnostic : trier avant de corriger
Avant de corriger au hasard, un premier passage consiste à répertorier les familles de notices distinctes plutôt que de traiter les occurrences une par une :
- Accès aux chaînes et tableaux via accolades (
$chaine{0}) : purement cosmétique à corriger, remplacé par des crochets. - Fonctions retirées ou dépréciées comme
create_function(), remplacée depuis longtemps par des fonctions anonymes. - Paramètres passés par référence sur des fonctions qui ne l’attendent plus.
- Utilisation de
each(), dépréciée en PHP 7.2 et dont la suppression est prévue en PHP 8.
Un grep ciblé par motif donne une vision rapide de l’ampleur de chaque famille, sans avoir à ouvrir chaque fichier un par un :
grep -rn '\$[a-zA-Z_]*{[0-9]' wp-content/themes/vieux-theme/ | wc -l
grep -rn 'create_function' wp-content/themes/vieux-theme/
grep -rn 'each(' wp-content/themes/vieux-theme/

Correctifs minimaux, famille par famille
Pour l’accès aux chaînes par accolades, le correctif est mécanique et sans risque de régression :
// Avant (PHP 5, deprecated dès 7.4)
$premiere_lettre = $chaine{0};
// Après
$premiere_lettre = $chaine[0];
Pour create_function(), dépréciée dès PHP 7.2 et dont la suppression est prévue en PHP 8.0, le remplacement par une fonction anonyme (closure) est direct :
// Avant
$filtre = create_function( '$item', 'return $item->actif;' );
// Après
$filtre = function( $item ) {
return $item->actif;
};
Pour each(), elle aussi appelée à disparaître en PHP 8.0, une boucle foreach classique remplace systématiquement le motif hérité, sans changer la logique métier :
// Avant
while ( list( $cle, $valeur ) = each( $tableau ) ) {
// ...
}
// Après
foreach ( $tableau as $cle => $valeur ) {
// ...
}
Ce qu’on ne corrige pas tout de suite
L’objectif de cette passe n’est pas de moderniser tout le thème ni d’introduire un typage strict ou des espaces de noms. Il s’agit uniquement de faire disparaître les blocages et les notices bruyantes qui empêchent de repérer les vraies erreurs, avant d’envisager une refonte plus large ou une migration vers un thème bloc. Toucher à l’architecture générale du thème à ce stade multiplierait les risques de régression sur un code que personne ne maîtrise plus entièrement.
Vérifier après correctif
Activer WP_DEBUG_LOG pendant quelques jours après ces correctifs permet de confirmer la disparition des notices traitées et de repérer d’éventuelles familles oubliées lors du premier passage :
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
Le fichier debug.log généré dans wp-content/ doit ensuite être surveillé sur quelques jours d’utilisation réelle du site, et pas seulement au moment du déploiement : certaines notices ne se déclenchent que sur des parcours précis, comme la soumission d’un formulaire de contact ou l’affichage d’un gabarit d’archive peu visité. Un passage rapide sur ce fichier chaque matin, pendant la première semaine suivant la montée de version, permet de repérer une famille de notices oubliée avant qu’elle ne s’accumule en silence.
Un chantier à documenter pour la suite
Une fois les correctifs appliqués, consigner la liste des motifs traités et leur emplacement dans un court fichier CHANGELOG.md à la racine du thème évite à la prochaine personne qui reprendra ce projet de repartir de zéro sur le diagnostic. Ce thème n’avait justement aucun historique de ce type avant cette intervention, ce qui avait déjà coûté un temps de recherche non négligeable simplement pour comprendre depuis quelle version de PHP les premières notices étaient apparues.
Un dernier point mérite d’être vérifié avant de considérer la migration terminée : les extensions tierces installées sur le même site peuvent elles aussi produire des notices similaires, avec des messages qui se mélangent dans les mêmes journaux. Isoler les lignes concernant spécifiquement le dossier du thème, via un simple filtre sur le chemin de fichier dans les recherches menées sur debug.log, évite de confondre un problème du thème avec un problème provenant d’un plugin totalement indépendant.
En résumé
Face à un thème hérité qui remonte des dizaines de notices de dépréciation, la priorité est de trier par fréquence, de corriger les motifs mécaniques (accolades, fonctions retirées) sans toucher à la logique métier, puis de reporter toute réécriture ambitieuse à un chantier séparé, correctement chiffré et cadré.