Techsy
Επικοινωνία
Ξεκίνα τώρα
Επιστροφή στο blog
guides

Οδηγός Sanity CMS: Πώς το χρησιμοποιούμε για δημοσίευση σε 10 γλώσσες

Ραίτη Mert Batur Gürbüz
Apr 6, 2026
18 εξάγουμε ανάγνωση
Περιεχόμενα
Οδηγός Sanity CMS: Πώς το χρησιμοποιούμε για δημοσίευση σε 10 γλώσσες

Οδηγός Sanity CMS: Πώς το χρησιμοποιούμε για δημοσίευση σε 10 γλώσσες

Έχουμε δημοσιεύσει πάνω από 400 κομμάτια περιεχομένου σε 4 ιστοσελίδες και 10 γλώσσες μέσω του Sanity CMS. Ακολουθούν όσα μάθαμε, από τον σχεδιασμό σχήματος μέχρι την αυτοματοποιημένη πολυγλωσσική δημοσίευση.

Το Sanity CMS είναι μια headless πλατφόρμα περιεχομένου χτισμένη γύρω από δομημένο περιεχόμενο, ένα Content Lake σε πραγματικό χρόνο και έναν προσαρμόσιμο editor βασισμένο σε React, το Sanity Studio. Χρησιμοποιεί τη γλώσσα GROQ για ερωτήματα, το Portable Text για πλούσιο περιεχόμενο και την προσέγγιση schema-as-code για τη μοντελοποίηση περιεχομένου. Αυτός ο οδηγός καλύπτει τη ρύθμιση, τον σχεδιασμό σχήματος, το GROQ, το Portable Text, την πολυγλωσσική αρχιτεκτονική και τις τιμές.

Τι είναι το Sanity CMS;

Το Sanity είναι μια πλατφόρμα δομημένου περιεχομένου, αυτό που η ομάδα της Sanity.io αποκαλεί «λειτουργικό σύστημα περιεχομένου». Σε αντίθεση με τα παραδοσιακά CMS που αποθηκεύουν blobs HTML σε μια βάση δεδομένων, το Sanity αποθηκεύει κάθε κομμάτι περιεχομένου ως δομημένο JSON σε ένα διαχειριζόμενο backend που ονομάζεται Content Lake. Μπορείτε να κάνετε ερωτήματα σε αυτό με GROQ ή GraphQL και να αποδώσετε το περιεχόμενο σε οποιοδήποτε frontend επιθυμείτε: Next.js, React Native, Svelte, μια mobile εφαρμογή, ένα εργαλείο CLI, οτιδήποτε.

Οι εταιρείες που το χρησιμοποιούν καλύπτουν όλο το φάσμα. Η Nike, η Figma, η Puma και η Cloudflare χρησιμοποιούν το Sanity σε enterprise κλίμακα. Οι startups το χρησιμοποιούν επειδή το δωρεάν επίπεδο είναι πραγματικά usable (περισσότερα για τις τιμές αργότερα). Εμείς το χρησιμοποιούμε επειδή τίποτα άλλο δεν μας έδωσε την ευελιξία να χτίσουμε μια πλήρως αυτοματοποιημένη ροή εργασίας δημοσίευσης σε 10 γλώσσες.

Αρχιτεκτονική Content Lake

Το Content Lake είναι το διαχειριζόμενο backend του Sanity. Σκεφτείτε το ως ένα hosted κατάστημα εγγράφων που συγχρονίζεται σε πραγματικό χρόνο σε όλους τους συνδεδεμένους clients. Όταν ένας editor αλλάζει μια παράγραφο στο Sanity Studio, ένας άλλος editor τη βλέπει αμέσως, χωρίς κουμπί αποθήκευσης, χωρίς συγκρούσεις merge, χωρίς migrations βάσης δεδομένων.

Στο παρασκήνιο, τα έγγραφα αποθηκεύονται ως δομημένο JSON με typed fields. Κάθε μετάλλαξη παρακολουθείται μέσω ενός transaction log, οπότε έχετε πλήρες ιστορικό εκδόσεων εξ ορισμού. Ο συγχρονισμός σε πραγματικό χρόνο χρησιμοποιεί μια αρχιτεκτονική βασισμένη σε listeners (που περιγράφεται στα docs αρχιτεκτονικής του Sanity στο GitHub) η οποία pushes αλλαγές σε όλους τους subscribers μέσω RxJS observables.

Τι κάνει αυτό διαφορετικό από, ας πούμε, μια βάση δεδομένων PostgreSQL με ένα REST API; Το Content Lake χειρίζεται τη μοντελοποίηση περιεχομένου, τον έλεγχο πρόσβασης, την caching CDN, τους μετασχηματισμούς εικόνων και τη συνεργασία σε πραγματικό χρόνο ως μία ενιαία διαχειριζόμενη υπηρεσία. Δεν εκτελείτε migrations. Δεν διαχειρίζεστε replicas. Απλώς ορίζετε schemas και κάνετε query στο περιεχόμενο.

Sanity Studio: Ο προσαρμόσιμος editor σας

Το Sanity Studio είναι μια open-source εφαρμογή React που serves ως η διεπαφή επεξεργασίας σας. Δεν είναι ένα hosted admin panel, είναι μια εφαρμογή React που ζει στον κώδικά σας. Μπορείτε να προσαρμόσετε κάθε πτυχή της: custom input components, conditional fields, ενέργειες εγγράφων, patterns structure builder και plugins.

Η συνεργασία σε πραγματικό χρόνο είναι ενσωματωμένη. Πολλοί editors μπορούν να εργαστούν ταυτόχρονα στο ίδιο έγγραφο με indicators παρουσίας και live updates. Αν έχετε χρησιμοποιήσει το Google Docs, η εμπειρία είναι παρόμοια, βλέπετε τους κέρσορες και τις αλλαγές των άλλων ατόμων σε πραγματικό χρόνο.

