Un flux RSS pour votre site !
publié le 14/02/2010Implémenter la génération d'un flux RSS en PHP et XML sur votre site web.
Voici donc le premier article de la rubrique "Développement Web", depuis la mise en ligne de Deepevening. Le temps de régler quelques bugs, et déjà quelques idées me viennent. En me penchant sur le référencement et la recherche de trafic, la mise en place d'une génération d'un flux RSS (Really Simple Syndication) m'a parue séduisante. Le principe : avertir tous les abonnés à mon flux de la sortie d'un nouvel article sur Deepevening. Les plus grands moteurs de blog tels que WordPress, DotClear, Drupal, ... proposent déjà leur module RSS. Mais lorsqu'on créé un site à la main, on fait comment ?
Commençons par le début ...
Un flux RSS, c'est quoi ?
Un flux RSS est un fichier XML, diffusé via un lecteur de flux, à un internaute pouvant alors suivre l'actualité d'un site sans pour autant y être. Il existe 2 principaux formats de syndication de contenu web : RSS et Atom. RSS se décline en 3 principales versions. La plus actuelle étant à priori la RSS 2.0, nous étudierons celle-ci dans cet article.
Fichier XML de flux RSS
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<atom:link href="http://www.monsite.fr/updates.xml" rel="self" type="application/rss+xml" />
<title>Mon Site</title>
<link>http://www.monsite.fr</link>
<description>Mon site a un super flux RSS</description>
<item>
<title>Ma dernière news !</title>
<link>http://www.monsite.fr/deniere-news.html</link>
<description>Ma dernière news en direct du flux RSS</description>
<guid>http://www.monsite.fr/deniere-news.html#140</guid>
<pubDate>Sat, 02 Feb 2010 20:54:49 +0100</pubDate>
</item>
</channel>
</rss>
Ce code est à placé dans un fichier .xml, par exemple : updates.xml. Toutes ces balises sont obligatoires si on veut passer l'étape de validation W3C RSS. Ce flux RSS est potentiellement exploitable et diffusable, une fois chargé sur votre site. Le problème est qu'à chaque fois que vous publierai un nouvel article, il faudra éditer à la main le fichier updates.xml, pour y ajouter les balises correspondantes à cet article... Heureusement, PHP est là pour nous automatiser tout cela.
Génération de l'entête du fichier
On commence par créer un fichier XML et on le stocke dans une variable $xml_file. A noter que toutes les méthodes suivantes sont disponibles depuis la version 5 de PHP. Pour les utilisateurs de PHP 4 (s'il en existe encore :-), vous trouverez les méthodes équivalentes sur www.php.net.
// Création du fichier XML
$xml_file = new DOMDocument("1.0","utf-8");
J'ai utilisé un encodage "utf-8", mais vous pouvez très bien utilisé l'ISO-8859-1.
Ensuite, on définit le document XML comme Flux RSS avec le noeud racine "RSS"
// Création du noeud racine <rss>
$root = $xml_file->createElement("rss");
$root->setAttribute("version", "2.0");
$root->setAttribute("xmlns:atom", "http://www.w3.org/2005/Atom");
$root = $xml_file->appendChild($root);
La méthode createElement() créé la balise "RSS". La méthode setAttribute() lui affecte un attribut couplé à sa valeur. Enfin, la méthode appendChild() insère la balise dans le fichier XML.
Description de notre site
// Création du noeud <channel>
$channel = $xml_file->createElement("channel");
$channel = $root->appendChild($channel);
// Création du noeud <atom:link>
$atom = $xml_file->createElement("atom:link");
$atom->setAttribute("href", "http://www.monsite.fr/updates.xml");
$atom->setAttribute("rel", "self");
$atom->setAttribute("type", "application/rss+xml");
$atom = $channel->appendChild($atom);
// Création du noeud <title>
$title = $xml_file->createElement("title");
$title = $channel->appendChild($title);
$text_title = $xml_file->createTextNode("Mon Site");
$text_title = $title->appendChild($text_title);
// Création du noeud <link>
$link = $xml_file->createElement("link");
$link = $channel->appendChild($link);
$text_link = $xml_file->createTextNode("http://www.monsite.fr");
$text_link = $link->appendChild($text_link);
// Création du noeud <description>
$desc = $xml_file->createElement("description");
$desc = $channel->appendChild($desc);
$text_desc = $xml_file->createTextNode("Mon site a un super flux RSS");
$text_desc = $desc->appendChild($text_desc);
Le noeud "Channel" englobe tout le contenu du flux RSS. La balise "atom:link" est nécessaire pour la compatibilité avec le format Atom. Ensuite viennent la balise "Title", "Link" et "Description" dont le nom est assez parlant.
Ajout des articles
Il ne nous reste plus qu'à insérer nos derniers articles. Généralement, nous avons une base de données Mysql, le plus souvent, contenant tous nos articles. Nous allons récupérer les 10 derniers articles et les insérer dans notre fichier XML.
// Connexion au serveur Mysql
$connect = mysql_connect("localhost","root","xxxxxxxx")
or die ('erreur de connexion');
// Connexion à la base de données
mysql_select_db("deepevening") or die ('erreur de connexion à la base');
// Requête SQL à exécuter (10 derniers articles)
$sqlRequest = ' SELECT id,title,description,date
FROM article
ORDER BY date DESC LIMIT 0,10';
Nous exécutons la requête et, parcourons tous les résultats pour insérer les balises de chaque article.
// Exécution de la requête
$sqlResult = mysql_query($sqlRequest, $connect);
// Pour chaque article ...
while($article = mysql_fetch_assoc($sqlResult)){
// Création du noeud <item>
$item = $xml_file->createElement("item");
$item = $channel->appendChild($item);
// Création du noeud <title>
$title = $xml_file->createElement("title");
$title = $item->appendChild($title);
$titleValue = $xml_file->createTextNode($article['title']);
$titleValue = $title->appendChild($titleValue);
// Création du noeud <link>
$link = $xml_file->createElement("link");
$link = $item->appendChild($link);
$linkValue = $xml_file->createTextNode("http://www.monsite.fr/article.php?id=".$article['id']);
$linkValue = $link->appendChild($linkValue);
// Création du noeud <description>
$desc = $xml_file->createElement("description");
$desc = $item->appendChild($desc);
$descValue = $xml_file->createTextNode($article['description']);
$descValue = $desc->appendChild($descValue);
// Création du noeud <guid>
$guid = $xml_file->createElement("guid");
$guid = $item->appendChild($guid);
$guidValue = $xml_file->createTextNode("http://www.monsite.fr/article.php?id=".$article['id']);
$guidValue = $guid->appendChild($guidValue);
// Création du noeud <pubDate>
$date = $xml_file->createElement("pubDate");
$date = $item->appendChild($date);
$dateValue = $xml_file->createTextNode(date('D, d M Y H:i:s', strtotime($article['date'])).' +0100');
$dateValue = $date->appendChild($dateValue);
}
La méthode createTextNode() permet de mettre un contenu texte à l'intérieur d'une balise. Nous ne reviendrons pas sur les balises "title", "link" et "description". La balise "guid" doit contenir un identifiant unique propre à chaque article. Nous nous servons ici de l'identifiant stocké en base de données. La balise "date" doit contenir la date de rédaction de l'article. Le format RSS 2.0 nous impose de formater la date de cette manière : "Sat, 13 Feb 2010 20:54:49 +0100". Pour remédier à cela, j'ai utilisé la fonction date() de PHP :
date('D, d M Y H:i:s', strtotime($article['date'])).' +0100');
Je vous renvoie à la doc de la fonction date(), pour plus de détails, sur www.php.net.
Sauvegarde du fichier XML
Il ne nous reste plus qu'à enregistrer notre fichier XML.
// Sauvegarde du fichier XML
$res = $xml_file->save('updates.xml');
Si $res vaut true, vous devriez avoir un beau fichier XML au format RSS prêt à être exploiter. Voici ce que donne celui de Deepevening.
Faire connaitre son flux RSS
La première chose à faire est d'afficher sur le site, un lien html montrant la disponibilité du flux RSS.
<a type="application/rss+xml" href="http://www.monsite.fr/updates.xml"> Flux RSS de Mon Site</a>
On peut également insérer la balise "link" suivante dans le "head" des pages du site, pour avertir le navigateur qu'un flux RSS est présent sur le site. D'après mes tests, seul Firefox prend en compte cette information en mettant une icône dans la barre d'adresse. Le clic sur cette icône affiche le flux RSS de la même manière qu'un lien html.
<link rel="alternate" type="application/rss+xml" href="http://www.monsite.fr/updates.xml" title="www.monsite.fr" />
En conclusion
Cette génération automatique de flux RSS doit, dans l'idéale, être exécutée lors d'un ajout, d'une modification ou d'une suppression d'un article, de manière à avoir un flux RSS toujours à jour. Petit bémol, je n'ai pas réussi à insérer juste un article à la position voulu dans le fichier XML. Le code ci-dessus génère la totalité du fichier XML à chaque fois et pourrait être optimisé, en ne modifiant que l'article à mettre à jour. Avis aux amateur ;-)
N'hésitez pas à utiliser le flux RSS de Deepevening comme exemple, ou tout simplement à vous abonner pour être informé des nouveaux articles de Deepevening : Deepevening - Derniers articles
Laisser un commentaire
Vos commentaires