Joomla 1.5 Sitemap mit Perl

PerlWenn für eine Webseite eine Sitemap existiert, können Suchmaschinen wie z.B. google die Seite besser indizieren und auch nicht verlinkte Seiten besser finden. Für joomla existieren einige Komponenten die Sitemaps automatisch erstellen können. Eine einfache Sitemap lässt sich aber auch schnell in beispielsweise Perl selber stricken.

Das Format der sitemap.xml

Die sitemap.xml Datei hat laut google folgendes Format als Minimalanforderung.

< ?xml version="1.0" encoding="UTF-8"?>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
      <loc>http://www.meinserver.de/seite1.html</loc>
      <lastmod>YYYY-MM-DD</lastmod>
    </url>
    <url>
      <loc>http://www.meinserver.de/seite2.html</loc>
      <lastmod>YYYY-MM-DD</lastmod>
    </url>
  </urlset>

Joomla URL Schema

Joomla hat mit aktivierter rewrite Engine und Suchmaschinenoptimierung folgendes URL Format.
Beitrag:
http://www.bsp.de/BEREICH/KATEGORIE/KATEGORIE_ID-KATEGORIE/BEITRAGS_ID-BEITRAG.html
Bereich:
http://www.bsp.de/BEREICH.html
Kategorie:
http://www.bsp.de/BEREICH/KATEGORIE.html

Die SQL Abfrage

Die Werte können wie folgt den Spalten in der Datenbank zugeordnet werden:

  • BEREICH – jos_sections.alias
  • KATEGORIE – jos_categories.alias
  • KATEGORIE_ID – jos_content.id
  • BEITRAGS_ID – jos_categories.id
  • BEITRAG – jos_content.alias

Zusätzlich benötigt man noch das Datum der letzten Änderung und den Freigabestatus.

  • Änderungsdatum – jos_content.modified
  • Freigabestatus – jos_content.status

Daraus ergibt sich für den Content die Abfrage:

SELECT jos_sections.alias,jos_content.id,jos_content.alias,
jos_categories.id, jos_categories.alias,DATE(jos_content.modified) 
FROM jos_content,jos_categories,jos_sections 
WHERE jos_categories.id=jos_content.catid 
AND jos_categories.section=jos_sections.id 
AND jos_content.state=1;

Für die Bereichsübersichtsseite braucht man folgende Abfrage:

SELECT DISTINCT jos_sections.alias,MAX(DATE(jos_content.modified)) 
FROM jos_content,jos_sections,jos_categories 
WHERE jos_categories.id=jos_content.catid 
AND jos_categories.section=jos_sections.id 
AND jos_content.state=1 
GROUP BY jos_sections.alias

Und noch eine dritte für die Kategorieübersichtsseite:

SELECT DISTINCT jos_sections.alias,jos_categories.alias,
MAX(DATE(jos_content.modified)) 
FROM jos_content,jos_sections,jos_categories 
WHERE jos_categories.id=jos_content.catid 
AND jos_categories.section=jos_sections.id 
AND jos_content.state=1 
GROUP BY jos_categories.alias

Das Perl Script

Für die Verbindung zur Datenbank braucht man das Datenbank Interface DBI, dass man mit

use DBI;

einbindet.
Danach kann man die Verbindung zur Datenbank aufbauen.

$db="<dbname>";
$host="<dbhost>";
$userid="<dbuser>";
$passwd="<dbpass>";
 
$baseurl="http://<host>/";
 
$dbh = DBI->connect("dbi:mysql:$db;$host",$userid,$passwd);
</host></dbpass></dbuser></dbhost></dbname>

Jetzt kann man sich an die Ausgabe machen. Dabei beginnt man mit dem XML Kopfteil.

print "< ?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n";
</urlset>

Als nächstes muss man die Abfrage zusammenbauen und ausführen.

$query = "SELECT jos_sections.alias,jos_content.id,jos_content.alias,
jos_categories.id,jos_categories.alias,DATE(jos_content.modified) 
FROM jos_content,
jos_categories,jos_sections WHERE jos_categories.id=jos_content.catid 
AND jos_categories.section=jos_sections.id AND jos_content.state=1;";
 
$sth = $dbh->prepare($query);
$sth->execute();

Damit der Zugriff auf die einzelnen Spalten einfacher wird, bindet man die einzelnen Spalten an Variablen.

$sth->bind_columns(\$sectionsalias,\$contentid,\$contantalias,\$categoriesid,\$categoriesalias,
\$contentmodified);

Und arbeitet sich in einer Schleife durch die einzelnen Links.

while($sth->fetch()){
        print "\t<url>\n";
        print "\t\t<loc>$baseurl$sectionsalias/$categoriesalias/$categoriesid-
              $categoriesalias/$contentid-$contantalias.html</loc>\n";
        print "\t\t<lastmod>$contentmodified</lastmod>\n";
        print "\t</url>\n";
}

Danach beendet man die Abfrage.

$sth->finish();

Das wiederholt man nun für die Bereichsübersicht…

# sections
$query = "SELECT DISTINCT jos_sections.alias,
MAX(DATE(jos_content.modified)) 
FROM jos_content,jos_sections,jos_categories WHERE 
jos_categories.id=jos_content.catid 
AND jos_categories.section=jos_sections.id 
AND jos_content.state=1 GROUP BY jos_sections.alias";
$sth = $dbh->prepare($query);
$sth->execute();
$sth->bind_columns(\$sectionsalias, \$contentmodified);
while($sth->fetch()){
	print "\t<url>\n";
	print "\t\t<loc>$baseurl$sectionsalias.html</loc>\n";
	print "\t\t<changefreq>daily</changefreq>\n";
	print "\t\t<lastmod>$contentmodified</lastmod>\n";
	print "\t</url>\n";
}
$sth->finish();

und für die Kategorieübersicht.

# categories
$query = "SELECT DISTINCT jos_sections.alias,jos_categories.alias
,MAX(DATE(jos_content.modified)) 
FROM jos_content,jos_sections,jos_categories 
WHERE jos_categories.id=jos_content.catid 
AND jos_categories.section=jos_sections.id 
AND jos_content.state=1 GROUP BY jos_categories.alias";
$sth = $dbh->prepare($query);
$sth->execute();
$sth->bind_columns(\$sectionsalias,\$categoriesalias,\$contentmodified);
while($sth->fetch()){
	print "\t<url>\n";
	print "\t\t<loc>$baseurl$sectionsalias/$categoriesalias.html</loc>\n";
	print "\t\t<changefreq>daily</changefreq>\n";
	print "\t\t<lastmod>$contentmodified</lastmod>\n";
	print "\t</url>\n";
}
$sth->finish();

Zuguterletzt schließt man die verbleibenden Tags und die Verbindung zur Datenbank.

print "\n";
 
$dbh->disconnect;

gen_sitemap

2 Gedanken zu „Joomla 1.5 Sitemap mit Perl“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.