CastMatrix

公開サイト・SEO

SEO・アナリティクス設定


概要

CastMatrix に組み込まれている SEO 関連の機能一覧です。

機能 状態 設定場所
Google Analytics(GA4) ✅ 実装済み 管理画面 → サイト設定
ページタイトル ✅ 自動生成 管理画面 → 店舗基本情報(shop_name)
メタディスクリプション ✅ 部分実装 キャッチフレーズ欄
OGP / SNS カード ✅ 実装済み 自動(キャスト詳細は動的)
canonical URL ✅ 実装済み 自動(全ページ)
sitemap.xml ✅ 実装済み /sitemap.xml(動的生成)
robots.txt ✅ 実装済み /robots.txt(動的生成)
noIndex 制御 ✅ 実装済み 対象ページに自動付与

1. Google Analytics(GA4)の設定

設定方法

管理画面 → サイト設定/cmm/settings/site)→「Google Analytics ID」欄に測定 ID を入力して保存します。

G-XXXXXXXXXX

GA4 の測定 ID は Google アナリティクス → 管理 → データストリーム → ウェブストリームの詳細で確認できます。

動作

  • 管理画面に ID を登録すると、公開サイトの全ページgtag.js スクリプトが自動挿入されます。
  • コードの変更・再デプロイは不要です。ID を空欄に戻すとスクリプト挿入が停止します。

2. ページタイトル(<title>

各ページのタイトルは次のルールで自動生成されます。

ページ タイトル形式
トップ(/home {shop_name}
キャスト一覧(/casts キャスト一覧 | {shop_name}
キャスト詳細(/casts/:id {キャスト名} | {shop_name}
出勤表(/schedule 出勤スケジュール | {shop_name}
ランキング(/ranking 人気ランキング | {shop_name}
クーポン(/coupon クーポン・バナー | {shop_name}
料金・案内(/system 料金・システム | {shop_name}
求人(/recruit/* 求人タイトル | {shop_name}
フリーページ(/pages/:slug {ページタイトル} | {shop_name}
お気に入り(/favorites お気に入り(noindex)

shop_name は管理画面 → 店舗基本情報/cmm/settings/shop)で設定します。
09-shop-and-recruit.md(購入後 ZIP 同梱)


3. メタディスクリプション(<meta name="description">

ページ ディスクリプション
トップ(/home shop.catchphraseSite_Settingscatchphrase キー)
キャスト詳細(/casts/:id キャストの catchphrase(キャスト編集画面で設定)
その他のページ 設定なし(クローラーが本文から自動生成)

4. OGP(Open Graph Protocol)/ SNS シェア

SNS(X/Twitter・LINE・Facebook 等)でシェアされたときのカード表示です。

全ページ共通

タグ
og:title ページタイトル
og:description メタディスクリプション(設定されている場合)
og:type website
twitter:card summary_large_image

キャスト詳細(/casts/:id)のみ追加

タグ
og:url ページの完全 URL(例: https://shop.example.com/casts/1
og:image キャストのメイン画像 URL(R2 または CF Images)

キャスト詳細ページは SSR のため、SNS がページを取得した際にキャストの最新情報が反映されます。

OGP 画像の推奨仕様

項目 推奨値
サイズ 1200 × 630 px
アスペクト比 1.91:1
形式 JPEG または WebP
ファイルサイズ 1 MB 以下

キャスト写真は縦長(3:4)のため、SNS カードでは上下がクロップされます。顔が中央に写っている構図を推奨します。


5. canonical URL

全ページに <link rel="canonical"> が自動挿入されます。

<!-- キャスト詳細など og:url が明示されているページ -->
<link rel="canonical" href="https://shop.example.com/casts/1" />

<!-- その他のページ(リクエスト URL をそのまま使用) -->
<link rel="canonical" href="https://shop.example.com/home" />

動作の仕組み:

  • キャスト詳細(/casts/:id)では og:url と同じ値(ページの完全 URL)を使用します。
  • 他のページでは Astro.url.href(リクエスト URL)を使用します。
  • カスタムドメインで公開すると、自動的に本番ドメインの URL が入ります。

6. sitemap.xml

/sitemap.xml にアクセスすると、現在の DB を参照して動的に生成された XML が返ります。
コードの変更なしに、キャストの登録・退店が自動的に反映されます。

収録されるページ

URL パターン changefreq priority
/(年齢確認・サイト入口) monthly 1.0
/home daily 0.9
/casts daily 0.9
/schedule daily 0.9
/ranking weekly 0.7
/coupon weekly 0.7
/system monthly 0.6
/recruit/cast monthly 0.5
/recruit/staff monthly 0.5
/casts/:id(在籍キャスト全員) weekly 0.8

収録されないページ

noIndex 指定のページ(//favorites)と管理画面(/cmm/*)はサイトマップに含まれません。

キャッシュ

Cache-Control: public, max-age=3600(1 時間)。新規キャスト登録後、最大 1 時間でサイトマップに反映されます。


7. robots.txt

/robots.txt も動的生成されます。カスタムドメインを設定すると、そのドメインの sitemap URL が自動で含まれます。

User-agent: *
Allow: /
Disallow: /cmm/
Sitemap: https://shop.example.com/sitemap.xml

管理画面(/cmm/)はクローラーをブロックします。


8. クローラーバイパスと noIndex

クローラーバイパス(全ページインデックス)

frontend/src/middleware.ts は Google・Bing 等の主要クローラーを User-Agent で判別し、年齢確認リダイレクトをスキップします。クローラーはすべてのコンテンツページに直接アクセスでき、インデックスされます。

対象クローラー: Googlebot / Bingbot / Yahoo Slurp / DuckDuckBot / Baidu / Yandex / SEMrush / Ahrefs

noIndex ページ

ページ 理由
/favorites(お気に入り) localStorage ベースの個人データページ
/cmm/*(管理画面) robots.txtDisallow: /cmm/ でブロック

/(年齢確認)はインデックス対象です。Google 検索で店舗名を検索した際、年齢確認ページが入口として表示されます。


9. SEO 設定チェックリスト

ローンチ前に以下を確認してください。

  • 管理画面 → 店舗基本情報で shop_name を本番の店舗名に設定した
  • Google Analytics 測定 ID(G-XXXXXXXXXX)を管理画面のサイト設定に登録した
  • キャストの catchphrase(キャッチフレーズ)を入力した(ディスクリプション・OGP に使用)
  • キャストのメイン画像を設定した(OGP 画像として SNS カードに使用)
  • カスタムドメインを HTTPS で公開した(canonical・sitemap・GA が正しいドメインで動作)
  • https://shop.example.com/sitemap.xml にアクセスして XML が返ることを確認した
  • https://shop.example.com/robots.txt にアクセスして正しい内容を確認した
  • Google Search Console にサイトを登録し、sitemap URL を送信した