> For the complete documentation index, see [llms.txt](https://docs.momocode.de/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.momocode.de/shopware-6/erweiterte-wunschlisten/4.-einwilligung.md).

# 4. Einwilligung & Consent-Tools

Die Gast-Wunschliste speichert Produkte im Browser des Besuchers (`localStorage`) und ist deshalb an eine Einwilligung gekoppelt. Woher das Plugin diese Einwilligung liest, legen Sie selbst fest — vom Shopware-eigenen Cookie-Banner bis zur Anbindung an ein externes Consent-Management-Tool (CMP).

Alle Einstellungen dieser Seite finden Sie unter **Erweiterungen → Meine Erweiterungen → Erweiterte Wunschlisten → ··· → Konfiguration**.

> Diese Seite betrifft ausschließlich **Gast-Besucher**. Eingeloggte Kunden speichern ihre Wunschlisten serverseitig in ihrem Kundenkonto — dort findet keine Einwilligungsprüfung statt.

***

## Die Einwilligungsquelle wählen

Das Feld **Einwilligungsquelle** im Bereich **Gast-Wunschliste** bestimmt, woher der Einwilligungsstand kommt:

| Einwilligungsquelle                          | Einwilligung kommt von                                                              | Plugin-Cookie im Shopware-Banner |
| -------------------------------------------- | ----------------------------------------------------------------------------------- | -------------------------------- |
| **Shopware-Cookie-Banner** *(Standard)*      | Shopwares eigenem Cookie-Banner, Kategorie „Komfortfunktionen“                      | ja                               |
| **Fremdes Cookie (Consent-Management-Tool)** | Einem Cookie Ihres Consent-Tools, ausgewertet über einen konfigurierbaren Vergleich | nein                             |
| **Eigene Anbindung (JavaScript-API)**        | Ausschließlich einem kleinen JavaScript-Baustein in Ihrem Theme                     | nein                             |
| **Keine Einwilligungsprüfung**               | Nirgendwoher — die Gast-Wunschliste ist ohne Prüfung aktiv                          | nein                             |

Zwei Punkte, die häufig für Rückfragen sorgen:

* **Die Einstellung gilt shopweit**, nicht pro Verkaufskanal. Shopware ruft den Cookie-Provider des Plugins ohne Verkaufskanal-Kontext auf; eine kanalweise Einstellung ließe sich dort nicht berücksichtigen. Damit Cookie-Banner und Storefront niemals auseinanderlaufen, lesen beide denselben globalen Wert.
* **Die Einstellung „Gast-Wunschliste aktivieren“ gewinnt immer.** Ist die Gast-Wunschliste deaktiviert, ist sie in allen vier Quellen aus. Die Einwilligungsquelle entscheidet nur, *wie* die Einwilligung erkannt wird — nie, *ob* die Funktion überhaupt existiert.

In allen Quellen außer **Shopware-Cookie-Banner** meldet das Plugin sein Cookie bewusst **nicht** mehr in Shopwares Cookie-Banner an. Andernfalls stünde dort ein Cookie deklariert, das die Storefront nie verwendet.

***

## Shopware-Cookie-Banner (Standard)

Ohne weitere Konfiguration erscheint das Plugin-Cookie in Shopwares Cookie-Banner unter **Komfortfunktionen**. Akzeptiert der Besucher diese Kategorie, wird die Gast-Wunschliste **sofort** freigeschaltet — ein Seitenwechsel oder Neuladen ist nicht nötig. Das Wunschlisten-Element erscheint unmittelbar nach dem Speichern der Cookie-Auswahl.

Für die meisten Shops ist das die richtige Wahl und es sind keine weiteren Einstellungen nötig.

***

## Fremdes Cookie (Consent-Management-Tool)

Setzen Sie statt Shopwares Banner eine Consent-Management-Plattform ein, kann das Plugin deren Cookie direkt auswerten. Dafür sind drei Felder zuständig:

| Feld                                                        | Bedeutung                                                  |
| ----------------------------------------------------------- | ---------------------------------------------------------- |
| **Name des Einwilligungs-Cookies**                          | Cookie, das gelesen wird, z. B. `CookieConsent`            |
| **Vergleichsverfahren für das Einwilligungs-Cookie**        | Exakte Übereinstimmung, Enthält oder JSON-Pfad             |
| **Vergleichswert bzw. JSON-Pfad des Einwilligungs-Cookies** | Vergleichswert oder — beim JSON-Pfad — der Pfad ins Cookie |

Die drei Vergleichsverfahren:

* **Exakte Übereinstimmung** — Der Cookie-Wert entspricht exakt dem Vergleichswert (Groß-/Kleinschreibung wird beachtet).
* **Enthält** — Der Vergleichswert kommt irgendwo im Cookie-Wert vor. Das richtige Verfahren für Tools, deren Cookie ein lesbarer Text und kein gültiges JSON ist.
* **JSON-Pfad** — Der Cookie-Wert wird als JSON gelesen und der Vergleichswert als durch Punkte getrennter Pfad (z. B. `consents.comfort`) hineinverfolgt. Als erteilt gilt nur `true`, `1`, `"1"` oder `"true"`.

### Rezepte für verbreitete Consent-Tools

Cookie-Namen und -Strukturen legen die Hersteller der Consent-Tools fest und können sich mit jeder Version ändern. Die folgenden Werte sind **Ausgangspunkte, keine Zusicherungen** — prüfen Sie sie in den Entwicklerwerkzeugen Ihres Browsers gegen Ihre eigene Installation.

| Tool           | Einwilligungsquelle | Cookie                          | Vergleichsverfahren | Wert                                                       |
| -------------- | ------------------- | ------------------------------- | ------------------- | ---------------------------------------------------------- |
| Cookiebot      | Fremdes Cookie      | `CookieConsent`                 | Enthält             | `preferences:true`                                         |
| Borlabs Cookie | Fremdes Cookie      | `borlabs-cookie`                | JSON-Pfad           | z. B. `consents.comfort`                                   |
| CCM19          | Fremdes Cookie      | Embedding-ID-Cookie Ihres Shops | Enthält             | Kennung der freigegebenen Gruppe                           |
| Usercentrics   | Eigene Anbindung    | —                               | —                   | siehe [Eigene Anbindung](#eigene-anbindung-javascript-api) |

Hinweise dazu:

* **Cookiebot** schreibt einen Wert, der wie JSON *aussieht*, aber keines ist. Verwenden Sie deshalb **Enthält**, nicht den JSON-Pfad.
* **Borlabs Cookie** legt die Gruppenbezeichnung im Pfad fest; sie hängt von der Benennung in Ihrem Shop ab. Öffnen Sie das Cookie einmal im Browser und lesen Sie den tatsächlichen Pfad ab.
* **Usercentrics** hält die Einwilligung in seiner JavaScript-Schnittstelle und nicht in einem stabil lesbaren Cookie. Hier ist die **Eigene Anbindung** der einzige verlässliche Weg.

### Wenn nichts erscheint

Der Abgleich schlägt bewusst **still** fehl — ohne Meldung in der Browser-Konsole. Jede Fehlkonfiguration (leerer Cookie-Name, leerer Vergleichswert, unlesbares JSON, ins Leere laufender Pfad) führt zu „nicht erteilt“. Das Symptom ist eindeutig: Die Gast-Wunschliste erscheint nicht. Prüfen Sie in diesem Fall Cookie-Name, Verfahren und Vergleichswert gegen den tatsächlichen Cookie-Inhalt in Ihrem Browser.

Ist das konfigurierte Cookie überhaupt nicht vorhanden, wertet das Plugin dies **nicht** als Ablehnung — ein Consent-Tool, das noch lädt, hat schlicht noch kein Cookie geschrieben.

***

## Eigene Anbindung (JavaScript-API)

Lässt sich Ihr Consent-Tool nicht über ein Cookie auslesen, binden Sie es über eine kleine JavaScript-Schnittstelle an. Das Plugin liefert bewusst **keine** tool-spezifischen Adapter mit — es stellt nur den Anschlusspunkt bereit; die wenigen Zeilen Glue-Code leben in Ihrem Theme.

> Dieser Abschnitt richtet sich an Entwickler bzw. Ihre Agentur. Für die Anbindung ist ein eigenes Theme bzw. Plugin erforderlich.

### Der Bridge-Block

Das Plugin stellt einen leeren, überschreibbaren Twig-Block bereit. Legen Sie in Ihrem Theme eine Erweiterung von `storefront/base.html.twig` an:

```twig
{% sw_extends '@Storefront/storefront/base.html.twig' %}

{% block momo_guest_wishlist_consent_bridge %}
    <script>
        (function () {
            // Die Abfrage zuerst registrieren: Sie ist unabhängig davon, ob
            // Ihr Consent-Tool zu diesem Zeitpunkt schon geladen ist.
            window.MomoWishlistConsent.registerResolver(function () {
                if (!window.myCmp || !window.myCmp.isReady()) {
                    return null; // noch keine Aussage möglich
                }

                return window.myCmp.hasConsent('comfort');
            });

            // Event-Anbindung, sobald das Consent-Tool verfügbar ist.
            // Mehrfache Aufrufe sind unschädlich — es wird höchstens einmal gebunden.
            let bound = false;

            function bindMyCmp() {
                if (bound || !window.myCmp || typeof window.myCmp.onConsentChange !== 'function') {
                    return bound;
                }

                bound = true;

                window.myCmp.onConsentChange(function (consents) {
                    window.MomoWishlistConsent.set(consents.comfort === true);
                });

                // Das Tool ist jetzt bereit — Stand einmal neu auswerten
                window.MomoWishlistConsent.refresh();

                return true;
            }

            // Lädt Ihr Consent-Tool asynchron, ist es hier noch nicht vorhanden.
            // Binden Sie an dessen eigenes Bereitschaftssignal — ersetzen Sie
            // „myCmpReady“ durch das Event bzw. den Callback Ihres Tools. Das
            // load-Event ist nur ein Rückfallnetz: Ein Tool, das sich erst nach
            // „load“ initialisiert, wird davon nicht mehr erfasst.
            if (!bindMyCmp()) {
                document.addEventListener('myCmpReady', bindMyCmp);
                window.addEventListener('load', bindMyCmp);
            }
        }());
    </script>
{% endblock %}
```

Beispiel für Usercentrics:

```twig
{% block momo_guest_wishlist_consent_bridge %}
    <script>
        window.addEventListener('ucEvent', function (event) {
            if (!event.detail || typeof event.detail !== 'object') {
                return;
            }

            // Servicenamen aus dem Usercentrics-Admin übernehmen
            window.MomoWishlistConsent.set(event.detail['Momo Advanced Wishlists'] === true);
        });
    </script>
{% endblock %}
```

Fertige Bausteine für Cookiebot und Borlabs Cookie finden Sie in der `README.md` des Plugins.

### Die Schnittstelle `window.MomoWishlistConsent`

| Methode                      | Verhalten                                                                                                                                                                                                                                                        |
| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `set(granted)`               | Erteilt oder widerruft die Einwilligung. Entspricht der übergebene Wert dem aktuellen Zustand, wird keine Änderung gemeldet. `set(false)` löscht Cookie und gespeicherte Wunschliste dennoch bei jedem Aufruf und bleibt damit ein verlässlicher harter Schnitt. |
| `isGranted()`                | Liefert den aktuell aufgelösten Einwilligungsstand.                                                                                                                                                                                                              |
| `onChange(callback)`         | Registriert einen Listener und liefert eine Abmeldefunktion zurück.                                                                                                                                                                                              |
| `registerResolver(funktion)` | Registriert eine Abfrage, die `true`, `false` oder `null` (keine Aussage) liefern darf.                                                                                                                                                                          |
| `refresh()`                  | Erzwingt eine sofortige Neuauswertung aller Abfragen.                                                                                                                                                                                                            |

Die Schnittstelle steht ab dem ersten Moment im `<head>` bereit — auch sehr frühe Aufrufe eines Consent-Tools gehen nicht verloren, sie werden zwischengespeichert und beim Laden des Themes nachgeholt.

**Auswertungsreihenfolge:** Liefert *irgendeine* Abfrage `true`, gilt die Einwilligung als erteilt. Andernfalls: liefert *irgendeine* Abfrage `false`, gilt sie als verweigert. Enthalten sich alle, entscheidet das plugin-eigene Consent-Cookie. Ein `true` gewinnt bewusst gegen jedes `false` — eine Abfrage, die `true` meldet, hat eine Einwilligung positiv beobachtet, während `false` oft nur bedeutet, dass sie noch keine bestätigen konnte. Daraus folgt eine Regel für Ihren Glue-Code: Nach einem Widerruf darf keine Abfrage weiterhin `true` melden. Die Folge hängt davon ab, wie der Widerruf das Plugin erreicht:

* **Über `set(false)`** — das Consent-Cookie und die gespeicherte Gast-Wunschliste werden zunächst gelöscht, doch die anschließende Neuauswertung sieht das veraltete `true` und erteilt die Einwilligung sofort wieder. Der Widerruf hält also nicht: Es wird keine Änderung gemeldet, und der Besucher kann umgehend neue Artikel speichern.
* **Nur über eine Neuauswertung** (Shopwares Cookie-Banner, Rückkehr in den Browser-Tab) — durch das veraltete `true` wird gar keine Änderung erkannt, es läuft keine Aufräumaktion und die gespeicherten Daten bleiben erhalten.

Melden Sie `false` bei einer ausdrücklichen Ablehnung — oder wenn der Einwilligungsstatus, den Sie auslesen, zwar vorliegt, aber kein Ja enthält. Melden Sie `null`, wenn Sie sich keine Meinung bilden können: Ihr Consent-Tool ist noch nicht fertig geladen oder der Wert wurde noch nicht geschrieben. Dieselbe Regel befolgt die eingebaute Cookie-Auswertung der Quelle **Fremdes Cookie** — und deshalb gilt ein fehlendes Cookie als Enthaltung, nicht als Ablehnung.

Cookie-Name, Gültigkeitsdauer und die aktive Einwilligungsquelle werden für Ihren Glue-Code als Data-Attribute am Element `[data-momo-guest-wishlist-storage]` ausgegeben. Lesen Sie die Werte von dort, statt sie fest zu verdrahten.

***

## Keine Einwilligungsprüfung

In dieser Quelle ist die Gast-Wunschliste ohne jede Prüfung aktiv. Das ist sinnvoll, wenn Ihre Einwilligungsverwaltung vollständig außerhalb von Shopware stattfindet und Sie die Funktion an anderer Stelle steuern.

Beachten Sie: **Keine Prüfung heißt „kein Tor“, nicht „Einwilligung erteilt“.** Es gibt keinen Einwilligungsstand, der widerrufen werden könnte — ein `set(false)` bleibt in dieser Quelle wirkungslos. Prüfen Sie Ihren Glue-Code deshalb nie in dieser Einstellung, sondern in der Quelle, die Sie produktiv einsetzen wollen.

***

## Verhalten ohne Einwilligung

Liegt keine Einwilligung vor, bestimmt das Feld **Wunschlisten-Element ohne Gast-Einwilligung** im Bereich **Storefront-Erscheinungsbild**, was der Besucher sieht. Diese Einstellung ist — anders als die Einwilligungsquelle — **pro Verkaufskanal** konfigurierbar.

* **Element ausblenden** *(Standard)* — Das Wunschlisten-Symbol bzw. die Schaltfläche wird gar nicht angezeigt. Bestehende Installationen verhalten sich nach einem Update unverändert.
* **Element anzeigen und Einwilligung anfragen** — Das Element bleibt sichtbar, ist aber inaktiv. Klickt der Besucher darauf, öffnet sich Shopwares Cookie-Einstellungen-Dialog. Ist dieser nicht verfügbar (etwa weil Sie ein externes Consent-Tool einsetzen), erscheint stattdessen ein ausblendbarer Hinweis, dass für die Wunschliste eine Einwilligung nötig ist.

**In keinem Fall wird ein Produkt gespeichert, solange keine Einwilligung vorliegt.** Das Element meldet niemals eine erfolgreiche Speicherung, die nicht stattgefunden hat. Auch nach nachträglich erteilter Einwilligung wird der zuvor angeklickte Artikel nicht automatisch nachgetragen — der Besucher klickt einfach erneut.

Der Hinweistext folgt Ihrem gewählten [Terminologie-Preset](https://github.com/momocode-de/plugin-gitbook/tree/de/shopware-6/erweiterte-wunschlisten/konfiguration.md#terminologie-preset) und lässt sich unter **Einstellungen → Textbausteine** über den Schlüssel `momoAdvancedWishlists.storefront.consent.requiredHint` anpassen.

Die Einstellung greift nicht, wenn die Gast-Wunschliste deaktiviert ist, wenn die Einwilligungsquelle auf **Keine Einwilligungsprüfung** steht oder wenn die Schaltflächenposition in Produktkacheln auf **Keine Schaltfläche** gesetzt ist.

***

## Widerruf der Einwilligung

Widerruft ein Besucher seine Einwilligung, löscht das Plugin sofort:

* das plugin-eigene Consent-Cookie
* die im Browser gespeicherte Gast-Wunschliste (`localStorage`)

Die Gast-Wunschliste ist danach leer, und der Zähler im Header aktualisiert sich ohne Neuladen der Seite. Das gilt gleichermaßen für einen Widerruf über Shopwares Cookie-Banner und über die JavaScript-Schnittstelle.

**Ein Wechsel der Einwilligungsquelle löscht dagegen nie Daten.** Wechseln Sie beispielsweise von **Shopware-Cookie-Banner** auf **Fremdes Cookie**, bleiben Besucher mit einem noch gültigen Plugin-Cookie zunächst freigeschaltet — dieses Cookie dient weiterhin als Rückfallebene. Möchten Sie einen harten Schnitt, setzen Sie im Bridge-Block einmalig `window.MomoWishlistConsent.set(false)`.

***

## Wann die Einwilligung geprüft wird

Das Plugin fragt den Einwilligungsstand **nicht** in regelmäßigen Abständen ab. Ausgewertet wird:

* beim Laden der Seite
* wenn Shopwares Cookie-Banner eine geänderte Auswahl speichert
* wenn der Besucher zum Browser-Tab zurückkehrt
* bei einem ausdrücklichen `refresh()` aus Ihrem Glue-Code

Dadurch wirken Änderungen sofort und ohne Neuladen der Seite — das Wunschlisten-Element erscheint bzw. verschwindet unmittelbar.
