TYPO3 Tipps und Tricks: (Custom) Sitemap entwickeln mittels ext:seo

In diesem Blogbeitrag zeigen wir, wie man mit TYPO3 unter Verwendung der SEO-Core-Extension eine eigene XML-Sitemap erstellen bzw. entwickeln kann.

In diesem Beispiel werden in einem Buchshop noch weitere URL's erstellt in den Subkategorien von verschiedenen Themen. Das ist über die vorhandenen SEO-Provider (pages und  RecordsXmlSitemapDataProvider) nicht möglich.

Zuerst muss der Sitemap-Provider im Typoscript registriert werden:

plugin.tx_seo {  config {    xmlSitemap {      sitemaps {        topics {          provider = Various\VaTemplate\Seo\SolrXmlSitemapDataProvider          config {            facet = topic          }        }      }    }  }}

Anschließend muss natürlich die Klasse mit dem Sitemap Provider noch erstellt werden - diese Klasse muss von TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider erben. Die Funktion generateItems muss dann ein array mit den Einträgen für die Sitemap liefern:

<?phpdeclare(strict_types=1);namespace Varioous\VaTemplate\Seo;use GuzzleHttp\Client;use Psr\Http\Message\ServerRequestInterface;use TYPO3\CMS\Core\Context\Context;use TYPO3\CMS\Core\Utility\GeneralUtility;use TYPO3\CMS\Extbase\Mvc\Web\Routing\UriBuilder;use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;use TYPO3\CMS\Seo\XmlSitemap\AbstractXmlSitemapDataProvider;use TYPO3\CMS\Seo\XmlSitemap\Exception\MissingConfigurationException;use Varioous\VaTemplate\Domain\Model\BookCategory;use Varioous\VaTemplate\Utility\BookCategoryUtility;use Varioous\VaTemplate\Domain\Repository\BookCategoryRepository;class SolrXmlSitemapDataProvider extends AbstractXmlSitemapDataProvider{    /**     * @param ServerRequestInterface $request     * @param string $key     * @param array $config     * @param ContentObjectRenderer|null $cObj     * @throws MissingConfigurationException     */    public function __construct(ServerRequestInterface $request, string $key, array $config = [], ContentObjectRenderer $cObj = null)    {        parent::__construct($request, $key, $config, $cObj);        $this->generateItems();    }    /**     * @throws MissingConfigurationException     */    public function generateItems(): void    {		/** @var BookCategoryRepository $bookCategoryRepository */		$bookCategoryRepository = GeneralUtility::makeInstance('Varioous\\VaTemplate\\Domain\\Repository\\BookCategoryRepository');		$type = $this->config['facet'];        		$subCategories = $bookCategoryRepository->findSubcategories($langCode);		/** @var BookCategory $category */		foreach ($subCategories as $category) {			if (!in_array($category->getUid(), $processCategories)) {				if ($type == 'topic') {					if ($category->getPid() != 519) {						$topics = BookCategoryUtility::getTopicsForSitemap($category);						foreach ($topics as $tObj) {							//create sitemap entry							$uri = $uriBuilder->reset()->setTargetPageUid($category->getUid())->setCreateAbsoluteUri(true)->build() . '/' . urlencode($tObj);							$item = [								'priority' => 0.5							];							$item['changefreq'] = 'weekly';							$item['loc'] = $uri;							$this->items[] = $item;						}					}				}			}		}    }}

Das war es im Prinzip auch schon wieder. Um für das Sitemap auch noch eine sprechende URL zu erstellen muss man in der Siteconfig noch folgende Einstellung vornehmen:

routes:  -    route: sitemap.xml    type: uri    source: 't3://page?type=1533906435'

Wenn man nun das Sitemap aufruft (mittels [URL]/sitemap.xml) erhält man auch schon das fertige Sitemap:

TYPO3 Custom Sitemap
Custom Sitemap - sitemap.xml
TYPO3 Sitemap
TYPO3 custom Sitemap - sitemap.xml