Come creare un feed rss per il proprio sito con PHP

Nell’articolo di oggi vediamo come creare un feed rss dinamico e validato per il proprio sito web con PHP

Un feed RSS è un particolare file a cui gli utenti possono iscriversi per seguire gli aggiornamenti del vostro sito o progetto. E’ uno strumento molto usato, sopratutto perchè è meno invasivo della newsletter e permette anche, se usato correttamente, di raccogliere e generare feedback e traffico in modo automatico.

Struttura generale di un file RSS

Un file rss è, tecnicamente parlando, un xml contenente una particolare struttura e linee guida da rispettare. In questa prima sezione vediamo il markup e struttura generale di un file rss validato.

Dichiarazione tipo di documento e codifica

<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">

Nella prima riga di codice indichiamo il tipo di rss e la sua versione.

<channel>
<atom:link href="LINK_AL_TUO_RSS" rel="self" type="application/rss+xml"/>
<title>TITOLO SITO</title>
<link>LINK SITO</link>
<description>
DESCRIZIONE SITO
</description>
[...]

Channel apre di fatto il canale dell’rss in cui andremo a specificare:

  • Il link all’rss (es. http://tuosito.com/rss.xml)
  • Il titolo del sito
  • Il link al sito (es. http://tuosito.com/)
  • La descrizione del sito

Subito dentro il channel andiamo a creare il loop di tutti gli articoli che vogliamo compaiano nel feed:

<item>
<title>TITOLO ARTICOLO</title>
<link>LINK ARTICOLO</link>
<guid>GUID ARTICOLO</guid>
<pubDate>DATA ARTICOLO</pubDate>
</item>

E’ importante precisare che, come avrete notato, all’interno del feed è possibile scegliere se mostrare solo il titolo dell’articolo o anche il testo completo dello stesso. Noi abbiamo optato per questa guida di mostrare solo il titolo, in quanto personalmente non apprezzo molto i siti che mostrano feed troppo lunghi a causa della descrizione. Ad ogni modo potete facilmente aggiungere la descrizione mettendo il tag <description>Esempio descrizione</description> all’interno dell’item.

E’ importante precisare che nel pubDate non va specificato il semplice timestamp o la data come siamo comunemente abituati. Per rendere il feed validato va infatti usata la notazione RFC-822. La notazione fa apparire la data in questo modo:

<pubDate>Tue, 26 Mar 2013 17:44:08 +0000</pubDate>

Se come me usate il timestamp per i vostri progetti vi basterà convertire il timestamp in questo modo:

<?php echo gmdate(DATE_RSS, strtotime($data_articolo)); ?>

In alcuni casi, a seconda di come salvate la data provate questo codice:

<?php echo gmdate(DATE_RFC822, strtotime($data_articolo)); ?>

Per chiudere l’analisi della struttura del feed usiamo i tag di chiusura di channel e rss:

</channel>
</rss>

Codice completo struttura feed RSS di base

<xml version="1.0" encoding="utf-8">
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
<channel>
<atom:link href="LINK_AL_TUO_RSS" rel="self" type="application/rss+xml"/>
<title>TITOLO SITO</title>
<link>LINK SITO</link>
<description>
DESCRIZIONE SITO
</description>

<item>
<title>TITOLO ARTICOLO</title>
<link>LINK ARTICOLO</link>
<guid>GUID ARTICOLO</guid>
<pubDate>DATA ARTICOLO</pubDate>
</item>

<item>
<title>TITOLO ARTICOLO2</title>
<link>LINK ARTICOLO2</link>
<guid>GUID ARTICOLO2</guid>
<pubDate>DATA ARTICOLO2</pubDate>
</item>

</channel>
</rss>

Validazione di un RSS

 Una volta creato il vostro feed RSS è importante validarlo, per prevenire eventuali errori commessi. Per farlo esiste un ottimo e comodissimo tool online. Questo aspetto non è da sottovalutare in quanto un feed non validato è di fatto poco utile, certi aggregatori non accettano infatti rss con errori.

 [button link=”http://feedvalidator.org/” color=”blue” target=”blank”]FeedValidator[/button]

Creazione di un Feed RSS Dinamico con PHP

Per prima cosa andiamo a creare un file rss.php in cui andremo a generare il contenuto dinamico del nostro sito. NOTA: l’esempio di questo articolo si basa su codice PHP/PDO, in ogni caso potete facilmente usare php/mysql classico come siete abituati per i vostri loops.

<?php header('Content-Type: application/xml');
echo '<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">';
include('config.php');
include('connessione_db.php');
?>

Come vedete andiamo a generare tutto l’heading dell’rss con codifica e tag inziali e tipo di documento. Ora andiamo a impostare il “corpo” del feed in questo modo:

<channel>
<atom:link href="http://tuosito.it/rss.xml" rel="self" type="application/rss+xml" />

<title><?php echo SITE_TITLE; ?></title>
<link><?php echo SITE_URL; ?></link>
<description>Viva targetweb</description>

<?php
//Loop per stampare gli articoli, news o altro
$q = $db->prepare("SELECT * FROM articoli");
$q->execute();
$q->setFetchMode(PDO::FETCH_ASSOC);
while($articoli = $q->fetch()) {   ?>

	<item>
		<title><?php echo $articoli['titolo_articolo']; ?></title>
		<link><?php echo $articoli['permalink']; ?></link>
		<guid><?php echo $articoli['permalink']; ?></guid>
		<pubDate><?php echo gmdate(DATE_RSS, strtotime($articoli['insert_date'])); ?></pubDate>

	</item>

<?php } //LOOP ARTICOLI ?>

</channel>
</rss>

Ovviamente la struttura in questo caso varia molto a seconda del vostro codice o delle vostre abitudini, in ogni caso avete delle linee guida utili su cui partire per rendere dinamico il vostro feed.

Ora che abbiamo creato la struttura PHP che genera il nostro RSS dinamico in base agli articoli nel database andiamo a modificare l’estensione in XML in modo da rendere operativo il nostro lavoro. Per farlo però agiamo via htaccess con una semplice rewrite rule in questo modo:

//Se viene digitata rss.xml vai a prelevare il file PHP
RewriteRule ^rss.xml ./rss.php

In questo modo quando verrà richiamato tuosito.it/rss.xml di fatto verrà elaborato il file PHP appena creato in modo del tutto dinamico. A questo punto potete dare ai vostri lettori l’indirizzo tuosito.it/rss.xml senza problemi per iniziare a seguire il vostro feed.

Conclusioni e approfondimenti

[button link=”http://www.targetweb.it/sitemap-dinamica-con-php/” color=”blue”]Sitemap Dinamica PHP[/button] [button link=”http://www.targetweb.it/guida-htaccess-mod-rewrite-e-redirect/” color=”blue”]Guida Htaccess[/button] [button link=”http://www.targetweb.it/interrogare-il-database-mysql-con-php-introduzione-alle-query-mysql/” color=”blue”]Query (loop) con Mysql[/button]

Se ti è piaciuto questo articolo condividilo sui tuoi social network preferiti! Oppure se hai ulteriori consigli o non ti sono chiari dei passaggi specifici faccelo sapere nei commenti ti risponderemo quanto prima!

  1. Volevo farti i complimenti per il tuo ottimo articolo, che ho studiato e mi ha permesso di crearmi un ottimo feed RSS per il mio sito.
    Mi permetto solo di segnalarti che per completezza sarebbe meglio dare anche l’istruzione MySQL per la creazione della tabella, che deve interagire con il tuo script.

    Ecco come ho fatto, ad es. io:

    CREATE TABLE articles (id_article INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, article_title VARCHAR(255) NOT NULL, permalink VARCHAR(255) NOT NULL, insert_date TIMESTAMP NOT NULL, PRIMARY KEY(id_article));

    Inoltre ho leggermente modificato lo stile PHP del tuo script ovvero:

    <?php
    /*

    Per questo script, rss.php, mi sono creato una nuova tabella 'articles' nel mio db chiamato, register_user, in questo modo:

    CREATE TABLE articles (id_article INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, article_title VARCHAR(255) NOT NULL, permalink VARCHAR(255) NOT NULL, insert_date TIMESTAMP NOT NULL, PRIMARY KEY(id_article));

    Poi devo inserire nella tabella i dati manualmente, che con questo script andrò ad estrarre.

    IMPORTANTE:
    Uso poi un file .htaccess per dire ad Apache di prendere questo file rss.php quando l'utente clicca sul link rss.xml.
    Infatti inserisco tale file nel menù del mio sito così:

    Vedere allora il file .htaccess allegato, che contiene questo codice:

    RewriteEngine On
    RewriteBase /new_site_local

    RewriteRule ^rss.xml$ rss.php

    */
    header(‘Content-Type: application/xml’);
    echo ‘
    ‘;

    // file con la classe PDO per la connessione al db
    require_once ‘config_db.php’;
    ?>

    newbielinux
    http://localhost/new_site_local/
    Guide per neofiti Linux

    setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //Loop to print all articles
    $stmt = $pdo->prepare(“SELECT * FROM articles”);

    $stmt->execute();

    while ( $row = $stmt->fetch(PDO::FETCH_ASSOC) )
    {
    echo ”;
    echo ” . $row[‘article_title’] . ”;
    echo ” . $row[‘permalink’] . ”;
    echo ” . $row[‘permalink’] . ”;
    echo ” . date(DATE_RSS, strtotime($row[‘insert_date’])) . ”;
    echo ”;
    }
    }
    catch (PDOException $e)
    {
    echo “Error!: ” . $e->getMessage() . “”;
    die;
    }
    ?>

    Spero tu non ti offenda e possa aiutare qualche altro utente desideroso di creare un feed RSS con PHP e MySQl come db.

    Grazie e ciao.

  2. Ciao e complimenti per i tuoi articoli, numerosi e veramente interessanti! Riguardo a questo mi è venuto il seguente dubbio: quanti articoli devono essere pubblicati nel feed? Dal tuo esempio sembrerebbe normale pubblicarli tutti. In realtà, penso ad un blog o a un sito con moltissimi articoli anche datati. Chiedo questo perché mi chiedevo anche se i programmi che accedono ai feed (… come il caro e ormai defunto Google Reader) tengono in memoria i feed vecchi oppure no.

    Grazie,
    Flavio

    P.S.: Cosa utilizzi per gestire i commenti nel tuo sito?

  3. Buonasera, probabilmente sto per fare una richiesta “banale”. Ma mi servirebbe molto il tuo aiuto. Dal mio sito genero un feed rss ma dopo 250 caratteri mi compare il simbolo […]. Come risolvo per visualizzarlo intero?
    Grazie anticipatamente!

  4. Ciao ottimo tutorial, grazie, è anche semplice da seguire.
    Ho solo un problema, quando pubblico il file .htacces sul server (di Aruba) mi scompare il sito e mi compare un messaggio d’errore INTERNAL SERVER ERROR, come faccio ad utilizzare le versione dinamica dell’rss senza utilizzare il file .htacces ?

  5. Il mio file rss.php l’ho piazzato in una cartella interna del sito.. In questo caso come lo riscrivo.. devo inserire così?

    RewriteEngine On
    # Se viene digitata rss.xml vai a prelevare il file PHP
    RewriteRule ^mia_cartella/rss.xml .mia/cartella/rss.php

    ??

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Up Next:

La mia avventura al Seminario Web Designer Freelance - 2013

La mia avventura al Seminario Web Designer Freelance - 2013