> ## 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.

# E-PSEO_ (SEO-Content für Produkte)

> Das Eingabeformular des SEO-Modus aufbauen: SEO-Produktname, Hauptkategorieindex, zwanzig freie SEO-Felder, Feldnamen, Fehlermeldungen und Rückmeldungen.

Im SEO-Modus öffnet ein SEO-Fachmann den Shop mit einem eigenen Passwort [und](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/kunde-anmeldung-und-kundenkonto.md) pflegt direkt auf der Produktdetailansicht zusätzliche Inhalte: einen SEO-Produktnamen für die sprechende Adresse, einen Hauptkategorieindex und bis zu zwanzig freie Felder für Seitentitel, Beschreibung und was sonst gebraucht wird.

Die Eingabefelder stehen nicht in der Produktdetailansicht selbst, sondern in einem eigenen Template. Sie tragen es in der Shopkonfiguration `shop.config` im Abschnitt `SEOProductFields` beim Parameter `Template` ein und holen es mit `~WS-Module(product_seo)~` in die Seite. Die Tags dieser Seite gelten ausschließlich in diesem Template.

Wegweiser: [SEO-Content für Produkte](https://dokumentation.websale.de/v8s/seo/seo-content-fuer-produkte.md) · Referenz: Abschnitt SEOProductFields · Referenz: [WS-Module()](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md)

> [!WARNING]
>
> Der Aufruf von `WS-Module(product_seo)` gehört in eine `ST-SeoMode`-Klammerung. Ohne sie bekommen auch gewöhnliche Besucher das Eingabeformular zu sehen.

Referenz: [ST-SeoMode](https://dokumentation.websale.de/v8s/referenz/tags/e-pseo.md)

Die Ausgabe der gepflegten Inhalte im Shop übernehmen nicht diese Tags, sondern die `PR-SeoFreeField1…20`Tags in der Produktdetailansicht. Diese Seite beschreibt nur die Pflegeoberfläche.

Referenz: [PR-SeoFreeField1…20](https://dokumentation.websale.de/v8s/referenz/tags/e-pseo.md)

## Kann in diesem Subshop überhaupt gepflegt werden

Verbundene Subshops bekommen ihre SEO-Daten wie ihre Produktdaten automatisch aus dem Haupt-Subshop. Gepflegt wird deshalb nur dort. `E-PSEO_Connected_Subshop` ist die erste Entscheidung im Template.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{E-PSEO_Connected_Subshop}
   <p>
      In diesem Subshop lässt sich kein SEO-Content bearbeiten.
      Bitte nehmen Sie Ihre Änderungen im Subshop ~E-PSEO_Connected_Subshop~ vor.
   </p>
{/E-PSEO_Connected_Subshop}

{!E-PSEO_Connected_Subshop}
   <!-- hier stehen die Eingabefelder -->
{/!E-PSEO_Connected_Subshop}
```

> [!WARNING]
>
> Die Klammerung greift **positiv**, wenn die Pflege hier **nicht** möglich ist. Das Eingabeformular gehört deshalb in den negativen Zweig. Wer das verwechselt, baut ein Formular, dessen Absenden der Shop immer mit der Meldung `ErrorConnectedSubshop` abweist.

Als Einzel-Tag gibt `E-PSEO_Connected_Subshop` die Kennung des Subshops aus, in dem gepflegt werden muss. Nennen Sie sie im Hinweis, sonst muss der SEO-Fachmann raten, wohin er wechseln soll.

## Das Formular

Beide Formulare des SEO-Modus, das zum Speichern und das zum Zurücksetzen, brauchen dieselben drei versteckten Felder: den Kontext, den Produktindex und den Aktionsnamen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{!E-PSEO_Connected_Subshop}
   <form class="seoform" action="/websale8/" method="post" id="SeoFormEdit">
      <input type="hidden" name="Ctx" value="~WS-CTX~">
      <input type="hidden" name="pi" value="~PR-ProdIndex~">
      <input type="hidden" name="~E-PSEO_Action_Save~" value="true">

      <label for="seo-name">SEO-Produktname für die Adresse (maximal 127 Zeichen)</label>
      <input type="text" id="seo-name" name="~E-PSEO_Name_Input~" value="~E-PSEO_Name~">
      {E-PSEO_Error_Name}<p class="fehler">~E-PSEO_Error_Name~</p>{/E-PSEO_Error_Name}

      <label for="seo-maincat">Hauptkategorieindex (maximal 255 Zeichen)</label>
      <input type="text" id="seo-maincat" name="~E-PSEO_MainCatIndex_Input~" value="~E-PSEO_MainCatIndex~">
      <input type="hidden" name="~E-PSEO_MainCatIndex_Hidden~" value="yes">
      {E-PSEO_Error_MainCatIndex}<p class="fehler">~E-PSEO_Error_MainCatIndex~</p>{/E-PSEO_Error_MainCatIndex}

      <label for="seo-feld1">SEO-Feld 1, beispielsweise für den Seitentitel (maximal 4000 Zeichen)</label>
      <textarea id="seo-feld1" name="~E-PSEO_Field1_Input~">~E-PSEO_Field1~</textarea>
      <input type="hidden" name="~E-PSEO_Field1_Hidden~" value="yes">
      {E-PSEO_Error_Field1}<p class="fehler">~E-PSEO_Error_Field1~</p>{/E-PSEO_Error_Field1}

      <button type="submit">Eingaben speichern</button>
   </form>

   <form class="seoform" action="/websale8/" method="post" id="SeoFormReset">
      <input type="hidden" name="Ctx" value="~WS-CTX~">
      <input type="hidden" name="pi" value="~PR-ProdIndex~">
      <input type="hidden" name="~E-PSEO_Action_Reset~" value="true">
      <button type="submit">Eingaben zurücksetzen</button>
   </form>
{/!E-PSEO_Connected_Subshop}
```

> [!WARNING]
>
> Ohne den Produktindex im Feld `pi` bricht das Modul ab und gibt gar nichts aus. Das ist die häufigste Ursache für ein Formular, das nach dem Absenden eine leere Seite hinterlässt.

`E-PSEO_Action_Save` und `E-PSEO_Action_Reset` liefern nur den technischen Namen. Sie stehen deshalb im `name`-Attribut, nicht im Wert. Am Absendeknopf lässt sich derselbe Name noch einmal setzen, nötig ist das neben dem versteckten Feld aber nicht.

### Die Feldnamen

Zu jedem Eingabefeld gehören bis zu drei Tags nach demselben Raster.

| Schreibweise | Liefert |
| - | - |
| `E-PSEO_<Feld>` | den gespeicherten Inhalt, und als Klammerung die Prüfung, ob schon etwas darin steht |
| `E-PSEO_<Feld>_Input` | den Feldnamen für das Eingabeelement |
| `E-PSEO_<Feld>_Hidden` | den Feldnamen für das zugehörige versteckte Feld |

`<Feld>` steht für `Name`, `MainCatIndex` oder `Field1` bis `Field20`.

> [!WARNING]
>
> Das versteckte Feld aus `_Hidden` gehört zu jedem SEO-Feld und zum Hauptkategorieindex dazu. Das Modul übernimmt einen Wert nur dann, wenn entweder etwas darin steht **oder** das zugehörige versteckte Feld mitgeschickt wurde. Ohne das versteckte Feld lässt sich ein einmal gefülltes Feld also nie wieder leeren, der alte Inhalt bleibt beim Speichern einfach stehen.

Der SEO-Produktname braucht kein verstecktes Feld und hat deshalb auch kein `_Hidden`-Tag. Er wird immer übernommen und lässt sich jederzeit leeren.

> [!WARNING]
>
> Übernehmen Sie die Feldnamen immer aus den `_Input`- und `_Hidden`-Tags. Ein selbst gewählter Name kommt beim Modul nicht an, die Eingabe geht beim Speichern verloren.

### Die Längen

| Feld | Höchstlänge |
| - | - |
| `E-PSEO_Name` | 127 Zeichen |
| `E-PSEO_MainCatIndex` | 255 Zeichen |
| `E-PSEO_Field1` bis `E-PSEO_Field20` | 4000 Zeichen |

> [!WARNING]
>
> Der SEO-Produktname muss shopweit eindeutig sein, denn er wird zur Adresse des Produktes. Vergibt jemand einen Namen, der schon zu einem anderen Produkt gehört, weist das Modul das Speichern mit der Meldung `ErrorNameAlreadyExists` ab.

Wird beim Speichern auch nur ein Feld beanstandet, speichert das Modul **gar nichts**. Die Eingaben bleiben im Formular stehen, und die betroffenen Felder tragen ihre Fehlermeldung. Der SEO-Fachmann verliert also nichts, muss aber alle Beanstandungen beheben, bevor irgendetwas gesichert wird.

## Fehler und Rückmeldungen

| Tag | Wirkung |
| - | - |
| `E-PSEO_Error` | greift, wenn beim Speichern etwas schiefging, und gibt den Meldungstext aus |
| `E-PSEO_Success` | greift, wenn die Eingaben gespeichert wurden |
| `E-PSEO_Name_Changed` | greift, wenn der SEO-Produktname geändert wurde |
| `E-PSEO_Error_Name` | die Meldung zum SEO-Produktnamen |
| `E-PSEO_Error_MainCatIndex` | die Meldung zum Hauptkategorieindex |
| `E-PSEO_Error_Field1…20` | die Meldung zum jeweiligen SEO-Feld |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{E-PSEO_Error}
   <div id="SeoProductError">
      <p>Es ist ein Fehler aufgetreten.</p>
      <p>~E-PSEO_Error~</p>
   </div>
{/E-PSEO_Error}

{E-PSEO_Success}
   <div id="SeoProductSuccess">
      <p>Ihre Eingaben wurden gespeichert.</p>
      {E-PSEO_Name_Changed}
         <p>Der SEO-Produktname hat sich geändert. Die neue Adresse des Produktes
            wird erst nach dem nächsten Generieren im TopRank-Manager wirksam.</p>
      {/E-PSEO_Name_Changed}
   </div>
{/E-PSEO_Success}
```

`E-PSEO_Success` und `E-PSEO_Name_Changed` sind reine Klammerungen ohne Textausgabe. Den Text schreiben Sie selbst ins Template.

> [!WARNING]
>
> Alle Meldungstexte stehen in der Shopkonfiguration `shop.config` im Abschnitt `SEOProductFields-Text`, nicht im Template. Fehlt dort ein Eintrag, bleibt die Meldung leer, und der SEO-Fachmann sieht einen Fehler ohne Begründung. Gebraucht werden `ErrorNameTooLong`, `ErrorFieldTooLong`, `ErrorNameAlreadyExists`, `ErrorConnectedSubshop` und `ErrorMainCatIndexTooLong`.

Referenz: [Abschnitt SEOProductFields-Text](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md#seoproductfields-text)

`E-PSEO_Name_Changed` ist der Platz für den Hinweis, dass die sprechende Adresse des Produktes noch nicht umgestellt ist. Sie entsteht erst beim nächsten Generieren im TopRank-Manager, nicht beim Speichern.

## Nachladen per AJAX

`E-PSEO_Ajax` greift, wenn das Modul über einen AJAX-Aufruf geladen wurde. Damit grenzen Sie den Bereich ab, der nach dem Speichern ausgetauscht werden soll.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<div id="SEOFields">
   {E-PSEO_Ajax}<WS-Ajax-SEOFields>{/E-PSEO_Ajax}

   <!-- Eingabefelder -->

   {E-PSEO_Ajax}</WS-Ajax-SEOFields>{/E-PSEO_Ajax}
</div>
```

> [!WARNING]
>
> Öffnender und schließender Marker müssen denselben Namen tragen, und dieser Name muss der Kennung des umgebenden Elements entsprechen. Ein Tippfehler an dieser Stelle führt dazu, dass der Shop nach dem Speichern nichts austauscht, ohne einen Fehler zu melden.

Ohne AJAX wird nach dem Speichern die ganze Produktseite neu geladen. Das hat den Vorteil, dass sich eine Änderung am Seitentitel sofort im Browser prüfen lässt. Bei der AJAX-Variante wird nur der eingeklammerte Bereich erneuert.

Referenz: WS-Ajax-"ID" · Wegweiser: AJAX-Funktionen

## WEBSALE-Tags in den SEO-Feldern

Nach schriftlicher Beauftragung und technischer Freischaltung dürfen in den SEO-Feldern selbst WEBSALE-Tags stehen. Sie werden dann bei der Ausgabe im Shop aufgelöst.

> [!WARNING]
>
> Damit dem SEO-Fachmann im Eingabefeld das Tag selbst und nicht dessen Ergebnis erscheint, klammern Sie den Inhalt mit `WS-NoParsing`. Ohne diese Klammerung sieht er nach dem Speichern nur noch das aufgelöste Ergebnis und kann das Tag weder prüfen noch korrigieren.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
<textarea id="seo-feld1" name="~E-PSEO_Field1_Input~">{WS-NoParsing}~E-PSEO_Field1~{/WS-NoParsing}</textarea>
```

Referenz: [WS-NoParsing](https://dokumentation.websale.de/v8s/referenz/tags/ws/shop-seite-und-technik.md#die-tags-im-uberblick)

## Die Tags im Überblick

| Tag | Einzel-Tag | Bereichs-Tag | negatives Bereichs-Tag | Schleifen-Tag |
| - | - | - | - | - |
| `E-PSEO_Connected_Subshop` | ja | ja | ja | – |
| `E-PSEO_Action_Save` | ja | – | – | – |
| `E-PSEO_Action_Reset` | ja | – | – | – |
| `E-PSEO_Name` | ja | ja | ja | – |
| `E-PSEO_Name_Input` | ja | – | – | – |
| `E-PSEO_MainCatIndex` | ja | ja | ja | – |
| `E-PSEO_MainCatIndex_Input` | ja | – | – | – |
| `E-PSEO_MainCatIndex_Hidden` | ja | – | – | – |
| `E-PSEO_Field1…20` | ja | ja | ja | – |
| `E-PSEO_Field1…20_Input` | ja | – | – | – |
| `E-PSEO_Field1…20_Hidden` | ja | – | – | – |
| `E-PSEO_ProdIndex` | ja | – | – | – |
| `E-PSEO_Error` | ja | ja | ja | – |
| `E-PSEO_Error_Name` | ja | ja | ja | – |
| `E-PSEO_Error_MainCatIndex` | ja | ja | ja | – |
| `E-PSEO_Error_Field1…20` | ja | ja | ja | – |
| `E-PSEO_Success` | – | ja | ja | – |
| `E-PSEO_Name_Changed` | – | ja | ja | – |
| `E-PSEO_Ajax` | – | ja | ja | – |

Zulässig sind alle Tags dieser Seite im Template für die Produkt-SEO-Eingabefelder, das in der Shopkonfiguration `shop.config` im Abschnitt `SEOProductFields` beim Parameter `Template` eingetragen ist.

`E-PSEO_ProdIndex` gibt den Produktindex aus, zu dem die angezeigten Felder gehören. Im Formular können Sie damit `~PR-ProdIndex~` ersetzen, was den Vorteil hat, dass der Wert aus dem Modul selbst stammt und nicht aus dem umgebenden Shop-Template.

## Verwandte Themen

* Wegweiser: [SEO-Content für Produkte](https://dokumentation.websale.de/v8s/seo/seo-content-fuer-produkte.md)
* Wegweiser: [SEO-URLs](https://dokumentation.websale.de/v8s/seo/seo-urls-und-link-optimierung.md)
* Referenz: [Abschnitt SEOProductFields](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md#seoproductfields)
* Referenz: [Abschnitt SEOProductFields-Text](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md#seoproductfields-text)
* Referenz: PR-SeoFreeField1…20


## Related topics

- [SEO-Content für Produkte](https://dokumentation.websale.de/v8s/seo/seo-content-fuer-produkte.md)
- [SEO-Optimierung mit TopRank](https://dokumentation.websale.de/v8s/seo/seo-optimierung-mit-toprank.md)
- [Grundlagen und Technik](https://dokumentation.websale.de/v8s/referenz/konfigurationen/shopkonfiguration-shop-config/grundlagen-und-technik.md)
- [SEO- (URL-Einstellungen TopRank)](https://dokumentation.websale.de/v8s/referenz/tags/seo-url-einstellungen-toprank.md)
- [SEO-URLs und Link-Optimierung](https://dokumentation.websale.de/v8s/seo/seo-urls-und-link-optimierung.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.