Wenn 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; |
2 Antworten auf „Joomla 1.5 Sitemap mit Perl“
Dankeeeeeee
Danke.
Das hat mich weiter gebracht.