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:
<?php
declare(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:


Aus der Reihe TYPO3 Tipps und Tricks
-
TYPO3 Tipps und Tricks: Seite programmatisch erstellen / Create Page Programmatically
-
Microsoft SQL Server (MSSQL) und TYPO3 in einem Docker-Container
-
Manueller/Programmatischer Login in Controller-Action (TYPO3 9)
Weitere interessante Beiträge zum Thema TYPO3 findest du hier.
Wir entwickeln digitale Lösungen mit Leidenschaft
Warum wir das tun? Weil die Verwirklichung Ihrer Vision unser größter Anspruch und die schönste Anerkennung ist. Deshalb nehmen wir uns gerne ausreichend Zeit für die Realisierung Ihres digitalen Projekts.
Kontaktieren Sie uns, wir sind gerne für Ihre Fragen da: