暫定日本語訳:Sanity SEO
暫定日本語訳:Sanity 店舗 コンテンツ as JSON と emits zero HTML — あなた frontend decides あなた SEO. Rendering modes, Portable Text, SEO object, sitemaps, draft-mode noindex, JSON-LD, と plugins.
言語
暫定日本語訳: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 place へ 店舗 コンテンツ, ない place その publishes 暫定日本語案: Webページ. It hands あなた コンテンツ out as データ (JSON), ない as finished HTML — so 暫定日本語案: separate Webサイト built とともに something like Next.js または Astro has へ turn その データ 暫定日本語案: へ ページ. その means none of usual SEO stuff (タイトル, sitemaps, canonical 暫定日本語案: tags) happens 自動 way it does on WordPress. biggest rule: 暫定日本語案: 構築 あなた ページ on サーバー または at 構築 time, ない entirely in 訪問者’s 暫定日本語案: ブラウザー, または 検索エンジン と AI ツール 可能性がある 決して see あなた コンテンツ.
何 Sanity actually is
暫定日本語案: 人々 sometimes assume Sanity is “a CMS like WordPress,” と その’s どこ 暫定日本語案: confusion starts. Sanity is headless CMS. It does two things: it 店舗 あなた 暫定日本語案: コンテンツ (in something Sanity calls コンテンツ Lake) と it gives コンテンツ 暫定日本語案: editors place へ write (Sanity Studio). 何 it does ない do is produce 暫定日本語案: single line of HTML. あなた コンテンツ comes out as structured データ — JSON — 通じて 暫定日本語案: API.
Evidence for this claim Sanity stores structured content in Content Lake and provides it to applications as data rather than finished site HTML. Scope: Sanity platform architecture; the frontend owns public rendering. Confidence: high · Verified: Sanity: Content Lake暫定日本語案: その means separate Webサイト — built とともに framework like Next.js, Astro, または 暫定日本語案: Remix — has へ fetch その JSON と 構築 actual ページ 人々 と 検索エンジン 暫定日本語案: see. Sanity 店舗 コンテンツ; あなた frontend publishes it. Once あなた internalize 暫定日本語案: その one sentence, almost everything について Sanity SEO 作る sense.
one decision その matters 大半の: rendering
暫定日本語案: Because あなた frontend 構築 ページ, どのように it 構築 them decides あなた SEO. There 暫定日本語案: are two safe ways と one risky way:
- 暫定日本語案: At 構築 time (SSG) — ページ are pre-built へ plain HTML files. Fast と 暫定日本語案: 検索-friendly.
- 暫定日本語案: On サーバー, per リクエスト (SSR) — サーバー 構築 full ページ と 送信 it. 暫定日本語案: また 検索-friendly, 常に fresh.
- 暫定日本語案: In 訪問者’s ブラウザー (CSR) — サーバー 送信 near-empty shell と 暫定日本語案: JavaScript fills it in afterward. この is risky one.
暫定日本語案: Google できる eventually run JavaScript と read CSR ページ, ただし it’s slower と less 暫定日本語案: reliable — と 現在 crawlers behind ChatGPT, Claude, と Perplexity typically 暫定日本語案: don’t render JavaScript at all, so それら just see empty shell. その’s ない 暫定日本語案: fixed rule, though: Google’s Gemini answers reuse Googlebot’s own rendering 暫定日本語案: infrastructure, so behavior already varies by provider と isn’t guaranteed へ stay 暫定日本語案: 同じ. So if あなた want へ 表示 up in Google と get cited by AI ツール, 構築 あなた 暫定日本語案: HTML on サーバー または at 構築 time.
Evidence for this claim Google can render JavaScript pages, but browser-only content depends on a separate rendering stage. Scope: Google Search only; this record does not support claims about named AI crawlers. Confidence: high · Verified: Google: JavaScript SEO basics”where did my SEO settings go?” 問題
暫定日本語案: On WordPress, plugin like Yoast quietly handled あなた タイトル, meta 説明, 暫定日本語案: sitemap, と canonical tags. Sanity has no such thing. So someone has へ deliberately:
- 暫定日本語案: 追加 SEO fields (タイトル, 説明, social 画像) へ コンテンツ in Sanity.
- 暫定日本語案: Wire それらの fields へ 各 ページ’s HTML in frontend.
- 暫定日本語案: 構築 sitemap, robots.txt, と structured データ — all in code.
暫定日本語案: None of この is hard. It just won’t happen on its own. lot of “my Sanity site has no SEO” stories are really “nobody built the stuff a plugin used to do.”
Two things その quietly go 誤った
- 暫定日本語案: Draft ページ getting へ Google. Sanity できる serve unpublished drafts 通じて 暫定日本語案: its API. If someone shares preview link と crawler finds it, その draft できる 暫定日本語案: get インデックス登録. あなた have へ actively block その.
- 暫定日本語案: Body text その’s invisible. Sanity 店舗 rich text in special format called 暫定日本語案: Portable Text — it’s データ, ない HTML. あなた frontend has へ convert it. On CSR 暫定日本語案: ページ, その conversion happens in ブラウザー, so AI crawlers 決して see あなた 記事 暫定日本語案: text.
暫定日本語案: Want full version — four rendering modes, reusable SEO field setup, 暫定日本語案: sitemaps, draft-mode protection, JSON-LD, と which plugins へ 使用? Switch へ 暫定日本語案: Advanced tab.
暫定日本語案: 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
seoobject in コンテンツ model とともに overrides (ない requirements) via 暫定日本語案:coalesce(), generate sitemaps と JSON-LD programmatically から existing fields, 暫定日本語案: と 保つ drafts out of インデックス登録 とともにX-Robots-Tag: noindexheader 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.
暫定日本語案: 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 renderingPortable 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-reactis 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:
- 暫定日本語案: 使用
publishedperspective in production; 決して expose unprotected preview 暫定日本語案: endpoint. - 暫定日本語案: 追加
X-Robots-Tag: noindexHTTP 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 ページ.) - 暫定日本語案: 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-pane— DEPRECATED. この 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.
AI要約
暫定日本語案: condensed take on Advanced version:
- 暫定日本語案: Sanity is コンテンツ-neutral. It 店舗 structured JSON in コンテンツ Lake 暫定日本語案: (queried via GROQ/REST) と emits zero HTML. frontend (Next.js, Astro, 暫定日本語案: Remix) produces all SEO output. “Sanity does SEO like WordPress” is myth.
- 暫定日本語案: Rendering mode is foundation. SSG と SSR ship 完全な HTML と 暫定日本語案: are safe; ISR (webhook-triggered on publish) adds freshness; CSR is risky. 暫定日本語案: Google deprecated dynamic rendering — 使用 SSR/static/hydration.
- 暫定日本語案: LLM-crawler rendering varies by provider — raw HTML maximizes Portable Text coverage.
- 暫定日本語案: Portable Text is JSON AST, ない HTML. Serialize it とともに
@portabletext/react暫定日本語案: または@portabletext/to-html;@sanity/block-content-to-reactis deprecated. 使用 暫定日本語案:pt::text(body)へ extract plain text 向けに JSON-LD. - 暫定日本語案: コンテンツ modeling: one reusable
seoobject 全体で all types, fields as 暫定日本語案: overrides ない requirements viacoalesce(), validation rules enforcing limits, 暫定日本語案: とhideFromSearchflag filtered から both sitemap と robots metadata. - 暫定日本語案: Sitemaps, metadata, canonicals, robots.txt are all built in frontend.
暫定日本語案: Filter drafts から sitemap GROQ クエリ, 使用
_updatedAt向けにlastModified, と 暫定日本語案: regenerate via Sanity webhooks. - 暫定日本語案: Generate JSON-LD programmatically から existing fields at render time — 決して
暫定日本語案: separate Studio editor. 使用
schema-dts; it できる render anywhere, ない just<head>. - 暫定日本語案: 保つ drafts out of インデックス登録: 使用
publishedperspective in production 暫定日本語案: と 追加X-Robots-Tag: noindexheader へ すべての preview レスポンス. leaked 暫定日本語案: draft URL has caused real インデックス登録 incidents. - 暫定日本語案: Plugins:
sanity-plugin-seo(主要) またはsanity-plugin-seofields. Yoast 暫定日本語案:sanity-plugin-seo-paneis deprecated. “SEO success in Sanity comes from intentional structure, not plugins.” - 暫定日本語案: AEO: 監視 Bing (フィード ChatGPT browse); serve markdown via コンテンツ
暫定日本語案: negotiation; Sanity advises against
llms.txt向けに large サイト.
公式ドキュメント
暫定日本語案: 主要-ソース ドキュメント から 検索エンジン と Sanity.
暫定日本語案: Google
- 暫定日本語案: Understand JavaScript SEO Basics — クロール → render → インデックス登録 pipeline, JS canonicals, と なぜ blocked files don’t get rendered. core reference 向けに any Sanity frontend.
- 暫定日本語案: Dynamic Rendering (deprecated workaround) — なぜ Google deprecated it と 何 へ 使用 instead (SSR, static rendering, hydration).
- 暫定日本語案: Rendering 向けに コンテンツ-Driven Web Apps — SSR vs. SSG vs. CSR tradeoffs 向けに exactly kind of コンテンツ サイト Sanity powers.
- 暫定日本語案: Robots meta tag, データ-nosnippet, と X-Robots-Tag —
X-Robots-Tag: noindexHTTP header 使用 へ 保つ draft/preview レスポンス out of インデックス登録. - 暫定日本語案: Intro へ robots.txt — 何 robots.txt does と doesn’t do (it controls クロール, ない インデックス登録 of leaked drafts).
暫定日本語案: Bing / Microsoft
- 暫定日本語案: 新しい evergreen Bingbot (Microsoft Edge) — Bingbot rendering JavaScript via Edge; relevant since Bing’s インデックス登録 フィード ChatGPT browse.
- 暫定日本語案: IndexNow / indexnow.org — push protocol へ wire へ あなた Sanity publish webhook.
暫定日本語案: Sanity
- 暫定日本語案: SEO とともに Sanity — Sanity’s own master SEO guide.
- 暫定日本語案: SEO Optimization course — full Next.js SEO course (schema types, dynamic sitemaps, JSON-LD).
- 暫定日本語案: Presenting と previewing コンテンツ (perspectives) —
publishedvs.draftsperspectives, basis of draft-mode safety.
出典からの引用
暫定日本語案: On—record statements relevant へ Sanity SEO. 各 link is deep link その jumps 暫定日本語案: へ quoted passage on ソース ページ.
暫定日本語案: Sanity — headless SEO model
- 暫定日本語案: “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.” 暫定日本語案: — Sanity, SEO とともに Sanity. 暫定日本語案: Jump へ quote
- 暫定日本語案: “SEO doesn’t have to be complicated. It’s a matter of taking content you’ve already responsibly structured with Sanity and rendering it in the format and places that search engines expect.” 暫定日本語案: — Sanity Learn, SEO Optimization course. 暫定日本語案: Jump へ quote
- 暫定日本語案: “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.” 暫定日本語案: — Sanity Learn, SEO schema types と metadata. 暫定日本語案: Jump へ quote
- 暫定日本語案: “JSON-LD is a powerful way to provide structured data to search engines—fortunately structured data is what Sanity does best.” 暫定日本語案: — Sanity Learn, Generating JSON-LD dynamically. 暫定日本語案: Jump へ quote
暫定日本語案: Google — dynamic rendering is deprecated
- 暫定日本語案: “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” 暫定日本語案: — Google 検索 Central docs. 暫定日本語案: Jump へ quote
- 暫定日本語案: Recommended instead: “server-side rendering, static rendering, or hydration.” 暫定日本語案: Jump へ quote
暫定日本語案: Industry — frontend owns SEO; structure beats plugins
- 暫定日本語案: “Sanity handles content storage and editing, while your frontend framework handles SEO output.” 暫定日本語案: — Webstacks, Sanity SEO. 暫定日本語案: Read guide
- 暫定日本語案: “AEO and SEO live on the same plumbing, so we treat them as one job.” 暫定日本語案: — Roboto Studio / Jono Alford, AEO & SEO best practices 向けに Sanity. 暫定日本語案: Read post
- 暫定日本語案: “SEO success in Sanity comes from intentional structure, not plugins.” 暫定日本語案: — Yanatiev, SEO best practices 向けに Sanity CMS. 暫定日本語案: Read post
- 暫定日本語案: “Probably don’t do llms.txt.” 暫定日本語案: — Knut Melvær, Sanity, どのように へ serve コンテンツ へ agents. 暫定日本語案: Read field guide
暫定日本語案: Note: Sanity’s サイト ( SEO guide, Learn course lessons, と blog) と Webstacks, Roboto Studio, と Yanatiev posts are JavaScript-rendered と resist automated text-fragment 確認; confirm これらの quotes against live ページ 前に treating them as final. Google dynamic-rendering doc is likewise JS-rendered.
Sanity SEO 確認
暫定日本語案: pass built around どのように Sanity actually 機能 — 構築 things プラットフォーム leaves 暫定日本語案: へ あなた frontend, と lock down things その quietly break.
暫定日本語案: Rendering & コンテンツ ( foundation)
- 暫定日本語案: [ ] ページ render their コンテンツ in HTML on 最初 リクエスト (SSG または SSR), ない だけ 暫定日本語案: 後に クライアント-side JavaScript runs.
- 暫定日本語案: [ ] No SEO-critical ページ depends on CSR (raw HTML maximizes LLM-crawler coverage).
- 暫定日本語案: [ ] ISR (if 使用) regenerates on Sanity publish webhook, ない just timer.
- 暫定日本語案: [ ] Portable Text is serialized サーバー-side とともに
@portabletext/reactまたは 暫定日本語案:@portabletext/to-html(ない deprecatedblock-content-to-react).
暫定日本語案: コンテンツ model
- 暫定日本語案: [ ] One reusable
seoobject on すべての document type — ない per-type duplication. - 暫定日本語案: [ ] SEO fields are overrides via
coalesce(), とともに validation rules enforcing 暫定日本語案: タイトル/説明 length 前に publish. - 暫定日本語案: [ ]
hideFromSearch(またはnoIndex) boolean exists と is filtered から both 暫定日本語案: sitemap GROQ クエリ と ページ’s robots metadata.
暫定日本語案: Frontend outputs
- 暫定日本語案: [ ] Metadata wired から GROQ へ
generateMetadata()(または framework equivalent) — 暫定日本語案: one reusable helper. - 暫定日本語案: [ ] Sitemap generated から GROQ, drafts/hidden filtered,
_updatedAt使用 向けに 暫定日本語案:lastModified, regenerated on webhook. - 暫定日本語案: [ ] Canonicals are absolute URLs から single
SITE_URL, per-ページ と 暫定日本語案: self-referencing by デフォルト. - 暫定日本語案: [ ] robots.txt exists in frontend;
.js/.cssare ない blocked. - 暫定日本語案: [ ] JSON-LD generated programmatically から existing fields (記事, Breadcrumb, 暫定日本語案: FAQ, Organization), verified とともに Rich Results テスト.
暫定日本語案: Draft / preview safety
- 暫定日本語案: [ ] Production API calls 使用
publishedperspective. - 暫定日本語案: [ ] すべての draft/preview レスポンス 送信
X-Robots-Tag: noindexheader. - 暫定日本語案: [ ] Preview secret validated サーバー-side と scoped へ Studio origin.
暫定日本語案: AEO & 監視
- 暫定日本語案: [ ] Bing Webmaster ツール 設定 up (Bing フィード ChatGPT browse); IndexNow on publish.
- 暫定日本語案: [ ] (Optional) markdown served via コンテンツ negotiation 向けに AI crawlers.
mental models
暫定日本語案: 1. Sanity 店舗, frontend publishes. 暫定日本語案: コンテンツ Lake holds JSON; あなた framework produces すべての byte of HTML と すべての SEO 暫定日本語案: signal. 前に debugging any Sanity SEO 問題, ask: 何 is frontend actually 暫定日本語案: 送信 crawlers? Almost everything resolves へ その.
暫定日本語案: 2. Rendering mode is 商品. 暫定日本語案: Pick by どのように コンテンツ changes:
- 暫定日本語案: Mostly static (blog, docs, marketing) → SSG (rebuild または ISR on publish).
- 暫定日本語案: Frequently changing, 必要がある be fresh → SSR.
- 暫定日本語案: Hours/days cadence, want static speed → ISR (webhook-triggered).
- 暫定日本語案: Behind login, ない meant へ be インデックス登録 → CSR is acceptable.
- 暫定日本語案: Public コンテンツ あなた want ranked または cited by AI → 決して CSR.
暫定日本語案: 3. Overrides, ない requirements.
暫定日本語案: SEO fields デフォルト へ 主要 コンテンツ と だけ override いつ editor fills them
暫定日本語案: in — implemented とともに coalesce(). この 保持 editing experience clean と
暫定日本語案: guarantees すべての ページ has something 向けに its タイトル と 説明.
暫定日本語案: 4. Generate, don’t author, markup. 暫定日本語案: Sitemaps, JSON-LD, hreflang, と canonicals are all derived から existing fields in 暫定日本語案: code at render time. separate editor surface 向けに any of them just creates drift. “Derive from existing fields, at render time, in code.”
暫定日本語案: 5. Defense in depth 向けに drafts.
暫定日本語案: published perspective in production is layer one; X-Robots-Tag: noindex header
暫定日本語案: on すべての preview レスポンス is layer two. 決して rely on single control へ 保つ
暫定日本語案: unpublished コンテンツ out of インデックス登録.
Sanity SEO — cheat sheet
暫定日本語案: Rendering modes at glance
| Mode | どこ HTML is built | SEO | Best 向けに | Watch out 向けに |
|---|---|---|---|---|
| SSG | 構築 time → static files | ✅ Best | Blogs, docs, marketing | Stale until rebuild |
| SSR | サーバー, per リクエスト | ✅ Best | Frequently-updated コンテンツ | Higher infra cost |
| ISR | Static + webhook regen | ✅ Good | Hourly/daily コンテンツ | 設定 publish webhook |
| CSR | In ブラウザー | ⚠️ Risky | Logged-in dashboards | Invisible へ AI crawlers |
暫定日本語案: 何’s built in frontend (ない in Sanity)
| Output | どのように |
|---|---|
| Body copy HTML | Serialize Portable Text (@portabletext/react / -to-html) |
| Meta tags | generateMetadata() から GROQ result |
| Sitemap | GROQ クエリ → XML; filter drafts; _updatedAt 向けに lastmod |
| Canonicals | Absolute URLs から one SITE_URL, per-ページ |
| robots.txt | Static frontend file (robots.ts in Next.js) |
| JSON-LD | Generated から existing fields; schema-dts 向けに types |
| リダイレクト | Sanity documents → frontend middleware / Worker |
暫定日本語案: GROQ snippets worth memorizing
- 暫定日本語案: Override とともに fallback:
coalesce(seo.title, title, "") - 暫定日本語案: Plain text から Portable Text:
pt::text(body) - 暫定日本語案: Sitemap filter:
*[... && defined(slug.current) && hideFromSearch != true]
暫定日本語案: Fast rules
- 暫定日本語案: LLM-crawler rendering varies by provider → 避ける CSR-だけ public コンテンツ.
- 暫定日本語案: Dynamic rendering is deprecated — 使用 SSR/static/hydration.
- 暫定日本語案: Drafts:
publishedperspective +X-Robots-Tag: noindexheader. - 暫定日本語案: Plugin:
sanity-plugin-seo✅ /sanity-plugin-seo-pane(Yoast) ❌ deprecated. - 暫定日本語案: “SEO success in Sanity comes from intentional structure, not plugins.”
Draft または preview コンテンツ 表示される in 検索 Console
暫定日本語案: 使用 この runbook いつ unpublished Sanity document has discoverable preview URL 暫定日本語案: または 表示 up in Google 検索 Console.
- 暫定日本語案: Confirm which レスポンス leaked. Fetch reported URL なしで Studio
暫定日本語案: credentials と inspect both status と
X-Robots-Tagheader. If it returns 暫定日本語案: published コンテンツ, continue へ 手順 2. If it exposes draft, disable preview 暫定日本語案: entry point while あなた continue. - 暫定日本語案: 確認 production perspective. Trace ページ’s GROQ リクエスト と confirm
暫定日本語案: production 使用
publishedperspective. If it 使用drafts, fix その クエリ 暫定日本語案: 最初; if it already 使用published, continue へ レスポンス layer. - 暫定日本語案: 追加 インデックス登録 backstop. 送信
X-Robots-Tag: noindexon すべての preview と 暫定日本語案: draft-mode レスポンス. If header is 不足している on any preview route, fix shared 暫定日本語案: preview middleware rather than patching one ページ. - 暫定日本語案: Validate preview access. Confirm preview secret is 確認 サーバー-side, 暫定日本語案: is ない reflected へ destination URL, と accepts リクエスト だけ から 暫定日本語案: intended Studio origin. If public preview URL still 機能, rotate secret と 暫定日本語案: close その route.
- 暫定日本語案: 削除 インデックス登録 copy. 後に レスポンス is safe, 使用 検索 Console’s
暫定日本語案: removal workflow いつ exposure is urgent, then リクエスト fresh クロール. If
暫定日本語案: URL すべき 決して exist publicly, 保つ
noindexレスポンス 利用可能 long enough 暫定日本語案: 向けに crawlers へ see it rather than blocking it in robots.txt. - 暫定日本語案: Verify fix. Fetch URL while logged out と run URL Inspection.
暫定日本語案: draft 必要がある be absent から body と preview レスポンス 必要がある carry
noindex.
Sanity SEO mistakes へ 避ける
Expecting Sanity へ emit SEO HTML
暫定日本語案: なぜ it’s 誤った: Sanity 店舗 JSON; it does ない publish タイトル, canonicals, 暫定日本語案: sitemaps, または ページ HTML. Do この instead: 作る frontend responsible 向けに 各 暫定日本語案: output と verify generated レスポンス rather than Studio fields.
Choosing CSR 向けに public コンテンツ
暫定日本語案: なぜ it’s 誤った: initial レスポンス is empty shell, と many AI crawlers do 暫定日本語案: ない execute JavaScript at all. Do この instead: ship public コンテンツ とともに SSG, SSR, 暫定日本語案: または webhook-triggered ISR.
Assuming unpublished means unindexable
暫定日本語案: なぜ it’s 誤った: shared preview URL できる leak と be クロール. Do この instead:
暫定日本語案: 使用 published perspective in production と 送信 X-Robots-Tag: noindex
暫定日本語案: header on すべての preview レスポンス.
Treating Portable Text as HTML
暫定日本語案: なぜ it’s 誤った: Portable Text is JSON AST, so un-serialized コンテンツ 決して
暫定日本語案: becomes crawlable body copy. Do この instead: serialize it on サーバー とともに
暫定日本語案: @portabletext/react または @portabletext/to-html.
Maintaining JSON-LD in separate editor
暫定日本語案: なぜ it’s 誤った: second copy of 商品, 記事, または organization facts drifts 暫定日本語案: から visible ページ. Do この instead: derive JSON-LD から 同じ Sanity fields 暫定日本語案: at render time と validate rendered output.
確認 whether Sanity ページ ships real HTML
暫定日本語案: Run この 後に changing rendering mode, Portable Text serialization, または ページ データ 暫定日本語案: loading. It checks initial レスポンス, 前に クライアント-side JavaScript できる fill gaps.
暫定日本語案: macOS / Linux — compare normal と Googlebot レスポンス
URL="https://example.com/article-slug"
curl -sL "$URL" -o /tmp/sanity-page.html
curl -sL -A "Googlebot" "$URL" -o /tmp/sanity-googlebot.html
grep -Ei '<title>|rel="canonical"|<h1|application/ld\+json' /tmp/sanity-page.html
diff -u /tmp/sanity-page.html /tmp/sanity-googlebot.html暫定日本語案: 最初 command すべき find ページ’s real タイトル, canonical, H1, と JSON-LD in
暫定日本語案: raw HTML. meaningful コンテンツ difference in diff deserves investigation;
暫定日本語案: crawlers と ユーザー すべき ない 受信 異なる canonical コンテンツ.
暫定日本語案: Windows PowerShell — inspect initial レスポンス
$url = "https://example.com/article-slug"
$html = (Invoke-WebRequest -Uri $url).Content
$html | Select-String -Pattern '<title>|rel="canonical"|<h1|application/ld\+json'暫定日本語案: DevTools Console — confirm Portable Text became semantic elements
[...document.querySelectorAll('main article p, main article h2, main article li')]
.map((node) => node.textContent.trim())
.filter(Boolean)
.slice(0, 20)暫定日本語案: Run snippet in ブラウザー Console. It is rendered-DOM 確認, so pair it とともに
暫定日本語案: curl テスト: コンテンツ 表示される だけ here ただし ない in initial レスポンス is still
暫定日本語案: クライアント-rendered.
ツール 向けに Sanity SEO
- 暫定日本語案: URL Inspection (Google 検索 Console) — see どのように single URL was クロール と 暫定日本語案: rendered. rendered HTML tells あなた whether あなた Portable Text actually made it 暫定日本語案: in — essential 向けに catching CSR gaps on Sanity frontend.
- 暫定日本語案: Rich Results テスト — confirm あなた programmatic JSON-LD is present in rendered 暫定日本語案: output 後に any rendering または template change.
- 暫定日本語案: Screaming Frog SEO Spider — クロール とともに JavaScript rendering on/off へ compare 暫定日本語案: raw HTML vs. rendered HTML; この is どのように あなた prove whether あなた コンテンツ is サーバー- 暫定日本語案: rendered または クライアント-rendered.
- 暫定日本語案: Ahrefs サイト Audit — surfaces 不足している metadata, broken canonicals, リダイレクト 暫定日本語案: chains, と indexability 問題 全体で whole frontend.
- 暫定日本語案: Bing Webmaster ツール — submit あなた sitemap と 監視 Bing インデックス登録 (it フィード 暫定日本語案: ChatGPT browse), plus どこ IndexNow submissions 表示 up.
- 暫定日本語案:
sanity-plugin-seo— in-Studio live SEO score, meta/OG preview, と robots 暫定日本語案: control so editors get feedback at authoring time.
テスト yourself: Sanity SEO
暫定日本語案: Five quick questions on どのように SEO 機能 on Sanity-backed サイト. Pick answer 向けに 各, then 確認.
時間を使う価値のあるリソース
暫定日本語案: My related writing
- 暫定日本語案: JavaScript SEO 問題 & Best Practices — my 主要 reference on rendering modes, which decide everything on Sanity frontend.
- 暫定日本語案: Beginner’s Guide へ Technical SEO — どこ rendering と クロール fit in bigger picture.
暫定日本語案: My speaking
- 暫定日本語案: JavaScript SEO — Ungagged 2019 (SlideShare) — my walkthrough of どのように headless/decoupled CMSes split frontend から backend, plus Googlebot’s stateless rendering. (Standing disclaimer: dynamic-rendering recommendation in その deck is 現在 outdated — Google deprecated it.)
暫定日本語案: On この サイト
- 暫定日本語案: SEO 向けに Headless CMS — sibling guide; Sanity is specific application of 同じ headless rules.
- 暫定日本語案: JavaScript SEO — rendering deep dive.
- 暫定日本語案: Canonicalization — consolidation mechanics behind あなた frontend’s canonical tags.
- 暫定日本語案: AI 検索 — どのように AI crawlers と answer engines behave.
暫定日本語案: から around industry
- 暫定日本語案: SEO とともに Sanity (Sanity) — Sanity’s own master SEO guide; start here 向けに プラットフォーム-現在の behavior.
- 暫定日本語案: SEO Optimization course (Sanity Learn) — hands-on Next.js course covering SEO object, dynamic sitemaps, と JSON-LD.
- 暫定日本語案: Sanity SEO (Webstacks, Devon Wood) — agency guide making “frontend handles SEO output” point clearly.
- 暫定日本語案: AEO & SEO best practices 向けに Sanity (Roboto Studio, Jono Alford) — AEO angle と “derive JSON-LD from existing fields” rule.
- 暫定日本語案: SEO best practices 向けに Sanity CMS (Yanatiev) — “structure, not plugins” framing.
- 暫定日本語案: どのように へ serve コンテンツ へ agents: field guide (Knut Melvær, Sanity) — コンテンツ negotiation と ケース against llms.txt 向けに large サイト.
- 暫定日本語案: Headless CMS SEO (Ahrefs, Despina Gavoyannis) — broader headless playbook (コンテンツ/code/design optimized independently) その Sanity sits inside.
- 暫定日本語案: turbo-start-sanity (Roboto Studio, GitHub) — open-ソース Sanity SEO starter とともに real
query.ts,seo-fields.ts, とseo.tsimplementations.
変更履歴
2026年7月19日に更新。
編集概要と記録された変更の詳細。変更の詳細
-
変更の詳細な注記は現在英語でのみ提供されています。
-
変更の詳細な注記は現在英語でのみ提供されています。
完全な比較は利用できません — この改訂の以前のスナップショットがアーカイブされていません。