暫定日本語訳:Sanity SEO

暫定日本語訳:Sanity 店舗 コンテンツ as JSON と emits zero HTML — あなた frontend decides あなた SEO. Rendering modes, Portable Text, SEO object, sitemaps, draft-mode noindex, JSON-LD, と plugins.

初回公開:2026年6月27日 · 最終更新:2026年8月4日 · Advanced
言語

暫定日本語訳:Sanity is headless CMS その 店舗 コンテンツ as structured JSON in its コンテンツ Lake と produces no HTML — so あなた frontend framework (Next.js, Astro, Remix) decides everything について あなた SEO. single biggest lever is rendering: SSG と SSR ship 完全な HTML と are safe; CSR is risky because LLM-crawler rendering contracts vary by provider. Portable Text is JSON AST, ない HTML, so frontend 必要がある serialize it. 構築 reusable SEO object in コンテンツ model, generate sitemaps と JSON-LD programmatically, 保つ drafts out of インデックス登録 とともに X-Robots-Tag: noindex header, と 使用 sanity-plugin-seo (ない deprecated Yoast pane). SEO success in Sanity comes から intentional structure, ない plugins.

暫定日本語案: TL;DR — Sanity is コンテンツ-neutral: it 店舗 structured JSON in コンテンツ 暫定日本語案: Lake と emits zero HTML, so frontend’s rendering mode decides everything. 暫定日本語案: SSG と SSR ship 完全な HTML と are safe; CSR is risky one because LLM 暫定日本語案: crawlers don’t execute JavaScript, と Google deprecated dynamic rendering as 暫定日本語案: workaround. Portable Text is JSON AST その frontend 必要がある serialize. 構築 暫定日本語案: reusable seo object in コンテンツ model とともに overrides (ない requirements) via 暫定日本語案: coalesce(), generate sitemaps と JSON-LD programmatically から existing fields, 暫定日本語案: と 保つ drafts out of インデックス登録 とともに X-Robots-Tag: noindex header on すべての 暫定日本語案: preview レスポンス. 使用 sanity-plugin-seo — 決して deprecated Yoast pane — ただし 暫定日本語案: remember “SEO success in Sanity comes from intentional structure, not plugins.”

Sanity is コンテンツ storage, ない publisher

暫定日本語案: useful 最初 principle: Sanity touches あなた コンテンツ, 決して あなた rendering. 暫定日本語案: コンテンツ Lake 店舗 everything as structured JSON, queried とともに GROQ 暫定日本語案: (Sanity’s クエリ 言語) または REST. Sanity Studio — editing UI — is React 暫定日本語案: single-ページ app その usually lives on its own .sanity.studio subdomain と isn’t 暫定日本語案: something あなた インデックス登録. Nothing in この stack produces HTML.

Evidence for this claim Sanity Content Lake is queried using APIs and GROQ; it is distinct from a site's frontend rendering layer. Scope: Sanity-hosted content data and query APIs. Confidence: high · Verified: Sanity: Content Lake

暫定日本語案: So entire SEO surface lives in あなた frontend framework. As Webstacks put it, 暫定日本語案: “Sanity handles content storage and editing, while your frontend framework handles SEO output.” その’s ない limitation — it’s whole headless model. Sanity’s own 暫定日本語案: team frames it well: “When using Sanity as a CMS, you’re doing headless SEO. Although this approach requires thoughtful technical implementation, it can liberate your content to help you reach more users across all channels.” 機能 is real, 暫定日本語案: ただし it’s 同じ 機能 as any headless 構築 (see 暫定日本語案: SEO 向けに Headless CMS).

Rendering mode is foundation

暫定日本語案: Because frontend 構築 HTML, rendering decision is single 大半の 暫定日本語案: consequential SEO choice on Sanity サイト. Four modes:

暫定日本語案: SSG — Static サイト Generation. コンテンツ is fetched から Sanity at 構築 time と 暫定日本語案: baked へ static HTML served から CDN. Best-ケース SEO: fully-rendered HTML on 暫定日本語案: 最初 リクエスト, fast TTFB. Ideal 向けに blog posts, marketing ページ, と 商品/landing 暫定日本語案: ページ. tradeoff is freshness — changed コンテンツ needs rebuild (ISR solves この).

暫定日本語案: SSR — サーバー-Side Rendering. コンテンツ is fetched per リクエスト と full HTML is 暫定日本語案: rendered on サーバー. Excellent SEO, 常に fresh. 使用 it 向けに frequently updated 暫定日本語案: コンテンツ. Tradeoff is infrastructure cost と slightly higher TTFB than static files.

