Come creare un generatore di sitemap in php

Ciao , se sei giunto qui stai cercando un modo veloce per realizzare il tuo sitemap xml per l'indicizzazione del tuo sito.

Io ti propongo la mia strada, utilizzando PHP , facile veloce e senza  troppi sbattimenti.

La prima cosa da fare è  impostare le variabili globali che ci serviranno per far girare il tutto.


$blist = array();
$pagina = "";
// Inizializza l'output come XML
header("Content-Type: application/xml; charset=utf-8");

// Stampa l'intestazione del file sitemap
$pagina .= '' . "";
$pagina .= 'xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xhtml="http://www.w3.org/1999/xhtml"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">' . "";

come puoi vedere abbiamo creato una Array List ($blist) che ci servirà per inserire le pagine che decideremo di non far apparire nel nostro Sitemap XML, dopo abbiamo creato $pagina che è la variabile che conterrà tutto ciò che andreamo a "stampare" a schermo alla fine. 

nel codice appena visualizzato puoi vedere anche che abbiamo impostato l'header della pagina che ci consentirà di determinare il fomrato del file che visualizzeremo cosi il browser può interpretarlo come tale anche se stiamo aprendo una pagina php.

Come puoi vedere ho inserito già i primi dati nella variabile $page , questi sono le intestazione del file xml con la formattazione xmlns standard.

Adesso vediamo come estrarre le informazioni dalla pagina del nostro sito. Sempre nel nostro file php creiamo una funzione con 2 campi variabili $url e $blacklist , questi ci serviranno per inviare alla funzione l'indirizzo che vogliamo venga analizzato e la lista di indirizzi da saltare durante l'analisi che potrebbero essere bloccanti o non consentiti nei motori di ricerca.

Ora ti descrivo passaggio per passaggio il loro utilizzo commentando ogni rige.

// Funzione per generare le URL del sito
function generateSiteMap($url,$blacklist){
$dom = new DOMDocument(); //creiamo un documento virtuale

$lista= array(""); // creiamo un array vuoto dove metteremo dentro tutti i link buoni
$res = "";      // creiamo la variabile che conterra il risultato di tutto

$html = file_get_contents($url); //sfruttiamo php8 per generare il contenuto html                                   della pagina

@$dom->loadHTML($html); //inseriamo il contenuto estratto nel documento già creato

$links = $dom->getElementsByTagName('a'); //generiamo un array con tutti gli elementi                                       del documento (genericamente usati in html per                                             i link)

a questo punto abbiamo la lista completa dei link contenuti nella pagina inserita nella variabile $url , non ci resta che inserirla in un ciclo per applicare qualche filtro e generare l'url definitivo.


foreach ($links as $link){
$href = $link->getAttribute('href'); //estraiamo l'attributo href dai link generati                                             prima

if (strpos($href, 'http') === false) {    // applichiamo un filtro che determina se                                              siano realmente link

$href = rtrim($url, '/') . '/' . ltrim($href, '/'); // Se l'URL è relativo, crea                                                        l'URL assoluto

}
if(!in_array(htmlspecialchars($href),$lista)){ //qui applichiamo il filtro per evitare                                                  i doppioni
$lista[]=htmlspecialchars($href);
}
}

a schelta possiamo inserire tutti i tipi di filtri che ci possono tornare utili questi per ore sono solo gli essenziali.

Perfetto ora abbiamo quasi finito ci manca solo di impostare come dovranno essere renderizzati i risultati.. per fare ciò faremo un ultimo ciclo che estrae i dati dall'arrai $lista e inserirà nella variabile $res quello che dovra essere visualizzato .


for ($i = 1; $i < count($lista); $i++) { //cicliamo il contenuto della $lista

if(!in_array($lista[$i],$blacklist)){ //verifichiamo la presenza dei link nella                                          blacklist se coincidono lo saltiamo

if (str_contains($lista[$i], $url)) { //stampiamo solo link interni al dominio

$res .= '' . "";
$res .= '' . $lista[$i] . '' . "";
$res .= '' . date('c', time()) . '' . "";
$res .= 'daily' . ""; // Frequenza di aggiornamento
$res .= '1.0000' . ""; // Priorità (0.0 - 1.0)
$res .= '' . "";
}
}
}
return $res ;    //rispondiamo alla funzione con tutto il contenuto di $res .
}​

a questo punto fuori dalla funzione non ci resta che creare la nostra BlakList , se ci serve, e richiamare la funzione per stampare il contenuto di tutto con 3 semplici righe.. 

aggiungiamo indirizzi alla nostra blacklist,

$blist[] = "https://www.telegram.com";
$blist[] = "https://www.facebook.com/";
$blist[] = "www.linkedin.com";​

chimiamo la funzione e stampiamo a schermo il risultato.


// Chiama la funzione per generare le URL del sito
$baseURL = 'https://www.fabiodirauso.it'; // Sostituisci con il tuo URL del sito
$pagina .= generateSiteMap($baseURL,$blist);

// Chiudi il tag dell'elemento urlset
$pagina .= '';
echo $pagina ;​

se vogliamo possiamo far in modo che venga aggiornato anche un file fisico ad ogni chiamata , il classico sitemap.xml

$open = fopen("../sitemap.xml","w+");
fwrite($open, $pagina);

fine.. salviamo e publichiamo sul nostro server il file in php appena creato.. 

il risultato quando andremo a chiamarlo sarà questo.. 

Se non vuoi scrivere tutot il codice clicca sul link qui sotto.

Scarica il file gia pronto

ora che ne dici , ci meritiamo un cafè ?