Poznámka: články jsou již mnoho let staré, doba se posunula, mnoho věcí v nich doporučovaných je již dnes překonané - berte s rezervou!


Dynamické generování Sitemaps pomocí PHP

Pokud spravujete dynamický web, máte jistě zájem na tom, aby nově vznikající obsah byl co nejrychleji zaindexován vyhledávači. Právě k tomuto účelu slouží soubory sitemaps – soubory ve vlastním dialektu jazyka XML, které jednoduše obsahují URL vašich jednotlivých podstránek. Díky tomu, že všechny podstránky máte vyjmenované v jednom souboru, vyhledávač se o nich dříve dozví, protože soubor sitemaps si aktualizuje velmi často, zatímco crawlování vašich stránek tak často provádět nemusí.

Soubory sitemaps mají velmi jednoduchou syntaxi, mohou vypadat například takto (detailní popis protokolu najdete na stránce domovské stránce protokolu sitemaps):

<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>http://www.example.com/</loc> <lastmod>2005-01-01</lastmod> <changefreq>monthly</changefreq> <priority>0.8</priority> </url> </urlset>

Jednotlivé uzly <url> reprezentují jednotlivé podstránky, můžete jim kromě vlastní adresy nadefinovat taky datum poslední modifikaci, odhadovanou frekvenci změn na stránce a prioritu stránky (to, jak vyhledávače s těmito hodnotami naloží, ale protokol nijak nespecifikuje).

Pro generování Sitemaps pomocí PHP jsem si vytvořil třídu (která vnitřně používá jinou mou třídu – writer XML). Použití je takovéto:

<? require_once("SitemapGenerator.class.php"); $g = new SitemapGenerator(); //zapsani hlavicky $g->WriteHeader("sitemap.xml", "UTF-8"); //jednoduche zapsani uzlu <url> $g->GenerateURL("http://www.example.com", "2005-01-01", "0.8", "daily"); $sql = "SELECT id FROM clanky ORDER BY REAX_ID"; $clanky = mysql_query($sql); //zapisovani uzlu v cyklu while ($clanek = mysql_fetch_object($clanky)) $g->GenerateURL("http://www.example.com/clanky/$clanek->id,"","","monthly"); //zapsani paticky $g->WriteFooter(); ?>

Kromě metody GenerateURL lze použít také metodu GenerateURLsFrom­Resource, které se předá výsledková sada a třída ji zpracuje na jednotlivá URL. Výsledková sada musí obsahovat odpovídající sloupce, lze použít něco jako:

<? $sql = "SELECT CONCAT('http://www.example.com/clanky/',id) AS loc, pubdate AS lastmod FROM clanky"; $clanky = mysql_query($sql); $g->GenerateURLsFromResource($sql); ?>

Kód třídy vypadá takto:

<? require_once("MyXmlWriter.class.php"); class SitemapGenerator { /** * Generuje Sitemap dle protokolu - www.sitemaps.org * V resource musi byt pouzit SQL konstrukt AS * (AS loc, AS lastmod[opt], AS priority[opt], as changefreq[opt] */ private $w; public function WriteHeader($filename, $encoding = null) { $this->w = new MyXmlWriter($filename); $this->w->WriteXMLDeclaration("1.0", $encoding); $this->w->WriteBeginTag("urlset"); $this->w->WriteAttribute("xmlns:xsi", "http://www.sitemaps.org/schemas/sitemap/0.9"); $this->w->WriteAttribute("xsi:schemaLocation","http://www.sitemaps.org/schemas/sitemap/0.9 \n". "http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd"); $this->w->WriteAttribute("xmlns","http://www.sitemaps.org/schemas/sitemap/0.9"); } public function WriteFooter() { $this->w->CloseTag(); //urlset } public function GenerateURLsFromResource($res) { /* parsing passed resource */ while ($item = mysql_fetch_object($resource)) { $loc = ""; $lastmod =""; $changefreq = ""; $priority = ""; if (array_key_exists("loc", $item)) $loc = $item->loc; if (array_key_exists("lastmod", $item)) $lastmod = $item->lastmod; if (array_key_exists("priority", $item)) $priority = $item->priority; if (array_key_exists("changefreq", $item)) $changefreq = $item->changefreq; $this->GenerateUrl($loc, $lastmod, $priority, $changefreq); } } public function GenerateUrl($loc, $lastmod = "", $priority = "", $changefreq = "") { $this->w->WriteBeginTag("url"); if ($loc != "") $this->w->WriteSimpleTextNode("loc", $loc); if ($lastmod != "") $this->w->WriteSimpleTextNode("lastmod", $lastmod); if ($priority != "") $this->w->WriteSimpleTextNode("priority", $priority); if ($changefreq != "") $this->w->WriteSimpleTextNode("changefreq", $changefreq); $this->w->CloseTag(); } } ?>
Ohodnoťte prosím užitečnost článku




22
 
37
 
19
 
21
 
16
 
 
Vložit komentář:
 

 



 

 

Nepoužívejte žádné html ani texy značky, odřádkování se zachová. Pokud uvádíte zdrojový kód, můžete ho vložit mezi značky
<syntax jazyk="PHP">...</syntax>,
bude potom zformátován. Jako atribut můžete uvést PHP, C#, HTML, CSS a mnoho dalších.


opiste cislo Opište číslo:

 

14.2.2007 11:38:51
[1] (Martin Grames) www
Užitečný článek odpovědět
Díky, už dlouho uvažuju, že udělám na webu sitemap, ale nějak jsem se ještě k tomu neměl. Teď díky tobě mám ušetřenou práci s psaním kódu :-)
A jak to tak vidím, tak si tě asi dám do RSS čtečky.
15.7.2007 16:34:40
[2] (Andrej ) www
Jak? odpovědět
Jak to zakonponovat, aby to delalo co ma?
 

TOPlist

Hoďte tam Táňu!