暫定日本語案: ISR — Incremental Static Regeneration (Vercel/Next.js). Static ページ regenerate 暫定日本語案: in background, ideally triggered by Sanity webhook on publish so ページ 暫定日本語案: rebuilds moment editor hits publish. この is best of SSG’s speed と SSR’s 暫定日本語案: freshness 向けに コンテンツ その changes on order of hours または days.

暫定日本語案: CSR — クライアント-Side Rendering. HTML shell ships, then JavaScript fetches から 暫定日本語案: Sanity と 構築 DOM in ブラウザー. この is worst SEO option: Googlebot 暫定日本語案: has へ queue ページ 向けに later render wave, timing is unpredictable, と AI 暫定日本語案: crawlers と many other bots see だけ shell. CSR is acceptable だけ behind 暫定日本語案: authentication 向けに コンテンツ あなた don’t want インデックス登録 anyway.

暫定日本語案: と don’t reach 向けに 古い shortcut: Google has deprecated dynamic rendering 暫定日本語案: (serving prerendered HTML へ bots, CSR へ ユーザー). Officially, “dynamic rendering was a workaround and not a long-term solution,” と Google 現在 recommends 暫定日本語案: “server-side rendering, static rendering, or hydration.” 向けに Sanity サイト, その 暫定日本語案: means SSG または SSR — ない bot-detection hack. (Full rendering treatment in 暫定日本語案: JavaScript SEO.)

Evidence for this claim Google describes dynamic rendering as a workaround rather than a recommended long-term solution and recommends server-side rendering, static rendering, or hydration. Scope: Google Search guidance for JavaScript sites. Confidence: high · Verified: Google: Dynamic rendering

Portable Text — あなた body copy is JSON AST

暫定日本語案: この is 大半の Sanity-specific thing on ページ. Sanity 店舗 rich text as 暫定日本語案: Portable Text: JSON abstract syntax tree, ない HTML. Body copy in コンテンツ 暫定日本語案: Lake looks like array of typed blocks, ない <p> tags. あなた frontend has へ 暫定日本語案: serialize it へ HTML 前に any crawler できる read it:

  • 暫定日本語案: @portabletext/react — 向けに React/Next.js.
  • 暫定日本語案: @portabletext/to-html — framework-agnostic (Astro, Remix, anything).
  • 暫定日本語案: 古い @sanity/block-content-to-react is deprecated — don’t 使用 it.

暫定日本語案: If あなた render サーバー-side または at 構築 time, serialization happens 前に ページ is 暫定日本語案: sent と crawlers get full HTML. If あなた render クライアント-side, serialization runs 暫定日本語案: in ブラウザー. Because LLM-crawler rendering contracts vary by provider, CSR 暫定日本語案: Portable Text creates coverage risk その raw HTML avoids. There’s また handy GROQ 暫定日本語案: helper: pt::text(body) extracts all plain text から Portable Text field as 暫定日本語案: string, which is perfect 向けに feeding JSON-LD 説明 なしで separate editor 暫定日本語案: field.

コンテンツ modeling 向けに SEO — reusable SEO object

暫定日本語案: cleanest pattern, と one Sanity’s own course teaches, is single 暫定日本語案: reusable seo object 追加 へ すべての document type — ない SEO fields copy-pasted per 暫定日本語案: type. key design principle から Sanity Learn: “For the benefit of content authors, fields relevant to SEO should not always be required. Instead, they should be used to override some existing content, when provided.”

暫定日本語案: In practice その means SEO fields are overrides とともに fallbacks, implemented とともに 暫定日本語案: GROQ’s coalesce():

"title": coalesce(seo.title, title, ""),
"description": coalesce(seo.description, excerpt, "")

暫定日本語案: minimum viable seo object: metaTitle (≤65 chars), metaDescription 暫定日本語案: (≤155 chars), canonicalUrl, openGraphImage (1200×630), と noIndex boolean. 暫定日本語案: 追加 Sanity validation rules へ enforce それらの character limits 前に publish — 暫定日本語案: so editors catch 問題 プラットフォーム する otherwise let 通じて. 使用 slug 暫定日本語案: type とともに カスタム generation function, と 使用 references 向けに internal links so 暫定日本語案: URL changes propagate 自動. 追加 hideFromSearch boolean と filter it out 暫定日本語案: of both sitemap GROQ クエリ ページ’s robots metadata.