Αναπτύσσουμε το Studio μας με npx sanity deploy, το οποίο το φιλοξενεί στο CDN της Sanity σε ένα custom subdomain. Μπορείτε επίσης να το self-host αφού είναι απλώς μια εφαρμογή React. Κατατάξαμε το Sanity υψηλά στη σύγκριση headless CMS κυρίως λόγω της ευελιξίας του Studio.

Πώς να ρυθμίσετε ένα project Sanity

Για να ρυθμίσετε το Sanity CMS, εγκαταστήστε το CLI με npm create sanity@latest, επιλέξτε ένα template project, διαμορφώστε τα αρχεία schema σας και εκτελέστε npx sanity dev για να ξεκινήσετε το Studio locally. Η整个过程 διαδικασία διαρκεί λιγότερο από 5 λεπτά.

Προαπαιτούμενα και Εγκατάσταση

Χρειάζεστε Node.js 18+ και npm (ή pnpm). Αυτό είναι όλο. Εκτελέστε την εντολή init:

bash
npm create sanity@latest

# You'll be prompted for:
# - Login method (Google, GitHub, email)
# - Project name
# - Dataset name (default: "production")
# - Project template (blog, ecommerce, clean)
# - TypeScript? (recommended: yes)

Το CLI δημιουργεί ένα project με όλα όσα χρειάζεστε. Έτσι φαίνεται η δομή του project:

Επεξήγηση Δομής Project

text
my-sanity-project/
├── schemas/              # Your content schemas (this is where you'll spend time)
│   ├── index.ts          # Schema registry -- imports and exports all types
│   ├── post.ts           # Document type definitions
│   └── blockContent.ts   # Rich text / Portable Text config
├── sanity.config.ts      # Main config -- plugins, Studio structure, dataset
├── sanity.cli.ts         # CLI config -- project ID, dataset
├── package.json
└── tsconfig.json

Το αρχείο sanity.config.ts είναι το σημείο εισόδου σας. Εδώ είναι ένα ελάχιστο παράδειγμα:

typescript
// sanity.config.ts
import { defineConfig } from 'sanity'
import { structureTool } from 'sanity/structure'
import { visionTool } from '@sanity/vision'
import { schemaTypes } from './schemas'

export default defineConfig({
  name: 'default',
  title: 'My Blog',
  projectId: 'your-project-id',
  dataset: 'production',
  plugins: [structureTool(), visionTool()],
  schema: { types: schemaTypes },
})

Το plugin visionTool() σας δίνει ένα playground GROQ μέσα στο Studio, θα το χρησιμοποιείτε συνεχώς κατά την ανάπτυξη.

Ανάπτυξη του Studio σας

Ξεκινήστε locally με npx sanity dev (τρέχει στο localhost:3333). Όταν είστε έτοιμοι να το μοιραστείτε με τους editors, αναπτύξτε το στο CDN της Sanity:

bash
npx sanity deploy
# Prompts for a hostname, e.g., "my-blog"
# Deploys to https://my-blog.sanity.studio

Pro tip: εκτελέστε npx sanity@latest schema deploy μετά από οποιαδήποτε αλλαγή στο schema. Αυτό ανεβάζει το schema σας στο API της Sanity, το οποίο ενεργοποιεί λειτουργίες όπως το GraphQL API και εργαλεία με awareness schema (συμπεριλαμβανομένου του MCP server που θα καλύψουμε αργότερα).

Σχεδιασμός Schema στο Sanity CMS

Τα schemas του Sanity ορίζονται ως αντικείμενα JavaScript ή TypeScript στον κώδικά σας. Κάθε schema καθορίζει έναν τύπο εγγράφου με fields, κανόνες επικύρωσης και custom input components. Οι αλλαγές στα schemas είναι άμεσες, δεν απαιτούνται migrations βάσης δεδομένων. Αυτή είναι η προσέγγιση «schema-as-code», και είναι αυτό που μας έκανε να επιλέξουμε το Sanity αντί του Contentful.

Τύποι Fields και Επικύρωση

Το Sanity διαθέτει ένα πλούσιο σύνολο τύπων fields. Εδώ είναι αυτά που χρησιμοποιούμε περισσότερο:

Τύπος FieldΠερίπτωση ΧρήσηςΠαράδειγμα
stringΣύντομο κείμενο, τίτλοι, slugsΤίτλος ανάρτησης, όνομα συγγραφέα
textΠολυγραμμικό απλό κείμενοΠεριλήψεις, περιγραφές
numberΑκέραιοι, δεκαδικοίΧρόνος ανάγνωσης, σειρά ταξινόμησης
booleanΔιακόπτεςΣημαία Featured, κατάσταση draft
arrayΛίστες, πλούσιο κείμενο (Portable Text)Περιεχόμενο σώματος, ετικέτες
referenceΣυνδέσεις με άλλα έγγραφαΣυγγραφέας, κατηγορία
imageΕικόνες με metadataΕικόνα εξωφύλλου με alt text
slugStrings φιλικά προς URLAuto-generated από τον τίτλο
objectΟμάδες nested fieldsSEO fields (metaTitle + metaDescription)
date / datetimeΗμερομηνίεςΗμερομηνία δημοσίευσης

Κάθε field υποστηρίζει επικύρωση μέσω μιας callback validation. Μπορείτε να επιβάλετε required fields, min/max τιμές, patterns regex και custom κανόνες:

typescript
defineField({
  name: 'seoDescription',
  title: 'Meta Description',
  type: 'string',
  validation: (Rule) =>
    Rule.required()
      .min(145)
      .max(160)
      .warning('Meta description should be 145-160 characters'),
})

Custom Block Types (Τα παραδείγματα παραγωγής μας)

Εδώ γίνεται ενδιαφέρον το Sanity, και όπου 0 από τους 6 ανταγωνιστικούς οδηγούς δείχνουν οποιονδήποτε κώδικα. Στο production schema μας, ορίζουμε πέντε custom block types μέσα στον πίνακα body: block (standard κείμενο), table, codeBlock, chartBlock και inlineImage.

