frank
Goto Top

Google Sitemap mit PHP und DOM erstellen (Document Object Model)

article-picture

Hier ein kleine Vorlage für alle Entwickler, die eine Google-Sitemap mit Hilfe von PHP selbst erstellen wollen. Bei der Google-Suche hatte ich leider nichts zu diesem Thema gefunden.

Um eine eigene Google-Sitemap mit Hilfe von PHP für administrator.de zu erstellen, habe mich für die DOM Schnittstelle (Document Object Model) entschieden. Da wir mehr als 50.000 Beiträge haben, muss ich eine Sitemap-Index Datei erstellen und die Inhalte auf mehrere Sitemap Dateien aufteilen. Infos und Hilfen zum Sitemap-Protokoll findet Ihr hier. Die Werte sind natürlich nur Beispielswerte, die muss jeder selbst anhand seiner Programmierung und Datenbank ausfüllen. Es geht nur um die reine XML Struktur per DOM und nicht um die Inhalte. Tipp: Das Entity-Escaping macht die DOM-Schnittstelle automatisch, man muss seine URLs also nicht extra mit "htmlspecialchars" umwandeln.

Hier die Sitemap-Index Datei:
// -------------
// SITEMAP INDEX
// -------------

$dom = new DOMDocument('1.0','UTF-8');  
$dom->formatOutput = true;

$xml = $dom->appendChild($dom->createElement('sitemapindex'));  
$xml_attr = $xml->setAttribute("xmlns","http://www.sitemaps.org/schemas/sitemap/0.9");  
$sitemap = $xml->appendChild($dom->createElement('sitemap'));  

$loc = $sitemap->appendChild($dom->createElement('loc'));  
$loc->appendChild($dom->createTextNode("http://www.example.com/sitemap1.xml.gz"));  
$lastmod = $sitemap->appendChild($dom->createElement('lastmod'));        
$lastmod->appendChild($dom->createTextNode(date(DATE_W3C)));

// SAVE       
if ($dom->save("/htdocs/sitemap-index.xml")) {  
	echo "Sitemap-Index erfolgreich gespeichert\n";  
} else {
	echo "Fehler beim Speichern des Sitemap-Index!\n";  
	exit;
}
Hier die Sitemap Datei:
// -------
// SITEMAP
// -------

$dom = new DOMDocument('1.0','UTF-8');  
$dom->formatOutput = true;

$xml = $dom->appendChild($dom->createElement('urlset'));  
$xml_attr = $xml->setAttribute("xmlns","http://www.sitemaps.org/schemas/sitemap/0.9");  

// BEISPIEL ERSTE URL (dass muss später dann in eine Schleife)
$url = $xml->appendChild($dom->createElement('url'));  
$loc = $url->appendChild($dom->createElement('loc'));  
$loc->appendChild($dom->createTextNode("http://www.example.com/index.php?mod=help&idx=1"));  
// OPTIONAL
$lastmod = $url->appendChild($dom->createElement('lastmod'));        
$lastmod->appendChild($dom->createTextNode(date(DATE_W3C)));
$changefreq = $url->appendChild($dom->createElement('changefreq'));        
$changefreq->appendChild($dom->createTextNode("daily"));  
$priority = $url->appendChild($dom->createElement('priority'));        
$priority->appendChild($dom->createTextNode("0.8"));  

// BEISPIEL ZWEITE URL ETC.. 
$url = $xml->appendChild($dom->createElement('url'));  
$loc = $url->appendChild($dom->createElement('loc'));  
$loc->appendChild($dom->createTextNode("http://www.example.com/index.php?mod=help&idx=2"));  
$lastmod = $url->appendChild($dom->createElement('lastmod'));        
$lastmod->appendChild($dom->createTextNode(date(DATE_W3C)));
$changefreq = $url->appendChild($dom->createElement('changefreq'));        
$changefreq->appendChild($dom->createTextNode("daily"));  
$priority = $url->appendChild($dom->createElement('priority'));        
$priority->appendChild($dom->createTextNode("0.8"));  

// SAVE       
if ($dom->save("/htdocs/sitemap.xml")) {  
	echo "Sitemap erfolgreich gespeichert\n";  
} else {
	echo "Fehler beim Speichern der Sitemap!\n";  
	exit;
}

Ergebnis "sitemap-index.xml":
<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <sitemap>
    <loc>http://www.example.com/sitemap1.xml.gz</loc>
    <lastmod>2008-11-06T12:39:03+01:00</lastmod>
  </sitemap>
</sitemapindex>
Ergebnis "sitemap.xml":
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.example.com/index.php?mod=help&amp;idx=1</loc>
    <lastmod>2008-11-06T12:39:03+01:00</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>http://www.example.com/index.php?mod=help&amp;idx=2</loc>
    <lastmod>2008-11-06T12:39:03+01:00</lastmod>
    <changefreq>daily</changefreq>
    <priority>0.8</priority>
  </url>
</urlset>

Weitere Informationen über Google-Sitemaps und genaue Feldbeschreibungen findet Ihr unter:
http://www.sitemaps.org/de/protocol.php
https://www.google.com/webmasters/tools/docs/de/protocol.html

Google-Sitemaps validieren bzw. überprüfen:
http://www.validome.org/google/lang/ge

Viel Spaß noch face-smile
Gruß
Frank

Content-Key: 101181

Url: https://administrator.de/contentid/101181

Ausgedruckt am: 28.03.2024 um 14:03 Uhr

Mitglied: masterG
masterG 15.11.2008 um 11:20:30 Uhr
Goto Top
Auf die Lösung bin ich bis jetzt nicht gekommen. Danke für das Tut.

Gruß
masterG
Mitglied: comvation
comvation 11.12.2008 um 09:43:26 Uhr
Goto Top
Wir haben diesen Bericht zum Anlass genommen, in unserer Open Source CMS Software Contrexx eine Sitemaps-XML Datei automatisch zu generieren. Ab der aktuellen Download Version ist dies nun enthalten.

Weitere Informationen unter http://www.contrexx.com/de/
Mitglied: pcguy
pcguy 25.04.2011 um 12:03:24 Uhr
Goto Top
Hallo Frank

Danke für die Anleitung!
Eine Frage noch, welcher Wert muss in der Konstante "_SITE_PATH." sein ?
Ich habe es schon mit einigen versuch, zb _SERVER["SCRIPT_URL"] ...

Sorry, ich bin noch PHP Anfänger face-wink
Mitglied: Frank
Frank 27.04.2011 um 15:28:20 Uhr
Goto Top
Hallo "pcguy",

die Konstante "_SITE_PATH." brauchst Du nicht zu beachten. Die wird nur bei uns intern verwendet. Ich habe sie oben im Code jetzt rausgeschmissen, damit sie nicht weiter verwirrt.

Das ganze sie dann so aus:
// SAVE        
if ($dom->save("/htdocs/sitemap.xml")) {   
    echo "Sitemap erfolgreich gespeichert\n";   
} else { 
    echo "Fehler beim Speichern der Sitemap!\n";   
    exit; 
}

Gruß
Frank