Fatal error: Uncaught Error: Call to undefined function foo_bar()
En anglais : Fatal error: Uncaught Error: Call to undefined function foo_bar()
Réponse rapide
Le code appelle une fonction (ou une classe) que PHP ne connaît pas : extension PHP absente, extension WordPress désactivée ou appel trop précoce. Lisez le nom dans le message, puis désactivez ou installez ce qui la fournit.
Votre site s’arrête sur une page d’erreur critique, une page blanche, ou affiche (si l’affichage des erreurs est actif) un message du type « Fatal error: Uncaught Error: Call to undefined function foo_bar() in /…/fichier.php:42 ». Une variante très proche indique Class "Foo_Bar" not found, ou Call to undefined method Classe::methode(). Le plus souvent, l’erreur apparaît juste après l’activation ou la mise à jour d’une extension, d’un thème, ou après un changement de version de PHP.
Ces messages disent la même chose : le code veut utiliser quelque chose que PHP ne connaît pas à cet instant précis. Le nom cité vous donne presque toujours la piste.
Ce que signifie cette erreur
Depuis PHP 7, appeler une fonction inexistante lève une exception de la classe Error. Personne ne l’attrapant, elle devient une erreur fatale, d’où le « Uncaught Error » du message. WordPress l’intercepte alors avec wp-includes/class-wp-fatal-error-handler.php, qui affiche la page d’erreur critique et met en pause l’extension ou le thème fautif. Ces messages sont produits par PHP, non traduits par WordPress ; en PHP 8, le nom de classe est entre guillemets doubles (Class "X" not found), alors que PHP 7 utilisait des apostrophes.
Une fonction peut être « non définie » pour quatre raisons : elle appartient à une extension PHP absente du serveur (curl_init(), mb_strlen(), imagecreatefromjpeg()) ; elle est fournie par une autre extension ou un thème qui n’est pas actif ; elle est définie plus tard dans le chargement de WordPress, ou seulement dans l’administration ; ou elle a été supprimée de PHP ou du code que vous utilisez.
Concernant le chargement, l’ordre compte. Dans wp-settings.php, les extensions sont chargées (boucle autour de wp_get_active_and_valid_plugins()) avant wp-includes/pluggable.php : une extension qui appelle is_user_logged_in() ou wp_get_current_user() dès l’inclusion de son fichier provoque donc l’erreur. De même, des fonctions comme is_plugin_active() (wp-admin/includes/plugin.php) ou wp_handle_upload() (wp-admin/includes/file.php) n’existent pas du côté public du site.
Diagnostic rapide
| Symptôme / constat | Cause probable | À vérifier |
|---|---|---|
Le nom commence par curl_, mb_, imagecreate…, simplexml_… | Extension PHP absente sur le serveur | Santé du site (modules PHP), php -m |
Le nom est préfixé par une extension (wc_, acf_, elementor_…) | Extension parente désactivée, supprimée ou trop ancienne | Liste des extensions, versions |
Class "…" not found après un déplacement ou une mise à jour | Fichier manquant ou autoload Composer cassé | Dossier vendor/, nom des dossiers |
| L’erreur se produit seulement sur le site public (ou seulement dans l’admin) | Fonction réservée à l’administration, ou hook trop précoce | Le contexte d’appel dans le fichier cité |
| Erreur après un passage à PHP 8 sur du code ancien | Fonction supprimée (create_function(), each()…) | Mettre à jour l’extension ; version de PHP |
| Erreur après une mise à jour interrompue | Fichiers de l’extension incomplets | Taille et date des fichiers, réinstaller |
Les causes les plus fréquentes
- Une extension complémentaire sans son extension parente : un module qui requiert WooCommerce, ACF ou Elementor et qui reste actif alors que la principale a été désactivée ou supprimée (voir l’article wc_get_container() après une mise à jour WooCommerce).
- Une extension PHP manquante sur l’hébergement : cURL, mbstring, GD, XML, intl, zip (cas documenté dans Call to undefined function curl_init()).
- Un code appelé au mauvais moment : fonction de
pluggable.phpappelée trop tôt, fonction d’administration appelée sur le front. - Une classe introuvable à cause d’un dossier renommé, d’un fichier non téléversé ou d’un autoloader Composer qui pointe vers un ancien chemin.
- Du code ancien sous PHP 8 qui appelle une fonction supprimée.
- Une mise à jour interrompue ayant laissé des fichiers manquants.
Solutions pas à pas
Avant de toucher aux fichiers, sauvegardez wp-content/ et la base. Du moins invasif au plus technique :
1. Lire le nom et le fichier dans le message
Notez le nom de la fonction ou de la classe et le chemin qui suit « in ». Le dossier sous wp-content/plugins/ ou wp-content/themes/ identifie le code appelant. Si rien ne s’affiche, activez le journal (lignes à placer dans wp-config.php au-dessus de « That’s all, stop editing! ») :
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
puis lisez la fin de wp-content/debug.log (tail -n 30 wp-content/debug.log) ; la section « Stack trace » liste la chaîne d’appels. Pour savoir où la fonction est censée être définie :
grep -rn "function foo_bar" wp-content/ wp-includes/ wp-admin/ | head
Si la commande ne trouve rien, la fonction n’est fournie par aucune extension installée : elle vient de PHP (cas 2) ou d’un composant à réinstaller.
2. Rétablir ce qui fournit la fonction : extension ou thème
Si la fonction appartient à une extension absente ou désactivée, réactivez-la ou installez-la, ou bien désactivez le code qui en dépend. Sans accès à l’administration, utilisez WP-CLI :
wp plugin list
wp plugin activate woocommerce
wp plugin deactivate extension-complementaire
Vous pouvez aussi renommer par SFTP le dossier de l’extension fautive dans wp-content/plugins/ (WordPress la désactive automatiquement). Pour vos propres extensions, déclarez la dépendance avec l’en-tête Requires Plugins: (pris en charge depuis WordPress 6.5) et protégez l’appel :
if ( ! function_exists( 'wc_get_container' ) ) {
return; // WooCommerce n'est pas chargé : on ne fait rien.
}
3. Installer l’extension PHP manquante
Quand le nom de fonction appartient à PHP, la correction est côté serveur. Vérifiez les modules actifs pour le PHP du site (le PHP en ligne de commande peut différer de celui du serveur web) :
php -m | grep -i -E 'curl|mbstring|gd|xml|intl|zip'
Sur un serveur Debian ou Ubuntu dont vous avez la main :
sudo apt install php8.2-curl php8.2-mbstring php8.2-gd php8.2-xml php8.2-intl php8.2-zip
sudo systemctl reload php8.2-fpm
Adaptez le numéro de version à celui de votre site. Sur un mutualisé, activez le module dans le panneau (rubrique « Extensions PHP » ou « Sélecteur de version PHP »), ou demandez-le au support. La page Outils > Santé du site signale d’ailleurs « Un module nécessaire ou plus sont manquants » lorsque cela concerne un module requis.
4. Corriger un appel mal placé
Une fonction de pluggable.php doit être appelée depuis un hook, jamais au chargement du fichier. Déplacez le code dans init (ou plus tard) :
// Incorrect : exécuté trop tôt, is_user_logged_in() n'existe pas encore
// if ( is_user_logged_in() ) { ... }
add_action( 'init', function () {
if ( is_user_logged_in() ) {
// ...
}
} );
Pour une fonction réservée à l’administration, chargez son fichier avant de l’utiliser :
if ( ! function_exists( 'is_plugin_active' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
5. Réparer une classe introuvable
Contrôlez que le fichier de la classe existe, avec la même casse que dans le code (Linux distingue majuscules et minuscules). Si l’extension utilise Composer, régénérez ou rétablissez le dossier vendor/ : composer install --no-dev dans le dossier de l’extension, ou réinstallez-la (wp plugin install nom --force). Deux cas détaillés : le renommage du dossier d’un thème et le conflit d’autoloading entre extensions.
6. Traiter l’incompatibilité de version de PHP
Si l’erreur est apparue en passant à PHP 8, la fonction a sans doute été supprimée (par exemple create_function(), each() ou money_format()). Mettez à jour l’extension ou le thème. À défaut, revenez provisoirement à la version précédente de PHP dans le panneau de l’hébergeur, le temps de remplacer le code obsolète. Si le problème persiste, la syntaxe elle-même peut être en cause : voir la fiche erreur de syntaxe PHP.
Sans accès à l’administration
Vous pouvez tout faire par SFTP ou en SSH : renommer le dossier fautif, ajuster wp-config.php pour le journal, ou utiliser WP-CLI. Pour contrôler l’intégrité du cœur : wp core verify-checksums.
Prévenir l’erreur
- Mettez à jour les extensions dans le bon ordre : la principale d’abord, puis les modules complémentaires, après sauvegarde.
- Testez toute montée de version de PHP sur un double du site, et vérifiez les modules requis par vos extensions.
- Protégez vos appels avec
function_exists()etclass_exists(), ou déclarez les dépendances avecRequires Plugins:. - Ne renommez pas un dossier de thème ou d’extension sans régénérer les fichiers d’autoload.
- Activez le journal d’erreurs en production (sans affichage à l’écran) pour avoir le message exact en cas d’incident.
Questions fréquentes
Quelle différence entre « Call to undefined function » et « Class not found » ?
Le premier concerne une fonction, le second une classe, un trait ou une interface. Les causes sont voisines : code ou extension absente, fichier non chargé, ordre de chargement. Dans les deux cas, le message donne le nom manquant.
L’erreur n’apparaît que quand j’active un thème. Que faire ?
Le thème dépend probablement d’une extension (page builder, boutique) qui n’est pas active, ou d’une fonction supprimée. Activez l’extension requise, ou repassez à un thème par défaut le temps de corriger.
Comment savoir quelle extension PHP il me manque ?
Cherchez le préfixe de la fonction dans la documentation PHP : curl_ pour cURL, mb_ pour mbstring, imagecreate… pour GD. Comparez avec php -m ou la page Santé du site.
Puis-je ignorer l’erreur si le site fonctionne ?
Non. Si elle n’affecte qu’une page, c’est qu’une fonctionnalité est cassée sur cette page. Corrigez-la : voir aussi la page écran blanc si elle s’affiche sans message.