webleads-tracker

WordPress & Référencement naturel
Mes servicesWordPress - Référencement
Hébergement WordPress
Vous êtes ici : SeoMix » WordPress » Référencement WordPress » Le code XML des flux RSS WordPress & the_category_rss

Le code XML des flux RSS WordPress & the_category_rss

Flux RSS de WordPressC'est suite à une demande d'Olivier de WebRankInfo que je me suis penché sur le cas des flux de WP.

Ceux qui suivent SeoMix auront remarqué dans un précédent article mon explication sur la manière de modifier le contenu des flux RSS de WordPress.

Sauf que ces flux possèdent aussi des balises métas invisibles pour les visiteurs, mais qui apparaissent pour d'éventuels moteurs de recherche et autres logiciels d'indexation. La question était alors de savoir comment les modifier.

Les balises XMl des flux WordPress

Olivier souhaitait supprimer les balises XML <Category> de tous les flux RSS de WordPress, sans pour autant modifier les fichiers du CMS situé dans le répertoire wp-includes. Ces balises apparaissent comme ceci dans le code source des "feed" :

< category >< ! [CDATA[Ecommerce]] >
< category >< ! [CDATA[Fails]] >
< category >< ! [CDATA[Webmarketing]] >
< category >< ! [CDATA[Wordpress]] >
...

Ces flux RSS possèdent donc un défaut majeur : ils mélangent catégories et mots clés, mais oublient les taxonomy. Pire encore, ils vont récupérer TOUTES les catégories et mots clés d'un article, ce qui les rend inutiles pour les moteurs de recherche ou pour les agrégateurs de contenus.

En cherchant un peu, j'ai compris que WordPress utilise le fichier feed-rss2.php pour générer son flux RSS par défaut. Ce fichier est un template, c'est à dire un modèle dans lequel WP va injecter ses contenus. Il fait alors appel à deux fonctions pour les balises XML <category> : the_category_rss(), qui fait elle-même appel à get_the_category_rss().

On peut donc influer sur les contenus XML des flux RSS en utilisant un filtre sur la fonction the_category_rss(). Après quelques tests et une ou deux prises de tête, voici les hacks que j'ai réussi à créer :

Supprimer les balises XML des flux RSS

Pour les supprimer purement et simplement, il suffit de copier/coller ce code dans le fichier functions.php de votre thème WordPress :

// Supprimer les balises XML Category des flux RSS - Code par www.seomix.fr
add_filter('the_category_rss', 'xmlrssno');
function xmlrssno($type = null) {$the_list = '';}

Et voilà, le tour est joué : les flux RSS de WordPress ne contiennent plus aucune balises XML Category.

Modifier les balises XML des flux RSS

Il existe d'autres possibilités qui utilisent le même hack. On peut demander à ce que le flux RSS de WordPress utilise uniquement les catégories, les mots ou les taxonomy. On peut également lui demander de ne prendre qu'un mot clé, ou qu'une catégorie pour remplir la balise XML <category>.

Uniquement les mots clés :

// Ne garder que les balises XML Category des mots clés pour les flux RSS - Code par www.seomix.fr
add_filter('the_category_rss', 'xmlrsstag');
function xmlrsstag($type = null) {
  if ( empty($type) ) $type = get_default_feed();
    $tags = get_the_tags();
  $thelist = '';
    $cat_names = array();
    $filter = 'rss';
    if ( 'atom' == $type ) $filter = 'raw';
    if ( !empty($tags) ) foreach ( (array) $tags as $tag ) {
    $cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter);}
    $cat_names = array_unique($cat_names);
    foreach ( $cat_names as $cat_name ) {
        if ( 'rdf' == $type )
            $thelist .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
        elseif ( 'atom' == $type )
            $thelist .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
        else
            $thelist .= "\t\t<category><![CDATA[" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . "]]></category>\n";}
  return $thelist;}

Un seul mot clé :

