Hướng dẫn về Sanity SEO

Sanity stores nội dung as JSON và emits zero HTML — của bạn frontend decides của bạn SEO. Kết xuất modes, Portable Text, đó SEO object, sitemaps, draft-chế độ noindex, JSON-LD, và plugin.

Xuất bản lần đầu: 27 thg 6, 2026 · Cập nhật lần cuối: 8 thg 8, 2026 · Advanced
Ngôn ngữ

Sanity là một headless CMS đó stores nội dung as structured JSON trong của nó Nội dung Lake và produces không HTML — so của bạn frontend framework (Tiếp theo.js, Astro, Remix) decides mọi thứ về của bạn SEO. Đó single biggest lever là kết xuất: SSG và SSR ship hoàn tất HTML và là safe; CSR là risky vì LLM-crawler kết xuất contracts vary by provider. Portable Text là một JSON AST, không HTML, so đó frontend phải serialize điều này. Xây dựng một reusable SEO object trong đó nội dung model, generate sitemaps và JSON-LD programmatically, giữ drafts out of đó chỉ mục với an X-Robots-Tag: noindex header, và dùng sanity-plugin-seo (không đó deprecated Yoast pane). SEO success trong Sanity xuất hiện từ intentional structure, không plugin.

TL;DR — Sanity là nội dung-neutral: điều này stores structured JSON trong đó Nội dung Lake và emits zero HTML, so đó frontend kết xuất chế độ decides mọi thứ. SSG và SSR ship hoàn tất HTML và là safe; CSR là đó risky một vì LLM các crawler không execute JavaScript, và Google deprecated dynamic kết xuất as một workaround. Portable Text là một JSON AST đó frontend phải serialize. Xây dựng một reusable seo object trong đó nội dung model với overrides (không requirements) qua coalesce(), generate sitemaps và JSON-LD programmatically từ existing các trường, và giữ drafts out of đó chỉ mục với an X-Robots-Tag: noindex header on mỗi preview phản hồi. Dùng sanity-plugin-seo — không bao giờ đó deprecated Yoast pane — nhưng remember “SEO success in Sanity comes from intentional structure, not plugins.” (bản dịch) «SEO success trong Sanity xuất hiện từ intentional structure, không plugin.»

Sanity là nội dung storage, không publisher

hữu ích đầu tiên principle: Sanity touches của bạn nội dung, không bao giờ của bạn kết xuất. nội dung Lake stores mọi thứ as structured JSON, queried với GROQ (Sanity query language) hoặc REST. Sanity Studio — editing UI — là React single-trang app đó thường lives on của nó own .sanity.studio subdomain và không phải điều gì đó bạn chỉ mục. Không có gì trong điều này stack produces HTML.

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

So đó entire SEO surface lives trong của bạn frontend framework. As Webstacks put điều này, “Sanity handles content storage and editing, while your frontend framework handles SEO output.” (bản dịch) «Sanity xử lý nội dung storage và editing, trong khi của bạn frontend framework xử lý SEO output.» đó là không một limitation — đây là đó toàn bộ headless model. Sanity own team frames điều này 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.” (bản dịch) «Khi dùng Sanity as một CMS, bạn là đang làm headless SEO. Although này approach requires thoughtful kỹ thuật implementation, điều này có thể liberate nội dung của bạn để help bạn reach hơn người dùng trên all channels.» Đó hoạt động là real, nhưng đây là đó giống nhau hoạt động as bất kỳ headless xây dựng (see SEO cho một Headless CMS).

Kết xuất chế độ là foundation

vì frontend xây dựng HTML, kết xuất decision là single phần lớn consequential SEO lựa chọn on Sanity trang web. Four modes:

SSG — Static trang web Generation. nội dung là fetched từ Sanity tại xây dựng time và baked vào static HTML phân phối từ CDN. Best-case SEO: fully-được kết xuất HTML on đầu tiên yêu cầu, fast TTFB. Ideal cho blog posts, marketing các trang, và sản phẩm/landing các trang. tradeoff là freshness — changed nội dung cần rebuild (ISR solves điều này).

