Artikel

Sanity SEO — fleksibelt headless CMS med GROQ og Portable Text

Sanity er et fleksibelt headless CMS med GROQ-forespørgselssprog og real-time collaboration. SEO implementeres i frontend — Sanity Studio kan udvides med SEO-præview direkte i editoren.

Hvide blokke i fleksibelt arrangement — abstrakt metafor for modulaer CMS-data

Sanity er et open-source headless CMS med en hosted cloud-infrastruktur. Det adskiller sig fra konkurrenter primært på tre punkter: GROQ-forespørgselssproget, Portable Text-formatet til rig tekst og real-time collaboration i Sanity Studio. Som med alle headless CMS er SEO frontend-lagets ansvar — Sanity leverer struktureret indhold, frontend leverer crawlbare sider.

Sanity Studio og SEO-preview

Sanity Studio er den tilpasselige editor-applikation der deployes som en del af projektet (typisk på studio.ditsite.dk). I modsætning til Contentful’s fixed editor-interface er Sanity Studio fuldt tilpasseligt via React-komponenter.

Det muliggør SEO-preview direkte i editoren: du kan bygge eller installere et plugin der viser en live-preview af, hvordan meta title og description vil se ud i et Google SERP-resultat, mens redaktøren skriver. sanity-plugin-seo-pane er et open source plugin der løser præcis dette og er kompatibelt med Sanity v3.

SEO-fields konfigureres som document-schema-felter:

// schemas/article.ts
{
  name: 'seo',
  title: 'SEO',
  type: 'object',
  fields: [
    { name: 'metaTitle', type: 'string', title: 'Meta title' },
    { name: 'metaDescription', type: 'text', title: 'Meta description', rows: 3 },
    { name: 'noindex', type: 'boolean', title: 'Skjul fra søgemaskiner' },
  ],
}

GROQ-queries til SEO-data

I frontend hentes SEO-data via GROQ. Et eksempel der henter indholdsdata og SEO-felter i én query til Next.js:

const query = groq`
  *[_type == "article" && slug.current == $slug][0]{
    title,
    "slug": slug.current,
    body,
    "seo": seo{
      metaTitle,
      metaDescription,
      noindex,
      "ogImage": ogImage.asset->url
    }
  }
`;

GROQ’s projection-syntax ({ ... }) henter præcis de felter du behøver — ingen over-fetching der belaster API-limits.

Portable Text og semantisk HTML

Portable Text renderer til korrekt semantisk HTML via @portabletext/react. Standard-rendereren genererer <p>, <h2>, <h3>, <ul>, <li> og <strong> korrekt. Custom components kan tilføjes for specifikke block-typer:

import { PortableText } from '@portabletext/react';

const components = {
  block: {
    h2: ({ children }) => <h2 className="text-2xl font-bold">{children}</h2>,
    normal: ({ children }) => <p>{children}</p>,
  },
};

<PortableText value={body} components={components} />

Korrekt semantisk heading-hierarki er vigtigt for Googles passage-ranking — Portable Text giver fuld kontrol over dette.

Sanity med Astro — en stærk SEO-kombination

Sanity + Astro er kombinationen der giver det bedste fra begge verdener til content-sites: Sanity giver redaktørerne et brugervenligt interface med real-time preview; Astro genererer statisk HTML med nul JavaScript-payload.

Den officielle @sanity/astro-integration håndterer Sanity-klient-konfiguration. GROQ-queries køres i Astro-komponenternes frontmatter-sektion ved build-tid — resultatet er statiske sider der ikke kalder Sanity API på runtime.

Andre artikler i samme emne

Ofte stillede spørgsmål

Håndterer Sanity SEO automatisk?
Nej — som alle headless CMS er Sanity et indholdslager. SEO-meta tags, canonical tags og structured data implementeres i frontend-applikationen. Sanity Studio kan dog udvides med SEO-preview via sanity-plugin-seo eller custom plugins der viser, hvordan meta title og description vil se ud i søgeresultater, direkte i editoren.
Hvad er GROQ og hvad betyder det for SEO-implementering?
GROQ (Graph-Relational Object Queries) er Sanitys forespørgselssprog. Det er mere udtryksfuldt end REST for komplekse datastrukturer — du kan hente præcis de felter du behøver i én forespørgsel, inkl. nested referencer. Til SEO-implementering betyder det at du kan hente SEO-data (metaTitle, metaDescription, ogImage) og indholdsdata i én GROQ-query frem for multiple API-kald. Det giver renere frontend-kode og færre API-requests ved server-side rendering.
Hvad er Sanity Portable Text og har det SEO-implikationer?
Portable Text er Sanitys format til rig tekst — struktureret JSON frem for HTML-strenge. Det giver frontend-laget fuld kontrol over rendering: du renderer Portable Text til HTML via @portabletext/react eller @portabletext/svelte. SEO-implikationen er positiv: du kan sikre korrekt semantisk HTML-output (h2, h3, p-hierarki) og undgå div-suppe der kan skade læsbarhed for Googlebot. Du kan også injicere structured data-markering direkte i Portable Text-rendering.
Hvad koster Sanity og hvornår er det det rigtige valg?
Sanity's gratis tier (Free) giver 3 brugere, 10GB bandwidth og 100.000 API-requests per måned — tilstrækkeligt til de fleste mindre projekter. Growth-planen koster $15/bruger/måned og giver ubegrænset projekter og øget API-kapacitet. Sanity er det bedste valg over Contentful når: fleksibel indholdsdatamodellering er vigtig, real-time collaboration er ønsket, og budgettet er lavere end Contentful's Team-plan. Contentful er bedre ved enterprise-compliance-krav og brug af Contentful-certificerede partnere.
Kan man bruge Sanity med Astro?
Ja — Sanity har en officiel Astro-integration (@sanity/astro) der håndterer Sanity-klient-konfiguration og giver adgang til GROQ-queries i Astro-komponenter. Kombinationen Sanity + Astro er populær til content-tunge sites: Sanity giver redaktørerne et brugervenligt interface; Astro leverer statisk output med nul JavaScript. For SEO er det en stærk kombination — statisk HTML fra Astro med redaktørvenlig indholdsstyring fra Sanity.

Placering i ordbogen