// Ne garder qu'une balises XML Category de mots clés pour les flux RSS - Code par www.seomix.fr
add_filter('the_category_rss', 'xmlrsstagun');
function xmlrsstagun($type = null) {
  if ( empty($type) ) $type = get_default_feed();
    $tags = get_the_tags();
  $thelist = '';
    $cat_names = array();
    $filter = 'rss';
    if ( 'atom' == $type ) $filter = 'raw';
    if ( !empty($tags) ) foreach ( (array) $tags as $tag ) {
    $cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter);}
    $cat_names = array($cat_names[0]);$cat_names = array_unique($cat_names);
    foreach ( $cat_names as $cat_name ) {
        if ( 'rdf' == $type )
            $thelist .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
        elseif ( 'atom' == $type )
            $thelist .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
        else
            $thelist .= "\t\t<category><![CDATA[" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . "]]></category>\n";}
  return $thelist;}

Plusieurs mots clé :

Pensez à remplacer la valeur de $count par le nombre de mots clés que vous voulez utiliser dans le XML de votre flux RSS WordPress :

// Ne garder qu'un nombre défini de balises XML Category de mots clés pour les flux RSS - Code par www.seomix.fr
add_filter('the_category_rss', 'xmlrsstagseveral');
function xmlrsstagseveral($type = null) {
  if ( empty($type) ) $type = get_default_feed();
    $count=7;
  $tags = get_the_tags();
  $thelist = '';
    $cat_names = array();
    $filter = 'rss';
    $tags = array_slice($tags, 0, $count);
  if ( 'atom' == $type ) $filter = 'raw';
  if ( !empty($tags) ) foreach ( (array) $tags as $tag ) {
    $cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, 'post_tag', $filter);}
  $cat_names = array_unique($cat_names);
    foreach ( $cat_names as $cat_name ) {
        if ( 'rdf' == $type )
            $thelist .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
        elseif ( 'atom' == $type )
            $thelist .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
        else
            $thelist .= "\t\t<category><![CDATA[" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . "]]></category>\n";}
  return $thelist;}

Uniquement les catégories :

// Ne garder que les balises XML Category des catégories pour les flux RSS - Code par www.seomix.fr
add_filter('the_category_rss', 'xmlrsscategory');
function xmlrsscategory($type = null) {
    if ( empty($type) )$type = get_default_feed();
    $categories = get_the_category();
    $thelist = '';
    $cat_names = array();
    $filter = 'rss';
    if ( 'atom' == $type )
        $filter = 'raw';
    if ( !empty($categories) ) foreach ( (array) $categories as $category ) {
    $cat_names[] = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter);}
    $cat_names = array_unique($cat_names);
    foreach ( $cat_names as $cat_name ) {
        if ( 'rdf' == $type )
            $thelist .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
        elseif ( 'atom' == $type )
            $thelist .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
        else
            $thelist .= "\t\t<category><![CDATA[" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . "]]></category>\n";}
  return $thelist;}

Une seule catégorie :

// Ne garder qu'une balises XML Category de catégorie pour les flux RSS - Code par www.seomix.fr
add_filter('the_category_rss', 'xmlrsscategoryun');
function xmlrsscategoryun($type = null) {
    if ( empty($type) )$type = get_default_feed();
    $categories = get_the_category();
    $thelist = '';
    $cat_names = array();
    $filter = 'rss';
    if ( 'atom' == $type )
        $filter = 'raw';
    if ( !empty($categories) ) foreach ( (array) $categories as $category ) {
    $cat_names[] = sanitize_term_field('name', $category->name, $category->term_id, 'category', $filter);}
  $cat_names = array($cat_names[0]);$cat_names = array_unique($cat_names);
    foreach ( $cat_names as $cat_name ) {
        if ( 'rdf' == $type )
            $thelist .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
        elseif ( 'atom' == $type )
            $thelist .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
        else
            $thelist .= "\t\t<category><![CDATA[" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . "]]></category>\n";}
  return $thelist;}

Une taxonomie :

