You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:52:28