XML-Sitemaps dynamisch mittels Ajax generieren – am Beispiel Contao

XML-Sitemaps sind ein nützliches und wichtiges Werkzeug um Suchmaschinen jene URL’s mitzuteilen, die wir selbst als valide erachten und in den SERPs haben wollen. Viele CMS-Systeme bieten bereits die Möglichkeit, XML-Sitemaps automatisiert zu erstellen. Contao beispielsweise generiert seine Sitemap anhand der Permalinks der Seitenstruktur und der Nachrichteneinträge und legt diese im Wurzelverzeichnis der Webstite als XML-Datei ab. Das nimmt dem User bereits viel Arbeit ab.

Nun gibt es aber auch URL’s die dynamisch generiert werden und gar nicht aus dem CMS-System kommen. Dies können etwa Produktseiten eines integrierten Shops sein die automatisiert aus einer Datenbank generiert und mit Inhalten befüllt werden.

Es entstehen nun viele URL-Quellen die alle in einer XML-Datei migriert werden sollen. Ich möchte hier nun eine Methode vorstellen die gar keiner physischen Datei bedarf sondern dem Suchmaschinenbot die XML-Ausgabe auf Abruf liefert.

Dazu benötigen wir folgende Dinge:

  • Ein eigenes minimales Contaomodul
  • Eine Ajaxfunktion
  • Eine RewriteRule

Das Contaomodul

Wir erstellen ein Modul “sitemap”. Dieses Modul benötigt nur minimalste Voraussetzungen:

Ordner-/Dateistruktur:

  • system/modules/sitemap/config/config.php
  • system/modules/sitemap/ModuleGenerateSitemap.php

config.php

Wir benötigen ein Frontendmodul für unsere Ajaxmethode. Dieses definieren wir in der config.php Datei.

<?php

// Front end module
array_insert($GLOBALS['FE_MOD']['miscellaneous'], 0, array
(
'sitemap' => 'ModuleGenerateSitemap'
));

?>

Hier weisen wir das Frontendtemplate “sitemap” der Modulklasse ModuleGenerateSitemap.php zu. Das Frontendtemplate benötigen wir später für den Ajaxcall. Eine Templatedatei erstellen müssen wir nicht, da sich alles in der Klasse ModuleGenerateSitemap abspielt.

ModuleGenerateSitemap.php

Die Ajaxfunktion:

Contao liefert uns bereits die richtige Umgebung für die Entwicklung einer passenden Ajaxfunktion mittels der

generateAjax()

Methode.

<?php

class ModuleGenerateSitemap extends Module {
  protected $strTemplate = "";

  protected function compile()
  { // bleibt leer
  }

  public function generateAjax()
  {
    $mode = $_GET['mode'];

    switch ($mode)
    {
      case "generateSitemap":

          ob_start("ob_gzhandler");                // GZip zur Komprimierung der Ausgabe
          header("Content-Type: text/plain");
          echo self::generateSitemapXML();            // Aufruf der eigentlichen XML-Funktion
          ob_end_flush();
          return false;

     break;
  }

  private static function generateSitemapXML()
  {
      // hier folgt die Konfiguration der Datenquellen MySQL ... Ausgabe zb.: in $objURLs

      // XML-Objekt instanzieren beginnt hier
      $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");

      // nun ist der Rahmen für die Befüllung der XML-Datei gegeben und es können nun die URLs eingetragen werden wie zb.:

      while($objURLs->next())
      {
          $url = $xml->appendChild($dom->createElement('url'));
          $loc = $url->appendChild($dom->createElement('loc'));
          $loc->appendChild($dom->createTextNode(/* hier steht die Funktion, welche die richtige URL liefert zb.:*/ getUrl($objURLs) );
          $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"));
      }

      $xmlfile = $dom->saveXML();
      return $xmlfile;                 // Hier geben wir das fertige XML zurück.
  }

}

?>

Das Modul in Contao erstellen

Damit der Ajaxcall funkionieren kann, muss unser Modul nun im Contao-Backend erstellt werden. Bei der Erstellung des Moduls, wählen wir einen beliebigen Namen und wählen “sitemap” als Modultyp. Nach dem Speichern können wir die ID des Moduls über die Modulinfo (Fragezeichensymbol) herausfinden. Diese benötigen wir für die RewriteRule.

Die RewriteRule

Wir ergänzen nun die .htaccess Datei im Contao Wurzelverzeichnis um die folgenden Zeilen.

RewriteEngine On
RewriteBase /

# Rewrite Sitemap
RewriteRule ^sitemap.xml$ ajax.php?action=fmd&id=1&mode=generateSitemap [qsa]

Parameterbeschreibung:

  • action=fmd (für den Aufruf eines Frontendmoduls)
  • id=1 (die ID des Frontendmoduls)
  • mode=generateSitemap (die Funktion welche im Frontendmodul aufgerufen werden soll)

Mit dieser Regel leiten wir jede Anfrage nach der /sitemap.xml Datei auf unser Ajaxscript um, welches dann ein XML formatiertes Ergebnis zurückliefert.

Nun kann diese Sitemap beispielsweise in den Google Webmastertools als XML-Sitemap eingetragen werden (siehe auch XML-Sitemaps @Google) . Ändert sich nun etwas an den Titeln in der Datenbank, so werden die Änderungen direkt beim Aufruf neu übernommen.

Über den Autor:

Dies ist nur ein Gravatar

Markus Hammerschmid - Xing | Twitter | Linkedin

Ich bin Webentwickler, SEO-, SEM und Social Media Ergebener und ambitionierter Prozessoptimierer. Hab Spaß am Bloggen und Twittern und freue mich auf jedes Feedback! Aktuell - Betreiber eines Onlineshops Circlepit Vinyl Records für Heavy Metal Schallplatten


Info