Εδώ είναι ο ορισμός του codeBlock:

typescript
// schemas/objects/codeBlock.ts
import { defineType } from 'sanity'

export const codeBlock = defineType({
  name: 'codeBlock',
  title: 'Code Block',
  type: 'object',
  fields: [
    {
      name: 'language',
      title: 'Language',
      type: 'string',
      options: {
        list: [
          { title: 'JavaScript', value: 'javascript' },
          { title: 'TypeScript', value: 'typescript' },
          { title: 'Python', value: 'python' },
          { title: 'Bash', value: 'bash' },
          { title: 'JSON', value: 'json' },
          { title: 'GROQ', value: 'groq' },
        ],
      },
    },
    {
      name: 'code',
      title: 'Code',
      type: 'text',
    },
  ],
})

Και εδώ είναι πώς το field body αναφέρει όλους τους custom τύπους μας μαζί:

typescript
// schemas/fields/body.ts
defineField({
  name: 'body',
  title: 'Body',
  type: 'array',
  of: [
    { type: 'block' },         // Standard Portable Text (paragraphs, headings, lists)
    { type: 'table' },         // @sanity/table plugin
    { type: 'codeBlock' },     // Our custom code block
    { type: 'chartBlock' },    // Data visualization (bar, line, pie)
    { type: 'inlineImage' },   // Images with alt text and captions
  ],
})

Αυτό δίνει στους editors μας ένα πλούσιο toolkit περιεχομένου ενώ διατηρεί κάθε στοιχείο typed και queryable. Ένα chartBlock δεν είναι απλώς ένα opaque HTML embed, είναι δομημένα δεδομένα με fields chartType, title, dataPoints και dataLabels. Αυτό έχει σημασία όταν προσπαθείτε να αποδώσετε το ίδιο περιεχόμενο σε web, email και mobile.

Best Practices Οργάνωσης Schema

Διατηρήστε τα schemas modular. Εμείς χωρίζουμε τα δικά μας σε αρχεία ανά τύπο: schemas/documents/post.ts, schemas/objects/codeBlock.ts, schemas/objects/chartBlock.ts. Τα εισάγουμε όλα στο schemas/index.ts:

typescript
// schemas/index.ts
import { post } from './documents/post'
import { codeBlock } from './objects/codeBlock'
import { chartBlock } from './objects/chartBlock'
import { inlineImage } from './objects/inlineImage'

export const schemaTypes = [post, codeBlock, chartBlock, inlineImage]

Η βασική ιδέα που αποκτήσαμε working with structured content: το schema ΣΑΣ είναι το μοντέλο περιεχομένου σας. Αν το σκεφτείτε ως context engineering για την ομάδα περιεχομένου σας, θα λάβετε καλύτερες αποφάσεις σχεδιασμού. Κάθε field που προσθέτετε πρέπει να εξυπηρετεί έναν σκοπό, είτε για τους editors, είτε για την απόδοση, είτε για τα queries.

GROQ: Η γλώσσα ερωτημάτων του Sanity

Το GROQ (Graph-Relational Object Queries) είναι η open-source γλώσσα ερωτημάτων του Sanity για φιλτράρισμα, joining και projection εγγράφων JSON. Η βασική σύνταξη είναι *[filter]{projection}, επιλέξτε όλα τα έγγραφα που ταιριάζουν σε ένα φίλτρο και στη συνέχεια διαμορφώστε την έξοδο. Είναι πιο συνοπτικό από το GraphQL για ερωτήματα συγκεκριμένα στο Sanity και, κατά την εμπειρία μας, πιο γρήγορο στην εκμάθηση.

Βασικά Ερωτήματα: Φιλτράρισμα και Projection

Το απλούστερο ερώτημα ανακτά όλα τα έγγραφα ενός τύπου:

groq
// Fetch all posts -- just title and slug
*[_type == "post"]{
  title,
  "slug": slug.current
}

// Filter by language, expand author reference
*[_type == "post" && language == "en"]{
  title,
  "slug": slug.current,
  "authorName": author->name,
  "authorImage": author->image,
  "categoryTitle": category->title,
  publishedAt
}

Ο τελεστής -> ακολουθεί αναφορές. author->name σημαίνει «ακολούθησε την αναφορά author και επέστρεψε το field name». Χωρίς ξεχωριστά queries, χωρίς προβλήματα N+1, χωρίς JOINs, είναι όλα μία έκφραση.

Joins, Ταξινόμηση και Pagination

Για τις σελίδες index του blog μας, χρειαζόμαστε ταξινομημένες, paginated αναρτήσεις με expanded references:

groq
// Paginated posts with full metadata
*[_type == "post" && language == "en"] | order(publishedAt desc) [0...10] {
  title,
  "slug": slug.current,
  excerpt,
  publishedAt,
  readTime,
  "author": author->{name, image},
  "category": category->{title, "slug": slug.current},
  "coverImage": coverImage{
    "src": asset->url,
    alt
  }
}

Το [0...10] σας δίνει τα πρώτα 10 αποτελέσματα (0-indexed, exclusive end). Το | order(publishedAt desc) ταξινομεί με νεότερα πρώτα. Η projection διαμορφώνει την έξοδο ώστε να περιλαμβάνει ακριβώς ό,τι χρειάζεται το frontend σας, τίποτα περισσότερο.

Μπορείτε να δοκιμάσετε όλα αυτά τα queries interactively χρησιμοποιώντας το plugin Vision μέσα στο Sanity Studio. Είναι ανεκτίμητο κατά την ανάπτυξη. Για περισσότερα patterns, δείτε το GROQ cheat sheet.

GROQ vs GraphQL

Το Sanity υποστηρίζει τόσο το GROQ όσο και το GraphQL. Πότε πρέπει να χρησιμοποιήσετε ποιο;

