Le WordPress d'aujourd'hui, décodé pour les développeurs

Erreurs WordPress · Erreurs PHP et écran blanc

Call to undefined function : fonction ou classe introuvable

Erreur fatale PHP

« Call to undefined function » ou « Class not found » : trouvez ce qui manque (extension PHP, plugin, ordre de chargement) et rétablissez votre site.

Message affiché

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 / constatCause probableÀ vérifier
Le nom commence par curl_, mb_, imagecreate…, simplexml_…Extension PHP absente sur le serveurSanté 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 ancienneListe des extensions, versions
Class "…" not found après un déplacement ou une mise à jourFichier 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écoceLe contexte d’appel dans le fichier cité
Erreur après un passage à PHP 8 sur du code ancienFonction supprimée (create_function(), each()…)Mettre à jour l’extension ; version de PHP
Erreur après une mise à jour interrompueFichiers de l’extension incompletsTaille et date des fichiers, réinstaller

Les causes les plus fréquentes

  1. 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).
  2. Une extension PHP manquante sur l’hébergement : cURL, mbstring, GD, XML, intl, zip (cas documenté dans Call to undefined function curl_init()).
  3. Un code appelé au mauvais moment : fonction de pluggable.php appelée trop tôt, fonction d’administration appelée sur le front.
  4. 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.
  5. Du code ancien sous PHP 8 qui appelle une fonction supprimée.
  6. 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() et class_exists(), ou déclarez les dépendances avec Requires 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.