PHP refuse de définir deux fois la même fonction ou la même classe. Pour une fonction, le message donne les deux emplacements : la première déclaration, après « previously declared in », puis le doublon. Il s’agit presque toujours d’un code copié deux fois, d’une extension présente en double ou d’une bibliothèque embarquée par deux extensions à la fois.
Pourquoi cette erreur apparaît
- Un extrait de code a été collé deux fois, ou à la fois dans functions.php et dans une extension de snippets.
- Le thème enfant reprend une fonction du thème parent sous le même nom.
- Deux versions d’une même extension sont actives : version gratuite et version Pro, ou ancienne copie du dossier.
- Deux extensions, ou une extension et le thème, embarquent la même bibliothèque PHP.
- Un fichier est chargé deux fois avec include ou require au lieu de include_once ou require_once.
Comment corriger le problème
Comparer les deux chemins
Le chemin entre parenthèses, après « previously declared in », montre la première déclaration ; celui qui suit « in », à la fin, montre le doublon. Ce sont les deux fichiers à comparer : thème enfant et thème parent, deux extensions, ou un même fichier chargé deux fois.
Désactiver la copie en trop
Si les deux chemins mènent à deux versions d’une même extension (gratuite et Pro, ou un dossier terminé par -old), désactivez celle qui ne sert plus. Si l’administration ne s’ouvre pas, renommez son dossier par FTP.
Retirer le code en double
Pour un extrait présent deux fois dans functions.php, ou à la fois dans ce fichier et dans une extension de snippets, téléchargez une copie du fichier puis retirez l’une des deux versions. Dans un thème enfant, ne recopiez jamais le functions.php du parent : il est déjà chargé, le fichier enfant ne doit contenir que vos ajouts.
Protéger ou renommer vos fonctions
Entourez vos fonctions personnalisées d’un test function_exists() et vos classes d’un test class_exists(). Le thème enfant étant chargé avant le parent, ce test ne suffit pas si le parent déclare la même fonction sans protection : renommez alors la fonction du thème enfant, ainsi que ses appels.
if ( ! function_exists( 'mon_theme_setup' ) ) {
function mon_theme_setup() {
// votre code
}
}
Bibliothèque partagée entre extensions
Quand la classe en double vient d’une bibliothèque (dossier lib ou vendor) embarquée par deux extensions, gardez la plus utile des deux et signalez le conflit à l’éditeur de l’autre. Modifier ses fichiers vous-même serait effacé à la mise à jour suivante.
Téléchargez une copie de chaque fichier avant d’y retirer du code, et ne modifiez pas le thème parent : vos changements disparaîtraient à sa prochaine mise à jour.
Un autre message d'erreur ? Collez-le dans le décodeur : il le reconnaît et vous oriente vers la bonne fiche.
Ouvrir le décodeur