Το GROQ είναι η native γλώσσα του Sanity. Χειρίζεται joins, projections και computed fields σε ένα single query string. Είναι αυτό για το οποίο είναι βελτιστοποιημένο το Content Lake.

Το GraphQL είναι διαθέσιμο αφού αναπτύξετε το schema σας (npx sanity@latest schema deploy). Χρησιμοποιήστε το όταν χρειάζεστε standardized tooling, για παράδειγμα, αν το frontend σας χρησιμοποι ήδη το Apollo Client ή αν η ομάδα σας γνωρίζει GraphQL αλλά όχι GROQ.

Εμείς χρησιμοποιούμε αποκλειστικά το GROQ. Είναι πιο expressive για δεδομένα Sanity και το plugin Vision κάνει το debugging queries trivial.

Portable Text: Πλούσιο Περιεχόμενο σωστά

Το Portable Text είναι η προδιαγραφή του Sanity για δομημένο πλούσιο κείμενο. Αντί να αποθηκεύει περιεχόμενο ως strings HTML, αποθηκεύει έναν πίνακα από typed blocks, παραγράφους, επικεφαλίδες, εικόνες, αποσπάσματα κώδικα, πίνακες, καθένα ως ένα αντικείμενο JSON. Αυτό καθιστά το περιεχόμενο renderable σε οποιοδήποτε framework, οποιαδήποτε πλατφόρμα, οποιαδήποτε μορφή.

Η Δομή Δεδομένων

Εδώ είναι πώς φαίνονται μια παράγραφος και ένα code block ως Portable Text JSON:

json
[
  {
    "_type": "block",
    "_key": "a1b2c3",
    "style": "normal",
    "markDefs": [],
    "children": [
      {
        "_type": "span",
        "_key": "d4e5f6",
        "text": "Here's an example of our pipeline config:",
        "marks": []
      }
    ]
  },
  {
    "_type": "codeBlock",
    "_key": "g7h8i9",
    "language": "typescript",
    "code": "export default defineConfig({ ... })"
  }
]

Κάθε block έχει ένα _type και _key. Τα standard text blocks χρησιμοποιούν "block" με children spans (που υποστηρίζουν marks όπως bold, italic και links). Τα custom blocks, όπως το codeBlock, chartBlock, table και inlineImage μας, χρησιμοποιούν το δικό τους _type και携带 carry structured fields.

Γιατί έχει σημασία αυτό; Επειδή το HTML είναι μια μορφή απόδοσης, όχι μια μορφή αποθήκευσης. Αν αποθηκεύετε <h2>Title</h2><p>Some <strong>text</strong></p> στη βάση δεδομένων σας, έχετε κλειδωθεί σε web rendering. Δεν μπορείτε να εξάγετε καθαρά αυτό για μια mobile εφαρμογή, ένα newsletter email, ένα PDF ή το context window ενός AI agent. Το Portable Text διαχωρίζει το περιεχόμενο από την παρουσίαση. Η προδιαγραφή Portable Text είναι open source, δεν είναι lock-in της Sanity.

Custom Blocks σε Παραγωγή

Η ροή εργασίας μας μετατρέπει το Markdown σε Portable Text χρησιμοποιώντας ένα script Python (scripts/md_to_portable_text.py). Ο converter χειρίζεται standard blocks, plus τους τέσσερις custom τύπους μας:

  • table, χρησιμοποιεί το schema του plugin @sanity/table. Οι σειρές και τα κελιά αποθηκεύονται ως δομημένα δεδομένα.
  • codeBlock, γλώσσα και κώδικας ως ξεχωριστά fields, επιτρέποντας syntax highlighting κατά την απόδοση.
  • chartBlock, τύπος γραφήματος, τίτλος, ετικέτες αξόνων, ονόματα σειρών και data points ως δομημένο JSON. Το frontend τα αποδίδει με το Chart.js.
  • inlineImage, alt text, πηγή και προαιρετικός caption ως ξεχωριστά fields.

Αυτή η δομή σημαίνει ότι μπορούμε να κάνουμε query για όλα τα παραδείγματα κώδικα στο blog μας (*[body[]._type == "codeBlock"]), να βρούμε αναρτήσεις με γραφήματα ή να εξάγουμε όλες τις εικόνες με missing alt text, όλα μέσω GROQ.

Απόδοση Portable Text

Στο frontend, χρησιμοποιήστε το @portabletext/react (ή τα ισοδύναμα Svelte/Vue). Καταχωρείτε custom components για κάθε τύπο block:

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

const components = {
  types: {
    codeBlock: ({ value }) => (
      <pre className={`language-${value.language}`}>
        <code>{value.code}</code>
      </pre>
    ),
    chartBlock: ({ value }) => <Chart data={value} />,
    inlineImage: ({ value }) => (
      <figure>
        <img src={value.src} alt={value.alt} />
        {value.caption && <figcaption>{value.caption}</figcaption>}
      </figure>
    ),
  },
}

// In your component:
<PortableText value={post.body} components={components} />

Αυτή είναι η πλήρης ροή απόδοσης. Το component PortableText χειρίζεται automatic τα standard blocks (παραγράφους, επικεφαλίδες, λίστες, marks). Ορίζετε custom components μόνο για τους custom τύπους σας.

Πολυγλωσσικό Περιεχόμενο με Sanity CMS

Το Sanity υποστηρίζει πολυγλωσσικό περιεχόμενο μέσω localization επιπέδου εγγράφου (ξεχωριστά έγγραφα ανά γλώσσα συνδεδεμένα με μια canonical reference) ή localization επιπέδου field (translated fields within one document). Η localization επιπέδου εγγράφου λειτουργεί καλύτερα για SEO και publishing μεγάλης κλίμακας, αυτό είναι που χρησιμοποιούμε στη ροή εργασίας μας 10 γλωσσών.

Localization Επιπέδου Εγγράφου vs Επιπέδου Field

