XML sitemap

typo3/cms-seo provides a ready to use XML sitemap that can be included via Site sets (recommended) or include in your TypoScript record.

How to access your XML sitemap

You can access the sitemaps by visiting https://example.org/?type=1533906435. You will first see the sitemap index. By default, there is one sitemap in the index. This is the sitemap for pages.

How to setup routing for the XML sitemap

You can use the PageType decorator to map page types to a fixed suffix. This allows you to expose the sitemap with a readable URL, for example https://example.org/sitemap.xml.

Additionally, you can map the parameter sitemap, so that the links to the different sitemap types (pages and additional ones, for example, from the news extension) are also mapped.

config/sites/<your_site>/config.yaml
routeEnhancers:
  PageTypeSuffix:
    type: PageType
    map:
      /: 0
      sitemap.xml: 1533906435
  Sitemap:
    type: Simple
    routePath: 'sitemap-type/{sitemap}'
    aspects:
      sitemap:
        type: StaticValueMapper
        map:
          pages: pages
          tx_news: tx_news
          my_other_sitemap: my_other_sitemap
Copied!

Data providers for XML sitemaps

The rendering of sitemaps is based on data providers implementing :php:`TYPO3CMSSeoXmlSitemapXmlSitemapDataProviderInterface.

typo3/cms-seo ships with the following data providers for XML sitemaps:

For pages: PagesXmlSitemapDataProvider

The \TYPO3\CMS\Seo\XmlSitemap\PagesXmlSitemapDataProvider will generate a sitemap of pages based on the detected site root. You can configure whether you have additional conditions for selecting the pages.

Via setting seo.sitemap.pages.excludedDoktypes it is possible to exclude certain Types of pages.

Additionally, you may exclude page subtrees from the sitemap (for example internal pages). This can be configured using setting seo.sitemap.pages.excludePagesRecursive.

If your site still depend on TypoScript records instead of site sets, you can make these settings via TypoScript constants.

For special use cases you might want to override the default TypoScript provided by the set.

For database records: RecordsXmlSitemapDataProvider

If you have an extension installed and want a sitemap of those records, the \TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider can be used. The following example shows how to add a sitemap for news records:

EXT:my_extension/Configuration/Sets/XmlSitemapNews/setup.typoscript
plugin.tx_seo {
  config {
    xmlSitemap {
      sitemaps {
        myNewsSitemap {
          provider = TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider
          config {
            table = news_table
            sortField = sorting
            lastModifiedField = tstamp
            changeFreqField = news_changefreq
            priorityField = news_priority
            additionalWhere = AND ({#no_index} = 0 OR {#no_follow} = 0)
            pid = <page id('s) containing news records>
            recursive = <number of subpage levels taken into account beyond the pid page. (default: 0)>
            url {
              pageId = <your detail page id>
              fieldToParameterMap {
                uid = tx_extension_pi1[news]
              }
              additionalGetParameters {
                tx_extension_pi1.controller = News
                tx_extension_pi1.action = detail
              }
            }
          }
        }
      }
    }
  }
}
Copied!

You can add multiple sitemaps and they will be added to the sitemap index automatically. Use different types to have multiple, independent sitemaps:

EXT:my_extension/Configuration/Sets/XmlSitemapMultiple/setup.typoscript
seo_googlenews < seo_sitemap
seo_googlenews.typeNum = 1571859552
seo_googlenews.10.sitemapType = googleNewsSitemap

plugin.tx_seo {
  config {
    xmlSitemap {
      sitemaps {
        news {
          provider = GeorgRinger\News\Seo\NewsXmlSitemapDataProvider
          config {
            # ...
          }
        }
      }
    }
    googleNewsSitemap {
      sitemaps {
        news {
          provider = GeorgRinger\News\Seo\NewsXmlSitemapDataProvider
          config {
            googleNews = 1
            # ...
            template = GoogleNewsXmlSitemap.xml
          }
        }
      }
    }
  }
}
Copied!

Change frequency and priority

Change frequencies define how often each page is approximately updated and hence how often it should be revisited (for example: News in an archive are "never" updated, while your home page might get "weekly" updates).

Priority allows you to define how important the page is compared to other pages on your site. The priority is stated in a value from 0 to 1. Your most important pages can get an higher priority as other pages. This value does not affect how important your pages are compared to pages of other websites. All pages and records get a priority of 0.5 by default.

The settings can be defined in the TypoScript configuration of an XML sitemap by mapping the properties to fields of the record by using the options changeFreqField and priorityField. changeFreqField needs to point to a field containing string values (see pages TCA definition of field sitemap_changefreq), priorityField needs to point to a field with a decimal value between 0 and 1.

Sitemap of records without sorting field

Sitemaps are paginated by default. To ensure that as few pages of the sitemap as possible are changed after the number of records is changed, the items in the sitemaps are ordered. By default, this is done using a sorting field. If you do not have such a field, make sure to configure this in your sitemap configuration and use a different field. An example you can use for sorting based on the uid field:

EXT:my_extension/Configuration/Sets/XmlSitemapTableWithoutSorting/setup.typoscript
plugin.tx_seo {
  config {
    xmlSitemap {
      sitemaps {
        myUnsortedTable {
          config {
            sortField = uid
          }
        }
      }
    }
  }
}
Copied!

Create a custom XML sitemap provider

If you need more logic in your sitemap, you can also write your own sitemap provider. You can do this by extending the \TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider class or implementing \TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider .

The main methods of interest are getLastModified() and getItems().

The getLastModified() method is used in the sitemap index and has to return the date of the last modified item in the sitemap.

The getItems() method has to return an array with the items for the sitemap:

EXT:my_extension/Classes/XmlSitemap/MyXmlSitemapProvider.php
$this->items[] = [
    'loc' => 'https://example.org/page1.html',
    'lastMod' => '1536003609'
];
Copied!

The loc element is the URL of the page to be crawled by a search engine. The lastMod element contains the date of the last update of the specific item. This value is a UNIX timestamp. In addition, you can include changefreq and priority as keys in the array to give search engines a hint.

Use a customized sitemap XSL file

The XSL file used to create a layout for an XML sitemap can be configured at three levels:

  1. For all sitemaps:

    EXT:my_extension/Configuration/TypoScript/setup.typoscript
    plugin.tx_seo.config {
        xslFile = EXT:my_extension/Resources/Public/CSS/mySite.xsl
    }
    Copied!
  2. For all sitemaps of a certain sitemapType:

    EXT:my_extension/Configuration/TypoScript/setup.typoscript
    plugin.tx_seo.config.mySitemapType.sitemaps {
        xslFile = EXT:my_extension/Resources/Public/CSS/mySite.xsl
    }
    Copied!
  3. For a specific sitemap:

    EXT:my_extension/Configuration/TypoScript/setup.typoscript
    plugin.tx_seo.config.xmlSitemap.sitemaps.myNewsSitemap.config {
        xslFile = EXT:my_extension/Resources/Public/CSS/mySite.xsl
    }
    Copied!

The value is inherited until it is overwritten.

If no value is specified at all, EXT:seo/Resources/Public/CSS/Sitemap.xsl is used as default.