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.
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 sebuah place untuk store konten, tidak sebuah place itu publishes halaman web. ini hands Anda konten out sebagai data (JSON), tidak sebagai finished HTML — so sebuah terpisah situs web dibangun dengan sesuatu like Berikutnya.js atau Astro memiliki untuk turn itu data ke halaman. itu berarti none dari biasa SEO stuff (judul, sitemaps, canonical tags) happens secara otomatis cara ini melakukan pada WordPress. biggest aturan: bangun Anda halaman pada sebuah server atau di bangun time, tidak entirely di pengunjung’s browser, atau mesin pencari dan AI alat dapat tidak pernah see Anda konten.
Apa Sanity sebenarnya adalah
Orang sometimes assume Sanity adalah “a CMS like WordPress,” (terjemahan) “sebuah CMS like WordPress,” dan itu’s di mana confusion dimulai. Sanity adalah sebuah CMS headless. ini melakukan dua hal: ini stores Anda konten (di sesuatu Sanity panggilan konten Lake) dan ini memberikan konten editors sebuah place untuk tulis (Sanity Studio). Apa ini melakukan tidak melakukan adalah produce sebuah single line dari HTML. Anda konten muncul out sebagai data terstruktur — JSON — melalui sebuah API.
Bukti untuk klaim ini Sanity stores structured content in Content Lake and provides it to applications as data rather than finished site HTML. Cakupan: Sanity platform architecture; the frontend owns public rendering. Tingkat keyakinan: tinggi · Diverifikasi: Sanity: Content Lakeitu berarti sebuah terpisah situs web — dibangun dengan sebuah kerangka kerja like Berikutnya.js, Astro, atau Remix — memiliki untuk fetch itu JSON dan bangun sebenarnya halaman orang dan mesin pencari see. Sanity stores konten; Anda frontend publishes ini. setelah Anda internalize itu satu kalimat, hampir semuanya tentang Sanity SEO membuat sense.
satu decision itu penting sebagian besar: rendering
Karena Anda frontend membangun halaman, bagaimana ini membangun them decides Anda SEO. Di sana adalah dua safe cara dan satu risky cara:
- di bangun time (SSG) — halaman adalah pre-dibangun ke plain HTML files. Fast dan penelusuran-friendly.
- pada sebuah server, per permintaan (SSR) — server membangun penuh halaman dan mengirim ini. juga penelusuran-friendly, selalu fresh.
- di pengunjung’s browser (CSR) — server mengirim sebuah near-empty shell dan JavaScript fills ini di afterward. ini adalah risky satu.
Google dapat eventually jalankan JavaScript dan baca sebuah CSR halaman, tetapi ini adalah lebih lambat dan lebih sedikit reliable — dan hari ini crawler behind ChatGPT, Claude, dan Perplexity typically jangan render JavaScript di semua, so mereka hanya see empty shell. itu’s tidak sebuah fixed aturan, though: Google’s Gemini jawaban reuse Googlebot’s own rendering infrastructure, so perilaku sudah varies oleh provider dan tidak guaranteed untuk stay yang sama. So jika Anda ingin tampilkan up di Google dan mendapatkan cited oleh AI alat, bangun Anda HTML pada server atau di bangun time.
Bukti untuk klaim ini Google can render JavaScript pages, but browser-only content depends on a separate rendering stage. Cakupan: Google Search only; this record does not support claims about named AI crawlers. Tingkat keyakinan: tinggi · Diverifikasi: Google: JavaScript SEO basics”di mana melakukan my SEO settings go?” (terjemahan) “di mana melakukan my SEO settings go?” masalah
pada WordPress, sebuah plugin like Yoast diam-diam handled Anda judul, deskripsi meta, sitemap, dan tag canonical. Sanity memiliki Tidak such hal. So seseorang memiliki untuk dengan sengaja:
- tambahkan SEO fields (judul, deskripsi, social image) untuk konten di Sanity.
- Wire itu fields ke setiap halaman’s HTML di frontend.
- bangun sitemap, sebuah robots.txt, dan data terstruktur — semua di code.
None dari ini adalah hard. ini hanya tidak akan happen pada -nya own. sebuah lot dari “my Sanity site memiliki Tidak SEO” (terjemahan) “my Sanity situs memiliki Tidak SEO” stories adalah benar-benar “tidak seorang pun built itu stuff a plugin digunakan untuk lakukan.” (terjemahan) “tidak seorang pun dibangun stuff sebuah plugin digunakan untuk melakukan.”
Dua hal itu diam-diam go wrong
- Draft halaman getting ke Google. Sanity dapat sajikan unpublished drafts melalui -nya API. jika seseorang shares sebuah preview tautan dan sebuah crawler menemukan ini, itu draft dapat mendapatkan terindeks. Anda memiliki untuk actively block itu.
- Body text itu’s invisible. Sanity stores rich text di sebuah special format called Portable Text — ini adalah data, tidak HTML. Anda frontend memiliki untuk convert ini. pada sebuah CSR halaman, itu conversion happens di browser, so AI crawler tidak pernah see Anda artikel text.
ingin penuh versi — four rendering modes, reusable SEO field setup, sitemaps, draft-mode protection, JSON-LD, dan yang plugins untuk gunakan? Switch untuk Advanced tab.
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
seoobject di konten model dengan overrides (tidak requirements) melaluicoalesce(), generate sitemaps dan JSON-LD programmatically dari existing fields, dan pertahankan drafts out dari indeks dengan sebuahX-Robots-Tag: noindexheader pada setiap preview respons. gunakansanity-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.
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-reactadalah 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:
- gunakan
publishedperspective di production; tidak pernah expose sebuah unprotected preview endpoint. - tambahkan sebuah
X-Robots-Tag: noindexheader 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.) - 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
noindexheader. - “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.
AI summary
sebuah condensed take pada Advanced versi:
- Sanity adalah konten-neutral. ini stores structured JSON di konten Lake (queried melalui GROQ/REST) dan emits zero HTML. frontend (Berikutnya.js, Astro, Remix) produces semua SEO output. “Sanity melakukan SEO like WordPress” (terjemahan) “Sanity melakukan SEO like WordPress” adalah sebuah myth.
- rendering mode adalah foundation. SSG dan SSR ship menyelesaikan HTML dan adalah safe; ISR (webhook-triggered pada publish) menambahkan freshness; CSR adalah risky. Google deprecated dynamic rendering — gunakan SSR/static/hydration.
- LLM-crawler rendering varies oleh provider — mentah HTML maximizes Portable Text coverage.
- Portable Text adalah sebuah JSON AST, tidak HTML. Serialize ini dengan
@portabletext/reactatau@portabletext/to-html;@sanity/block-content-to-reactadalah deprecated. gunakanpt::text(body)untuk extract plain text untuk JSON-LD. - konten modeling: satu reusable
seoobject di seluruh semua jenis, fields sebagai overrides tidak requirements melaluicoalesce(), validation aturan enforcing limits, dan sebuahhideFromSearchflag filtered dari keduanya sitemap dan robots metadata. - Sitemaps, metadata, canonicals, robots.txt adalah semua dibangun di frontend.
Filter drafts dari sitemap GROQ kueri, gunakan
_updatedAtuntuklastModified, dan regenerate melalui Sanity webhooks. - Generate JSON-LD programmatically dari existing fields di render time — tidak pernah sebuah
terpisah Studio editor. gunakan
schema-dts; ini dapat render anywhere, tidak hanya<head>. - pertahankan drafts out dari indeks: gunakan
publishedperspective di production dan tambahkan sebuahX-Robots-Tag: noindexheader untuk setiap preview respons. sebuah leaked draft URL memiliki disebabkan nyata pengindeksan incidents. - Plugins:
sanity-plugin-seo(utama) atausanity-plugin-seofields. Yoastsanity-plugin-seo-paneadalah deprecated. “SEO success di Sanity muncul dari intentional structure, tidak plugins.” (terjemahan) “SEO success di Sanity muncul dari intentional structure, tidak plugins.” - AEO: monitor Bing (feeds ChatGPT browse); sajikan markdown melalui konten
negotiation; Sanity advises terhadap
llms.txtuntuk besar situs.
Dokumentasi resmi
Utama-sumber documentation dari mesin pencari dan Sanity.
- memahami JavaScript SEO Basics — crawl → render → indeks pipeline, JS canonicals, dan mengapa blocked files jangan mendapatkan dirender. core reference untuk apa pun Sanity frontend.
- Dynamic rendering (deprecated workaround) — mengapa Google deprecated ini dan apa untuk gunakan alih-alih (SSR, static rendering, hydration).
- rendering untuk konten-Driven Web Apps — SSR vs. SSG vs. CSR tradeoffs untuk persis jenis dari konten situs Sanity powers.
- Robots meta tag, data-nosnippet, dan X-Robots-Tag —
X-Robots-Tag: noindexheader HTTP digunakan untuk pertahankan draft/preview respons out dari indeks. - Intro untuk robots.txt — apa robots.txt melakukan dan tidak melakukan (ini controls crawling, tidak pengindeksan dari leaked drafts).
Bing / Microsoft
- baru evergreen Bingbot (Microsoft Edge) — Bingbot rendering JavaScript melalui Edge; relevant since Bing’s indeks feeds ChatGPT browse.
- IndexNow / indexnow.org — push protocol untuk wire untuk Anda Sanity publish webhook.
Sanity
- SEO dengan Sanity — Sanity’s own master SEO guide.
- SEO Optimization course — penuh Berikutnya.js SEO course (schema jenis, dynamic sitemaps, JSON-LD).
- Presenting dan previewing konten (perspectives) —
publishedvs.draftsperspectives, basis dari draft-mode safety.
Quotes dari sumber
pada—record statements relevant untuk Sanity SEO. setiap tautan adalah sebuah deep tautan itu jumps untuk quoted passage pada sumber halaman.
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 with Sanity. Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh dua, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- “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 to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh dua, bagian kecil dua: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- “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 and metadata. Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh dua, bagian kecil tiga: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- “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 to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh dua, bagian kecil empat: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Google — dynamic rendering adalah deprecated
«- “Dynamic rendering was a workaround and not a long-term solution for problems with JavaScript-generated content in search engines.” — Google Search Central docs. Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh empat, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.) «- Recommended instead: “server-side rendering, static rendering, or hydration.” Jump to quote » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh empat, bagian kecil dua: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
«Industry — frontend owns SEO; structure beats plugins » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian delapan puluh lima, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
- “Sanity handles content storage and editing, while your frontend framework handles SEO output.” (terjemahan) “Sanity menangani konten storage dan editing, sementara Anda frontend kerangka kerja menangani SEO output.” — Webstacks, Sanity SEO. Baca guide
- “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.” — Roboto Studio / Jono Alford, AEO & SEO best practices untuk Sanity. Baca post
- “SEO success in Sanity comes from intentional structure, not plugins.” (terjemahan) “SEO success di Sanity muncul dari intentional structure, tidak plugins.” — Yanatiev, SEO best practices untuk Sanity CMS. Baca post
- “Probably don’t do llms.txt.” (terjemahan) “Probably jangan melakukan llms.txt.” — Knut Melvær, Sanity, cara sajikan konten untuk agents. Baca field guide
Sanity SEO checklist
sebuah lulus dibangun sekitar bagaimana Sanity sebenarnya berfungsi — bangun hal platform leaves untuk Anda frontend, dan lock down hal itu diam-diam break.
rendering & konten ( foundation)
- halaman render mereka konten di HTML pada pertama permintaan (SSG atau SSR), tidak hanya setelah client-side JavaScript berjalan.
- Tidak SEO-critical halaman bergantung pada CSR (mentah HTML maximizes LLM-crawler coverage).
- ISR (jika digunakan) regenerates pada sebuah Sanity publish webhook, tidak hanya sebuah timer.
- Portable Text adalah serialized server-side dengan
@portabletext/reactatau@portabletext/to-html(tidak deprecatedblock-content-to-react).
konten model
- Satu reusable
seoobject pada setiap document jenis — tidak per-jenis duplication. - SEO fields adalah overrides melalui
coalesce(), dengan validation aturan enforcing judul/deskripsi length sebelum publish. - sebuah
hideFromSearch(ataunoIndex) boolean ada dan adalah filtered dari keduanya sitemap GROQ kueri dan halaman’s robots metadata.
Frontend outputs
- Metadata wired dari GROQ ke
generateMetadata()(atau kerangka kerja equivalent) — satu reusable helper. - Sitemap generated dari GROQ, drafts/hidden filtered,
_updatedAtdigunakan untuklastModified, regenerated pada sebuah webhook. - Canonicals adalah absolute URLs dari sebuah single
SITE_URL, per-halaman dan self-referencing oleh default. - robots.txt ada di frontend;
.js/.cssadalah tidak blocked. - JSON-LD generated programmatically dari existing fields (artikel, Breadcrumb, FAQ, Organization), verified dengan Rich hasil Test.
Draft / preview safety
- Production API panggilan gunakan
publishedperspective. - setiap draft/preview respons mengirim sebuah
X-Robots-Tag: noindexheader. - Preview secret validated server-side dan scoped untuk Studio origin.
AEO & monitoring
- Bing Webmaster alat siapkan (Bing feeds ChatGPT browse); IndexNow pada publish.
- (Opsional) markdown disajikan melalui konten negotiation untuk AI crawler.
mental models
1. Sanity stores, frontend publishes. konten Lake holds JSON; Anda kerangka kerja produces setiap byte dari HTML dan setiap SEO sinyal. sebelum debugging apa pun Sanity SEO masalah, tanyakan: apa adalah frontend sebenarnya sending crawler? Hampir semuanya resolves untuk itu.
2. rendering mode adalah product. Pick oleh bagaimana konten perubahan:
- Mostly static (blog, docs, marketing) → SSG (rebuild atau ISR pada publish).
- Frequently mengubah, harus menjadi fresh → SSR.
- Hours/days cadence, ingin static speed → ISR (webhook-triggered).
- Behind sebuah login, tidak dimaksudkan untuk menjadi terindeks → CSR adalah acceptable.
- Publik konten Anda ingin diperingkatkan atau cited oleh AI → tidak pernah CSR.
3. Overrides, tidak requirements.
SEO fields default untuk utama konten dan hanya override ketika sebuah editor fills them
di — implemented dengan coalesce(). ini mempertahankan editing experience bersih dan
jaminan setiap halaman memiliki sesuatu untuk -nya judul dan deskripsi.
4. Generate, jangan author, markup. Sitemaps, JSON-LD, hreflang, dan canonicals adalah semua derived dari existing fields di code di render time. sebuah terpisah editor surface untuk apa pun dari them hanya membuat drift. “Derive dari existing fields, di render time, di code.” (terjemahan) “Derive dari existing fields, di render time, di code.”
5. Defense secara mendalam untuk drafts.
published perspective di production adalah layer satu; sebuah X-Robots-Tag: noindex header
pada setiap preview respons adalah layer dua. tidak pernah rely pada sebuah single control untuk pertahankan
unpublished konten out dari indeks.
Sanity SEO — cheat sheet
rendering modes di sebuah glance
| Mode | Di mana HTML adalah dibangun | SEO | Best untuk | Watch out untuk |
|---|---|---|---|---|
| SSG | bangun time → static files | ✅ Best | Blogs, docs, marketing | Stale until rebuild |
| SSR | server, per permintaan | ✅ Best | Frequently-diperbarui konten | Lebih tinggi infra cost |
| ISR | Static + webhook regen | ✅ baik | Hourly/daily konten | Configure publish webhook |
| CSR | di browser | ⚠️ Risky | Logged-di dashboards | Invisible untuk AI crawler |
apa dibangun di frontend (tidak di Sanity)
| Output | Bagaimana |
|---|---|
| Body copy HTML | Serialize Portable Text (@portabletext/react / -to-html) |
| Meta tags | generateMetadata() dari sebuah GROQ hasil |
| Sitemap | GROQ kueri → XML; filter drafts; _updatedAt untuk lastmod |
| Canonicals | Absolute URLs dari satu SITE_URL, per-halaman |
| robots.txt | Static frontend file (robots.ts di Berikutnya.js) |
| JSON-LD | Generated dari existing fields; schema-dts untuk jenis |
| Redirects | Sanity documents → frontend middleware / Worker |
GROQ snippets worth memorizing
- Override dengan fallback:
coalesce(seo.title, title, "") - Plain text dari Portable Text:
pt::text(body) - Sitemap filter:
*[... && defined(slug.current) && hideFromSearch != true]
Fast aturan
- LLM-crawler rendering varies oleh provider → hindari CSR-hanya publik konten.
- Dynamic rendering adalah deprecated — gunakan 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.” (terjemahan) “SEO success di Sanity muncul dari intentional structure, tidak plugins.”
Draft atau preview konten appeared di Search Console
gunakan ini runbook ketika sebuah unpublished Sanity document memiliki sebuah discoverable preview URL atau menampilkan up di Google Search Console.
- Konfirmasi yang respons leaked. Fetch reported URL tanpa Studio
credentials dan inspect keduanya status dan
X-Robots-Tagheader. jika ini mengembalikan published konten, continue untuk langkah 2. jika ini exposes sebuah draft, disable preview entry poin sementara Anda continue. - periksa production perspective. Trace halaman’s GROQ permintaan dan konfirmasi
production menggunakan
publishedperspective. jika ini menggunakandrafts, perbaiki itu kueri pertama; jika ini sudah menggunakanpublished, continue untuk respons layer. - tambahkan pengindeksan backstop. kirim
X-Robots-Tag: noindexpada setiap preview dan draft-mode respons. jika header adalah missing pada apa pun preview route, perbaiki shared preview middleware alih-alih patching satu halaman. - Validate preview access. Konfirmasi preview secret adalah diperiksa server-side, adalah tidak reflected ke destination URL, dan accepts permintaan hanya dari yang dimaksud Studio origin. jika sebuah publik preview URL masih berfungsi, rotate secret dan close itu route.
- hapus terindeks copy. setelah respons adalah safe, gunakan Search Console’s
removal workflow ketika exposure adalah urgent, lalu permintaan sebuah fresh crawl. jika
URL seharusnya tidak pernah exist publicly, pertahankan
noindexrespons tersedia panjang cukup untuk crawler untuk see ini alih-alih blocking ini di robots.txt. - Verify perbaiki. Fetch URL sementara logged out dan jalankan pemeriksaan URL.
draft harus menjadi absent dari body dan preview respons harus carry
noindex.
Sanity SEO mistakes untuk hindari
Expecting Sanity untuk emit SEO HTML
Mengapa ini adalah wrong: Sanity stores JSON; ini melakukan tidak publish judul, canonicals, sitemaps, atau halaman HTML. melakukan ini alih-alih: membuat frontend responsible untuk setiap output dan verify generated respons alih-alih Studio fields.
Choosing CSR untuk publik konten
Mengapa ini adalah wrong: awal respons adalah sebuah empty shell, dan banyak AI crawler melakukan tidak execute JavaScript di semua. melakukan ini alih-alih: ship publik konten dengan SSG, SSR, atau webhook-triggered ISR.
Assuming unpublished berarti unindexable
Mengapa ini adalah wrong: sebuah shared preview URL dapat leak dan menjadi di-crawl. melakukan ini alih-alih:
gunakan published perspective di production dan kirim sebuah X-Robots-Tag: noindex
header pada setiap preview respons.
Treating Portable Text sebagai HTML
Mengapa ini adalah wrong: Portable Text adalah sebuah JSON AST, so un-serialized konten tidak pernah
becomes dapat di-crawl body copy. melakukan ini alih-alih: serialize ini pada server dengan
@portabletext/react atau @portabletext/to-html.
Maintaining JSON-LD di sebuah terpisah editor
Mengapa ini adalah wrong: sebuah kedua copy dari product, artikel, atau organization facts drifts dari terlihat halaman. melakukan ini alih-alih: derive JSON-LD dari yang sama Sanity fields di render time dan validate dirender output.
periksa apakah sebuah Sanity halaman ships nyata HTML
Jalankan ini setelah mengubah rendering mode, Portable Text serialization, atau halaman data memuat. ini memeriksa awal respons, sebelum client-side JavaScript dapat fill gaps.
macOS / Linux — bandingkan wajar dan Googlebot respons
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.htmlpertama command seharusnya temukan halaman’s nyata judul, canonical, H1, dan JSON-LD di
mentah HTML. sebuah bermakna konten perbedaan di diff deserves investigation;
crawler dan pengguna seharusnya tidak menerima berbeda canonical konten.
Windows PowerShell — inspect awal respons
$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 — konfirmasi Portable Text menjadi semantic elements
[...document.querySelectorAll('main article p, main article h2, main article li')]
.map((node) => node.textContent.trim())
.filter(Boolean)
.slice(0, 20)Jalankan snippet di browser Console. ini adalah sebuah dirender-DOM periksa, so pair ini dengan
curl test: konten appearing hanya di sini tetapi tidak di awal respons adalah masih
client-dirender.
alat untuk Sanity SEO
«- URL Inspection (Google Search Console) — see how a single URL was crawled and rendered. The rendered HTML tells you whether your Portable Text actually made it in — essential for catching CSR gaps on a Sanity frontend.
- Rich Results Test — confirm your programmatic JSON-LD is present in the rendered output after any rendering or template change.
- Screaming Frog SEO Spider — crawl with JavaScript rendering on/off to compare raw HTML vs. rendered HTML; this is how you prove whether your content is server- rendered or client-rendered.
- Ahrefs Site Audit — surfaces missing metadata, broken canonicals, redirect chains, and indexability issues across the whole frontend.
- Bing Webmaster Tools — submit your sitemap and monitor Bing indexing (it feeds ChatGPT browse), plus where IndexNow submissions show up.
sanity-plugin-seo— in-Studio live SEO score, meta/OG preview, and robots control so editors get feedback at authoring time. » (Terjemahan) (Ringkasan bahasa Indonesia untuk bagian seratus empat puluh tujuh, bagian kecil satu: teks sumber dipertahankan agar dapat diperiksa dalam tinjauan penutur asli.)
Uji pemahaman Anda: Sanity SEO
Five quick pertanyaan pada bagaimana SEO berfungsi pada sebuah Sanity-backed situs. Pick sebuah jawaban untuk setiap, lalu periksa.
Resources worth Anda time
My related writing
- JavaScript SEO Issues & Best Practices — my utama reference pada rendering modes, yang decide semuanya pada sebuah Sanity frontend.
- Beginner’s Guide untuk SEO teknis — di mana rendering dan crawling fit di bigger picture.
My speaking
- JavaScript SEO — Ungagged 2019 (SlideShare) — my walkthrough dari bagaimana headless/decoupled CMSes split frontend dari backend, plus Googlebot’s stateless rendering. (Standing disclaimer: dynamic-rendering recommendation di itu deck adalah now outdated — Google deprecated ini.)
pada ini situs
- SEO untuk sebuah CMS headless — sibling guide; Sanity adalah sebuah spesifik application dari yang sama headless aturan.
- JavaScript SEO — rendering deep dive.
- Canonicalization — consolidation mechanics behind Anda frontend’s tag canonical.
- AI Penelusuran — bagaimana AI crawler dan jawaban mesin behave.
dari sekitar industry
- SEO dengan Sanity (Sanity) — Sanity’s own master SEO guide; mulai di sini untuk platform-saat ini perilaku.
- SEO Optimization course (Sanity Learn) — hands-pada Berikutnya.js course covering SEO object, dynamic sitemaps, dan JSON-LD.
- Sanity SEO (Webstacks, Devon Wood) — agency guide membuat “frontend menangani SEO output” (terjemahan) “frontend menangani SEO output” poin dengan jelas.
- AEO & SEO best practices untuk Sanity (Roboto Studio, Jono Alford) — AEO angle dan “derive JSON-LD dari existing fields” (terjemahan) “derive JSON-LD dari existing fields” aturan.
- SEO best practices untuk Sanity CMS (Yanatiev) — “structure, tidak plugins” (terjemahan) “structure, tidak plugins” framing.
- cara sajikan konten untuk agents: sebuah field guide (Knut Melvær, Sanity) — konten negotiation dan case terhadap llms.txt untuk besar situs.
- CMS headless SEO (Ahrefs, Despina Gavoyannis) — lebih luas headless playbook (konten/code/design dioptimalkan independently) itu Sanity sits di dalam.
- turbo-mulai-sanity (Roboto Studio, GitHub) — sebuah open-sumber Sanity SEO starter dengan nyata
query.ts,seo-fields.ts, danseo.tsimplementations.
Log perubahan
Diperbarui 19 Jul 2026.
Ringkasan editorial dan detail perubahan yang tercatat.Detail perubahan
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
-
Catatan perubahan terperinci saat ini tersedia dalam bahasa Inggris.
Perbandingan lengkap tidak tersedia — tidak ada cuplikan sebelumnya yang diarsipkan untuk revisi ini.