mcpField
T
typo3-seo

typo3-seo

github.com/dirnbauer营销与增长3379 次安装13 周前更新
代码仓库

关于 typo3-seo

面向开发者和站点管理员的 TYPO3 v14 SEO 配置技能,介绍核心 SEO 设置,以及元数据、多语言标签、站点地图、robots.txt 和规范 URL 的配置,并遵循 TYPO3 API 与惯例。

主要功能

  1. 01设置 TYPO3 SEO 扩展
  2. 02配置元数据和社交标签
  3. 03生成多语言 hreflang 标签
  4. 04配置 XML 站点地图和 robots.txt
  5. 05管理规范 URL

适用场景

  1. 01为 TYPO3 页面添加 SEO 字段
  2. 02配置搜索和社交分享元数据
  3. 03设置站点地图和 robots.txt 路由
  4. 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.md
07-performance-seo.md
08-seo-checklist.md
09-seo-extensions-typo3-v14.md
10-monitoring-and-analytics.md
appendix.md
full-guide.md
v14-notes.md

详细介绍

TYPO3 SEO 配置

来源:https://github.com/dirnbauer/webconsulting-skills

兼容性: 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 Graph
  • twitter_title、twitter_description、twitter_image - Twitter Cards
  • canonical_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" />
}

详细参考

如果任务需要详细示例、较长模板、故障排查矩阵、附录或上文未包含的章节,请阅读完整指南。处理范围较窄的任务时,请勿加载此文件,以便该技能遵循渐进式披露。

评论

支持 Markdown