ΠτυχήΕπίπεδο ΕγγράφουΕπίπεδο Field
ΠροσέγγισηΞεχωριστό έγγραφο ανά γλώσσαΌλες οι μεταφράσεις σε ένα έγγραφο
SEOΚάθε έγγραφο έχει το δικό του URL/slugSingle URL, δυσκολότερο να serve pages ανά γλώσσα
Πολυπλοκότητα QueryΑπλά φίλτρα: language == "de"Nested field access: title.de
Μέγεθος ΠεριεχομένουΜικρά, focused documentsΈνα μεγάλο έγγραφο με όλες τις γλώσσες
Καλύτερο γιαΑναρτήσεις blog, σελίδες, περιεχόμενο driven by SEOΜικρά strings UI, ετικέτες, metadata
Η γνώμη μαςΤο χρησιμοποιούμε για τα πάνταΜόνο για shared strings UI

Επιλέξαμε localization επιπέδου εγγράφου επειδή κάθε μετάφραση αποκτά το δικό της slug, το δικό της URL και τα δικά της metadata. Η τουρκική έκδοση μιας ανάρτησης σχετικά με το Supabase vs Firebase παίρνει το slug supabase-firebase-karsilastirma, σωστά Τουρκικά, όχι ένα hack URL parameter.

Η Αρχιτεκτονική της Ροής Εργασίας 10 Γλωσσών μας

Έτσι λειτουργεί η αυτοματοποιημένη ροή εργασίας μας: γράφουμε μια ανάρτηση στα Αγγλικά, στη συνέχεια τη μεταφράζουμε σε 9 επιπλέον γλώσσες (Γερμανικά, Γαλλικά, Ολλανδικά, Ισπανικά, Τουρκικά, Ιταλικά, Σουηδικά, Νορβηγικά, Αραβικά). Κάθε μετάφραση περνάει από μετατροπή Markdown, generation Portable Text και δημοσίευση API Sanity.

Η αρχιτεκτονική выглядит έτσι:

  1. Γραφή, Markdown Αγγλικών με YAML frontmatter
  2. Μετάφραση, AI μετάφραση σε 9 γλώσσες (επαληθευμένη για πληρότητα και diacritics)
  3. Μετατροπή, Script Python μετατρέπει κάθε αρχείο .md σε Portable Text JSON
  4. Δημοσίευση, Κλήσεις API στο Sanity: δημιουργία εγγράφου, ανέβασμα εικόνων, patch references

Κάθε έγγραφο έχει ένα field language και μια reference canonicalPost που δείχνει στο Αγγλικό original. Εδώ είναι το ερώτημα GROQ για να ανακτήσετε μια ανάρτηση και όλες τις μεταφράσεις της:

groq
// Fetch a post and all its translations
*[_type == "post" && slug.current == "sanity-cms-guide" && language == "en"][0]{
  title,
  language,
  "translations": *[
    _type == "post" &&
    canonicalPost._ref == ^._id
  ]{
    title,
    language,
    "slug": slug.current
  }
}

Η πλευρά του schema είναι straightforward, ένα field language με ένα enum των υποστηριζόμενων γλωσσών:

typescript
defineField({
  name: 'language',
  title: 'Language',
  type: 'string',
  options: {
    list: [
      { title: 'English', value: 'en' },
      { title: 'German', value: 'de' },
      { title: 'French', value: 'fr' },
      { title: 'Dutch', value: 'nl' },
      { title: 'Spanish', value: 'es' },
      { title: 'Turkish', value: 'tr' },
      { title: 'Italian', value: 'it' },
      { title: 'Swedish', value: 'sv' },
      { title: 'Norwegian', value: 'no' },
      { title: 'Arabic', value: 'ar' },
    ],
  },
  validation: (Rule) => Rule.required(),
})

Ένα gotcha που μάθαμε με τον σκληρό τρόπο: δημοσιεύστε πρώτα το Αγγλικό έγγραφο, στη συνέχεια κάντε patch τις references canonicalPost στις μεταφράσεις χρησιμοποιώντας το published document ID, όχι το πρόθεμα drafts.. Το Sanity treats draft και published documents ως ξεχωριστές οντότητες internally.

Για περισσότερες λεπτομέρειες για το πώς αυτή η ροή εργασίας συνδέεται με το Model Context Protocol, δείτε την επόμενη ενότητα.

Λειτουργίες AI του Sanity: MCP, Canvas και Agent Context

Το Sanity позиционαρεται ως το λειτουργικό σύστημα περιεχομένου για την εποχή της AI. Οι βασικές λειτουργίες AI περιλαμβάνουν έναν MCP server για AI agents να διαβάζουν και να γράφουν περιεχόμενο, Canvas για editing assisted by AI μέσα στο Studio και Agent Context για production AI agents να κάνουν query σε δομημένο περιεχόμενο με awareness schema.

Ενσωμάτωση MCP Server

Ο Sanity MCP server επιτρέπει σε AI agents, Claude Code, Cursor, Windsurf και άλλους, να interact με το workspace Sanity σας programatically. Οι agents μπορούν να διαβάσουν schemas, να εκτελέσουν ερωτήματα GROQ, να δημιουργήσουν έγγραφα και να διαχειριστούν περιεχόμενο χωρίς custom API wrappers.

Χρησιμοποιούμε τον Sanity MCP server καθημερινά στη ροή εργασίας περιεχομένου μας. Οι AI agents μας κάνουν query στο schema για να κατανοήσουν τη δομή εγγράφου, ανακτούν υπάρχουσες αναρτήσεις για να βρουν ευκαιρίες internal linking και δημοσιεύουν νέα έγγραφα. Το πρωτόκολλο MCP δίνει στους agents awareness schema, ξέρουν ποια fields υπάρχουν, ποιους τύπους αναμένουν και ποιοι κανόνες επικύρωσης ισχύουν. Αν χτίζετε AI agents for business workflows, αυτό είναι ένα powerful pattern.