SSR — máy chủ-Side Kết xuất. nội dung là fetched theo yêu cầu và đầy đủ HTML là được kết xuất on máy chủ. Excellent SEO, luôn fresh. sử dụng nó cho frequently đã cập nhật nội dung. Tradeoff là infrastructure cost và slightly cao hơn TTFB hơn static files.

ISR — Incremental Static Regeneration (Vercel/tiếp theo.js). Static các trang regenerate trong background, ideally triggered by Sanity webhook on publish so trang rebuilds moment editor hits publish. Đây là best của SSG speed và SSR freshness cho nội dung đó thay đổi on order của hours hoặc days.

CSR — Client-Side Kết xuất. HTML shell ships, sau đó JavaScript fetches từ Sanity và xây dựng DOM trong trình duyệt. Đây là worst SEO option: Googlebot có để queue trang cho sau đó render wave, timing là unpredictable, và AI các crawler và nhiều khác bots see chỉ shell. CSR là acceptable chỉ behind authentication cho nội dung bạn không muốn được lập chỉ mục anyway.

Và không reach cho đó old shortcut: Google có deprecated dynamic kết xuất (serving prerendered HTML để bots, CSR để người dùng). Officially, “dynamic rendering was a workaround and not a long-term solution,” (bản dịch) «dynamic kết xuất đã là một workaround và không một dài-term giải pháp,» và Google hiện tại khuyến nghị “server-side rendering, static rendering, or hydration.” (bản dịch) «máy chủ-side kết xuất, static kết xuất, hoặc hydration.» Cho một Sanity site, đó có nghĩa là SSG hoặc SSR — không một bot-detection hack. (Đầy đủ kết xuất treatment trong JavaScript SEO.)

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

Portable Text — của bạn thân phản hồi copy là JSON AST

Đây là phần lớn Sanity-cụ thể điều on trang. Sanity stores rich text as Portable Text: JSON abstract syntax tree, không HTML. thân phản hồi copy trong nội dung Lake looks như array của typed chặn, không <p> tags. của bạn frontend có để serialize nó vào HTML trước khi bất kỳ crawler có thể đọc nó:

  • @portabletext/react — cho React/tiếp theo.js.
  • @portabletext/to-html — framework-agnostic (Astro, Remix, bất cứ điều gì).
  • old @sanity/block-content-to-reactdeprecated — không sử dụng nó.

nếu bạn render máy chủ-side hoặc tại xây dựng time, serialization happens trước khi trang là được gửi và các crawler nhận đầy đủ HTML. nếu bạn render client-side, serialization chạy trong trình duyệt. vì LLM-crawler kết xuất contracts vary by provider, CSR Portable Text tạo coverage risk đó thô HTML tránh. có cũng handy GROQ helper: pt::text(body) extracts all đơn giản text từ Portable Text trường as string, mà là perfect cho feeding JSON-LD các mô tả không có tách biệt editor trường.

nội dung modeling Đối với SEO — reusable SEO object

Đó sạch nhất pattern, và đó một Sanity own course teaches, là một single reusable seo object đã thêm để mỗi document loại — không SEO các trường copy-pasted theo loại. Đó key design principle từ 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.” (bản dịch) «Cho đó benefit of nội dung authors, các trường relevant để SEO không nên luôn là bắt buộc. Thay vì, they nên là được dùng để override some existing nội dung, khi provided.»

trên thực tế đó có nghĩ là SEO các trường là overrides với fallbacks, implemented với GROQ 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), và noIndex boolean. Thêm Sanity validation rules để enforce những điều đó character limits trước khi publish — so editors catch các vấn đề nền tảng sẽ nếu không let qua. sử dụng slug loại với custom generation function, và sử dụng references cho liên kết nội bộ so URL thay đổi propagate tự động. Thêm hideFromSearch boolean và filter nó out của cả hai sitemap GROQ query trang robots metadata.

Metadata, sitemaps, và canonicals — all được xây dựng trong frontend

