News
Alles was mich beschäftigt und bewegt
TYPO3 Sitemap mit TypoScript
Häufig ist es erforderlich, eine Webseite mit einer Sitemap auszustatten. Nun gibt es eine Vielzahl an Extensions, die dafür sorgen, dass eine Sitemap dynamisch aus den vorhandenen Seiten erzeugt wird.
Es ist nicht sinnvoll das gesamte System mit Extensions zu beladen, weil meist die Performance der Webseite darunter leidet. Mit etwas TypoScript und dem Wissen, wie eine XML-Sitemap aufgebaut ist, ist es möglich eine Sitemap ohne Extensions zu erstellen, die zudem noch die Möglichkeit bietet, andere Datensätze wie tt_news oder Datensätze aus eigenen Extensions darzustellen.
Das folgende Skript zeigt wie es geht:
sitemap = PAGE
sitemap {
typeNum = 200
config {
no_cache = 1
disableAllHeaderCode = 1
additionalHeaders = Content-Type: text/xml; charset=utf-8
simulateStaticDocuments = 0
# Wie lautet die BaseUrl der Seite?
absRefPrefix = {$baseUrlProtocol}://{$baseUrl}/
tx_realurl_enable = 1
}
10 = COA
10 {
wrap (
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.google.com/schemas/sitemap/0.84 www.google.com/schemas/sitemap/0.84/sitemap.xsd"
>|</urlset>
)
10 = HMENU
10 {
special = directory
# Ab welcher RootPage soll die Sitemap erstellt werden?
special.value = 1
# Sollen "NotInMenu"-Seiten angezeigt werden?
includeNotInMenu = 1
# Welche Seiten sollen nicht in der Sitemap erscheinen?
excludeUidList = 24,28,34
1 = TMENU
1 {
expAll = 1
NO {
doNotLinkIt = 1
stdWrap {
cObject = COA
cObject {
wrap = <url>|</url>
10 = TEXT
10 {
typolink {
parameter.field = uid
returnLast = url
}
wrap = <loc>|</loc>
}
20 = TEXT
20 {
field = SYS_LASTCHANGED
strftime = %Y-%m-%dT%H:%M:%SZ
wrap = <lastmod>|</lastmod>
}
30 = TEXT
30.value = <priority>1.0</priority><changefreq>weekly</changefreq>
if.isFalse.field = shortcut
}
}
}
}
2 < .1
2.NO.stdWrap.cObject.30.value = <priority>0.9</priority><changefreq>weekly</changefreq>
3 < .1
3.NO.stdWrap.cObject.30.value = <priority>0.8</priority><changefreq>monthly</changefreq>
4 < .1
4.NO.stdWrap.cObject.30.value = <priority>0.7</priority><changefreq>monthly</changefreq>
5 < .1
5.NO.stdWrap.cObject.30.value = <priority>0.6</priority><changefreq>monthly</changefreq>
6 < .1
6.NO.stdWrap.cObject.30.value = <priority>0.5</priority><changefreq>monthly</changefreq>
7 < .6
8 < .6
9 < .6
10 < .6
}
# news details
20 = CONTENT
20 {
table = tt_news
select {
orderBy = title ASC
languageField = sys_language_uid
# Wo sind die News-Datensätze gespeichert?
pidInList = 3
}
renderObj = COA
renderObj {
stdWrap.wrap = <url>|</url>
10 = TEXT
10 {
# Welche Seite enthält das News-Detail-Plugin?
typolink {
parameter = 24
additionalParams = &tx_ttnews[tt_news]={field:uid}
additionalParams.insertData = 1
returnLast = url
}
wrap = <loc>|</loc>
}
20 = TEXT
20 {
field = date
strftime = %Y-%m-%dT%H:%M:%SZ
wrap = <lastmod>|</lastmod>
}
30 = TEXT
30.value = <priority>0.7</priority><changefreq>weekly</changefreq>
}
}
}
}Beschreibung
Zuerst wird das Seiten-Objekt und der Seiten-Typ definiert, damit die Sitemap über den URL-Parameter `type=200` aufgerufen werden kann. Mit Hilfe eines HMENU werden in einem COA-Objekt die Seiten aufgebaut. Dabei muss in `special.value =` die PageId der Root-Seite und in `excludeUidList =` die PageIds eingetragen werden, welche nicht in der XML-Sitemap dargestellt werden sollen.
Anschließend können weitere Daten an das COA-Objekt angehängt werden. Im Beispiel werden die Datensätze aus tt_news an die Sitemap angehängt. Es muss darauf geachtet werden, dass mittels `pidInList =` der System-Ordner angegeben wird, in dem die News-Datensätze gespeichert sind und in `parameter =` die PageId der Detail-Seite angegeben wird. Wenn es mehrere News-Ordner und/ oder Detail-Seiten gibt, so kann dies beliebig oft wiederholt werden.