---
title: "Academy Article"
canonical_url: "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren"
locale: de
meta:
  "og:title": "Academy Article"
---

[Zur Startseite](https://academy.laioutr.com/)

- [Für Entwickler](https://academy.laioutr.com/bereiche/fuer-entwickler)

- [Einstieg für Entwickler](https://academy.laioutr.com/leitfaeden/einstieg-fuer-entwickler)

- [Content Collections im Code deklarieren](https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren)

# Content Collections im Code deklarieren

Welche Inhaltstypen das Laioutr CMS verwaltet, legt das Projekt in der Option collections von @laioutr-app/cms fest. Nach dem nächsten Deployment erscheinen die Typen im Cockpit unter Content, und ihre Einträge beantworten Orchestr-Queries wie jedes andere Backend.

## Bevor du startest

<dl>

<dt>Tarif</dt>
<dd>Jeder Plan mit aktivierter Integration Laioutr CMS</dd>

<dt>Rolle</dt>
<dd>Entwickler mit Zugriff auf Code und Cockpit-Integrationen</dd>

<dt>Dauer</dt>
<dd>15 Min.</dd></dl>

### Voraussetzungen

- Laioutr CMS unter Integrations aktiviert
- Lokale Entwicklungsumgebung oder Zugriff auf die laioutrrc.json

Zuletzt geprüft am 15. Oktober 2026

Das Laioutr CMS speichert **Einträge** von Entity-Typen, die die Storefront bereits kennt, etwa `BlogPost`, `Recipe` oder `Author`. Redakteure legen sie im Cockpit unter **Content** an, übersetzen und veröffentlichen sie. Die Storefront liest sie über `@laioutr-app/cms` aus der Content Delivery API.

Für jeden deklarierten Typ registriert die App Query Handler, Component Resolver, Link Handler und Page Indexes. Eigene Tokens definiert das CMS nicht: Es beantwortet die vorhandenen Tokens des Typs, sodass eine Section für kanonische `BlogPost`-Daten auch mit CMS-Einträgen funktioniert.

Typen kommen aus drei Quellen: kanonische Typen wie `BlogPost`, `Product` oder `Category`, Typen, die eine installierte App anbietet, und eigene Typen aus einer Token-Datei. Besucher sehen veröffentlichte Einträge, die Content-Vorschau zeigt Entwürfe. Die Reads sind nicht gecacht, eine Veröffentlichung ist also mit der nächsten Anfrage sichtbar.

## Schritt für Schritt

1. 1 ### Schritt 1: Laioutr CMS aktivieren

   Im Cockpit **Integrations** öffnen, **Laioutr CMS** aktivieren und die Storefront neu deployen. Das richtet Bucket, CDN-Key und die App `@laioutr-app/cms` ein.
2. 2 ### Schritt 2: Collections deklarieren

   In `nuxt.config.ts` unter `'@laioutr-app/cms'` die Liste `collections: ['BlogPost', 'Recipe']` eintragen. Gehostete Projekte führen dieselbe Liste in der App-Konfiguration der `laioutrrc.json`; jeden Typ nur an einer Stelle pflegen.
3. 3 ### Schritt 3: Eigene Typen definieren

   Für einen eigenen Typ eine Token-Datei mit `defineEntityComponentToken` und Zod-Schema anlegen und als `{ entityType: 'Author', tokens: './cms/author.tokens' }` eintragen. Gehostete Projekte veröffentlichen die Token-Datei als Paket.
4. 4 ### Schritt 4: Queries freischalten

   In der Option `queries` festlegen, wie das CMS antwortet, etwa `'acme/author/by-slug': 'by-slug'`. Kanonische Typen bringen Standard-Queries mit, `false` schaltet einzelne ab.
5. 5 ### Schritt 5: Deployen und Einträge prüfen

   Die Umgebung **main** deployen, denn die Liste wird beim Build gelesen. Danach Einträge unter **Content** anlegen und Entwürfe mit `?preview_token=…` an der Storefront-URL prüfen.

## Ergebnis prüfen

Der Typ erscheint im Cockpit unter **Content**, das Build-Log enthält keine Warnung `[@laioutr-app/cms] … note(s) on the content collections`, und ein veröffentlichter Eintrag ist mit der nächsten Anfrage auf seiner Seite sichtbar.

## Häufige Fragen

Warum fehlt ein Typ im Cockpit?

Das Cockpit liest die Liste aus der Storefront der Umgebung **main**. Ein Typ erscheint erst, wenn dieses Deployment ihn deklariert. Typen mit Einträgen, die nicht mehr deklariert sind, stehen als **Not declared** in der Liste.

Wie wird ein Feld sprachunabhängig?

Mit `.meta({ cms: { localized: false } })` am Feld. Standardmäßig werden Texte, Rich Text, Medien und Links je Sprache gepflegt, Zahlen, Booleans, Enums und Daten nicht.

Warum steht ein zurückgezogener Eintrag noch in der Sitemap?

Die Sitemap der SEO-Essentials-App wird nur periodisch neu erzeugt, ein Eintrag kann dort bis zu etwa einem Tag bleiben. Die Seite selbst ist sofort offline.

## Passend dazu

- [Inhalte in Content Collections pflegen](https://academy.laioutr.com/artikel/inhalte-in-content-collections-pflegen)6 Min.

  Content Collections sind der Bereich für strukturierte Inhalte wie Blogartikel, Rezepte oder Autoren in Cockpit. Unter Content › Collections werden Einträge angelegt, je Sprache gepflegt, verknüpft und ohne Deployment veröffentlicht.
- [Orchestr: Entities, Queries, Actions und Resolver](https://academy.laioutr.com/artikel/orchestr-entities-queries-actions-und-resolver)8 Min.

  Orchestr ist die Datenschicht von Laioutr und läuft serverseitig im Nuxt-Server. Queries liefern Entity-IDs, Component Resolver laden die Daten dazu, Actions führen Änderungen aus, und Tokens bilden den Vertrag zwischen Frontend, Orchestr und Apps.
- [Delivery API, Management API und Assets API](https://academy.laioutr.com/artikel/delivery-management-und-assets-api)8 Min.

  Die Delivery API liefert veröffentlichte Laioutr-Inhalte an Frontends und andere Kanäle, die Management API legt Inhalte und Assets programmatisch an und ändert sie. Der Assets-Teil läuft über die Routen /api/public/media/\* der Storefront und wird mit einem projektgebundenen Restricted Key autorisiert.
- [Deployment starten und prüfen](https://academy.laioutr.com/artikel/deployment-starten-und-pruefen)5 Min.

  Ein Deployment baut die Storefront einer Umgebung neu und bringt Änderungen an Apps, Versionen und Konfiguration live. Gestartet wird es in Cockpit unter Deployments mit Deploy; Status und Build-Log zeigen, ob es erfolgreich war.

## In einer Lektion lernen

- [Content Collections im Code](https://academy.laioutr.com/lektionen/entwickler-content-collections-im-code)10 Min.

## [Einstieg für Entwickler](https://academy.laioutr.com/leitfaeden/einstieg-fuer-entwickler)

In diesem Leitfaden suchen

1. [Lokale Entwicklungsumgebung einrichten](https://academy.laioutr.com/artikel/lokale-entwicklungsumgebung-einrichten)15 Min.
2. [Die Laioutr CLI: Befehle und Authentifizierung](https://academy.laioutr.com/artikel/laioutr-cli-befehle-und-authentifizierung)6 Min.
3. [Die erste eigene App bauen und veröffentlichen](https://academy.laioutr.com/artikel/erste-eigene-app-bauen-und-veroeffentlichen)20 Min.
4. [Eigene Sections und Blocks für Studio definieren](https://academy.laioutr.com/artikel/eigene-sections-und-blocks-fuer-studio-definieren)15 Min.
5. [Orchestr: Entities, Queries, Actions und Resolver](https://academy.laioutr.com/artikel/orchestr-entities-queries-actions-und-resolver)8 Min.
6. [Content Collections im Code deklarieren](https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren)15 Min.
7. [Performance und technisches SEO im Code](https://academy.laioutr.com/artikel/performance-und-technisches-seo-im-code)10 Min.

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://academy.laioutr.com/#website",
      "@type": "WebSite",
      "inLanguage": "de",
      "name": "Default",
      "url": "https://academy.laioutr.com/",
      "workTranslation": {
        "@id": "https://academy.laioutr.com/#website"
      }
    },
    {
      "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#webpage",
      "name": "Academy Article",
      "url": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren",
      "@type": [
        "WebPage",
        "FAQPage"
      ],
      "breadcrumb": {
        "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#breadcrumb"
      },
      "isPartOf": {
        "@id": "https://academy.laioutr.com/#website"
      },
      "mainEntity": [
        {
          "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#/schema/question/1"
        },
        {
          "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#/schema/question/2"
        },
        {
          "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#/schema/question/3"
        }
      ],
      "potentialAction": [
        {
          "@type": "ReadAction",
          "target": [
            "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren"
          ]
        }
      ]
    },
    {
      "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#breadcrumb",
      "@type": "BreadcrumbList",
      "itemListElement": [
        {
          "@type": "ListItem",
          "name": "Home",
          "item": "https://academy.laioutr.com/",
          "position": 1
        },
        {
          "@type": "ListItem",
          "name": "Für Entwickler",
          "item": "https://academy.laioutr.com/bereiche/fuer-entwickler",
          "position": 2
        },
        {
          "@type": "ListItem",
          "name": "Einstieg für Entwickler",
          "item": "https://academy.laioutr.com/leitfaeden/einstieg-fuer-entwickler",
          "position": 3
        },
        {
          "@type": "ListItem",
          "name": "Content Collections im Code deklarieren",
          "item": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren",
          "position": 4
        }
      ]
    },
    {
      "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#/schema/question/1",
      "@type": "Question",
      "inLanguage": "de",
      "name": "Warum fehlt ein Typ im Cockpit?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "<p>Das Cockpit liest die Liste aus der Storefront der Umgebung <strong>main</strong>. Ein Typ erscheint erst, wenn dieses Deployment ihn deklariert. Typen mit Einträgen, die nicht mehr deklariert sind, stehen als <strong>Not declared</strong> in der Liste.</p>"
      }
    },
    {
      "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#/schema/question/2",
      "@type": "Question",
      "inLanguage": "de",
      "name": "Wie wird ein Feld sprachunabhängig?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "<p>Mit <code>.meta({ cms: { localized: false } })</code> am Feld. Standardmäßig werden Texte, Rich Text, Medien und Links je Sprache gepflegt, Zahlen, Booleans, Enums und Daten nicht.</p>"
      }
    },
    {
      "@id": "https://academy.laioutr.com/artikel/content-collections-im-code-deklarieren#/schema/question/3",
      "@type": "Question",
      "inLanguage": "de",
      "name": "Warum steht ein zurückgezogener Eintrag noch in der Sitemap?",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "<p>Die Sitemap der SEO-Essentials-App wird nur periodisch neu erzeugt, ein Eintrag kann dort bis zu etwa einem Tag bleiben. Die Seite selbst ist sofort offline.</p>"
      }
    }
  ]
}
```
