Le code XML des flux RSS WordPress & the_category_rss

Publié le 30 novembre 2010 Le Référencement de WordPress

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 » :

...

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\n";
		elseif ( 'atom' == $type )
			$thelist .= sprintf( '', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
		else
			$thelist .= "\t\t\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\n";
		elseif ( 'atom' == $type )
			$thelist .= sprintf( '', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
		else
			$thelist .= "\t\t\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\n";
		elseif ( 'atom' == $type )
			$thelist .= sprintf( '', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
		else
			$thelist .= "\t\t\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\n";
		elseif ( 'atom' == $type )
			$thelist .= sprintf( '', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
		else
			$thelist .= "\t\t\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\n";
		elseif ( 'atom' == $type )
			$thelist .= sprintf( '', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
		else
			$thelist .= "\t\t\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\n";
		elseif ( 'atom' == $type )
			$thelist .= sprintf( '', esc_attr( apply_filters( 'get_bloginfo_rss', get_bloginfo( 'url' ) ) ), esc_attr( $cat_name ) );
		else
			$thelist .= "\t\t\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 ;)

Daniel Roch

Fondateur, conférencier, auteur, consultant et expert SEO WordPress

26 Commentaires

Olivier Duffez Le 30 novembre 2010 à 10h58
Merci Daniel, ça marche bien en effet.
Djib's Le 30 novembre 2010 à 11h42
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"
Daniel Roch Le 30 novembre 2010 à 11h54
@Olivier: de rien ;)

@Djib's : merci d'avoir signalé les erreurs. C'est corrigé.
kalvin Le 30 novembre 2010 à 12h01
merci, excellent
Aurélien Le 30 novembre 2010 à 12h18
Merci pour cet article.
Peux-tu développer l'intérêt SEO de supprimer les balises des fichiers XML ?
Daniel Roch Le 30 novembre 2010 à 14h46
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.
Benoit Ponthieu Le 01 décembre 2010 à 0h47
Excellent article que je vais tacher de mettre en application prochainement.

Merci ;)
Patkban Le 01 décembre 2010 à 7h34
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
Daniel Roch Le 01 décembre 2010 à 10h11
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.
DJib's Le 01 décembre 2010 à 15h46
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
Daniel Roch Le 02 décembre 2010 à 12h05
Normalement oui. Je fais de tests et je te redis ça.
DJib's Le 02 décembre 2010 à 17h42
Merci de ton aide :-)
Daniel Roch Le 02 décembre 2010 à 21h10
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. ;)
Djib's Le 02 décembre 2010 à 22h08
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.
Daniel Roch Le 03 décembre 2010 à 9h52
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.
DJib's Le 03 décembre 2010 à 19h36
j'ai toujours l'erreur :

[pastacode lang="bash" provider="manual"]Parse error: syntax error, unexpected T_RETURN in /homepages/1/d312302640/htdocs/wp-content/themes/twentyten/functions.php on line 506[/pastacode]
la ligne 506 correspond à :
[pastacode lang="bash" provider="manual"]return $thelist;}[/pastacode]

tests effectués sur le theme par défaut en désactivant ou pas les plugins
Daniel Roch Le 04 décembre 2010 à 11h34
Je pense avoir corrigé (une lettre en trop dans ces deux codes)
Djib's Le 04 décembre 2010 à 21h56
Merci ça fonctionne maintenant
DJib's Le 05 décembre 2010 à 19h09
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.
Daniel Roch Le 06 décembre 2010 à 9h45
Fait un nouvel essai avec le code corrigé. Si ca ne marche toujours pas, donne-moi le lien vers ton flux rss.
DJib's Le 06 décembre 2010 à 16h52
C'est bon tout fonctionne correctement maintenant.

Merci pour ta patience ;-)
Chamomor Le 10 janvier 2011 à 7h12
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 ?
Daniel Roch Le 10 janvier 2011 à 13h38
Je n'ai jamais fait l'essai. Théoriquement, je ne pense pas que le code fonctionne...
Jean-Pierre Cointre Le 05 mars 2011 à 15h33
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 ?
Daniel Roch Le 07 mars 2011 à 13h43
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.
Jean-Pierre Cointre Le 08 mars 2011 à 7h52
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

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *