Publier et générer une syndication RSS automatique

Sur le modèle de mon script de génération de sitemap, la création d'une syndication RSS au format XML est très simple. La définition du protocole est résumée dans Wikipedia.
On peut scinder les deux scripts et conjuguer l'écriture des deux fichiers : d'où les variables $rss, $fluxrss, $ladateRSS, la conservation de la structure de $tableau ainsi que $page=>$google dans la boucle foreach.

Inclusion des fichiers utiles, fonction et définition des variables

<?
// mode muet par défaut
$afficheresult = false;
// si la fonction testée n'existe pas, c'est que le script est appelé directement
// donc inclusion des fichiers de config et affichage du résultat
if(!function_exists('queryDB_open')) {
	include('configuration.php');
	include('fonctions.php');
	// affichage du résultat
	$afficheresult = true;
}
// ouverture de la connexion (fonction perso) si absente
if(!isset($db)) $db = queryDB_open();
// URL absolue de la racine du site (NB. slash en fin de ligne)
$http = "http://www.pasbanal.com/";
// email du webmaster (vide pour option)
$emailwebmaster = "";
// envoi d'un email au webmestre en cas d'erreur (et annulation de la màj)
$envoimail = "";

// nom du fichier
$fluxrss = "fluxrss.xml";
// entrées RSS
$rss = "";
// en-tête du fichier XML
$titre_rss = "Mon site à moi";
$description_rss = "Blah blah blah";
$language_rss = "fr";
// formatage des textes
function formater_RSS($text) {
	$text = strip_tags($text);
	$text = htmlspecialchars($text);
	Return stripslashes($text);
}

Écriture des pages statiques

// extraction de la dernière mise à jour dans 'matable'
// NB. MAX n'est pas pertinent pour un champ MySQL de type DATE
$sql = "SELECT MAX(ladate) FROM matable";
$res = @mysql_query($sql,$db);
$row = @mysql_fetch_row($res);
// définition des pages statiques (cf. $tableau sitemap)
// page=>(priority,lastmod,changefreq,titre_RSS,description_RSS)
// priority : de 0,0 à 1,0 (cf. sitemap)
// lastmod : date sous forme de timestamp ; 0 pour date fichier ; -1 pour ignorer
// changefreq : always, hourly, daily, weekly, monthly, yearly, never (cf. sitemap)
// titre_RSS : titre de la page ; optionnel ; vide = page non publiée
// description_RSS : résumé de la page ; optionnel
$tableau = array(
	'index.php'=>array('',$row[0],'','Accueil','Une description de la page'),
	'mapage.php'=>array('',0,'','Le titre de la page',''),
);
// nombre total des entrées écrites
$c = 0;
foreach($tableau as $page=>$google) {
	if(!strlen($google[3])) continue; // le titre est vide
	$ladateRSS = '';
	if($google[1]>0) {
		$ladateRSS = @date("D, d M Y H:i:s +0100", $google[1]);
	} elseif($google[1]!=-1 && $tmp = @stat($page)) {
		$ladateRSS = @date("D, d M Y H:i:s +0100", $tmp[9]);
	}
	$url = $http.$page;
	$rss .= "<item>\n";
	$rss .= "	<title>".formater_RSS($google[3])."</title>\n";
	$rss .= "	<link>$url</link>\n";
	if(strlen($ladateRSS))
		$rss .= "	<pubdate>$ladateRSS</pubdate>\n";
	if(strlen($google[4]))
		$rss .= "	<description>".formater_RSS($google[4])."</description>\n";
	$rss .= "</item>\n";	
	$c++;
}
// $c vaut 0 : le tableau n'a pas été lu correctement
// indication de l'erreur et annulation d'écriture
if(!$c) $envoimail.="tableau, ";

Exemple d'écriture de pages dynamiques

// ex. http://monsite.com/lapage.php?article=2
$sql = "SELECT id,ladate,titre,description FROM matable";
$res = @mysql_query($sql,$db);
$start=0;
while($row = @mysql_fetch_assoc($res)) {
	$url = $http."lapage.php?article=$row[id]";
	$rss .= "<item>\n";
	$rss .= "	<title>".formater_RSS($row['titre'])."</title>\n";
	$rss .= "	<link>$url</link>\n";
	$rss .= "	<pubdate>".@date("D, d M Y H:i:s +0100", $row['ladate'])."</pubdate>\n";
	if(!empty($row['description'])) 
		$rss .= "	<description>".formater_RSS($row['description'])."</description>\n";
	$rss .= "</item>\n";
	$c++;
	$start++;
}
if(!$start) $envoimail.="lapage.php, ";

Ecriture du fichier sitemap.xml

// écriture du fichier sauf erreur
if(!strlen($envoimail)) {
	$rss =	"<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n".
			"<rss version=\"2.0\">\n".
			"<channel>\n".
			"<title>$titre_rss</title>\n".
			"<link>$http</link>\n".
			"<description>$description_rss</description>\n".
			"<language>$language_rss</language>\n".
			"<pubdate>".date("D, d M Y H:i:s +0100")."</pubdate>\n".
			$rss.
			"</channel>\n".
			"</rss>\n";
	if(!$fichier = @fopen($fluxrss, 'w')) $envoimail.="fopen rss, ";
	if(!strlen($envoimail) && !@fwrite($fichier,$rss)) $envoimail.="fwrite rss, ";
	if(!strlen($envoimail) && !@fclose($fichier)) $envoimail.="fclose rss, ";
}

Affichage ou email

// affichage du résultat
if($afficheresult) {
	echo "<p>Résultat pour $c pages : <a href='".$http.$fluxrss."' target='_blank'>$fluxrss</a></p>\n";
	if(strlen($envoimail))
		echo "<p><b>Erreurs :</b>$envoimail</p>\n";
	echo "<p><b>RSS:</b><br>". str_replace("\n","\n<br>",htmlentities($rss)) ."</p>";
// ou envoi du mail si erreur
} elseif(strlen($envoimail) && strlen($emailwebmaster))
	@mail($emailwebmaster,"Erreur fil RSS $http","Erreur(s) : $envoimail\n\n$http$fluxrss\n\n$rss","From: $emailwebmaster");
?>

Publication

Reste à signaler aux navigateurs et lecteurs la syndication, en insérant le lien vers le fichier ainsi créé dans l'en-tête (HTML) du site.

<html>
<head>
[...]
<link rel="alternate" type="application/rss+xml" title="Mon fil RSS" href="http://www.pasbanal.com/fluxrss.xml">
</head>
[...]

Si tout se passe bien, le logo apparaît sur votre brouteur favori (dont IE7). Vous pouvez ajouter lien et logo ad hoc pour signaler la syndication. La gestion sous Thunderbird (aussi pratique que le protocole IMAP) est expliquée dans 01Net.

http://dev.ppan.net [Haut de page] [Document mis à jour le 04.07.2007]