关于 typo3-seo
面向开发者和站点管理员的 TYPO3 v14 SEO 配置技能,介绍核心 SEO 设置,以及元数据、多语言标签、站点地图、robots.txt 和规范 URL 的配置,并遵循 TYPO3 API 与惯例。
主要功能
- 01设置 TYPO3 SEO 扩展
- 02配置元数据和社交标签
- 03生成多语言 hreflang 标签
- 04配置 XML 站点地图和 robots.txt
- 05管理规范 URL
适用场景
- 01为 TYPO3 页面添加 SEO 字段
- 02配置搜索和社交分享元数据
- 03设置站点地图和 robots.txt 路由
- 04处理不同站点变体的规范 URL
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dirnbauer/ webconsulting-skills --skill typo3-seo安装后在 Claude Code 中输入/typo3-seo确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/06-structured-data-json-ld.md07-performance-seo.md08-seo-checklist.md09-seo-extensions-typo3-v14.md10-monitoring-and-analytics.mdappendix.mdfull-guide.mdv14-notes.md详细介绍
TYPO3 SEO 配置
兼容性: TYPO3 v14.x 此技能中的所有 SEO 配置均适用于 TYPO3 v14。
优先使用 TYPO3 API: 创建自定义实现前,始终优先使用 TYPO3 的内置 API、核心功能和成熟惯例。不要重新实现 TYPO3 已经提供的功能。请务必查阅 TYPO3 官方文档,确认所用的 API 和方法在 TYPO3 v14 中存在且未被弃用。
1. SEO 核心扩展设置
安装
ddev composer require typo3/cms-seo
ddev typo3 extension:setup -e seo
ddev typo3 cache:flush
页面属性 SEO 选项卡
安装后,页面会有一个“SEO”选项卡,其中包含:
seo_title- 覆盖搜索引擎使用的页面标题description- 元描述og_title、og_description、og_image- Open Graphtwitter_title、twitter_description、twitter_image- Twitter Cardscanonical_link- 规范 URL 覆盖值no_index、no_follow- 机器人指令
2. Meta 标签配置
TypoScript 设置(TYPO3 v14)
page {
meta {
# Basic meta tags
viewport = width=device-width, initial-scale=1
robots = index,follow
author = webconsulting
# Open Graph (auto-filled by EXT:seo if page properties set)
og:type = website
og:site_name = {$site.name}
og:locale = de_AT
# Recommended social image: 1200×630 px; add og:image:width / og:image:height when known for faster previews
# Twitter Cards
twitter:card = summary_large_image
twitter:site = @webconsulting
}
}
动态元描述
page.meta.description = TEXT
page.meta.description {
# Page description, then slide rootline; add further fallbacks via stdWrap.if / constants (do not use {$...} inside `data` as a getText key)
data = page:description
ifEmpty.data = levelfield:-1,description,slide
htmlSpecialChars = 1
}
Hreflang 标签(多语言)
EXT:seo 会根据站点配置自动生成 hreflang 标签:
# config/sites/main/config.yaml
languages:
- languageId: 0
locale: de_AT
hreflang: de-AT
title: Deutsch
- languageId: 1
locale: en_GB
hreflang: en-GB
title: English
面向国际 SEO 时,如果要定位国际市场,请在站点配置中添加 x-default hreflang(通常为主要市场语言)——EXT:seo 会根据 languages 条目生成标签。
3. XML 站点地图配置
基本站点地图设置
# config/sites/main/config.yaml
base: 'https://example.com/'
routeEnhancers:
PageTypeSuffix:
type: PageType
map:
sitemap.xml: 1533906435
TypoScript 站点地图配置(TYPO3 v14)
plugin.tx_seo {
config {
xmlSitemap {
sitemaps {
# Pages sitemap (default)
pages {
provider = TYPO3\CMS\Seo\XmlSitemap\PagesXmlSitemapDataProvider
config {
excludedDoktypes = 3,4,6,7,199,254
additionalWhere = {#no_index} = 0 AND {#canonical_link} = ''
}
}
# News sitemap (example for EXT:news)
news {
provider = GeorgRinger\News\Seo\NewsXmlSitemapDataProvider
config {
table = tx_news_domain_model_news
sortField = datetime
lastModifiedField = tstamp
changeFreqField = sitemap_changefreq
priorityField = sitemap_priority
# Google largely ignores changefreq/priority — keep for other crawlers; focus on accurate lastmod
additionalWhere = {#hidden} = 0 AND {#deleted} = 0
pid = 123
url {
pageId = 45
fieldToParameterMap {
uid = tx_news_pi1[news]
}
additionalGetParameters {
tx_news_pi1.controller = News
tx_news_pi1.action = detail
}
# Match this with a News route enhancer that maps the namespaced tx_news_pi1 arguments.
# Example:
# routeEnhancers:
# NewsPlugin:
# type: Extbase
# extension: News
# plugin: Pi1
# routes:
# - routePath: '/{news-title}'
# _controller: 'News::detail'
# _arguments:
# news-title: news
}
}
}
# Products sitemap (custom extension)
products {
provider = TYPO3\CMS\Seo\XmlSitemap\RecordsXmlSitemapDataProvider
config {
table = tx_shop_domain_model_product
sortField = title
lastModifiedField = tstamp
pid = 100
recursive = 2
url {
pageId = 50
fieldToParameterMap {
uid = tx_shop_pi1[product]
}
additionalGetParameters {
tx_shop_pi1.controller = Product
tx_shop_pi1.action = show
}
}
}
}
}
}
}
}
站点地图索引
访问站点地图:https://example.com/sitemap.xml
如果没有路由增强器,通常会通过 ?type=1533906435 请求底层页面类型。TYPO3 会根据站点地图索引生成确切的子站点地图 URL。除非路由明确映射了这些 URL,否则不要硬编码 ?sitemap=... URL。
TYPO3 v14: 根据 Breaking #104422,站点地图 GET 参数的命名空间为
tx_seo[sitemap]和tx_seo[page]。上面的PageTypeSuffix增强器仅映射站点地图页面类型。核心默认使用查询参数处理站点地图索引分页;用于美化子 URL 的自定义路由增强器是可选的,必须定义正确的aspects,且必须避免使用与核心冲突的增强器键:
# Optional — NOT shipped by Core; tune routePath + aspects + mappers to your real sitemap segments.
CustomSitemapPagination:
type: Simple
routePath: 'sitemap/{sitemap}/{page}'
aspects:
sitemap:
type: StaticRangeMapper
start: '0'
end: '99'
page:
type: StaticRangeMapper
start: '0'
end: '999'
defaults:
page: '0'
_arguments:
sitemap: 'tx_seo/sitemap'
page: 'tx_seo/page'
请参阅 references/v14-notes.md,了解相同模式的上下文说明。
此增强器是可选的自定义增强器——核心会映射
tx_seo/sitemap,但按设计保留查询参数分页。添加后请进行充分测试。
分页和路由增强器: 核心会将
sitemap.xml映射到 SEO 页面类型;按设计,站点地图索引分页仍使用查询参数(核心不会提供用于tx_seo/page的现成美化 URL 增强器)。任何自定义增强器(例如上面的CustomSitemapPagination)都是可选的,且必须定义正确的aspects——不要将示例视为核心默认配置。
4. Robots.txt 配置
静态 Robots.txt
# public/robots.txt
User-agent: *
Allow: /
# Disallow TYPO3 backend and system directories
Disallow: /typo3/
Disallow: /typo3conf/
Disallow: /typo3temp/
# Sitemap location
Sitemap: https://example.com/sitemap.xml
通过 TypoScript 动态生成 Robots.txt
# Generate robots.txt dynamically
robotstxt = PAGE
robotstxt {
typeNum = 9999
config {
disableAllHeaderCode = 1
additionalHeaders.10.header = Content-Type: text/plain; charset=utf-8
}
10 = TEXT
10.value (
User-agent: *
Allow: /
Disallow: /typo3/
Disallow: /typo3conf/
Disallow: /typo3temp/
Sitemap: https://example.com/sitemap.xml
)
# For a dynamic base URL, derive it from site `base` (YAML), a TypoScript constant, or
# a small data processor — `TEXT.value` does not interpolate `{getEnv:...}` getText.
}
路由增强:
# config/sites/main/config.yaml
routeEnhancers:
PageTypeSuffix:
type: PageType
map:
robots.txt: 9999
5. 规范 URL
自动规范 URL
EXT:seo 会自动生成规范标签。请在站点中配置:
# config/sites/main/config.yaml
base: 'https://example.com/'
baseVariants:
- base: 'https://staging.example.com/'
condition: 'applicationContext == "Development"'
手动覆盖规范 URL
在页面属性的 SEO 选项卡中设置“Canonical URL”字段。
通过 TypoScript:
page.headerData.100 = TEXT
page.headerData.100 {
value = <link rel="canonical" href="https://example.com/specific-page" />
}
详细参考
如果任务需要详细示例、较长模板、故障排查矩阵、附录或上文未包含的章节,请阅读完整指南。处理范围较窄的任务时,请勿加载此文件,以便该技能遵循渐进式披露。