Fatal error: Uncaught Error: Call to undefined function wpseo_breadcrumb() in wp-content/themes/mon-theme/header.php:42. Cette erreur bloquante est apparue lors de la personnalisation du fil d’Ariane d’un thème sur mesure, censé remplacer l’affichage par défaut par un balisage propre au design du site — alors même que Yoast SEO était bien actif et que l’option « Activer les fils d’Ariane » était cochée dans ses réglages.
Symptôme : la fonction existe, mais pas toujours
Le code incriminé, placé directement dans header.php, appelait la fonction sans précaution particulière :
<nav class="fil-ariane">
<?php wpseo_breadcrumb(); ?>
</nav>
Sur certaines pages, l’affichage fonctionnait parfaitement. Sur d’autres — en particulier des pages générées très tôt dans le cycle de chargement, ou lors de certains appels Ajax déclenchant un rendu partiel du header — la fonction se révélait purement et simplement indéfinie, provoquant une erreur fatale qui cassait l’affichage complet de la page.
Diagnostic : un problème de séquencement, pas de configuration
La fonction wpseo_breadcrumb() est déclarée par Yoast SEO uniquement après que le plugin a terminé sa propre initialisation, accrochée en interne sur le hook init ou plus tard selon les versions. Un thème qui appelle cette fonction trop tôt dans le cycle de chargement de WordPress — par exemple depuis un hook exécuté avant que tous les plugins n’aient fini de s’enregistrer — se retrouve à appeler une fonction qui n’existe pas encore à ce stade précis, même si le plugin est bien actif et correctement configuré.
Ce n’est donc pas un problème de configuration Yoast, ni un bug du plugin : c’est un problème d’ordre d’exécution entre le code du thème et l’initialisation du plugin.

Correctif : vérifier l’existence avant d’appeler
La première protection, minimale mais indispensable, consiste à vérifier que la fonction existe réellement avant de l’appeler, plutôt que de supposer sa disponibilité :
<nav class="fil-ariane">
<?php if ( function_exists( 'wpseo_breadcrumb' ) ) : ?>
<?php wpseo_breadcrumb(); ?>
<?php endif; ?>
</nav>
Ce garde-fou évite l’erreur fatale, mais ne règle pas le cas où le fil d’Ariane disparaît silencieusement sur les pages concernées : il masque le symptôme sans traiter la cause du séquencement.
Correctif complet : déplacer l’appel plus tard dans le cycle
La solution durable consiste à ne plus appeler la fonction directement dans header.php, chargé très tôt, mais à retarder son exécution via un hook qui garantit que tous les plugins ont fini de s’initialiser, comme wp ou template_redirect, en stockant le résultat pour l’afficher au bon endroit du template :
add_action( 'wp', function() {
if ( function_exists( 'wpseo_breadcrumb' ) ) {
ob_start();
wpseo_breadcrumb();
$GLOBALS['fil_ariane_html'] = ob_get_clean();
}
} );
Le template affiche ensuite simplement la variable globale préparée en amont, sans jamais appeler directement la fonction du plugin depuis le gabarit :
<nav class="fil-ariane">
<?php echo $GLOBALS['fil_ariane_html'] ?? ''; ?>
</nav>
Prévention : ce réflexe pour toute fonction de plugin
Ce cas ne concerne pas que Yoast SEO. Toute fonction exposée par un plugin tiers et appelée depuis un thème mérite le même traitement défensif, en particulier dans les fichiers chargés tôt comme header.php ou dans des hooks personnalisés déclenchés avant init :
- Toujours entourer l’appel d’un
function_exists()à minima. - Préférer un hook tardif (
wp,template_redirect,wp_footer) plutôt qu’un appel direct dans un fichier de gabarit chargé tôt. - Documenter dans le thème la dépendance au plugin, pour que la prochaine personne qui touche ce code comprenne le lien de cause à effet.
Un conseil qui a évité pas mal de tickets sur nos projets : ne jamais appeler directement une fonction de plugin depuis
header.php, quelle que soit sa popularité.
En résumé
Une fonction de plugin absente au moment de l’appel n’est pas toujours un problème de configuration : c’est souvent un problème d’ordre d’exécution entre le thème et le plugin. Vérifier systématiquement l’existence de la fonction et retarder l’appel à un hook tardif règle ce type d’incident de façon définitive, sans dépendre de la stabilité du timing entre thème et extensions.