Pour rappel, une taxonomie sur WordPress correspond à une nouvelle hiérarchisation de vos contenus. Par défaut, vos articles sont classés par catégorie et mots clés. Mais vous pouvez très bien créer un nouveau type de catégorisation, que l'on appelle les taxonomies.

On peut donc utiliser ces informations pour la balise XML de vos flux RSS WordPress. Remplacez dans ce code "XXXXXX" par le nom de votre taxonomy, puis copier/coller le tout dans votre fichier functions.php.

// Utiliser une taxonomy pour la balise XML Category des flux RSS - Code par www.seomix.fr
add_filter('the_category_rss', 'xmlrsstaxo');
function xmlrsstaxo($type = null) {
  if ( empty($type) ) $type = get_default_feed();
    global $post;
  $mytaxonomy = get_the_terms($post->ID, 'XXXXXX');
  $thelist = '';
    $cat_names = array();
    $filter = 'rss';
    if ( 'atom' == $type ) $filter = 'raw';
    if ( !empty($mytaxonomy) ) foreach ( (array) $mytaxonomy as $tag ) {
    $cat_names[] = sanitize_term_field('name', $tag->name, $tag->term_id, $mytaxonomy, $filter);}
    $cat_names = array($cat_names[0]);$cat_names = array_unique($cat_names);
    foreach ( $cat_names as $cat_name ) {
        if ( 'rdf' == $type )
            $thelist .= "\t\t<dc:subject><![CDATA[$cat_name]]></dc:subject>\n";
        elseif ( 'atom' == $type )
            $thelist .= sprintf( '<category scheme="%1$s" term="%2$s" />', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
        else
            $thelist .= "\t\t<category><![CDATA[" . @html_entity_decode( $cat_name, ENT_COMPAT, get_option('blog_charset') ) . "]]></category>\n";}
  return $thelist;}

Et voilà. Vous n'avez maintenant plus qu'à choisir parmi les codes précédents le hack WordPress qui correspond le mieux à vos besoins. Pour ma part, je vous conseille l'utilisation du hack avec une seule catégorie, ou celui avec la taxonomy. C'est ce qui sera le plus pertinent pour votre flux RSS vis-à-vis des moteurs de recherche et agrégateurs.

Comme on dit, c'est fou ce que l'on peut faire avec WordPress 3 ;)

Les thèmes relatifs

Voici les thématiques abordées par Le code XML des flux RSS WordPress & the_category_rss:

