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

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_contentajoute 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.