Metadata. Trong tiếp theo.js App Router, sử dụng exported generateMetadata() function (không inline <head> tags) so metadata không duplicate trên nested layouts. Xây dựng một máy chủ-side helper đó takes GROQ kết quả và trả về framework metadata object — implement nó sau khi, sử dụng nó mọi nơi. Open Graph images có thể là generated dynamically với tiếp theo.js Edge OG generation, pulling nội dung straight từ Sanity.

Sitemaps. có không auto-sitemap. bạn xây dựng nó từ GROQ query → URL array → XML (sitemap.ts trong tiếp theo.js, @astrojs/sitemap trong Astro). luôn filter drafts và hidden các trang:

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

sử dụng _updatedAt (không _createdAt hoặc manual date) cho lastModified, giữ riêng lẻ sitemap files dưới 50 000 các URL với chỉ mục cho lớn hơn các trang, và trigger regeneration qua Sanity webhook on publish/unpublish so nó không bao giờ goes stale.

Canonicals. đặt canonical các URL từ nội dung model, default để self-referencing canonical, và xây dựng absolute các URL từ single SITE_URL so canonical không bao giờ drifts. (Mechanics trong Canonicalization.)

Dữ liệu có cấu trúc — generate nó, không tác giả nó

Đó right pattern là để generate JSON-LD programmatically từ existing nội dung các trường tại render time — không bao giờ xây dựng một tách biệt JSON-LD editor surface trong Studio, mà chỉ tạo drift giữa nội dung và markup. Roboto Studio rule là blunt: “Derive JSON-LD from existing fields, at render time, in code.” (bản dịch) «Derive JSON-LD từ existing các trường, tại render time, trong code.» Sanity agrees — “JSON-LD is a powerful way to provide structured data to search engines — fortunately structured data is what Sanity does best.” (bản dịch) «JSON-LD là một powerful way để cung cấp dữ liệu có cấu trúc để các công cụ tìm kiếm — fortunately dữ liệu có cấu trúc là điều gì Sanity làm best.»

Dùng pt::text(body) để pull đơn giản text cho schema các mô tả, đó TypeScript package schema-dts cho loại safety, và render điều này với <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>.” (bản dịch) «đó JSON-LD markup có thể là được kết xuất anywhere trong đó trang — điều này không cần để là stored bên trong đó .» Priority types cho nội dung các trang: Bài viết/BlogPosting, BreadcrumbList, FAQPage, Organization, WebSite.

Giữ drafts out của Google — thực-incident pitfall

Sanity perspective hệ thống controls draft visibility: published trả về chỉ production nội dung; drafts trả về draft documents cho preview. Luôn dùng đó published perspective trong production API calls. Nhưng đó alone không đủ, vì draft URLs leak. As một nhà phát triển recounted, đó danger là “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.” (bản dịch) «một client panicking vì an unpublished landing trang showed lên trong Google Search Console. Nếu một nội dung editor chia sẻ đó URL trong Slack, và ai đó clicks điều này từ một trình duyệt đó là thì được crawl (điều này happens), đó draft nội dung có thể end lên được lập chỉ mục.»

reliable defense là multi-layer một:

  1. sử dụng published perspective trong production; không bao giờ expose unprotected preview điểm cuối.
  2. Thêm X-Robots-Tag: noindex HTTP header để mỗi draft-chế độ/preview phản hồi — ngay cả nếu draft URL leaks và nhận được crawl, Googlebot respects header và sẽ không chỉ mục nó. (không rely on robots.txt cho điều này; header là nhiều hơn reliable hơn disallow cho preview các trang.)
  3. Validate preview secret máy chủ-side; không bao giờ reflect nó trong chuyển hướng URL, và phạm vi preview-enable điểm cuối để của bạn Studio origin.

Robots, các chuyển hướng, image SEO, và hreflang

robots.txt là static frontend file (app/robots.ts trong tiếp theo.js). Block Studio paths chỉ nếu họ’re on giống nhau domain (Disallow: /studio/); không try để block preview các trang với nó.

Các chuyển hướng là genuine workflow win: store them as Sanity documents (from, to, statusCode) so nội dung team có thể manage các chuyển hướng không có nhà phát triển deploy, sau đó implement them trong tiếp theo.js middleware.ts hoặc CDN/Worker layer (không bao giờ trong Sanity itself). Thêm validation rules để ngăn loops và không hợp lệ paths.