Agent Context για Production AI

Το Agent Context είναι μια ξεχωριστή λειτουργία για integrations AI production-grade. Σε αντίθεση με τον MCP server (ο οποίος σχεδιάστηκε για developer tools), το Agent Context παρέχει read-only, scoped access για AI agents που χρειάζεται να κάνουν query στο περιεχόμενό σας at runtime, σκεφτείτε chatbots, μηχανές recommendation ή συστήματα personalization περιεχομένου.

Η διαφορά έχει σημασία: το MCP είναι για build-time και editorial workflows (εργαλεία ανάπτυξης με awareness schema), ενώ το Agent Context είναι για runtime access περιεχομένου με proper authentication και rate limiting.

Το δομημένο περιεχόμενο του Sanity του δίνει ένα real advantage εδώ. Μια ιστοσελίδα WordPress αποθηκεύει περιεχόμενο ως blobs HTML, ένας AI agent πρέπει να parse HTML για να κατανοήσει το περιεχόμενο. Το Sanity αποθηκεύει typed JSON documents με defined schemas. Ένας agent μπορεί να κάνει query *[_type == "product" && category == "electronics"]{name, price, features} και να πάρει πίσω clean, δομημένα δεδομένα. Χωρίς scraping, χωρίς parsing, χωρίς guessing.

Πώς χρησιμοποιούμε το Sanity στο Techsy

Αυτό δεν είναι ένα hypothetical section. Τρέχουμε Sanity CMS σε 4 production websites, δημοσιεύοντας σε 10 γλώσσες με μια αυτοματοποιημένη ροή εργασίας που χτίσαμε τον περασμένο χρόνο. Εδώ είναι η αρχιτεκτονική.

Η Αρχιτεκτονική της Ροής Εργασίας Περιεχομένου μας

Η ροή εργασίας goes from research to published post across all 10 languages:

  1. Έρευνα, ανάλυση keywords, identification competitor gap, patterns SERP
  2. Brief, structured writing spec με guidance sections, word counts, internal links
  3. Γραφή, παραγωγή Markdown Αγγλικών με YAML frontmatter
  4. Μετατροπή, Script Python transforms Markdown σε Portable Text JSON με τους 5 custom block types μας
  5. Δημοσίευση, Κλήσεις API στο Sanity: createOrReplace έγγραφο, ανέβασμα εικόνων στο Sanity CDN, patch author/category references
  6. Μετάφραση, AI μετάφραση σε 9 γλώσσες, επαληθευμένη για πληρότητα
  7. Δημοσίευση μεταφράσεων, ίδια ροή convert/publish ανά γλώσσα, με reference canonicalPost patched στο Αγγλικό original

Το custom schema υποστηρίζει τύπους block, table, codeBlock, chartBlock και inlineImage, όλα ορισμένα ως production Sanity schema objects με κανόνες επικύρωσης. Μεταξύ των AI tools for startups που έχουμε δοκιμάσει, αυτή η ροή εργασίας βασισμένη στο Sanity ήταν η most reliable για δομημένο περιεχόμενο σε scale.

Μαθήματα από 400+ Δημοσιευμένα Κομμάτια

Λίγα πράγματα που θα θέλαμε κάποιος να μας είχε πει:

Η σειρά patching reference έχει σημασία. Οι references Sanity δεν μπορούν να δείχνουν σε έγγραφα που δεν υπάρχουν ακόμα. Δημοσιεύστε πρώτα την Αγγλική ανάρτηση, στη συνέχεια δημιουργήστε μεταφράσεις με canonicalPost να δείχνει στο published ID του Αγγλικού εγγράφου. Το σπάσαμε αυτό αρκετές φορές νωρίς.

Η ανάπτυξη schema είναι per-workspace. Αν τρέχετε πολλαπλά projects Sanity (εμείς τρέχουμε 4), πρέπει να αναπτύξετε schemas σε καθένα ξεχωριστά: npx sanity@latest schema deploy per project config.

Το δωρεάν tier είναι πραγματικό. Τρέξαμε δύο από τα τέσσερα sites μας στο free plan για μήνες. 20 users, 500K API requests/μήνα, 100K CDN requests, αυτό αρκεί για ένα real production site, όχι απλώς ένα toy project.

Η μετατροπή Portable Text είναι το bottleneck. Το Markdown σε Portable Text δεν είναι trivial. Nested lists, tables inside blockquotes, code blocks με special characters, edge cases everywhere. Έχουμε iterate on our converter script for months.

Χρειάζεστε βοήθεια για τη ρύθμιση του Sanity για το project σας; Έχουμε χτίσει πολυγλωσσικές ροές εργασίας περιεχομένου για 4 production sites. Λάβετε μια δωρεάν συμβουλευτική

Ανάλυση Τιμών Sanity CMS

Το Sanity προσφέρει τρία plans: Free (20 users, 500K API requests/μήνα), Growth ($15/user/μήνα με advanced roles και scheduled drafts) και Enterprise (custom pricing με SLA και compliance features). Το free tier είναι το most generous στην αγορά headless CMS.

ΛειτουργίαFreeGrowth ($15/user/μήνα)Enterprise
Users2050Unlimited
API requests500K/μήνα2.5M/μήναCustom
CDN requests100K/μήνα500K/μήναCustom
RolesΜόνο AdminAdmin, Developer, Editor, ContributorCustom roles
ΣυνεργασίαEditing σε πραγματικό χρόνο+ Scheduled publishing, drafts+ Workflows
ΥποστήριξηCommunityEmailDedicated + SLA
Compliance,,SOC 2, HIPAA

Στο free tier, τρέχουμε δύο από τα sites μας χωρίς να χτυπάμε limits. Το Growth plan στα $15/user/μήνα πρόσθεσε role-based access (important μόλις είχαμε non-technical editors) και scheduled publishing. Οι Viewers είναι free στο Growth, which is a nice touch, δεν τιμωρείστε για giving stakeholders read access.

