neoDSI   CTO & Développeur back-end symfony
+33 6 62 75 87 89 Contact

Modifier les flux RSS de wordpress

Évidement il ne faut absolument pas toucher au core de wordpress et ajouter des filtres dans le fichier functions.php du thème.

1. Modifier le flux RSS

On ajoute simplement un filtre sur le contenu et la fonction correspondante :

add_filter('the_excerpt_rss', 'new_rss_content');

function new_rss_content() {
	if ( get_post_type() == 'portfolio' ) {
		$aPC = get_post_custom();
		$sContent = $aPC['portfolioAbout'][0];
	} else {
		$sContent= get_the_excerpt();
	}
	return $sContent;
}

Je teste en première ligne si je suis dans le flux rss de mon custom post type portfolio. Si c’est le cas, alors je récupère toute les metaboxes de mon custom post type, et je mets dans $sContent le contenu de ma metaboxes portfolioAbout. Dans l’autre cas, je me contente d’affecter à ma variable l’extrait.  Et enfin je retourne ma variable qui contient soit l’extrait soit le contenu de ma metaboxes.

Pour faire une modification du titre, on utilise de la même façon le filtre :

add_filter('the_title_rss', 'new_rss_title');

2. Ajout d’un custum post type au flux RSS princpipal

Si vous avez des custom post type, alors ceux ci ne seront pas intégrés au flux rss principal. Dans mon cas, j’ai donc http://www.neodsi.fr/blog/feed qui est le flux rss des articles du blog, et http://www.neodsi.fr/portfolio/feed qui est le flux rss de mon custom post type portfolio.

Quand j’utilise http://www.neodsi.fr/feed j’ai par défaut seulement les articles.

On utilise cette fois-ci le filtre request que l’on modifie dans le cas des flux rss. On ajoute donc (toujours dans functions.php).

add_filter( 'request', 'add_rss_custom_post_type' );

function add_rss_custom_post_type( $args ) {
    if ( isset( $args['feed'] ) 
		&& !isset( $args['pagename'] ) 
		&& !isset( $args['post_type'] ) )
        $args['post_type'] = array('post', 'portfolio');
    return $args;
}

La fonction add_rss_custom_post_type récupère en argument un tableau qui nous donne des informations sur le type de requête demandé (ici feed) et des informations de contexte.

Dans le cas du flux principal: 
array(1) { ["feed"]=> string(4) "feed" }
Dans le cas des articles: 
array(2) { ["feed"]=> string(4) "feed" ["pagename"]=> string(4) "blog" }
Et dans le cas du portfolio on obtient: 
array(2) { ["feed"]=> string(4) "feed" ["post_type"]=> string(9) "portfolio" }

Il y a toujours l’index feed car nous sommes dans des requêtes de flux rss, mais aussi pagename qui nous indique de quelle page on veut le flux et post_type dans le cas des flux de pages de custom post type (car donc mon cas, la page qui affiche tout les portfolio est une page d’archive du custom post type portfolio).

Dans la fonction qui modifie le flux rss principal on regarde si on est dans une requête sur un flux rss et si les index pagename et post_type n’existent pas (car si ils existent on serait alors dans un flux secondaire). Si c’est le cas alors nous sommes dans notre flux principal et on ajoute alors l’index post_type avec post et portfolio pour qu’il affiche ces deux contenus dans le flux principal.