Image SEO: sử dụng Sanity image CDN với ?auto=format cho tự động WebP/AVIF, manage alt text tại asset cấp độ với document-cấp độ overrides, sử dụng vanity filenames thay vì hashed các URL, và đặt hotspot/crop so tự động crops giữ subject — mà matters phần lớn cho OG images.

Hreflang: model locale variants as tách biệt Sanity documents referencing canonical version, generate hreflang từ GROQ query returning all locale slugs, và cho mỗi locale trang self-referencing canonical — không bao giờ canonical non-English trang để English một.

Plugin — helpful, không substitute

  • sanity-plugin-seo — chính khuyến nghị (22k+ downloads). Trực tiếp SEO score, meta/OG preview, social cards, robots control, hreflang, readability. AI tier adds từ khóa suggestions và meta generation.
  • sanity-plugin-seofields — alternative: 39 schema.org types, SEO Health Dashboard, và tiếp theo.js helper functions (buildSeoMeta()).
  • sanity-plugin-seo-paneDEPRECATED. Đây là old Yoast integration, đã xóa due để outdated dependency. nó vẫn hiển thị lên trong old tutorials. không sử dụng nó.

Đó honest cách diễn đạt, từ Yanatiev: “SEO success in Sanity comes from intentional structure, not plugins.” (bản dịch) «SEO success trong Sanity xuất hiện từ intentional structure, không plugin.» Plugin surface các trường và cho editorial feedback — they không replace proper nội dung modeling.

AI tìm kiếm và AEO

Đó 2026 wrinkle: LLM training và retrieval các crawler (Anthropic, OpenAI, Phổ biến Crawl) typically không execute JavaScript hôm nay, so CSR Portable Text là largely invisible để them regardless of liệu Googlebot có thể render điều này — nhưng này là provider-cụ thể và không một guaranteed contract. Google Gemini pipeline là đó notable exception, since điều này reuses Googlebot’s own kết xuất infrastructure, và other providers’ behavior có thể thay đổi. Treat “no rendering” (bản dịch) «không kết xuất» as đó safe assumption để xây dựng cho, không một vĩnh viễn law. Beyond kết xuất, hai Sanity-friendly tactics: serve sạch markdown qua nội dung negotiation khi Accept: text/markdown là present (Sanity @portabletext/markdown package converts Portable Text với không extra authoring), và monitor Bing cụ thể since Bing chỉ mục feeds ChatGPT’s browse các phản hồi. On llms.txt, Sanity own Knut Melvær là skeptical — “Probably don’t do llms.txt” (bản dịch) «Probably không làm llms.txt» đối với các trang web lớn, vì đó all-hoặc-không có gì phạm vi và file-size limits làm điều này impractical; theo-trang nội dung negotiation là hơn granular. Roboto Studio summary là đó right mindset: “AEO and SEO live on the same plumbing, so we treat them as one job.” (bản dịch) «AEO và SEO trực tiếp on đó giống nhau plumbing, so we treat them as một job.» (Hơn trong AI Tìm kiếm.)

myths worth killing

  • “Sanity does SEO automatically like WordPress + Yoast.” (bản dịch) «Sanity làm SEO tự động như WordPress + Yoast.» Không. Zero HTML, zero tự động bất cứ điều gì.
  • “Any rendering mode is fine if the content’s in Sanity.” (bản dịch) «Bất kỳ kết xuất chế độ là fine nếu đó nội dung trong Sanity.» Không. CSR breaks lập chỉ mục và AI visibility; dynamic kết xuất là deprecated.
  • “Drafts can’t be indexed.” (bản dịch) «Drafts không thể là được lập chỉ mục.» They có thể, nếu một preview URL leaks. Dùng một noindex header.
  • “Portable Text is HTML.” (bản dịch) «Portable Text là HTML.» đây là một JSON AST đó frontend phải serialize.
  • “You need a JSON-LD editor in Studio.” (bản dịch) «Bạn cần một JSON-LD editor trong Studio.» Không — generate điều này từ existing các trường.

Add an expert note

Pin an expert quote

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