Dynamické generování Sitemaps pomocí PHP
- Vložil Trupík 2/14/2007 10:13:33 AM
-
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
GenerateURLsFromResource, 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