Πώς συγκρίνεται αυτό με τους competitors;

ΛειτουργίαSanity FreeContentful FreeStrapi Cloud FreePayload Cloud
Users20111
Content typesUnlimited48UnlimitedUnlimited
API calls500K/μήναIncludedIncludedIncluded
Custom typesYesLimitedYesYes
Price to grow$15/user/μήνα$300/μήνα$29/μήνα$50/μήνα

Το 20-user free tier του Sanity είναι exceptional. Το Contentful σας περιορίζει σε 1 user στο free και jumps στα $300/μήνα για το Team plan τους. Αν είστε startup ή small team, το free plan του Sanity σας επιτρέπει να τρέξετε real production workloads χωρίς να ξοδέψετε τίποτα.

Το Sanity προσφέρει επίσης ένα startup program που δίνει σε eligible startups ένα έτος free Growth access. Worth applying for if you qualify.

Συχνές Ερωτήσεις

Τι είναι το Sanity CMS και πώς λειτουργεί;

Το Sanity CMS είναι μια headless πλατφόρμα περιεχομένου που αποθηκεύει δομημένα JSON documents σε ένα διαχειριζόμενο backend που ονομάζεται Content Lake. Επεξεργάζεστε περιεχόμενο μέσω του Sanity Studio (μια προσαρμόσιμη εφαρμογή React), κάνετε query με GROQ ή GraphQL και το αποδίδετε σε οποιοδήποτε frontend framework. Το περιεχόμενο συγχρονίζεται σε πραγματικό χρόνο σε όλους τους συνδεδεμένους clients.

Είναι δωρεάν το Sanity CMS;

Ναι. Το free tier του Sanity περιλαμβάνει 20 users, 500K API requests per month και 100K CDN requests, το most generous free plan among headless CMS platforms. Το Growth plan κοστίζει $15 per user per month και προσθέτει role-based access, scheduled publishing και higher limits. Η τιμολόγηση Enterprise είναι custom.

Ποια είναι η διαφορά μεταξύ Sanity και Contentful;

Το Sanity χρησιμοποιεί schema-as-code (τα schemas ζουν στον κώδικά σας), GROQ για queries και ένα fully customizable open-source Studio. Το Contentful χρησιμοποιεί GUI-based content modeling, GraphQL και έναν hosted editor με λιγότερη customization. Το free tier του Sanity περιλαμβάνει 20 users versus 1 του Contentful. Το Contentful έχει μεγαλύτερο marketplace plugins.

Είναι καλό το Sanity CMS για beginners;

Το Sanity Studio είναι intuitive για content editors, η εμπειρία editing δεν απαιτεί technical knowledge. Ωστόσο, η ρύθμιση schemas απαιτεί proficiency σε JavaScript ή TypeScript. Το Sanity παρέχει excellent documentation, project templates και ένα community Slack με active support. Ξεκινήστε με npm create sanity@latest και ένα blog template.

Μπορώ να self-host το Sanity;

Το Sanity Studio είναι fully self-hostable επειδή είναι μια open-source εφαρμογή React. Μπορείτε να το αναπτύξετε στο Vercel, Netlify ή οποιονδήποτε static hosting provider. Το backend Content Lake είναι μια managed service, δεν υπάρχει option self-hosting για το data layer. Αυτό είναι ένα tradeoff: παίρνετε zero infrastructure management αλλά no on-premises data control.

Τι τύπο βάσης δεδομένων χρησιμοποιεί το Sanity;

Το Content Lake του Sanity δεν είναι μια traditional SQL ή NoSQL database. Είναι ένα managed document store που αποθηκεύει περιεχόμενο ως δομημένο JSON με ένα layer query GROQ on top. Δεν interact με την underlying database directly, interact μέσω των APIs της Sanity. Τα έγγραφα έχουν full version history και real-time sync built in.

Είναι open source το Sanity CMS;

Το Sanity Studio είναι open source under the MIT license, μπορείτε να το fork, να το customize και να το self-host. Το backend Content Lake είναι proprietary SaaS. Η προδιαγραφή γλώσσας query GROQ είναι επίσης open source, published στο GitHub. Η προδιαγραφή Portable Text είναι επίσης open source, maintained στο portabletext.org.

Τι είναι το Portable Text στο Sanity;

Το Portable Text είναι η προδιαγραφή του Sanity για δομημένο πλούσιο κείμενο. Αντί να αποθηκεύει περιεχόμενο ως strings HTML, αναπαριστά παραγράφους, επικεφαλίδες, εικόνες και custom blocks ως typed JSON objects σε έναν πίνακα. Αυτό καθιστά το περιεχόμενο portable across frameworks και platforms. Μπορείτε να ορίσετε custom block types όπως code snippets, charts και tables με τα δικά τους structured fields.

Τι είναι το GROQ και πώς διαφέρει από το GraphQL;

Το GROQ (Graph-Relational Object Queries) είναι η native γλώσσα query του Sanity. Η σύνταξή του, *[filter]{projection}, είναι πιο concise από το GraphQL για δεδομένα Sanity, με built-in support για joins μέσω του τελεστή -> και computed fields. Το GraphQL είναι επίσης available για teams που prefer standardized tooling ή χρησιμοποιούν ήδη το Apollo Client.

Πώς χειρίζεται το Sanity το πολυγλωσσικό περιεχόμενο;

Το Sanity υποστηρίζει localization επιπέδου εγγράφου (ξεχωριστά έγγραφα ανά γλώσσα συνδεδεμένα με canonical references) και localization επιπέδου field (translated fields within one document). Η localization επιπέδου εγγράφου είναι better for SEO επειδή κάθε μετάφραση gets its own URL και metadata. Χρησιμοποιούμε localization επιπέδου εγγράφου για να δημοσιεύουμε across 10 γλώσσες με automated translation και publishing pipelines.

