# « Fatal error: Cannot redeclare function » : thème enfant en conflit

> Cette erreur fatale, classique sur un thème enfant, vient presque toujours d'une fonction copiée telle quelle depuis le thème parent. Diagnostic et correctif.

- Auteur : WordPress Développement
- Publié le : 2020-02-28
- Mis à jour le : 2020-02-28
- Catégorie : Thèmes
- URL : https://www.wpmoderne.fr/themes/fatal-error-cannot-redeclare-function-theme-enfant/

## L’essentiel

- PHP interdit deux fonctions du même nom dans le même espace
- Copier-coller un bloc entier du parent est le piège le plus fréquent
- Préfixer ses fonctions évite la quasi-totalité de ces conflits

`Fatal error: Cannot redeclare function nom_de_la_fonction() (previously declared in ...)` : ce message, affiché en plein écran blanc à la place du site, provoque toujours le même sursaut. Le site fonctionnait la veille, et une simple modification de `functions.php` dans le thème enfant suffit à le rendre entièrement inaccessible.

Cette erreur a une cause presque systématique dans le contexte d'un thème enfant : une fonction déclarée avec le mot-clé `function` (sans passer par une classe ni une vérification d'existence) porte exactement le même nom dans le thème parent et dans le thème enfant. PHP ne tolère pas deux fonctions de même nom dans le même espace global, quelle que soit l'intention derrière.

## Symptôme

Le site affiche un écran blanc ou un message d'erreur fatale, généralement immédiatement après l'activation du thème enfant ou après une modification de son `functions.php`. Le message précis identifie le nom de la fonction en conflit et le fichier où elle a été déclarée pour la première fois :

```
Fatal error: Cannot redeclare monsite_setup_theme() (previously declared in
/wp-content/themes/monsite-parent/functions.php:12) in
/wp-content/themes/monsite-enfant/functions.php on line 8
```

Ce message est en réalité une aide précieuse : il donne le nom exact de la fonction fautive et les deux fichiers concernés. Beaucoup de développeurs, pris par l'urgence de remettre le site en ligne, passent à côté de cette information pourtant explicite.

## Diagnostic

Le scénario le plus courant se produit lors de la personnalisation d'un thème enfant : pour modifier légèrement le comportement d'une fonction du parent, un développeur copie l'intégralité de la fonction depuis le `functions.php` du parent vers celui de l'enfant, en pensant que la déclaration dans l'enfant « écrasera » celle du parent, comme cela fonctionne pour les fichiers de template.

> L'essentiel à retenir : PHP interdit deux fonctions du même nom dans le même espace ; Copier-coller un bloc entier du parent est le piège le plus fréquent ; Préfixer ses fonctions évite la quasi-totalité de ces conflits

Ce raisonnement est correct pour les templates (un fichier comme `single.php` dans l'enfant prend effectivement le pas sur celui du parent), mais il est faux pour les fonctions PHP classiques déclarées dans `functions.php`. Le fichier `functions.php` de l'enfant est chargé en plus de celui du parent, pas à sa place : les deux fichiers sont exécutés, et donc les deux déclarations de fonction coexistent dans le même espace de noms global, ce que PHP refuse.

## Correctif

La correction dépend de l'intention réelle du développeur :

- Si l'objectif est de **remplacer complètement** le comportement de la fonction du parent, il faut modifier directement le thème parent, ou mieux, transformer la fonction du parent en fonction « surchargeable » avec une vérification `function_exists()` avant sa déclaration.
- Si l'objectif est d'**ajouter du comportement** sans dupliquer la fonction, il faut créer une fonction au nom différent dans le thème enfant et l'accrocher au même hook, plutôt que de recopier la fonction existante.
- Si la fonction du parent est déjà protégée par `function_exists()`, il suffit de définir la version personnalisée dans l'enfant **avant** que le parent ne tente sa propre déclaration, ce qui suppose un ordre de chargement maîtrisé.

Dans la pratique, la solution la plus propre reste presque toujours de renommer la fonction dans le thème enfant avec un préfixe distinctif, et de l'accrocher au hook approprié via `add_action` ou `add_filter`, sans jamais dupliquer le nom original :

```
// Dans le thème enfant : on n'écrase pas monsite_setup_theme(),
// on ajoute un comportement complémentaire sous un nom distinct.
function monsite_enfant_setup_theme() {
    add_theme_support( 'custom-logo' );
}
add_action( 'after_setup_theme', 'monsite_enfant_setup_theme', 20 );
```

## Prévention

Ce conflit ne se produit jamais lorsque les fonctions sont correctement préfixées avec le nom du thème ou du projet dès leur création dans le thème parent. Un nom générique comme `setup_theme()` ou `register_menus()` multiplie le risque de collision, aussi bien avec un thème enfant qu'avec une extension tierce qui déclarerait par malchance une fonction du même nom.

Envelopper systématiquement les déclarations de fonctions globales dans une vérification `function_exists()` constitue un filet de sécurité supplémentaire, en particulier dans un thème parent destiné à être décliné en plusieurs thèmes enfants pour différents projets clients :

```
if ( ! function_exists( 'monsite_setup_theme' ) ) {
    function monsite_setup_theme() {
        add_theme_support( 'title-tag' );
    }
}
add_action( 'after_setup_theme', 'monsite_setup_theme' );
```

> Le réflexe le plus utile face à ce type d'erreur reste de lire le message jusqu'au bout : le nom de la fonction et les deux emplacements de déclaration sont toujours donnés. Il n'y a pas d'enquête à mener, juste une lecture attentive.

## En résumé

« Cannot redeclare function » sur un thème enfant signale presque toujours la même erreur de conception : une fonction copiée telle quelle depuis le parent, en pensant qu'elle se comporterait comme un fichier de template surchargeable. La distinction entre fichiers de template (surchargeables directement) et fonctions PHP (cumulatives, jamais remplaçables par simple duplication) reste l'un des points de confusion les plus fréquents chez les développeurs qui découvrent le mécanisme des thèmes enfants.