26 commentaires
  1. Olivier Duffez
    4 messages

    Olivier Duffez - Le 30 novembre 2010, 10:58

    Merci Daniel, ça marche bien en effet.

  2. Djib's
    27 messages

    Djib's - Le 30 novembre 2010, 11:42

    Il y a une coquille dans ton code sur « uniquement les mots clés ». A la troisième ligne il ne faut pas mettre les //

    deuxième coquille dans le dernier paragraphe du texte, c’est « agrégateurs » et non pas « agréagateurs »

  3. Daniel Roch
    712 messages

    Daniel Roch - Le 30 novembre 2010, 11:54

    @Olivier: de rien ;)

    @Djib’s : merci d’avoir signalé les erreurs. C’est corrigé.

  4. kalvin
    1 message

    kalvin - Le 30 novembre 2010, 12:01

    merci, excellent

  5. Aurélien
    2 messages

    Aurélien - Le 30 novembre 2010, 12:18

    Merci pour cet article.
    Peux-tu développer l’intérêt SEO de supprimer les balises des fichiers XML ?

  6. Daniel Roch
    712 messages

    Daniel Roch - Le 30 novembre 2010, 14:46

    Honnêtement, je ne peux pas vraiment quantifier l’impact. Je pense qu’il existe, mais qu’il est infime.

    Après, c’est juste une question de logique pour tout les sites qui iraient crawler les flux RSS de WordPress (moteurs de recherche et agrégateurs) : il est en effet stupide d’avoir plusieurs catégories pour un article, surtout qu’en cumulant catégories et mots clés, on arrive parfois à plusieurs dizaines de catégories dans le flux XML généré par WordPress.

  7. Benoit Ponthieu
    2 messages

    Benoit Ponthieu - Le 01 décembre 2010, 00:47

    Excellent article que je vais tacher de mettre en application prochainement.

    Merci ;)

  8. Patkban
    2 messages

    Patkban - Le 01 décembre 2010, 07:34

    Bonjour,
    J’ai un gros problème : quand je fais un « export » de mon site (fichier XML), le fichier est incomplet et surtout quand je l’importe il crée de nouvelles catégories (ex : canal+1, canal+2, canal+3, etc.)
    Qu’est-ce que je peux faire pour que tout fonctionne correctement.
    Merci

  9. Daniel Roch
    712 messages

    Daniel Roch - Le 01 décembre 2010, 10:11

    Il s’agit des fichiers XML de base de donnée, et non pas ceux liés aux fichiers RSS. Regarde sur le site de WordPress Fr : tu y trouveras les informations dont tu as besoin.

  10. DJib's
    27 messages

    DJib's - Le 01 décembre 2010, 15:46

    Je voulais savoir s’il était possible de modifier le code qui permete d’afficher un seul mot clé, pour qu’il affiche le nombre de mot clés voulus. J’utilise aussi feedburner pour twitter, et les mots clé sont ajoutés comme hash tags, mais il m’en faudrait 2-3, un seul ce n’est pas assez.

    Merci

  11. Daniel Roch
    712 messages

    Daniel Roch - Le 02 décembre 2010, 12:05

    Normalement oui. Je fais de tests et je te redis ça.

  12. DJib's
    27 messages

    DJib's - Le 02 décembre 2010, 17:42

    Merci de ton aide :-)

  13. Daniel Roch
    712 messages

    Daniel Roch - Le 02 décembre 2010, 21:10

    C’est bon. J’ai ajouté le code dans l’article pour choisir un nombre déterminé de mots clés pour les balises XMLs. ;)

  14. Djib's
    27 messages

    Djib's - Le 02 décembre 2010, 22:08

    Merci, mais lorsque je mets le code, je mon site affiche une page blanche, dès que je supprime le code, tout redevient normal.

    Désolé d’être lourd, mais le code pour pour un seul mot clé ne marche pas aussi chez moi. Actuellement le seul qui marche pour les mots clés, c’est celui qui affiche tous les mots clés.

  15. Daniel Roch
    712 messages

    Daniel Roch - Le 03 décembre 2010, 09:52

    Peux-tu activer le thème par défaut de WordPress, et placer le script dans celui-ci (pour voir si le bug vient de mon code ou d’une incompatibilité avec ton thème).

    Fais aussi l’essai en désactivant tous tes plugins.

  16. DJib's
    27 messages

    DJib's - Le 03 décembre 2010, 19:36

    j’ai toujours l’erreur :

    Parse error: syntax error, unexpected T_RETURN in /homepages/1/d312302640/htdocs/wp-content/themes/twentyten/functions.php on line 506

    la ligne 506 correspond à :

    return $thelist;}

    tests effectués sur le theme par défaut en désactivant ou pas les plugins

  17. Daniel Roch
    712 messages

    Daniel Roch - Le 04 décembre 2010, 11:34

    Je pense avoir corrigé (une lettre en trop dans ces deux codes)

  18. Djib's
    27 messages

    Djib's - Le 04 décembre 2010, 21:56

    Merci ça fonctionne maintenant

  19. DJib's
    27 messages

    DJib's - Le 05 décembre 2010, 19:09

    C’est encore moi !

    Il y a encore un soucis avec le code qui permet d’afficher le nombre de mots clés désirés.

    Peut importe le nombre de mots que je configure, il n’y a qu’un mot qui apparait.

  20. Daniel Roch
    712 messages

    Daniel Roch - Le 06 décembre 2010, 09:45

    Fait un nouvel essai avec le code corrigé. Si ca ne marche toujours pas, donne-moi le lien vers ton flux rss.

  21. DJib's
    27 messages

    DJib's - Le 06 décembre 2010, 16:52

    C’est bon tout fonctionne correctement maintenant.

    Merci pour ta patience ;-)

  22. Chamomor
    3 messages

    Chamomor - Le 10 janvier 2011, 07:12

    Bonjour Daniel,
    Bravo pour ce hack bien intéressant.
    Question: que faire des custom post type ?
    Sont-elles intégrées au flux dans ton code ?

  23. Daniel Roch
    712 messages

    Daniel Roch - Le 10 janvier 2011, 13:38

    Je n’ai jamais fait l’essai. Théoriquement, je ne pense pas que le code fonctionne…

  24. Jean-Pierre Cointre
    2 messages

    Jean-Pierre Cointre - Le 05 mars 2011, 15:33

    bonjour,
    Merci pour cet article très intéressant.
    Dans notre écosystème de blogueurs, je gère la liste des catégories et laisse libre les mots clefs (tag).
    Je cherche à récupérer dans un autre environnement en utilisant les flux RSS les articles avec uniquement les catégories dans le champs Catégory et pas les tags.
    Votre code fonctionne correctement pour les sites (par exemple rse.lemonde-apres.com/jpcointre/feed) sauf pour le site principal de notre environnement rse.lemonde-apres.com.
    Avez-vous une adaptation pour cet environnement WordPress 3.0.4. avec theme Mandigo ?

  25. Daniel Roch
    712 messages

    Daniel Roch - Le 07 mars 2011, 13:43

    Mon code ne fonctionne que pour le XML contenu dans les flux rss de WordPress (sous la forme « CDATA »). Dans les deux flux de ton commentaire), mes hacks en sont pas pris en compte puisqu’ils affichent plusieurs catégories CDATA à chaque fois.

  26. Jean-Pierre Cointre
    2 messages

    Jean-Pierre Cointre - Le 08 mars 2011, 07:52

    Merci Daniel,
    Nous ne nous somme pas bien compris.
    1) C’est bien un environnement WordPress (3.0.4)
    2) Ton code fonctionne bien pour tous les blogs individuel de l’environnement.
    3) Seul le blog principal me pose problème. J’ai contourné la difficulté en utilisant un blog fille comme nouvelle source.
    Merci

