Sitemap dinamica con PHP

Oggi scopriamo come realizzare una sitemap completamente dinamica con PHP interfacciandoci a un database MYSQL.

Quando risulta necessario creare una sitemap dinamica? bhè l’esempio più evidente è quando creiamo un nostro cms o sistema di gestione in generale. Se usate WordPress o altri CMS potrete generare la sitemap direttamente installando un plugin (io vi consiglio Google sitemap XML per WordPress).

Se invece avete creato un vostro sito dinamico in PHP il cruccio della sitemap sarà presto uno dei vostri problemi. Per creare una sitemap dinamica dobbiamo farci una semplice domanda:

Come facciamo di solito ad estrarre i dati che ci servono dal database per visualizzarli a video?

01. Struttura di un file sitemap

Una sitemap che si rispetti (e venga rispettata da Google), è composta da:

Dichiarazione del tipo di contenuto (xml)

Content-Type: text/xml

– Versione e codifica

<?xml version="1.0" encoding="UTF-8"?>

– Schema ufficiale

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

Struttura principale dei link

<url>
	<loc>
	http://www.tuosito.it/
	</loc>
	<lastmod>20/10/2011</lastmod>
</url>

Come vedete la struttura è divisa in <loc> ovvero location, è il percorso al vostro (o ai vostri) articoli, lastmod invece è la data dell’ultima modifica dell’articolo.

02. Scriviamo la sitemap in PHP

Create un file chiamato sitemap.php nella root del vostro sito, e copiate questo codice:

<?php header('Content-Type: text/xml');//lasciare in alto
echo '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'; //lasciarlo in alto altrimenti da errore
include('gestione/config.php');
include('gestione/connessione_db.php');
$data_oggi = (date('Y-m-d'));
?>

Come vedete, grazie a header di php creo l’intestazione del file (XML). Successivamente includo i file che mi servono per connettermi al database e creo una variabile che conterrà la data del giorno (ideale per refreshare la home e pagine statiche vedi punto 03).

NOTA IMPORTANTE: Header() è una funziona molto delicata di PHP, assicuratevi di non lasciare spazi vuoti nel codice prima di <?php e dopo i tag di chiusura ?> altrimenti potrebbe dare errore. Oltre a questo il codice:

header('Content-Type: text/xml');

Va messo DAVANTI a tutto il resto del codice (come vedete nell’esempio sopra).

Ora potete collegarvi al database ed eseguite il loop per estrarre le pagine singole dei vostri articoli come siete abituati:

<?php
 mysql_select_db("$db_name",$connessione); 

		 $risultato = mysql_query("SELECT * FROM tua_tabella");

		      if (!$risultato) {

					 exit ('<p> Errore mentre recuperavo i dati' . mysql_error() . '</p>');

					 }

					 while ($row = mysql_fetch_array($risultato))   

					 {

                        $var1 = $row['var1'];
                        $var2 = $row['var2'];
                        $data = $row['data'];

                                          echo "
                                          <url>
                                           ";
                                          echo "<loc>$base_url/$var1/$var2.html";
                                          echo "</loc>
                                            ";
                                          echo "<lastmod>$data</lastmod>";
                                          echo "
                                         </url>";

                                         }//FINE LOOP SITEMAP

Ovviamente $data è una variabile che contiene la data recuperata dalla vostra tabella, $var1 e $var2 sono altre due variabili ricostruite dalla vostra tabella necessarie per costruire i link agli articoli. In questo modo abbiamo scritto la sitemap che prenderà tutti i valori presenti nella vostra tabella sotto forma di documento XML valido come sitemap. Ovviamente se avete più di una tabella dovrete eseguire più di un loop while.

NOTA: Ricordate di includere i file config.php e connessione_db.php per potervi interfacciare al database senza problemi!

03. come faccio per le pagine “statiche”?

Bene il contenuto dinamico del vostro database è stato inserito correttamente nella sitemap, ora però dobbiamo pensare al contenuto statico, come home page, pagina contatti, chi siamo etc… come fare?

Una prima soluzione (la più semplice) è di creare altre dichiarazioni XML indicando come data la variabile $data_oggi impostata in precedenza nel documento (vedi parte iniziale dell’articolo).

Vediamo un esempio chiarificatore:

<url>
	<loc>
	http://www.tuosito.it/
	</loc>
	<lastmod><?php echo $data_oggi ?></lastmod>
</url>
<url>
	<loc>
	http://www.tuosito.it/chi-siamo.html
	</loc>
	<lastmod><?php echo $data_oggi ?></lastmod>
</url>

In questo modo sia gli articoli statici che la home avranno sempre la data di oggi come ultima modifica. Come vedete siamo riusciti in pochi passi a costruire la nostra sitemap che recupera i dati in modo dinamico da un database.

04. Come trasformare da PHP e XML il documento

Molti di voi staranno dicendo: ma sei pazzo? lo sanno tutti che la sitemap non può avere estensione php…Per rendere la nostra sitemap con estensione XML non dobbiamo fare altro che aggiungere questa regola al nostro file htaccess:

###############
RewriteEngine On
RewriteBase /
RewriteRule ^sitemap.xml ./sitemap.php [L,QSA]
###############

Si tratta di una regola di mod rewrite che in pratica trasforma il file da sitemap.php a sitemap.XML. Quando viene richiesto l’url con estensione xml (quello da inviare a Google), la regola fa in modo di recuperare i dati scritti nel file php che abbiamo creato (spiegazione molto banale, giusto per farvi capire meglio).

Provate ora a scrivere nel browser tuosito.it/sitemap.xml ed eccovi servita la vostra sitemap dinamica trasformata in XML pronta per essere inviata a Google! ovviamente ogni volta che aggiungerete o modificherete un articolo del database la sitemap agirà di conseguenza. Questo fa sì che questo sistema si attesti su livelli abbastanza alti di automatizzazione (in caso di modifiche strutturali al sito ovviamente è da rivedere).

Come demo vi fornisco il risultato finale di un sito di mia (recente) creazione: MBC House.

A lunedì e buon week end!! (ovviamente condividete e commentate ). =)

  1. Ciao non capisco come mai il codice che ho incollato nell’ htaccess non funziona appena vado al link xml.

  2. Grazie bella guida! La domanda che più mi tormentava era come far accettare la sitemap dinamica in PHP a Google dato che richiede il formato XML e non ero sicuro di poter riscrivere l’url, grazie a te ho ottenuto la risposta 😉

  3. Ciao, può essere banale, ma forse per molti no, comunque mi permetto di segnalarti che ti sei dimenticato di inserire la chiusura del tag , il che genera errori diversi a seconda del browser, che potrebbero essere fuorvianti.
    Per il resto l’articolo è perfetto, e per questo ti ringrazio.
    Ciao

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:

Da oggi mi trovi anche su html5Today!

Da oggi mi trovi anche su html5Today!