Metadata, sitemaps, と canonicals — all built in frontend

暫定日本語案: Metadata. In Next.js App Router, 使用 エクスポート generateMetadata() function 暫定日本語案: (ない inline <head> tags) so metadata doesn’t duplicate 全体で nested layouts. 暫定日本語案: 構築 one サーバー-side helper その takes GROQ result と returns framework’s 暫定日本語案: metadata object — implement it once, 使用 it everywhere. Open Graph 画像 できる be 暫定日本語案: generated dynamically とともに Next.js Edge OG generation, pulling コンテンツ straight から 暫定日本語案: Sanity.

暫定日本語案: Sitemaps. There’s no auto-sitemap. あなた 構築 it から GROQ クエリ → URL array → 暫定日本語案: XML (sitemap.ts in Next.js, @astrojs/sitemap in Astro). 常に filter drafts と 暫定日本語案: hidden ページ:

*[_type in ["page", "post"] && defined(slug.current) && hideFromSearch != true]

暫定日本語案: 使用 _updatedAt (ない _createdAt または 手動 date) 向けに lastModified, 保つ 暫定日本語案: individual sitemap files 下で 50 000 URLs とともに インデックス登録 向けに larger サイト, と 暫定日本語案: trigger regeneration via Sanity webhook on publish/unpublish so it 決して goes stale.

暫定日本語案: Canonicals. 設定 canonical URLs から コンテンツ model, デフォルト へ 暫定日本語案: self-referencing canonical, と 構築 absolute URLs から single SITE_URL so 暫定日本語案: canonical 決して drifts. (Mechanics in 暫定日本語案: Canonicalization.)

Structured データ — generate it, don’t author it

暫定日本語案: right pattern is へ generate JSON-LD programmatically から existing コンテンツ 暫定日本語案: fields at render time — 決して 構築 separate JSON-LD editor surface in Studio, 暫定日本語案: which just creates drift 間に コンテンツ と markup. Roboto Studio’s rule is blunt: 暫定日本語案: “Derive JSON-LD from existing fields, at render time, in code.” Sanity agrees — 暫定日本語案: “JSON-LD is a powerful way to provide structured data to search engines — fortunately structured data is what Sanity does best.”

暫定日本語案: 使用 pt::text(body) へ pull plain text 向けに schema 説明, TypeScript 暫定日本語案: package schema-dts 向けに type safety, と render it とともに 暫定日本語案: <script type="application/ld+json">. Note その “the JSON-LD markup can be rendered anywhere in the page — it doesn’t need to be stored inside the <head>.” Priority types 向けに コンテンツ サイト: 記事/BlogPosting, 暫定日本語案: BreadcrumbList, FAQPage, Organization, Webサイト.

保持 drafts out of Google — real-incident pitfall

暫定日本語案: Sanity’s perspective system controls draft visibility: published returns だけ 暫定日本語案: production コンテンツ; drafts returns draft documents 向けに preview. 常に 使用 暫定日本語案: published perspective in production API calls. ただし その alone isn’t enough, 暫定日本語案: because draft URLs leak. As one developer recounted, danger is 暫定日本語案: “a client panicking because an unpublished landing page showed up in Google Search Console. If a content editor shares that URL in Slack, and someone clicks it from a browser that’s then crawled (it happens), the draft content can end up indexed.”

暫定日本語案: reliable defense is multi-layer one:

  1. 暫定日本語案: 使用 published perspective in production; 決して expose unprotected preview 暫定日本語案: endpoint.
  2. 暫定日本語案: 追加 X-Robots-Tag: noindex HTTP header へ すべての draft-mode/preview 暫定日本語案: レスポンス — even if draft URL leaks と gets クロール, Googlebot respects 暫定日本語案: header と won’t インデックス登録 it. (Don’t rely on robots.txt 向けに この; header is more 暫定日本語案: reliable than disallow 向けに preview ページ.)
  3. 暫定日本語案: Validate preview secret サーバー-side; 決して reflect it in リダイレクト URL, と 暫定日本語案: scope preview-enable endpoint へ あなた Studio’s origin.

Robots, リダイレクト, 画像 SEO, と hreflang

暫定日本語案: robots.txt is static frontend file (app/robots.ts in Next.js). Block Studio 暫定日本語案: paths だけ if それら’re on 同じ domain (Disallow: /studio/); don’t try へ block 暫定日本語案: preview ページ とともに it.