Ετικέτες

sanity-cmsheadless-cmsgroqportable-textcontent-management

Κοινοποίηση άρθρου

Σχετικά άρθρα

Περισσότερα στο guides

guides
Jul 18, 2026

Σύγκριση Τιμών LLM API 2026: Κάθε Κύριο Μοντέλο, Τιμολογημένο

Πλήρης σύγκριση τιμών LLM API για το 2026 — Claude, GPT-5.6, Gemini, DeepSeek, Qwen, GLM και Mistral τιμολογημένα παράλληλα ανά εκατομμύριο tokens, απευθείας από τις επίσημες σελίδες τιμολόγησης.

12 min read εξάγουμε ανάγνωση
Ανάγνωση
guides
Apr 12, 2026

Οδηγός Surfer SEO 2026: Content Editor, Βαθμολογία NLP και AI Search

Ένας πρακτικός οδηγός για το Surfer SEO που καλύπτει τη ροή εργασίας του Content Editor, το σύστημα βαθμολόγησης NLP, το AI Tracker για βελτιστοποίηση GEO και τον αυτοματισμό API. Με βάση δοκιμές σε πάνω από 50 άρθρα.

14 min read εξάγουμε ανάγνωση
Ανάγνωση
guides
Apr 12, 2026

Οδηγός Semrush 2026: Κάθε Εργαλείο Αναλυτικά (Με Παραδείγματα)

Ένας πρακτικός οδηγός για το Semrush που καλύπτει την έρευνα λέξεων-κλειδιών, τον έλεγχο ιστότοπου, την ανταγωνιστική ανάλυση, την παρακολούθηση ορατότητας AI και τη ρύθμιση διακομιστή MCP. Περιλαμβάνει παραδείγματα κώδικα και ροές εργασίας από μια πραγματική διαδικασία SEO.

14 min read εξάγουμε ανάγνωση
Ανάγνωση
Εμφάνιση όλων των άρθρων
Ξεκινήσετε το Project σας

Έτοιμοι να δημιουργήσουμε κάτι εξαιρετικό;

Ας κάνουμε το όραμά σας πραγματικότητα. Η ομάδα μας είναι έτοιμη να σας βοηθήσει να φτιάξετε λογισμικό που κάνει τη διαφορά.

Κλείστε μια κλήση αξιολόγησης 30 λεπτάΔείτε το Έργο μας

Τα πιο hot από τη βιβλιοθήκη

Claude Skills

Δείτε όλα
  • New Post

    Full SEO blog pipeline: research, brief, write, validate, image, translate, publish to Sanity. Autonomous from start to finish.

  • Content Refresh

    Audit a stale post, find decay drivers, and ship a SERP-aligned refresh without losing existing rankings.

  • SEO Audit

    Site-wide SEO audit with prioritized fix list: technical, on-page, and EEAT signals.

AI Automatizations

Δείτε όλα
  • Security Auditor

    Weekly SCA + IaC scan with prioritized fix PRs.

  • Cold Email Writer

    Generates first-touch emails grounded in one specific public detail.

  • Lead Research Agent

    Enrich an email into a profile, score fit, alert in Slack.

Τα πιο hot από τη βιβλιοθήκη

Claude Skills

Δείτε όλα
  • New Post

    Full SEO blog pipeline: research, brief, write, validate, image, translate, publish to Sanity. Autonomous from start to finish.

  • Content Refresh

    Audit a stale post, find decay drivers, and ship a SERP-aligned refresh without losing existing rankings.

  • SEO Audit

    Site-wide SEO audit with prioritized fix list: technical, on-page, and EEAT signals.

AI Automatizations

Δείτε όλα
  • Security Auditor

    Weekly SCA + IaC scan with prioritized fix PRs.

  • Cold Email Writer

    Generates first-touch emails grounded in one specific public detail.

  • Lead Research Agent

    Enrich an email into a profile, score fit, alert in Slack.

Υπηρεσίες

  • Enterprise Λύσεις
  • Mobile Εφαρμογές
  • Web Application

Λύσεις

  • CRM Συστήματα
  • AI Ενσωμάτωση
  • ERP Λύσεις
  • Φωνητικοί Πράκτορες
  • Αυτοματοποίηση Διαδικασιών
  • Κιберασφάλεια

Βιβλιοθήκη

  • Ιστολόγιο
  • Έργα

Κοινότητα

  • AI Automatizations
  • Claude Skills

Εργαλεία

  • Υπολογισμό Κόστους Mobile App
  • Υπολογισμός Κόστους OpenAI / LLM APIs
  • Υπολογισμός Κόστους MVP
  • Υπολογισμός Κόστους Voice AI Agent

Εταιρεία

  • Σχετικά
  • Συνεργάτες
  • Επικοινωνία

Νομικά

  • Πολιτική Απορρήτου
  • Όροι Χρήσης
  • Πολιτική Cookies

Υπηρεσίες

  • Enterprise Λύσεις
  • Mobile Εφαρμογές
  • Web Application

Λύσεις

  • CRM Συστήματα
  • AI Ενσωμάτωση
  • ERP Λύσεις
  • Φωνητικοί Πράκτορες
  • Αυτοματοποίηση Διαδικασιών
  • Κιберασφάλεια

Βιβλιοθήκη

  • Ιστολόγιο
  • Έργα

Κοινότητα

  • AI Automatizations
  • Claude Skills

Εργαλεία

  • Υπολογισμό Κόστους Mobile App
  • Υπολογισμός Κόστους OpenAI / LLM APIs
  • Υπολογισμός Κόστους MVP
  • Υπολογισμός Κόστους Voice AI Agent

Εταιρεία

  • Σχετικά
  • Συνεργάτες
  • Επικοινωνία
ΝομικάΠολιτική ΑπορρήτουΌροι ΧρήσηςΠολιτική Cookies
TECHSY
© 2026 Techsy. Με επιφύλαξη παντός δικαιώματος.