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

- Auteur : Clément Hadrot
- Publié le : 2022-11-08
- Mis à jour le : 2022-11-08
- Catégorie : Tips
- URL : https://wpmoderne.dev.wordpress-developpement.fr/tips/encart-fin-article-the-content-sans-effet-de-bord/

## L’essentiel

- 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

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.
