- Sat
- 18
- Apr
- 09
Generare sitemap coerente con le specifiche di Google per il proprio sito web con Php e SimpleXML
Di in Php, Xml Controls: +-close
Rendiamo il nostro sito indicizzabile dai motori di ricerca
Oggi vedremo come creare una sitemap in xml usando l’oggetto Php SimpleXML. Per chi non lo conoscesse SimpleXML è una classe built in del linguaggio Php dalla versione 5 e per chi invece leggerà queste righe perchè cercava quale utilità ha o che cos’è una sitemap, possiamo dire che è un file XML dove sono listate tutte le url del nostro sito, utile ai motori di ricerca come Google, Yahoo, MSN ecc.. al fine dell’indicizzazione.
Grazie a SimpleXML leggere e scrivere file XML con php è veramente uno scherzo, in quanto sono necessarie poche righe di codice per fare tutto ciò di cui abbiamo bisogno. In questo tutorial costruiremo da zero una classe, che chiameremo Sitemap, che ci permetterà di fare tutto quello di cui abbiamo bisogno in maniera ordinata e semplice.
Il protocollo di Google
Visitando questa pagina possiamo vedere come deve essere costruito il file xml per rispettare il protocollo di google, qui di seguito brevemente riassunto
Sitemap.php
// Il file deve iniziare con questa linea
<?xml version="1.0" encoding="UTF-8"?>
// Deve contenere il tag urlset, che conterra al suo interno le varie url
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
// Un esempio di url, loc è richiesto, il resto è opzionale
<url>
<loc>http://www.example.com/</loc>
<lastmod>2005-01-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
// Chiusura del tag urlset
</urlset>
Il listato della classe Sitemap.php
class Sitemap
{
private $xml;
private $sitemap;
public function __construct(){
$this->sitemap = 'percorso_fisico_alla_sitemap/sitemap.xml';
$this->xml = $this->read($this->sitemap);
}
function read($file){
if (file_exists($file)){
try{
return simplexml_load_file($file);
}catch (Exception $e){
throw new Exception("Errore nel caricamento del file");
}
}else{
throw new Exception("File xml inesistente");
}
}
function add($data){
try{
$node = $this->xml->addChild("url");
$node->addChild("loc", $data['loc']);
$node->addChild("lastmod", $this->datetime(isset($data['date']) && !empty($data['date']) && trim($data['date']) != '' ? $data['date'] : NULL));
$node->addChild("changefreq", $data['changefreq']);
$node->addChild("priority", $data['priority']);
}catch(Exception $e){
throw new Exception("Errore in add... i dati erano un array?");
}
}
function get($couple){
foreach($this->xml->url as $node){
if ($node->$couple['node'] == $couple['value']){
return $node;
}
}
return NULL;
}
function edit($couple, $data){
$node = $this->get($couple);
$node->loc = $data['loc'];
$node->lastmod = $this->datetime(isset($data['date']) && !empty($data['date']) ? $data['date'] : NULL);
$node->changefreq = $data['changefreq'];
$node->priority = $data['priority'];
}
function timestamp($data){
try{
$data = explode(" ", $data);
list($y, $m, $d) = explode("-", trim($data[0]));
list($h, $mi, $sc) = explode(":", trim($data[1]));
return mktime($h,$mi,$sc,$d,$m,$y);
}catch(error $e){
throw new Exception("Errore in timestamp");
}
}
function datetime($date = NULL){
try{
$mktime = $date === NULL && empty($date) ? mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")) : $this->timestamp($date);
//return date(DATE_ATOM,$mktime);
$offset = date("O",$mktime);
return date("Y-m-d\TH:i:s",$mktime).substr($offset,0,3).":".substr($offset,-2);
}catch(Exception $e){
throw new Exception("Errore in datetime");
}
}
function save(){
//file_put_contents($this->sitemap, $this->xml->asXML());
$this->xml->asXML($this->sitemap);
}
function delete($couple){
$node = $this->get($couple);
if ($node != NULL){
unset($node[0][0]);
}
}
function erase(){
unset($this->xml->url);
}
}
La classe possiede due proprietà private, $xml e $sitemap, che conterranno rispettivamente l’oggetto SimpleXML e la path fisica, completa di nome, della nostra sitemap. Alla sitemap dovranno essere impostati i permessi di scrittura. Vediamo qui di seguito una veloce spiegazione di ogni metodo.
Il Costruttore
public function __construct(){
$this->sitemap = 'percorso_fisico_alla_sitemap/sitemap.xml';
$this->xml = $this->read($this->sitemap);
}
Il costruttore si occupa di attribuire i valori alle proprietà private, quindi istanzia SimpleXML tramite la chiamata al metodo read().
Il metodo read()
function read($file){
if (file_exists($file)){
try{
return simplexml_load_file($file);
}catch (Exception $e){
throw new Exception("Errore nel caricamento del file");
}
}else{
throw new Exception("File xml inesistente");
}
}
Questo metodo prova a creare l’oggetto SimpleXML tramire la chiamata alla funzione simplexml_load_file() a cui viene passato come argomento il file da leggere. Se la lettura ha successo ritorna l’oggetto SimpleXML.
Il metodo add()
function add($data){
try{
$node = $this->xml->addChild("url");
$node->addChild("loc", $data['loc']);
$node->addChild("lastmod", $this->datetime(isset($data['date']) && !empty($data['date']) && trim($data['date']) != '' ? $data['date'] : NULL));
$node->addChild("changefreq", $data['changefreq']);
$node->addChild("priority", $data['priority']);
}catch(Exception $e){
throw new Exception("Errore in add... i dati erano un array?");
}
}
Add() aggiunge un nodo url alla urlset. L’argomento da passare ad add() è un array che deve contenere necessariamente le chiavi ‘loc’, ‘changefreq’ e ‘priority’. Può contenere anche la chiave ‘date’ ( che diverrà il valore di ‘lastmod’), omettendolo il valore di ‘lastmod’ equivarrà alla data attuale.
Il metodo get()
function get($couple){
foreach($this->xml->url as $node){
if ($node->$couple['node'] == $couple['value']){
return $node;
}
}
return NULL;
}
Get() è un metodo utile alla ricerca di un nodo. Particolare ( credo ) il fatto di passare ad argomento un array che deve contenere la chiavi ‘node’ e ‘value’: il valore di ‘node’ sarà uno dei nodi contenuti in url ( quindi loc, lastmod, changefreq o priority ), ‘value’ sarà il valore da ricercare. Da sottolineare che il nodo ritornato è esclusivamente il primo trovato.
Il metodo edit()
function edit($couple, $data){
$node = $this->get($couple);
$node->loc = $data['loc'];
$node->lastmod = $this->datetime(isset($data['date']) && !empty($data['date']) ? $data['date'] : NULL);
$node->changefreq = $data['changefreq'];
$node->priority = $data['priority'];
}
Edit() modifica i valori di un nodo esistente. Internamente utilizza il metodo get() per trovare il nodo da modificare. Gli argomenti da passare sono l’array per la ricerca e l’array con i dati che andranno a sostituirsi nel nodo trovato.
Il metodo timestamp()
function timestamp($data){
try{
$data = explode(" ", $data);
list($y, $m, $d) = explode("-", trim($data[0]));
list($h, $mi, $sc) = explode(":", trim($data[1]));
return mktime($h,$mi,$sc,$d,$m,$y);
}catch(error $e){
throw new Exception("Errore in timestamp");
}
}
Timestamp è più che altro una utility, ritorna un timestamp da una data passata in formato dd/mm/yyyy hh/MM/ss. E’ utilizzata in datetime()
Il metodo datetime()
function datetime($date = NULL){
try{
$mktime = $date === NULL && empty($date) ? mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")) : $this->timestamp($date);
//return date(DATE_ATOM,$mktime);
$offset = date("O",$mktime);
return date("Y-m-d\TH:i:s",$mktime).substr($offset,0,3).":".substr($offset,-2);
}catch(Exception $e){
throw new Exception("Errore in datetime");
}
}
Datetime() ritorna il corretto formato data da inserire nella sitemap rispetto al protocollo. Da notare che la riga commentata (return date(DATE_ATOM,$mktime);) è un metodo alternativo che ritorna lo stesso risultato delle 2 successive.
Il metodo save()
function save(){
//file_put_contents($this->sitemap, $this->xml->asXML());
$this->xml->asXML($this->sitemap);
}
Save() salva le modifiche effettuate alla sitemap. La riga commentata è un metodo alternativo per salvare.
Il metodo delete()
function delete($couple){
$node = $this->get($couple);
if ($node != NULL){
unset($node[0][0]);
}
}
Delete() elimina il nodo trovato. L’oggetto SimpleXML non possiede un metodo nativo per eliminare un nodo, a questo scopo utilizziamo la funzione unset() di php. Delete utilizza internamente get(), quindi per eliminare un nodo bisogna passare l’array utile alla sua ricerca.
Il metodo erase()
function erase(){
unset($this->xml->url);
}
Erase() elimina tutte le url della urlset. Utile per la reindicizzazione di tutte le url.
Esempio di utilizzo
Utilizare la classe è semplice, la si istanzia, si effettuano le varie modifiche, quindi si chiama il metodo save().
// Istanziare la classe
$map = new Sitemap();
// esempi di aggiunta nodi
$map->add(array(
'loc'=>'http://www.miosito.com/uno/',
'changefreq'=>'monthly',
'priority'=>'0.2'
));
$map->add(array(
'loc'=>'http://www.miosito.com/due/',
'changefreq'=>'monthly',
'priority'=>'0.2'
));
// Esempio di eliminazione nodo
$map->delete(array('node'=>'loc','value'=>'http://www.miosito.com/uno/'));
// Salviamo la sitemap. Da chiamare dopo aver effettuato le modifiche
$map->save();
Si conclude qui il tutorial, spero che sia utile a qualcuno, mi raccomando i commenti
No related posts.
Related posts brought to you by Yet Another Related Posts Plugin.












ho provato questa classe, ma ho un problema:
Fatal error: Call to undefined function emptyempty() in /Users/alex/Documents/htdocs/sitemap/sitemap.php on line 67
come mai??
E’ un errore di wordpress penso, ci sono alcune parole che sono ripetute.
La parola in questione è la funzione empty() di php, nell’articolo me l’ha trasformata in emptyempty().
Ti consiglio di cliccare il tasto ‘view plain’ e di ricopiare la classe da li. Non dovresti avere problemi.
Fammi sapere se è tutto ok.
Ciao
Tutto ok risolto, funziona…
Bello bello…