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.
<? // 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); }
// 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, ";
// 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, ";
// é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 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"); ?>
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