TYPO3 9自定义扩展站点地图:动态详情页ID配置问题
解决TYPO3 9自定义Events扩展XML Sitemap动态详情页ID与Slug URL问题
你说的完全没错,默认的RecordsXmlSitemapDataProvider确实只能配置固定的pageId,没办法直接从活动记录的seite1字段动态读取对应的详情页ID,也没法自动生成你配置的Slug URL。要实现这个需求,我们需要自定义一个XML Sitemap数据提供者,继承默认类并重写URL生成逻辑。
步骤1:创建自定义XML Sitemap Data Provider
在你的tx_ntevents扩展里新建一个类文件Classes/XmlSitemap/VeranstaltungXmlSitemapDataProvider.php,代码如下:
<?php namespace NtEvents\XmlSitemap; use TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider; use TYPO3\CMS\Core\Utility\GeneralUtility; use TYPO3\CMS\Core\Routing\SiteMatcher; use TYPO3\CMS\Core\Routing\Router; class VeranstaltungXmlSitemapDataProvider extends RecordsXmlSitemapDataProvider { /** * 重写URL生成逻辑,动态获取详情页ID并生成Slug URL * @param array $record 当前活动记录 * @return array|null 生成的Sitemap URL数组 */ public function getUrl(array $record): ?array { // 先调用父类逻辑获取基础结构 $url = parent::getUrl($record); if (!$url) { return null; } // 读取当前记录的详情页ID(seite1字段) $detailPageId = (int)$record['seite1']; if ($detailPageId <= 0) { // 无有效详情页ID则跳过该条目 return null; } // 获取详情页所属的站点配置 $siteMatcher = GeneralUtility::makeInstance(SiteMatcher::class); try { $site = $siteMatcher->matchByPageId($detailPageId); } catch (\TYPO3\CMS\Core\Routing\Exception\SiteNotFoundException $e) { return null; } // 使用TYPO3路由生成器生成带Slug的URL $router = GeneralUtility::makeInstance(Router::class); try { $uri = $router->generateUri( $site, 'tx_ntevents_events', [ 'controller' => 'Veranstaltung', 'action' => 'show', 'veranstaltung' => $record['uid'] ], '', true ); $url['loc'] = (string)$uri; } catch (\TYPO3\CMS\Core\Routing\Exception\MissingRouteArgumentsException $e) { return null; } // 保留最后修改时间字段 $url['lastmod'] = $this->getLastModified($record); return $url; } }
步骤2:修改TX_SEO配置使用自定义Provider
更新你的TypoScript配置,替换默认的provider为自定义的类:
plugin.tx_seo { config { xmlSitemap { sitemaps { veranstaltung { provider = NtEvents\XmlSitemap\VeranstaltungXmlSitemapDataProvider config { table = tx_ntevents_domain_model_veranstaltung sortField = kursnummer lastModifiedField = tstamp recursive = 1 pid = 110 // 这里不再需要配置url节点的内容,自定义Provider会处理URL生成 } } } } } }
关键说明
- 这个自定义Provider继承了默认的
RecordsXmlSitemapDataProvider,所以保留了原有的记录查询、排序、递归遍历等逻辑,不用重新实现这些基础功能。 - 动态读取每条活动记录的
seite1字段作为详情页ID,确保每个活动都指向正确的详情页。 - 通过TYPO3的
Router类生成URL,自动匹配你在config.yaml里配置的Slug路由规则,生成美观的语义化URL。 - 如果某条活动记录没有设置有效的
seite1值,会自动跳过该条目,避免生成无效链接。
最后操作
- 清除TYPO3的所有缓存(包括类缓存,确保新的Provider类被加载)
- 访问你的站点
sitemap.xml,查看生成的活动条目是否已经正确使用了对应的详情页ID和Slug URL
内容的提问来源于stack exchange,提问作者qualle
相关产品推荐
相关产品推荐

