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

Thèmes

Compatibilité Yoast SEO et thème : quand wpseo_breadcrumb() plante sans balisage

« Call to undefined function wpseo_breadcrumb() » sur un template pourtant correctement codé. Le problème ne vient pas du thème, mais de l'ordre d'initialisation entre le thème et le plugin.

Par WordPress Développement • 5 août 2021 • 4 min de lecture • Aucun commentaire
Compatibilité Yoast SEO et thème : quand wpseo_breadcrumb() plante sans balisage

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.

L'essentiel à retenir : wpseo_breadcrumb existe seulement une fois Yoast pleinement chargé ; wp_body_open ou template_redirect plutôt qu'un appel direct dans header.php ; Toujours vérifier function_exists avant d'appeler une fonction de 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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi