Panduan Sanity SEO

Sanity stores konten sebagai JSON dan emits zero HTML — Anda frontend decides Anda SEO. rendering modes, Portable Text, SEO object, sitemaps, draft-mode noindex, JSON-LD, dan plugins.

Pertama kali diterbitkan: 27 Jun 2026 · Terakhir diperbarui: 3 Agu 2026 · Lanjutan

Sanity adalah sebuah CMS headless itu stores konten sebagai structured JSON di -nya konten Lake dan produces Tidak HTML — so Anda frontend kerangka kerja (Berikutnya.js, Astro, Remix) decides semuanya tentang Anda SEO. single biggest lever adalah rendering: SSG dan SSR ship menyelesaikan HTML dan adalah safe; CSR adalah risky karena LLM-crawler rendering contracts vary oleh provider. Portable Text adalah sebuah JSON AST, tidak HTML, so frontend harus serialize ini. bangun reusable SEO object di konten model, generate sitemaps dan JSON-LD programmatically, pertahankan drafts out dari indeks dengan sebuah X-Robots-Tag: noindex header, dan gunakan sanity-plugin-seo (tidak deprecated Yoast pane). SEO success di Sanity muncul dari intentional structure, tidak plugins.

TL;DR — Sanity adalah konten-neutral: ini stores structured JSON di konten Lake dan emits zero HTML, so frontend’s rendering mode decides semuanya. SSG dan SSR ship menyelesaikan HTML dan adalah safe; CSR adalah risky satu karena LLM crawler jangan execute JavaScript, dan Google deprecated dynamic rendering sebagai sebuah workaround. Portable Text adalah sebuah JSON AST itu frontend harus serialize. bangun reusable seo object di konten model dengan overrides (tidak requirements) melalui coalesce(), generate sitemaps dan JSON-LD programmatically dari existing fields, dan pertahankan drafts out dari indeks dengan sebuah X-Robots-Tag: noindex header pada setiap preview respons. gunakan sanity-plugin-seo — tidak pernah deprecated Yoast pane — tetapi remember “SEO success in Sanity comes from intentional structure, not plugins.” (terjemahan) “SEO success di Sanity muncul dari intentional structure, tidak plugins.”

Sanity adalah konten storage, tidak sebuah publisher

sebuah berguna pertama principle: Sanity touches Anda konten, tidak pernah Anda rendering. konten Lake stores semuanya sebagai structured JSON, queried dengan GROQ (Sanity’s kueri language) atau REST. Sanity Studio — editing UI — adalah sebuah React single-halaman app itu biasanya lives pada -nya own .sanity.studio subdomain dan tidak sesuatu Anda indeks. Tidak ada apa pun di ini stack produces HTML.

Bukti untuk klaim ini Sanity Content Lake is queried using APIs and GROQ; it is distinct from a site's frontend rendering layer. Cakupan: Sanity-hosted content data and query APIs. Tingkat keyakinan: tinggi · Diverifikasi: Sanity: Content Lake

So entire SEO surface lives di Anda frontend kerangka kerja. sebagai Webstacks put ini, “Sanity menangani konten storage dan editing, sementara Anda frontend kerangka kerja menangani SEO output.” (terjemahan) “Sanity menangani konten storage dan editing, sementara Anda frontend kerangka kerja menangani SEO output.” itu’s tidak sebuah limitation — ini adalah seluruh headless model. Sanity’s own team frames ini well: “Ketika menggunakan Sanity sebagai a CMS, Anda melakukan headless SEO. Although ini approach requires thoughtful teknis implementation, it dapat liberate Anda konten untuk help Anda reach lebih users across all channels.” (terjemahan) “Ketika menggunakan Sanity sebagai sebuah CMS, Anda’re melakukan headless SEO. Although ini approach memerlukan thoughtful teknis implementation, ini dapat liberate Anda konten untuk help Anda reach lebih pengguna di seluruh semua channels.” berfungsi adalah nyata, tetapi ini adalah yang sama berfungsi sebagai apa pun headless bangun (see SEO untuk sebuah CMS headless).

rendering mode adalah foundation

Karena frontend membangun HTML, rendering decision adalah single sebagian besar consequential SEO pilihan pada sebuah Sanity situs. Four modes:

SSG — Static situs Generation. konten adalah fetched dari Sanity di bangun time dan baked ke static HTML disajikan dari sebuah CDN. Best-case SEO: fully-dirender HTML pada pertama permintaan, fast TTFB. Ideal untuk blog posts, marketing halaman, dan product/landing halaman. tradeoff adalah freshness — changed konten perlu sebuah rebuild (ISR solves ini).

SSR — rendering sisi server. konten adalah fetched per permintaan dan penuh HTML adalah dirender pada server. Excellent SEO, selalu fresh. gunakan ini untuk frequently diperbarui konten. Tradeoff adalah infrastructure cost dan slightly lebih tinggi TTFB daripada static files.

ISR — Incremental Static Regeneration (Vercel/Berikutnya.js). Static halaman regenerate di background, ideally triggered oleh sebuah Sanity webhook pada publish so halaman rebuilds moment sebuah editor hits publish. ini adalah best dari SSG’s speed dan SSR’s freshness untuk konten itu perubahan pada order dari hours atau days.

CSR — rendering sisi klien. sebuah HTML shell ships, lalu JavaScript fetches dari Sanity dan membangun DOM di browser. ini adalah worst SEO option: Googlebot memiliki untuk queue halaman untuk sebuah kemudian render wave, timing adalah unpredictable, dan AI crawler dan banyak lainnya bot see hanya shell. CSR adalah acceptable hanya behind authentication untuk konten Anda tidak ingin terindeks anyway.

«And don’t reach for the old shortcut: Google has deprecated dynamic rendering (serving prerendered HTML to bots, CSR to users). Officially, “dynamic rendering was a workaround and not a long-term solution,” and Google now recommends “server-side rendering, static rendering, or hydration.” For a Sanity site, that means SSG or SSR — not a bot-detection hack. (Full rendering treatment in JavaScript SEO.)

Bukti untuk klaim ini Google describes dynamic rendering as a workaround rather than a recommended long-term solution and recommends server-side rendering, static rendering, or hydration. Cakupan: Google Search guidance for JavaScript sites. Tingkat keyakinan: tinggi · Diverifikasi: Google: Dynamic rendering

» (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian tiga puluh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

Portable Text — Anda body copy adalah sebuah JSON AST

ini adalah paling Sanity-spesifik hal pada halaman. Sanity stores rich text sebagai Portable Text: sebuah JSON abstract syntax tree, tidak HTML. Body copy di konten Lake looks like sebuah array dari typed blocks, tidak <p> tags. Anda frontend memiliki untuk serialize ini ke HTML sebelum apa pun crawler dapat baca ini:

  • @portabletext/react — untuk React/Berikutnya.js.
  • @portabletext/to-html — kerangka kerja-agnostic (Astro, Remix, apa pun).
  • old @sanity/block-content-to-react adalah deprecated — jangan gunakan ini.

jika Anda render server-side atau di bangun time, serialization happens sebelum halaman adalah dikirim dan crawler mendapatkan penuh HTML. jika Anda render client-side, serialization berjalan di browser. Karena LLM-crawler rendering contracts vary oleh provider, CSR Portable Text membuat sebuah coverage risk itu mentah HTML menghindari. ada juga sebuah handy GROQ helper: pt::text(body) extracts semua plain text dari sebuah Portable Text field sebagai sebuah string, yang adalah perfect untuk feeding JSON-LD deskripsi tanpa sebuah terpisah editor field.

konten modeling untuk SEO — reusable SEO object

paling bersih pattern, dan satu Sanity’s own course teaches, adalah sebuah single reusable seo object ditambahkan untuk setiap document jenis — tidak SEO fields copy-pasted per jenis. key design principle dari Sanity Learn: “Untuk itu benefit dari konten authors, fields relevant untuk SEO seharusnya tidak selalu menjadi wajib. Alih-alih, they seharusnya menjadi digunakan untuk override some existing konten, ketika provided.” (terjemahan) “untuk benefit dari konten authors, fields relevant untuk SEO seharusnya tidak selalu menjadi diperlukan. Alih-alih, mereka seharusnya menjadi digunakan untuk override beberapa existing konten, ketika disediakan.”

dalam praktik itu berarti SEO fields adalah overrides dengan fallbacks, implemented dengan GROQ’s coalesce():

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

sebuah minimum viable seo object: metaTitle (≤65 chars), metaDescription (≤155 chars), canonicalUrl, openGraphImage (1200×630), dan sebuah noIndex boolean. tambahkan Sanity validation aturan untuk enforce itu character limits sebelum publish — so editors catch masalah platform akan jika tidak let melalui. gunakan slug jenis dengan sebuah custom generation function, dan gunakan references untuk tautan internal so URL perubahan propagate secara otomatis. tambahkan sebuah hideFromSearch boolean dan filter ini out dari keduanya sitemap GROQ kueri dan halaman’s robots metadata.

Metadata, sitemaps, dan canonicals — semua dibangun di frontend

Metadata. di Berikutnya.js App Router, gunakan exported generateMetadata() function (tidak inline <head> tags) so metadata tidak duplicate di seluruh nested layouts. bangun satu server-side helper itu takes sebuah GROQ hasil dan mengembalikan kerangka kerja’s metadata object — implement ini setelah, gunakan ini di mana-mana. Open Graph images dapat menjadi generated dynamically dengan Berikutnya.js Edge OG generation, pulling konten straight dari Sanity.

Sitemaps. ada Tidak auto-sitemap. Anda bangun ini dari sebuah GROQ kueri → URL array → XML (sitemap.ts di Berikutnya.js, @astrojs/sitemap di Astro). selalu filter drafts dan hidden halaman:

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

gunakan _updatedAt (tidak _createdAt atau sebuah manual date) untuk lastModified, pertahankan individual sitemap files di bawah 50 000 URLs dengan sebuah indeks untuk lebih besar situs, dan trigger regeneration melalui sebuah Sanity webhook pada publish/unpublish so ini tidak pernah goes stale.

Canonicals. Set canonical URLs dari konten model, default untuk sebuah self-referencing canonical, dan bangun absolute URLs dari sebuah single SITE_URL so canonical tidak pernah drifts. (Mechanics di Canonicalization.)

data terstruktur — generate ini, jangan author ini

«The right pattern is to generate JSON-LD programmatically from existing content fields at render time — never build a separate JSON-LD editor surface in Studio, which just creates drift between content and 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.” » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian empat puluh tujuh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)

gunakan pt::text(body) untuk pull plain text untuk schema deskripsi, TypeScript package schema-dts untuk jenis safety, dan render ini dengan <script type="application/ld+json">. Note itu “itu JSON-LD markup dapat menjadi dirender anywhere di itu halaman — it tidak perlu untuk menjadi stored di dalam itu <head>.” (terjemahan) “ JSON-LD markup dapat menjadi dirender anywhere di halaman — ini tidak perlu untuk menjadi stored di dalam tidak terdefinisi.” Priority jenis untuk konten situs: artikel/BlogPosting, BreadcrumbList, FAQPage, Organization, situs web.

Mempertahankan drafts out dari Google — nyata-incident pitfall

Sanity’s perspective sistem controls draft visibilitas: published mengembalikan hanya production konten; drafts mengembalikan draft documents untuk preview. selalu gunakan published perspective di production API panggilan. tetapi itu alone tidak cukup, karena draft URLs leak. sebagai satu developer recounted, danger adalah “a client panicking karena an unpublished landing halaman showed up di Google Search Console. Jika a konten editor shares itu URL di Slack, dan seseorang clicks it dari a browser itu lalu crawled (it happens), itu draft konten dapat end up indexed.” (terjemahan) “sebuah client panicking karena sebuah unpublished landing halaman showed up di Google Search Console. jika sebuah konten editor shares itu URL di Slack, dan seseorang clicks ini dari sebuah browser itu’s lalu di-crawl (ini happens), draft konten dapat end up terindeks.”

reliable defense adalah sebuah multi-layer satu:

  1. gunakan published perspective di production; tidak pernah expose sebuah unprotected preview endpoint.
  2. tambahkan sebuah X-Robots-Tag: noindex header HTTP untuk setiap draft-mode/preview respons — bahkan jika sebuah draft URL leaks dan mendapatkan di-crawl, Googlebot respects header dan tidak akan indeks ini. (jangan rely pada robots.txt untuk ini; sebuah header adalah lebih reliable daripada sebuah disallow untuk preview halaman.)
  3. Validate preview secret server-side; tidak pernah reflect ini di redirect URL, dan cakupan preview-enable endpoint untuk Anda Studio’s origin.

Robots, redirects, image SEO, dan hreflang

robots.txt adalah sebuah static frontend file (app/robots.ts di Berikutnya.js). Block Studio paths hanya jika mereka’re pada yang sama domain (Disallow: /studio/); jangan try untuk block preview halaman dengan ini.

Redirects adalah sebuah genuine workflow win: store them sebagai Sanity documents (from, to, statusCode) so konten team dapat manage redirects tanpa sebuah developer deploy, lalu implement them di Berikutnya.js middleware.ts atau sebuah CDN/Worker layer (tidak pernah di Sanity itself). tambahkan validation aturan untuk mencegah loops dan tidak valid paths.

Image SEO: gunakan Sanity’s image CDN dengan ?auto=format untuk automatic WebP/AVIF, manage teks alt di asset tingkat dengan document-tingkat overrides, gunakan vanity filenames alih-alih hashed URLs, dan set hotspot/crop so automatic crops pertahankan subject — yang penting sebagian besar untuk OG images.

Hreflang: model locale variants sebagai terpisah Sanity documents referencing canonical versi, generate hreflang dari sebuah GROQ kueri returning semua locale slugs, dan memberikan setiap locale halaman sebuah self-referencing canonical — tidak pernah canonical sebuah non-English halaman untuk English satu.

Plugins — helpful, tidak sebuah substitute

  • sanity-plugin-seo — utama recommendation (22k+ downloads). Langsung SEO score, meta/OG preview, social cards, robots control, hreflang, readability. AI tier menambahkan keyword suggestions dan meta generation.
  • sanity-plugin-seofields — sebuah alternative: 39 schema.org jenis, sebuah SEO Health Dashboard, dan Berikutnya.js helper functions (buildSeoMeta()).
  • sanity-plugin-seo-pane — DEPRECATED. ini adalah old Yoast integration, dihapus karena sebuah outdated dependency. ini masih menampilkan up di old tutorials. jangan gunakan ini.

honest framing, dari Yanatiev: “SEO success in Sanity comes from intentional structure, not plugins.” (terjemahan) “SEO success di Sanity muncul dari intentional structure, tidak plugins.” Plugins surface fields dan memberikan editorial feedback — mereka jangan replace proper konten modeling.

AI penelusuran dan AEO

2026 wrinkle: LLM training dan retrieval crawler (Anthropic, OpenAI, umum crawl) typically jangan execute JavaScript hari ini, so CSR Portable Text adalah largely invisible untuk them regardless dari apakah Googlebot dapat render ini — tetapi ini adalah provider-spesifik dan tidak sebuah guaranteed contract. Google’s Gemini pipeline adalah notable exception, since ini reuses Googlebot’s own rendering infrastructure, dan lainnya providers’ perilaku dapat perubahan. Treat “no rendering” (terjemahan) “Tidak rendering” sebagai safe assumption untuk bangun untuk, tidak sebuah permanent law. Beyond rendering, dua Sanity-friendly tactics: sajikan bersih markdown melalui konten negotiation ketika Accept: text/markdown adalah present (Sanity’s @portabletext/markdown package converts Portable Text dengan Tidak extra authoring), dan monitor Bing secara khusus since Bing’s indeks feeds ChatGPT’s browse respons. pada llms.txt, Sanity’s own Knut Melvær adalah skeptical — “Probably don’t do llms.txt” (terjemahan) “Probably jangan melakukan llms.txt” untuk besar situs, karena semua-atau-tidak ada apa pun cakupan dan file-size limits membuat ini impractical; per-halaman konten negotiation adalah lebih granular. Roboto Studio’s summary adalah right mindset: “AEO and SEO live on the same plumbing, so we treat them as one job.” (terjemahan) “AEO dan SEO langsung pada yang sama plumbing, so kami treat them sebagai satu job.” (Lebih di AI Penelusuran.)

myths worth killing

  • “Sanity does SEO automatically like WordPress + Yoast.” (terjemahan) “Sanity melakukan SEO secara otomatis like WordPress + Yoast.” Tidak. Zero HTML, zero automatic apa pun.
  • “Any rendering mode is fine if the content’s in Sanity.” (terjemahan) “apa pun rendering mode adalah fine jika konten’s di Sanity.” Tidak. CSR breaks pengindeksan dan AI visibilitas; dynamic rendering adalah deprecated.
  • “Drafts can’t be indexed.” (terjemahan) “Drafts dapat’t menjadi terindeks.” mereka dapat, jika sebuah preview URL leaks. gunakan noindex header.
  • “Portable Text is HTML.” (terjemahan) “Portable Text adalah HTML.” ini adalah sebuah JSON AST itu frontend harus serialize.
  • “Anda perlu a JSON-LD editor di Studio.” (terjemahan) “Anda perlu sebuah JSON-LD editor di Studio.” Tidak — generate ini dari existing fields.

Tambahkan catatan pakar

Sematkan kutipan pakar

Orang baru? Buat profilnya yang belum diklaim di /admin/experts/ → Sematkan kutipan pakar terlebih dahulu.