» Commentez cet article !
(Merci de donner un vrai prénom)
(Ne sera jamais publié)
(Modèration subjective)
Html accepté <a> <i> <b> [codesyntax]CODE[/codesyntax]
» Prévisualisez votre message

3 sites en parlent :
Par www.blogmemes.be le 30/11/2010» Le code XML des flux RSS WordPress & the_category_rssRéférencement de Wordpress avec les flux RSS...- Vous aimez cet article ? Votez pour lui sur Blogmemes.be !Comment améliorer le rendu XML des flux RSS WordPress pour le référencement ? Utilisez ces hacks de SeoMix avec the_category_rss & get_the_category_rss....
Par designfloat.com le 30/11/2010» Le code XML des flux RSS WordPress & the_category_rssFlux RSS de Wordpress et the_category_rss...Comment améliorer le rendu XML des flux RSS WordPress pour le référencement ? Utilisez ces hacks de SeoMix avec the_category_rss & get_the_category_rss....
Par www.fuzz.fr le 30/11/2010» Le code XML des flux RSS WordPress & the_category_rssFlux RSS de Wordpress et the_category_rss...Comment améliorer le rendu XML des flux RSS WordPress pour le référencement ? Utilisez ces hacks de SeoMix avec the_category_rss & get_the_category_rss....

© 2010-2012 SeoMix : WordPress & Référencement
Propulsé par WordPress et Daniel Roch. Logo créé par Willy-Bahuaud

Indispensable
WordPress
A propos de SeoMix
Mes servicesWordPress - Référencement
Suivez-nous !
  • 8225 abonnés
  • 195 articles
  • 4525 messages
Vous devriez lire
Seo et emarketing
Les amis
fb3d1749817ddab926b7dde0b93d82a5QQQQQQQQQQQQQQQQQQQQQQ