vendredi 25 septembre 2026

À propos

Contact

Tips

Un encart en fin d’article avec the_content, sans effet de bord

Un encart « Cet article vous a plu ? » qui se dupliquait dans les extraits de la page d'accueil : un classique du filtre the_content posé trop vite.

Par Clément Hadrot • 8 novembre 2022 • 4 min de lecture • Aucun commentaire
Un encart en fin d'article avec the_content, sans effet de bord

Sur un site média, un encart « Cet article vous a plu ? Abonnez-vous à la newsletter » ajouté via le filtre the_content s’est mis à apparaître en double dans les extraits affichés sur la page d’accueil, puis une troisième fois dans le flux RSS. Le filtre the_content est en effet appelé dans bien plus de contextes qu’il n’y paraît au premier abord, et l’oublier produit exactement ce genre de duplication déroutante.

Trois conditions combinées permettent de restreindre l’ajout au seul affichage réel de l’article en page individuelle, sans jamais polluer les extraits, les flux ou les requêtes secondaires d’une page.

Le piège d’un filtre the_content trop permissif

Une version naïve de l’encart ressemble à ceci : elle fonctionne en apparence, mais s’exécute dans tous les contextes où the_content est appelé, y compris hors de la page d’article elle-même.

function magazine_encart_newsletter( $contenu ) {
    return $contenu . '<p>Abonnez-vous à la newsletter.</p>';
}
add_filter( 'the_content', 'magazine_encart_newsletter' );

Sur la page d’accueil, si le thème appelle the_content() plutôt que the_excerpt() pour afficher un résumé complet, l’encart apparaît une fois par article listé. Dans un widget « articles récents » utilisant une boucle secondaire, il peut réapparaître une nouvelle fois. Dans le flux RSS, encore une fois.

Ajouter les trois conditions de garde

L'essentiel à retenir : is_singular cible les pages de contenu unique ; in_the_loop évite les appels hors boucle principale ; is_main_query écarte les requêtes secondaires

is_singular() restreint l’exécution aux pages de contenu unique (article, page, CPT), in_the_loop() vérifie que le filtre s’exécute bien à l’intérieur de la boucle principale d’affichage, et is_main_query() écarte les requêtes secondaires (widgets, blocs de requête, boucles personnalisées dans un template).

function magazine_encart_newsletter( $contenu ) {
    if ( ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
        return $contenu;
    }
    return $contenu . '<p>Abonnez-vous à la newsletter.</p>';
}
add_filter( 'the_content', 'magazine_encart_newsletter' );

Ces trois conditions, utilisées ensemble, forment un schéma standard qui revient dans une grande partie des filtres the_content écrits pour un usage ponctuel de ce type. Aucune des trois seule ne suffit : is_singular() seul laisse passer les boucles secondaires présentes sur la page d’article elle-même (articles liés, par exemple).

Exclure explicitement le flux RSS

Même avec les trois conditions ci-dessus, un flux RSS affichant le contenu complet peut encore déclencher the_content dans un contexte considéré comme « singulier » par WordPress selon la configuration du thème et de l’extension SEO utilisée. Une vérification supplémentaire avec is_feed() ferme ce dernier cas :

if ( is_feed() || ! is_singular( 'post' ) || ! in_the_loop() || ! is_main_query() ) {
    return $contenu;
}

Positionner l’encart à un endroit précis plutôt qu’en fin de contenu

Ajouter systématiquement l’encart tout en fin de texte, avec une simple concaténation, ignore la longueur réelle de l’article. Une variante plus soignée insère l’encart après le second paragraphe, quelle que soit la longueur totale, ce qui améliore sensiblement le taux de clic sur les articles longs.

function magazine_inserer_apres_second_paragraphe( $contenu, $encart ) {
    $paragraphes = explode( '</p>', $contenu, 3 );
    if ( count( $paragraphes ) < 3 ) {
        return $contenu . $encart;
    }
    return $paragraphes[0] . '</p>' . $paragraphes[1] . '</p>' . $encart . $paragraphes[2];
}

Vérifier l’absence de duplication après déploiement

  • Contrôler la page d’accueil, si elle affiche des extraits complets plutôt que des résumés tronqués.
  • Contrôler le flux RSS principal à l’adresse /feed/.
  • Contrôler toute page utilisant un bloc de requête ou un widget affichant le contenu intégral d’articles.

Ce trio de conditions, je le colle presque par réflexe dès qu’un filtre the_content ajoute quoi que ce soit de visuel : le coût d’écrire trois vérifications supplémentaires est dérisoire comparé au temps perdu à traquer une duplication signalée par un client plusieurs semaines après la mise en ligne.

En résumé

Un filtre the_content sans garde s’exécute dans bien plus de contextes que la seule page d’article : extraits, boucles secondaires, flux RSS. La combinaison is_singular(), in_the_loop() et is_main_query(), complétée au besoin par is_feed(), borne précisément son exécution au seul affichage réel de l’article, sans jamais dupliquer l’encart ailleurs sur le site.

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