C'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 ;)
26 Commentaires
Merci Daniel, ça marche bien en effet.
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"
@Olivier: de rien ;)
@Djib's : merci d'avoir signalé les erreurs. C'est corrigé.
merci, excellent
Merci pour cet article.
Peux-tu développer l'intérêt SEO de supprimer les balises des fichiers XML ?
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.
Excellent article que je vais tacher de mettre en application prochainement.
Merci ;)
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
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.
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
Normalement oui. Je fais de tests et je te redis ça.
Merci de ton aide :-)
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. ;)
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.
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.
j'ai toujours l'erreur :
la ligne 506 correspond à :
tests effectués sur le theme par défaut en désactivant ou pas les plugins
Je pense avoir corrigé (une lettre en trop dans ces deux codes)
Merci ça fonctionne maintenant
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.
Fait un nouvel essai avec le code corrigé. Si ca ne marche toujours pas, donne-moi le lien vers ton flux rss.
C'est bon tout fonctionne correctement maintenant.
Merci pour ta patience ;-)
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 ?
Je n'ai jamais fait l'essai. Théoriquement, je ne pense pas que le code fonctionne...
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 ?
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.
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