> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# $wsCmsPage - CMS-Seite ausgeben

> Modul $wsCmsPage: das Seitendokument einer CMS-Seite aus strapi im Template lesen.

Mit dem `$wsCmsPage` Modul können Sie im Template auf das Seitendokument der aktuell aufgerufenen CMS-Seite zugreifen. Das Modul liefert das JSON-Dokument aus dem Objektspeicher unverändert aus, ohne Umbenennung oder Umsortierung. Ein typischer Anwendungsfall ist das CMS-Seitentemplate, das die Inhalte einer in Strapi gepflegten Inhaltsseite ausgibt.

<Note>
  Das Modul wird ausschließlich auf CMS-Seiten gefüllt, also auf Seiten, die über den View-Controller `CmsPage` gerendert werden. Auf allen anderen Seiten ist `$wsCmsPage` leer (`null`).
</Note>

Weiterführende Seiten zu diesem Thema:

* [Auslieferung von CMS-Seiten in den Shop](/strapi-cms/grundlagen-architektur-von-strapi#auslieferung-von-cms-seiten-in-den-shop) erklärt, wie die Seiten in den Objektspeicher kommen, wie die SEO-URL entsteht und welche Felder der Shop selbst auswertet.
* [Template Theme](/frontend/die-basics/template-theme#cms-seitentemplate) erklärt das CMS-Seitentemplate und die Einbindung in das Basis-Template.

***

## Modulübersicht

**Beispiel / Ausschnitt über** `$wsCmsPage`

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{= $wsCmsPage | json }}
```

**JSON-Ausgabe**

```json theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{
  "contentType": "api::contentpage.contentpage",
  "meta": {
    "id": 92,
    "documentId": "jyllb6ubw0dj62vndr0lh7z1",
    "locale": "de",
    "createdAt": "2026-06-26T08:00:00.000Z",
    "updatedAt": "2026-07-16T09:00:00.000Z",
    "publishedAt": "2026-07-16T09:03:00.000Z",
    "url": "Zahlungsarten",
    "metaTitle": "Zahlungsarten",
    "metaDescription": "Beschreibung zu Zahlungsarten",
    "robots": ["noindex", "nofollow"],
    "hreflang": [
      {
        "language": "fr-fr",
        "url": "myshop.fr/paiement",
        "subshopId": "francais",
        "default": false
      }
    ]
  },
  "fields": [
    { "name": "Markup", "type": "richtext", "value": "AGB Content" },
    {
      "name": "content",
      "type": "dynamiczone",
      "value": [
        {
          "component": "elemente.ws-markup",
          "id": 96,
          "fields": [
            { "name": "FullWidth", "type": "boolean", "value": false }
          ]
        }
      ]
    }
  ]
}
```

**Variablen in der Übersicht**

| **Name**                            | **Rückgabe-Typ**  | **Beschreibung**                                                                                                 |
| ----------------------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------- |
| `contentType`                       | string            | strapi-Kennung des Content-Typs, aus dem die Seite stammt. Wird vom Shop nicht ausgewertet.                      |
| `meta`                              | map               | Verwaltungsdaten der Seite plus SEO-Block.                                                                       |
| `meta.url`                          | string            | URL der Seite, ohne führenden Schrägstrich.                                                                      |
| `meta.metaTitle`                    | string            | Meta-Title. Wird vom Shop zusätzlich als Seitentitel gesetzt und ist über `$wsViews.metaTitle()` verfügbar.      |
| `meta.metaDescription`              | string            | Meta-Description. Wird vom Shop zusätzlich gesetzt und ist über `$wsViews.metaDescription()` verfügbar.          |
| `meta.robots`                       | array             | Robots-Angaben der Seite. Werden vom Shop zusätzlich in `$wsViews.current.robotOptions` zusammengeführt.         |
| `meta.publishedAt`                  | string oder null  | Zeitstempel der Veröffentlichung. `null` bei Entwürfen.                                                          |
| `meta.hreflang`                     | array             | Alternativsprachen-Objekte (`language`, `url`, `subshopId`, `default`). Werden **nicht** automatisch ausgegeben. |
| `meta.id`                           | number            | Interne numerische strapi-ID (pro Sprachversion).                                                                |
| `meta.documentId`                   | string            | Stabile, sprachübergreifende Dokument-ID.                                                                        |
| `meta.locale`                       | string            | Sprache des Dokuments, beispielsweise `de`.                                                                      |
| `meta.createdAt` / `meta.updatedAt` | string (ISO-8601) | Zeitstempel aus strapi.                                                                                          |
| `fields`                            | array             | Die Inhaltsfelder der Seite, je `{ name, type, value }`. Unverändert aus strapi.                                 |

## Methoden

Für `$wsCmsPage` stehen keine Methoden zur Verfügung.

***

## Variablen

### \$wsCmsPage.contentType

Gibt aus, aus welchem strapi-Content-Typ die aufgerufene Seite stammt. Der Content-Typ entspricht der Eingabemaske hinter der Seite und legt fest, welche Felder ein Redakteur ausfüllen kann.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{= $wsCmsPage.contentType }}
```

### \$wsCmsPage.meta

Enthält die Verwaltungsdaten und den SEO-Block der Seite.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{= $wsCmsPage.meta | json }}
```

<Note>
  Der Shop setzt Meta-Title und Meta-Description bereits selbst. Im Basis-Template werden sie üblicherweise über die Funktionen [\$wsViews.metaTitle()](https://dokumentation.websale.de/frontend/referenz/module/wsviews#\$wsviews-metatitle) und [\$wsViews.metaDescription()](https://dokumentation.websale.de/frontend/referenz/module/wsviews#\$wsviews-metadescription) ausgegeben, damit alle Seitentypen einheitlich behandelt werden. Der direkte Zugriff über `$wsCmsPage.meta` ist nur nötig, wenn Sie die Rohwerte an anderer Stelle benötigen.
</Note>

Welche dieser Felder der Shop auswertet und welche Felder reine Verwaltungsdaten sind, steht unter [Der SEO-Block in meta](/strapi-cms/grundlagen-architektur-von-strapi#der-seo-block-in-meta).

### \$wsCmsPage.fields

Enthält die Inhaltsfelder der Seite. Jeder Eintrag hat die Schlüssel `name`, `type` und `value`.

Der Shop gibt diese Liste unverändert weiter und interpretiert sie nicht. Welche Feldnamen und Komponenten es gibt, ergibt sich aus der Strapi-Modellierung des jeweiligen Shops. Für den Zugriff wird die Liste einmalig in ein Name/Wert-Objekt überführt:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCmsPage }}
    {{ var $cFields = {} }}
    {{ foreach $cField in $wsCmsPage.fields }}
        {{ $cFields[$cField.name] = $cField.value }}
    {{ /foreach }}

    <h1>{{= $wsCmsPage.meta.metaTitle }}</h1>
    <div>{{! $cFields.Markup }}</div>
{{ /if }}
```

