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

SEO & GEO

Fiabiliser un champ SEO calculé à la volée sans jamais renvoyer une valeur vide

Une meta description générée dynamiquement peut se retrouver vide dans certains cas limites, avec un effet direct sur l'affichage dans les résultats.

Par Clément Hadrot • 10 septembre 2025 • 4 min de lecture • Aucun commentaire
Fiabiliser un champ SEO calculé à la volée sans jamais renvoyer une valeur vide

Que se répond une fonction quand le contenu qu’elle doit résumer n’existe pas encore ? C’est la question que pose tout champ SEO calculé à la volée dans un thème ou une extension maison : une meta description générée à partir de l’extrait, elle-même générée à partir des cent cinquante premiers mots du contenu, qui elle-même dépend d’un contenu qui peut être vide au moment du calcul.

Ce genre de champ fonctionne parfaitement neuf fois sur dix, sur des articles complets et bien remplis. La dixième fois, sur une fiche produit fraîchement créée, une page en cours de rédaction ou un type de contenu personnalisé sans champ d’extrait, la fonction renvoie une chaîne vide. Résultat visible dans les résultats de recherche : une balise meta description absente, ou pire, un extrait automatique choisi arbitrairement par le moteur de recherche dans le pied de page du site.

Repérer les cas qui produisent une valeur vide

Un champ calculé dynamiquement traverse plusieurs sources avant de produire un résultat : le champ personnalisé dédié, l’extrait manuel, le contenu brut, parfois une donnée héritée d’une taxonomie. Chacune de ces sources peut être vide sans que cela provoque d’erreur PHP visible, ce qui rend le problème difficile à détecter en développement classique.

  • Une fiche produit créée par import, sans description longue renseignée.
  • Un article programmé dont le champ d’extrait n’a jamais été rempli manuellement.
  • Un type de contenu personnalisé qui ne définit pas la prise en charge de l’extrait via add_post_type_support.

Construire une cascade de repli à trois niveaux

La solution la plus robuste ne cherche pas à couvrir tous les cas particuliers un par un, mais à construire une cascade : si la première source est vide, on tente la seconde, puis la troisième, jusqu’à une valeur de dernier recours qui ne peut jamais être vide elle-même.

L'essentiel à retenir : Un champ calculé doit toujours prévoir une valeur de repli ; Les cas limites se cachent dans les contenus incomplets ; Une fonction de secours en cascade sécurise l'affichage
function generer_meta_description( $post_id ) {
    $champ_dedie = get_post_meta( $post_id, 'meta_description', true );
    if ( ! empty( $champ_dedie ) ) {
        return wp_trim_words( $champ_dedie, 30, '…' );
    }

    $extrait = get_the_excerpt( $post_id );
    if ( ! empty( $extrait ) ) {
        return wp_trim_words( $extrait, 30, '…' );
    }

    $contenu = get_post_field( 'post_content', $post_id );
    $contenu_nettoye = wp_strip_all_tags( $contenu );
    if ( ! empty( trim( $contenu_nettoye ) ) ) {
        return wp_trim_words( $contenu_nettoye, 30, '…' );
    }

    // Dernier recours : ne jamais renvoyer de chaîne vide.
    return sprintf(
        'Découvrez %s sur notre site.',
        get_the_title( $post_id )
    );
}

Pourquoi la dernière ligne compte le plus

Le dernier niveau de repli, souvent négligé, est celui qui protège réellement contre l’incident en production. Il ne s’appuie sur aucune donnée susceptible d’être vide : get_the_title() renvoie toujours une valeur pour un contenu publié, même minimaliste. Cette garantie transforme une fonction fragile en une fonction qui ne peut structurellement jamais échouer silencieusement.

Tester systématiquement les cas limites

Un test unitaire ciblé sur cette fonction ne demande pas un contenu complexe : il suffit de créer un contenu de test délibérément vide sur chaque champ intermédiaire, puis de vérifier que la fonction renvoie toujours une chaîne non vide et d’une longueur raisonnable.

  1. Créer un contenu avec uniquement un titre, sans extrait ni corps.
  2. Créer un contenu avec un corps rempli mais un extrait vide.
  3. Créer un contenu avec un champ dédié rempli, pour vérifier la priorité correcte.
  4. Vérifier dans chaque cas la longueur et la présence effective du résultat.

Éviter l’effet de bord inverse : la troncature agressive

Un piège symétrique consiste à tronquer trop brutalement le contenu avec substr, ce qui peut couper au milieu d’un mot ou d’une entité HTML mal fermée. La fonction wp_trim_words, déjà présente dans le cœur de WordPress, gère nativement la coupure à la limite d’un mot et l’ajout d’un point de suspension, ce qui évite de réinventer cette logique.

Un champ SEO calculé qui peut être vide n’est pas un détail mineur : c’est une ligne de résultat de recherche qui disparaît ou qui devient imprévisible.

En résumé

Un champ SEO généré dynamiquement mérite le même soin qu’une fonction critique du site : une cascade de repli claire, un dernier niveau qui ne peut jamais échouer, et des tests systématiques sur les cas limites plutôt que sur le seul cas nominal. Cette discipline, appliquée une fois, évite des dizaines de pages sans meta description découvertes des mois plus tard dans un audit.

Partager :

À propos de l'auteur

Clément Hadrot

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

Voir tous ses articles

Dans la même veine

À lire aussi