Typoscript XML Sitemap

Man kann sich mit Typoscript eine wunderbare XML Sitemap basteln, ohne dazu extra eine der vielen erhältlichen Extensions verwenden zu müssen.

In diesem Beispiel wird der komplette Seitenbaum abgebildet, plus zusätzlich die Einträge einer Extensiontabelle. Wenn man z.B. eine Auflistung von Newsartikeln inkl. einer Detailansicht zum jeweiligen Artikel hat, kann man diese Detailseiten ebenfalls hier hinzufügen. (ab 20 = CONTENT…)

xmlSitemap = PAGE
xmlSitemap {
  typeNum = 200
  config {
    no_cache = 1
    disableAllHeaderCode = 1
    additionalHeaders = Content-Type: text/xml; charset=utf-8
    simulateStaticDocuments = 0
    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 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd"
      >|</urlset>              
    )

    10 = HMENU
    10 {
      special = directory

      #Ausgangspunkt / Root Seite
      special.value = 1

      #1 = Standard
      #2 = Erweitert
      #3 = Externe URL
      #4 = Shortcut
      #5 = Nicht im MenÌ
      #6 = Backend Benutzer Bereich
      #7 = Mount Seite
      #199 = Abstand
      #254 = Sysordner
      #255 = Recycler

      excludeDoktypes = 2,3,5,6,7,199,254,255

      1 = TMENU
      1 {
        expAll = 1
        NO {
          doNotLinkIt = 1

          stdWrap {

            cObject = COA
            cObject {              

      wrap = <url>|</url>

        10 = TEXT
            10 {
              typolink {
                parameter.field = uid
                returnLast = url
                forceAbsoluteUrl = 1
              }
              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>   

            if.isFalse.field = shortcut              

      }

          }

        }
      }
      2 < .1
      2.NO.stdWrap.cObject.30.value = <priority>0.9</priority>
      3 < .1
      3.NO.stdWrap.cObject.30.value = <priority>0.8</priority>
      4 < .1
      4.NO.stdWrap.cObject.30.value = <priority>0.7</priority>
      5 < .1
      5.NO.stdWrap.cObject.30.value = <priority>0.6</priority>
      6 < .1
      6.NO.stdWrap.cObject.30.value = <priority>0.5</priority>
      7 < .6
      8 < .6
      9 < .6
      10 < .6
    }  

    # beliebige records...
    /*
    20 = CONTENT
    20 {
            table = tx_adprojects_domain_model_project
            select {
                orderBy = title ASC
                languageField = sys_language_uid
                pidInList = 11,12,13,14,15,30
            }
            renderObj = COA
            renderObj {
                stdWrap.wrap = <url>|</url>
                5 = TEXT
                5 {                    
                    typolink.parameter = 123                   
                    typolink.additionalParams = &tx_adprojects_projects[project]={field:uid}&tx_adprojects_projects[controller]=Project&tx_adprojects_projects[action]=show
                    typolink.additionalParams.insertData = 1
                    typolink.returnLast = url
                    typolink.forceAbsoluteUrl = 1
                    wrap = <loc>|</loc>
                }
                10 = TEXT
                10 {
                    field = tstamp
                    strftime = %Y-%m-%dT%H:%M:%SZ
                    wrap = <lastmod>|</lastmod>
                }
                20 = TEXT
                20.value = <priority>0.7</priority><changefreq>weekly</changefreq>
            }
        }

  }
  */

}

Ich denke das meiste ist selbsterklärend.

Die Ausgabe der Sitemap erhält man dann mittels der festgelegten Typenum. (http://www.domain.at/?type=200)
Mit der passenden realurl Config oder alternativ einer RewriteRule bekommt man das auch noch in schön hin:

//[...]
'fileName'=> array (
		'index'=> array (
			'sitemap.xml'=> array (
				'keyValues'=> array (
					'type'=>200,
				),
			),
//[...]

(http://www.domain.at/sitemap.xml)

12 Gedanken zu „Typoscript XML Sitemap“

  1. Habe ewigkeiten mit Extensions rumgehampelt, obwohl es doch so einfach und so sauber und so updatefähig geht.

    Vielen Dank!

  2. Hallo ich habe beruflich mit sehr vielen verschiedenen CMSen zu tun und kenne mich mit TypoScript überhaupt nicht aus. Wenn ich jedes CMS in allen Details lernen müsste käme ich gar nicht mehr hinterher. Ich finde die Möglichkeit eine XML Sitemap ohne Plugins zu erstellend sehr interessant. Kannst du mir sagen wo dieser Code in Typo3 in welchem Element eingefügt werden muss? Vielen Dank im Voraus.

    Tina

  3. Hallo

    Vielen Dank für den vielversprechenden Post – aber wie immer (und da schliesse ich mich meine Vor-Schreiberin an) kommt man als Neuling vom Hundersten ins Tausende. Ich habe ein Extension-Template mit Deinem Code definiert, bekomme aber nun beim Aufruf meiner Sitemap (https://www.board-portal-software.de/?type=200) nun immer vom Browser einen Redirect auf https://www.board-portal-software.de/start.html?type=200 präsentiert. Dieser enthält alles andere als eine braucbare Sitemap.

    Danke für jeden sachdienlichen Hinweis.

    Lieber Gruss

    Markus

    1. Hallo Markus,

      die Sitemap wird richtig generiert (sieh dir mal den Quelltext an), allerdings ohne korrekten XML Content-Type (daher stellt sie der Browser auch nicht als XML dar) und es befindet sich nur eine Seite (die Startseite) in der Sitemap.
      Wie sieht denn dein Seitenbaum aus? Wenn ich mir die Website so ansehe, finde ich da gar kein Menü mit Seiten, sondern nur Artikel. Diese XML-Sitemap ist primär für normale TYPO3-Seiten gedacht. Natürlich kann man auch Extension-Records in der XML-Sitemap ausgeben, siehe dazu den Abschnitt „# beliebige records…“. LG

  4. Hallo Alex,

    viele Dank für diesen Typoscript Snippet. Ich habe diesen in meiner TYPO3 (8.7) Instanz eingebunden aber der w3c validator bemängelt immer, dass die 1. Zeile eine blank line ist. Ich kann mir nicht erklären wo diese herkommen soll. Hast du einen Tipp für mich?

    Vielen Dank
    Christopher

Schreibe einen Kommentar

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