Qualche tempo fa pubblicai un articolo che spiegava come realizzare una classe per creare feed rss in PHP (Generare i Feed RSS con PHP). A seguito di una richiesta specifica da parte di un lettore vi mostro come adattare lo script per far si che sia sempre aggiornato quando vengono caricati nuovi articoli e quando ne vengono cancellati altri.
La prima classe è quella che vi avevo già presentato, la ripropongo per chiarezza:
<?php class MakeRSS { var $Articles = array(); // Channel info var $title = ''; var $link = ''; var $description = ''; var $data = ''; var $cont = ''; function MakeRSS($title, $link, $description, $optional = '') { $this->title = $title; $this->link = $link; $this->description = $description; } function AddImage($title, $url, $link, $description = '') { $this->image['title'] = $title; $this->image['url'] = $url; $this->image['link'] = $link; $this->image['description'] = $description; if( $tmp = @getimagesize($url) ){ $this->image['w'] = ($tmp[0] > 144) ? 144 : $tmp[0]; $this->image['h'] = ($tmp[1] > 400) ? 400 : $tmp[1]; } } function AddArticle($title, $link, $description, $author, $categoria,$data) { // inserisce un nuovo articolo global $cont; $data = $cont .= "<item>n" . "<guid>".$link."</guid>n" . "<title>".$title."</title>n" . "<description>".$description."</description>n" . "<link>".$link."</link>n" . "<author>".$author."</author>n" . "<category>".$categoria."</category>n" . "<pubDate>".$data."</pubDate>n" . "</item>n"; } function Output($save = false, $path = '') { global $cont; $out = '<?xml version="1.0" encoding="utf-8"?>' . "n" . '<?xml-stylesheet type="text/css" href="rss.css" ?>' . "n" . '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">' . "n" . '<channel>' . "n" . '<atom:link href="http://ketek.altervista.org/rss.xml" rel="self" type="application/rss+xml" />'. "n"; $out .= "<title>$this->title</title>n" . "<link>$this->link</link>n" . "<description>$this->description</description>n"; $out .= $cont; // aggiungo tutti gli item $out .= "</channel>n</rss>"; // True output if( !$save or !$path ){ header("Content-type: application/xml"); echo $out; return true; } else { $fh = fopen($path, 'w'); if($fh) { fwrite($fh, $out); fclose($fh); return true; } return false; } } } ?>
Adesso vediamo come integrarla in sito che ha bisogno di mantenere i feed sempre aggiornati.
Prendiamo un sito di notizie, ogni volta che viene aggiunto un articolo oppure ogni volta che uno viene rimosso il nostro script deve sempre essere aggiornato.
Come lo sviluppiamo?
Sicuramente le soluzioni sono diverse, io l’ho impostato così: quando si aggiunge o si rimuove un articolo viene richiamata la funzione aggiornaRSS(), che definiamo in un file qualsiasi (da includere), oppure nella classe di prima.
AggiornaRSS ha il compito di creare il nuovo RSS, che si sostituirà a quello vecchio, e che conterrà tutti gli articoli presenti nel database: in questo modo il feed sarà aggiornato a qualsiasi tipo di modifica, che si tratti di aggiunta, rimozione o modifica.
include('configurazione.php'); // tutti i dati per connettersi al database include('makeRSS.php'); date_default_timezone_set('Europe/Rome'); function aggiornaRSS() { $db = connetti_db($host, $username, $password, $db_name); $r = new MakeRSS('Feed RSS – NOME SITO', LINK SITO, DESCRIZIONE); $r->AddImage('NOME SITO - LOGO','URL LOGO', 'LINK LOGO', 'DESCRIZIONE'); $query = ' SELECT * FROM articolo '; $result = invia_query($db, $query); if ($result != '') { while($row = mysql_fetch_array($result)) { // i campi settati dipendono dalla tabella $titolo = $row['titolo']; $link = $row['link']; $descrizione = $row['introduzione']; $email = $row['email']." (".$row['nickname'].")"; $categoria = $row['categoria']; $data = $row['data'].' '.gmdate('T'); $r->AddArticle($titolo, $link, $descrizione , $email, $categoria, $data); } $r->Output(true, './rss.xml'); header("Location: PAGE "); } } }
Miraccomando al parametro $data: il formato deve essere del tipo RFC-822 per essere validato, per questo estraggo dal database il parametro attraverso $row['data'] e gli aggiungo gmdate('T'), che corrisponde al timezone, che abbiamo settato a inizio pagina con la funzione date_default_timezone_set('Europe/Rome').