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.