Das Muster gilt auf jeder Ebene, auch innerhalb von Komponenten (`value.fields`) und für die Blöcke von Inhaltsblöcken. Die Feldtypen und die Form der jeweiligen `value` sind unter [Die Feldtypen](/strapi-cms/migration-der-strapi-datenstruktur-v5#die-feldtypen) beschrieben, das Umstellen bestehender Feldzugriffe unter [Schritt 4](/strapi-cms/migration-der-strapi-datenstruktur-v5#schritt-4-feldzugriffe-umstellen) und [Schritt 5](/strapi-cms/migration-der-strapi-datenstruktur-v5#schritt-5-inhaltsblocke-dynamic-zone-anpassen).

<Warning>
  Die Reihenfolge der `fields`-Liste folgt der Schema-Definition und ist für das Rendern bedeutungslos. Greifen Sie deshalb immer über `name` und nie über die Position auf Felder zu. Die Reihenfolge **innerhalb** eines Array-Werts (Inhaltsblöcke, wiederholbare Komponenten) entspricht dagegen exakt der Anordnung des Redakteurs und muss beim Rendern übernommen werden.
</Warning>

***

## Aktionen

Für `$wsCmsPage` stehen keine Aktionen zur Verfügung.

***

## Beispiele

### Gemeinsames Basis-Template auf CMS-Inhalte prüfen

Da `$wsCmsPage` auf allen anderen Seiten `null` ist, kann ein gemeinsames Basis-Template gefahrlos darauf prüfen:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCmsPage }}
    {{# nur auf CMS-Seiten #}}
{{ /if }}
```

### Alternativsprachen ausgeben

`meta.hreflang` wird nicht automatisch in die hreflang-Angaben des Shops übernommen,[\$wsViews.current.getHreflangAutomatic()](https://dokumentation.websale.de/frontend/referenz/module/wsviews#\$wsviews-current-gethreflangautomatic) liefert für CMS-Seiten nichts. Für die Ausgabe im HTML-Head:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $cAlt in $wsCmsPage.meta.hreflang }}
    <link rel="alternate" hreflang="{{= $cAlt.language }}" href="{{= $cAlt.url }}">
{{ /foreach }}
```

### Unbekannte Komponenten im Testmodus sichtbar machen

Ohne einen `{{ else }}`-Zweig verschwindet eine neu angelegte, im Template nicht umgesetzte Komponente still aus der Seite:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $cItem in $cFields.content }}
    {{ if $cItem.component == "elemente.ws-markup" }}
        {{# … Ausgabe … #}}
    {{ else }}
        {{ if $wsTestMode.active }}
            <!-- Komponente "{{= $cItem.component }}" ist im Template nicht umgesetzt -->
        {{ /if }}
    {{ /if }}
{{ /foreach }}
```

### Entwurf im Testmodus kennzeichnen

Ein Entwurf (`meta.publishedAt` ist `null`) wird nur bei aktivem [Testmodus](/frontend/referenz/aktionen/testmode) ausgeliefert. Das lässt sich im Template sichtbar machen:

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsCmsPage && !$wsCmsPage.meta.publishedAt }}
    <p class="notice">Diese Seite ist ein Entwurf und öffentlich nicht erreichbar.</p>
{{ /if }}
```

***

## Weiterführende Links

* [Auslieferung von CMS-Seiten in den Shop](/strapi-cms/grundlagen-architektur-von-strapi#auslieferung-von-cms-seiten-in-den-shop)
* [Template Theme - CMS-Seitentemplate](/frontend/die-basics/template-theme#cms-seitentemplate)
* [content.cmsTemplates](/konfiguration/content-katalog-kategorien-produkte#content-cmstemplates-cms-seiten)
* [Migration der strapi-Datenstruktur (Version 5)](/strapi-cms/migration-der-strapi-datenstruktur-v5)
* [\$wsViews](/frontend/referenz/module/wsviews)
* [\$wsTestMode](/frontend/referenz/module/wstestmode)


## Related topics

- [Template Theme](/frontend/die-basics/template-theme.md)
- [Grundlagen & Architektur von strapi](/strapi-cms/grundlagen-architektur-von-strapi.md)
- [Übersicht - strapi CMS](/strapi-cms.md)
- [Migration der strapi-Datenstruktur (Version 5)](/strapi-cms/migration-der-strapi-datenstruktur-v5.md)
- [seoMetaData - Meta-Daten & Seo-Texte](/konfiguration/seometadata-meta-daten-seo-texte.md)