暫定日本語案: リダイレクト are genuine workflow win: 店舗 them as Sanity documents (from, 暫定日本語案: to, statusCode) so コンテンツ team できる manage リダイレクト なしで developer 暫定日本語案: deploy, then implement them in Next.js middleware.ts または CDN/Worker layer (決して 暫定日本語案: in Sanity itself). 追加 validation rules へ 防ぐ loops と 無効 paths.

暫定日本語案: 画像 SEO: 使用 Sanity’s 画像 CDN とともに ?auto=format 向けに 自動 WebP/AVIF, 暫定日本語案: manage alt text at asset level とともに document-level overrides, 使用 vanity 暫定日本語案: filenames instead of hashed URLs, と 設定 hotspot/crop so 自動 crops 保つ 暫定日本語案: subject — which matters 大半の 向けに OG 画像.

暫定日本語案: Hreflang: model locale variants as separate Sanity documents referencing 暫定日本語案: canonical version, generate hreflang から GROQ クエリ returning all locale slugs, 暫定日本語案: と give すべての locale ページ self-referencing canonical — 決して canonical 暫定日本語案: non-English ページ へ English one.

Plugins — 役立つ, ない substitute

  • 暫定日本語案: sanity-plugin-seo — 主要 recommendation (22k+ downloads). Live SEO 暫定日本語案: score, meta/OG preview, social cards, robots control, hreflang, readability. AI 暫定日本語案: tier adds keyword suggestions と meta generation.
  • 暫定日本語案: sanity-plugin-seofields — alternative: 39 schema.org types, SEO Health 暫定日本語案: Dashboard, と Next.js helper functions (buildSeoMeta()).
  • 暫定日本語案: sanity-plugin-seo-paneDEPRECATED. この is 古い Yoast integration, 暫定日本語案: 削除 due へ outdated dependency. It still 表示 up in 古い tutorials. Don’t 使用 暫定日本語案: it.

暫定日本語案: honest framing, から Yanatiev: “SEO success in Sanity comes from intentional structure, not plugins.” Plugins surface fields と give editorial feedback — それら 暫定日本語案: don’t replace proper コンテンツ modeling.

AI 検索 と AEO

暫定日本語案: 2026 wrinkle: LLM training と retrieval crawlers (Anthropic, OpenAI, 一般的な 暫定日本語案: クロール) typically don’t execute JavaScript 現在, so CSR Portable Text is largely 暫定日本語案: invisible へ them regardless of whether Googlebot できる render it — ただし この is 暫定日本語案: provider-specific と ない guaranteed contract. Google’s Gemini pipeline is 暫定日本語案: notable exception, since it reuses Googlebot’s own rendering infrastructure, と 暫定日本語案: other providers’ behavior できる change. Treat “no rendering” as safe assumption へ 暫定日本語案: 構築 向けに, ない permanent law. Beyond rendering, two Sanity-friendly 暫定日本語案: tactics: serve clean markdown via コンテンツ negotiation いつ Accept: text/markdown 暫定日本語案: is present (Sanity’s @portabletext/markdown package converts Portable Text とともに no 暫定日本語案: extra authoring), と 監視 Bing specifically since Bing’s インデックス登録 フィード 暫定日本語案: ChatGPT’s browse レスポンス. On llms.txt, Sanity’s own Knut Melvær is skeptical — 暫定日本語案: “Probably don’t do llms.txt” 向けに large サイト, because all-または-nothing scope と 暫定日本語案: file-size limits 作る it impractical; per-ページ コンテンツ negotiation is more granular. 暫定日本語案: Roboto Studio’s summary is right mindset: “AEO and SEO live on the same plumbing, so we treat them as one job.” (More in AI 検索.)

myths worth killing

  • 暫定日本語案: “Sanity does SEO automatically like WordPress + Yoast.” No. Zero HTML, zero 暫定日本語案: 自動 anything.
  • 暫定日本語案: “Any rendering mode is fine if the content’s in Sanity.” No. CSR breaks 暫定日本語案: インデックス登録 と AI visibility; dynamic rendering is deprecated.
  • 暫定日本語案: “Drafts can’t be indexed.” それら できる, if preview URL leaks. 使用 noindex 暫定日本語案: header.
  • 暫定日本語案: “Portable Text is HTML.” It’s JSON AST その frontend 必要がある serialize.
  • 暫定日本語案: “You need a JSON-LD editor in Studio.” No — generate it から existing fields.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.