Comme la plupart des CMS, WordPress propose de gérer un flux RSS contenant soit les articles complets, soit un court extrait. Si la première solution est bien plus agréable pour les lecteurs humains, elle facilite malheureusement le pillage de contenus par des sites indélicats…
De nombreux sites construisent en effet « leur » contenu en aspirant les flux RSS de diverses sources, parfois même sans citer l’origine des articles. Grâce aux filtres de WordPress, il est toutefois possible de jouer un peu avec ces aspirateurs, plutôt que de simplement les bloquer.
Comme lors de la génération d’une page normale, le flux RSS est en effet généré par le moteur de WordPress en appliquant différents filtres sur le contenu, et il est ainsi possible via un plug-in de définir des nouveaux filtres qui vont modifier le contenu du flux RSS lorsqu’un aspirateur est détecté.
Avant de se plonger dans WordPress, commencez par trouver un moyen d’identifier ces aspirateurs. La plupart du temps, ceux-ci utilisent une adresse IP fixe, ce qui permet de les repérer facilement dans les logs du serveur. La valeur de la chaîne « user-agent » passée dans les requêtes peut également aider à l’identification.
Une fois l’aspirateur correctement identifié, il ne reste plus qu’à créer un plug-in WordPress qui va ajouter un filtre sur the_content_feed. Voici par exemple ce qui peut être fait avec la méthode « douce », en remplaçant simplement le contenu complet par un extrait pour un aspirateur identifié par son adresse IP :
1 2 3 4 5 6 |
function contenuRSSAspirateur($content) { return get_the_excerpt(); } if ($_SERVER["REMOTE_ADDR"] == "123.45.67.89") { add_filter("the_content_feed", "contenuRSSAspirateur"); } |
À partir de là, tout est permis, y compris rendre la monnaie de sa pièce au site indélicat… Les contenus aspirés sont en effet rarement vérifiés manuellement, et certains aspirateur ne filtrent même pas les éventuels bout de JavaScript qui pourraient avoir été inclus dans le RSS… Ainsi, il devient possible par exemple d’ajouter un pop-up d’alerte lorsque quelqu’un lit un de vos contenu sur un site aspirateur :
1 2 3 4 5 6 |
function contenuRSSAspirateur($content) { return get_the_excerpt()."<script>alert('Cet article a été recopié depuis Infobidouille (https://www.infobidouille.com).')</script>"; } if ($_SERVER["REMOTE_ADDR"] == "123.45.67.89") { add_filter("the_content_feed", "contenuRSSAspirateur"); } |
Vous pouvez également utiliser les filtres pour ajouter systématiquement un lien vers le billet original, afin de forcer tous les aspirateurs non identifiés à « citer » la source (inspiré du plugin Yoast SEO) :
1 2 3 4 5 6 |
function addSrcLink($content) { $srcLink = '<p>L\'article <a href="'.esc_url(get_permalink()).'">'.get_the_title().'</a> a été publié initialement sur <a href="'.esc_url(get_bloginfo('url')).'">'.get_bloginfo('name').'</a></p>'; return $srcLink.$content.$srcLink; } add_filter("the_content_feed", "addSrcLink"); add_filter("the_excerpt_rss", "addSrcLink"); |
(le filtre the_excerpt_rss s’applique au champ description des éléments du flux RSS)
Et si vos fidèles lecteurs trouvent vos flux RSS trop chargés à cause de ces ajouts, rien de plus simple que de leur proposer une version épurée du flux, en ajoutant un nouveau filtre réduisant les flux à leur strict minimum (le contenu des articles, et rien d’autre) lorsqu’ils sont appelés avec un certain paramètre dans l’URL :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
if (isset($_GET["contentOnly"])) { function cleanRSSContent($content) { $content = apply_filters( 'the_content', get_the_content() ); $content = str_replace(']]>', ']]>', $content); return $content; } add_filter("the_content_feed", "cleanRSSContent", 1000); function cleanRSSExcerpt($content) { $content = apply_filters( 'the_excerpt', get_the_excerpt() ); $content = str_replace(']]>', ']]>', $content); return $content; } add_filter("the_excerpt_rss", "cleanRSSExcerpt", 1000); } |
Le principe est tout simple, on ajoute un filtre avec une valeur de priorité élevée (le dernier paramètre de add_filter) qui, au lieu de s’appliquer au contenu déjà traité par les filtres précédents, va aller rechercher le contenu brut et lui appliquer les traitements minimaux (uniquement ceux appliqués sur l’affichage normal d’une page), annulant ainsi tous les filtres précédents (ça serait encore plus propre en désactivant les filtres, mais c’est plus complexe à mettre en place).
Notez par contre que si vous utilisez un plug-in de cache, il faudra bien faire attention à ce que ces flux retraités ne soient pas mis en cache, il serait dommage qu’un lecteur légitime obtienne le flux retraité pour un aspirateur…