SEOSEO
Web版の最重要 KPI はオーガニック流入です。本ページは実装済みの SEO 要素と、 プロダクト仕様書の範囲外で未実装/計画中の項目を明確に分けて記載します。
Organic traffic is the web app's top KPI. This page separates what is actually implemented today from items that are planned but not yet built (and therefore not covered by the current product spec).
メタタグ(実装済み)Meta tags (shipped)
共通レイアウト web/home/src/layouts/BaseLayout.astro が全ページで以下を出力します。
The shared layout web/home/src/layouts/BaseLayout.astro emits the following on every page:
<title>/<meta name="description"><link rel="canonical">(省略時はPUBLIC_SITE_URL+Astro.url.pathname)(defaults toPUBLIC_SITE_URL+Astro.url.pathname)- OGP(
og:title,og:description,og:url,og:image,og:type,og:site_name,og:locale)Open Graph (og:title,og:description,og:url,og:image,og:type,og:site_name,og:locale) - Twitter カード(
summary_large_image,twitter:title/description/image)Twitter card (summary_large_image,twitter:title/description/image) - hreflang の alternate リンク(対応 locale 分 +
x-default)Alternatehreflanglinks for each supported locale +x-default
構造化データ JSON-LD(実装済み)Structured data — JSON-LD (shipped)
JSON-LD は共有パッケージ @parky/seo(web/packages/seo/src/json-ld.ts)が組み立て、
コンポーネント web/home/src/components/JsonLd.astro が
<script type="application/ld+json"> として埋め込みます。
ページ側でのインライン JSON-LD 手書きは禁止(CLAUDE.md の SEO 品質ゲート)。
JSON-LD is assembled by the shared @parky/seo package
(web/packages/seo/src/json-ld.ts) and injected through
web/home/src/components/JsonLd.astro as
<script type="application/ld+json">.
Inline JSON-LD on individual pages is forbidden by the SEO quality gate in CLAUDE.md.
| @type | 用途 | Used on | Builder |
|---|---|---|---|
Organization |
運営組織情報。parentOrganization としてハイフィールド株式会社(/company/#organization)にリンク |
Brand organization. Links to Highfield Inc. as parentOrganization at /company/#organization |
buildOrganizationJsonLd() |
WebSite |
全ページ。SearchAction 付きでサイト内検索ボックスをマークアップ |
All pages — includes a SearchAction markup for the site search box |
buildWebSiteJsonLd() |
BreadcrumbList |
階層のあるページ(ハブ、スポット詳細、メディア)。相対パスは siteUrl で絶対化 | Hierarchical pages (hubs, spot details, media). Relative paths are absolutized against siteUrl | buildBreadcrumbJsonLd() |
ParkingFacility |
スポット詳細・駅ハブの駐車場リスト要素。openingHoursSpecification(24h / HH:MM-HH:MM パターンのみ schema 化、それ以外は省略)、amenityFeature(高さ/幅/長さ/重量、EV、車椅子)、aggregateRating + review |
Spot detail and station-hub list items. Builds openingHoursSpecification (only for parsable 24h / HH:MM-HH:MM strings — free-form text is dropped to keep rich-results valid), amenityFeature (height / width / length / weight, EV, wheelchair), and aggregateRating + review |
buildParkingFacilityJsonLd() |
ItemList + ParkingFacility / LightweightItemList |
ハブページの駐車場リスト。重量版(フル詳細埋込)と軽量版(URL+name のみ・重複は @id で名寄せ) |
Hub parking lists. Heavy version embeds full ParkingFacility objects; lightweight version emits URL + name only (Google merges via @id) |
buildItemListJsonLd() / buildLightweightItemListJsonLd() |
FAQPage |
ハブ / メディアの FAQ セクション | FAQ sections on hubs and media pages | buildFAQPageJsonLd() |
Place |
駅・ランドマークページ(駅ハブ /p/[pref]/[city]/[spotSlug]/ と英語ミラー)。Wikidata 等を sameAs |
Station / landmark page (the station hub and its English mirror). Wikidata URIs go in sameAs |
buildPlaceJsonLd() |
CollectionPage |
都道府県ハブ・駅ハブ・シーン別 LP。配下の ItemList を mainEntity として持つ |
Prefecture hubs, station hubs, scene LPs. Embeds the relevant ItemList as mainEntity |
buildCollectionPageJsonLd() |
Article / BlogPosting / NewsArticle |
/media/[...slug]/ の記事本体。articleBody は事前抽出した plain text(空文字なら省略)。著者は authorUrl があれば Person、無ければ Organization fallback。image 未指定時は og-default.png へ fallback |
Article body on /media/[...slug]/. articleBody is pre-extracted plain text (omitted when empty). Author becomes a Person when authorUrl is set, otherwise falls back to the Organization. Missing image falls back to og-default.png |
buildArticleJsonLd() |
LocalBusiness は使っていません(駐車場の主スキーマは ParkingFacility)。Article / NewsArticle はメディア記事で実装済みです(旧版ドキュメントの「未実装」記述を訂正)。
We do not emit LocalBusiness (parking lots use ParkingFacility). Article / NewsArticle are emitted for media bodies — earlier docs that said otherwise were out of date.
サイトマップと robots(実装済み)Sitemap & robots (shipped)
@astrojs/sitemapintegration をastro.config.mjsで組み込み、filterで dev 環境と/companyと/legal/tokutei(法務監修中)を除外。SSG ページのみを列挙する@astrojs/sitemapwired up inastro.config.mjs; thefilterdrops the dev environment,/company, and/legal/tokutei(under legal review). It only lists SSG pages- SSR ページ(駅ハブ 3 階層・記事・カテゴリ)は
src/pages/sitemap-pages.xml.tsが動的生成する別 sitemap (/sitemap-pages.xml) で補完。BFF からfetchPublishableStationHubs/fetchAllPublishedArticles等で取得 - SSR pages (3-tier station hubs, articles, categories) are covered by a second sitemap (
/sitemap-pages.xml) generated bysrc/pages/sitemap-pages.xml.ts, populated from the BFF (fetchPublishableStationHubs,fetchAllPublishedArticles, …) /robots.txtはsrc/pages/robots.txt.tsで動的生成。PUBLIC_SITE_URLから環境判定し、dev は全面Disallow: /。prod はSitemap:で/sitemap-index.xmlと/sitemap-pages.xmlの両方を案内/robots.txtis generated bysrc/pages/robots.txt.ts; it detects the env viaPUBLIC_SITE_URL. Dev returns blanketDisallow: /; prod advertises both/sitemap-index.xmland/sitemap-pages.xmlviaSitemap:- AI クローラー(GPTBot / ClaudeBot / PerplexityBot / Google-Extended / Applebot-Extended 等)に prod では明示的
Allow、dev では明示的Disallowを出力(方針未定義と判定されないため) - AI crawlers (GPTBot / ClaudeBot / PerplexityBot / Google-Extended / Applebot-Extended, …) get an explicit
Allowon prod and an explicitDisallowon dev — so audits never flag the policy as "undefined" - dev 環境の
dist/_headers(deploy-public-dev.ymlが here-doc で生成。Apache.htaccessではない)がX-Robots-Tag: noindex, nofollow, noarchive, nosnippetを全レスポンスに付与する二重防御 - The dev
dist/_headers(written via here-doc indeploy-public-dev.yml— not an Apache.htaccess) also setsX-Robots-Tag: noindex, nofollow, noarchive, nosnippeton every response as a second layer of defense.
hreflang と国際化(実装済み)hreflang & i18n (shipped)
- Astro i18n routing。既定 locale
jaは prefix 無し、英語は/en/配下 - Astro i18n routing — default locale
jais prefix-less, English lives under/en/. BaseLayout.astroが各 locale の alternate リンクとx-default(ja 版)を出力BaseLayout.astroemits per-locale alternate links plusx-defaultpointing at the ja version.
Core Web Vitals の設計方針(一部未確認)Core Web Vitals — design guidelines (not all verified)
- LCP: ヒーロー画像は
loading="eager"+fetchpriority="high"で先読み - LCP: hero images should use
loading="eager"+fetchpriority="high". - CLS: すべての画像に明示的な width/height を付与し、地図 island は固定高さコンテナで予約する
- CLS: always set explicit width/height on images, and reserve a fixed-height container for the map island.
- INP: Mapbox 地図 island は
client:visibleで遅延ハイドレート - INP: Mapbox islands hydrate lazily via
client:visible.
監視(未実装 / 計画)Monitoring (planned, not yet built)
- (計画) HTTP ステータスの定期チェック(GitHub Actions cron + curl など)
- (Planned) Recurring HTTP status check (e.g. GitHub Actions cron + curl).
- (計画) sitemap 全 URL を突いて 404 を検知
- (Planned) Sweep every URL in the sitemap to detect 404s.
- (計画) Search Console / PageSpeed Insights の週次レビュー
- (Planned) Weekly Search Console / PageSpeed Insights review.
- (計画) 主要 URL への Lighthouse CI(PR ごと)
- (Planned) Lighthouse CI on key URLs per PR.