mcpField
T
typo3-seo

typo3-seo

github.com/dirnbauerマーケティング・グロース3379 回インストール13 週間前に更新
リポジトリ

typo3-seo について

開発者やサイト管理者向けの TYPO3 v14 SEO 設定スキルです。TYPO3 API と標準的な慣例に沿って、基本設定のほか、メタデータ、多言語タグ、サイトマップ、robots.txt、正規 URL の設定方法を説明します。

主な機能

  1. 01TYPO3 SEO 拡張のセットアップ
  2. 02メタデータとソーシャルタグの設定
  3. 03多言語 hreflang タグの生成
  4. 04XML サイトマップと robots.txt の設定
  5. 05正規 URL の管理

活用シーン

  1. 01TYPO3 ページへの 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 がすでに提供している機能を再実装しないでください。使用する API やメソッドが TYPO3 v14 に存在し、非推奨になっていないことを、必ず TYPO3 の公式ドキュメントで確認してください。

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 - canonical URL の上書き
  • no_index、no_follow - ロボット向けディレクティブ

2. メタタグの設定

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 でリクエストされます。子サイトマップの正確な URL は、TYPO3 がサイトマップインデックスから生成します。ルーティングで明示的にマッピングしていない限り、?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. Canonical URL

自動 canonical

EXT:seo は canonical タグを自動生成します。サイトで設定してください。

# config/sites/main/config.yaml
base: 'https://example.com/'
baseVariants:
  - base: 'https://staging.example.com/'
    condition: 'applicationContext == "Development"'
Canonical の手動上書き

ページプロパティの SEO タブで、「Canonical URL」フィールドを設定します。

TypoScript を使用する場合:

page.headerData.100 = TEXT
page.headerData.100 {
    value = <link rel="canonical" href="https://example.com/specific-page" />
}

詳細リファレンス

詳細な例、長いテンプレート、トラブルシューティング用マトリックス、付録、または上記に含まれていないセクションが必要なタスクでは、完全ガイドをお読みください。対象範囲の狭いタスクでは、このファイルを読み込まず、スキルが段階的開示に従うようにしてください。

コメント