Book

CCT4U Dokumentation

Vollständige Anleitung zur Einrichtung und Konfiguration

Überblick: Wie die Komponenten zusammenarbeiten

Stell dir das Cookie-System wie eine Hierarchie vor:

  1. Kategorien = Die Hauptordner (z.B. "Marketing")
  2. Dienste = Die konkreten Dienste in den Ordnern (z.B. "Google Analytics")
  3. Skripte & Cookies =
    Skripte – Der Code, der für die Dienste ausgeführt wird (z.B. Google Analytics-Tracking-Code)
    Cookies – Die kleinen Dateien, die von den Diensten gesetzt werden (z.B. "_ga"-Cookie)

1. Kategorien – Die grundlegende Organisation

Was sind Kategorien?

Kategorien sind die Hauptthemenbereiche, in die du deine Dienste einordnest. Sie helfen den Besuchern deiner Website zu verstehen, wofür unterschiedliche Cookies eingesetzt werden.

Standard-Kategorien:

  • "Notwendig" (wird automatisch erstellt, kann nicht gelöscht werden)
  • "Marketing" (für Werbung und Tracking)
  • "Komfort" (für bessere Benutzererfahrung)
  • "Statistik" (für Analyse des Besucherverhaltens)

Wie füge ich Kategorien hinzu:

  1. Titel: Z.B. "Marketing und Werbung" (frei wählbar)
  2. Schlüssel: Wird automatisch generiert (z.B. "marketing-und-werbung"), kann aber bei Bedarf manuell angepasst werden
  3. Beschreibung: "Diese Dienste helfen uns, unsere Werbung zu verbessern und dir relevante Inhalte zu zeigen."
Tipp: Erstelle zuerst alle Kategorien, bevor du Dienste hinzufügst! Titel und Schlüssel sind frei wählbar – wähle Namen, die für deinen Anwendungsfall sinnvoll sind.

2. Dienste – Die konkreten Services

Was sind Dienste?

Dienste sind die tatsächlichen Services, die du auf deiner Website verwendest. Jeder Dienst gehört zu einer Kategorie und kann mehrere Skripte und Cookies haben.

Beispiele für Dienste:

  • Google Analytics (Kategorie: Statistik)
  • Facebook Pixel (Kategorie: Marketing)
  • YouTube Videos (Kategorie: Komfort)
  • Google Fonts (Kategorie: Notwendig)

Wie füge ich Dienste hinzu:

  1. Name: google-analytics (technischer Name, keine Leerzeichen! – frei wählbar, aber muss eindeutig sein)
  2. Titel: "Google Analytics" (für Besucher sichtbar – frei wählbar)
  3. Beschreibung: "Hilft uns zu verstehen, wie unsere Website genutzt wird" (frei wählbar)
  4. Kategorie: Wähle aus deinen zuvor erstellten Kategorien
Wichtig: Der Name muss eindeutig sein und wird später in Skripten, Cookies und HTML-Elementen über das data-name-Attribut referenziert!

⚠️ KRITISCH: Dienste sind KEINE automatischen Blocker!

Häufiges Missverständnis:

"Mein Theme verwendet Google Fonts. Und obwohl ich einen Google-Fonts-Dienst in CCT4U angelegt habe, werden die Fonts trotzdem ohne Zustimmung geladen!"

❌ Genau! Das Anlegen eines Dienstes blockiert NICHTS!

Was TATSÄCHLICH passiert:

  1. Du legst einen "Google Fonts"-Dienst in CCT4U an
  2. CCT4U fügt ihn zum Cookie-Consent-Banner hinzu
  3. ABER: Dein Theme lädt Google Fonts TROTZDEM OHNE Zustimmung!
  4. Ergebnis: DSGVO-Verstoß – externe Ressourcen laden unabhängig von der Zustimmung

Warum?

CCT4U ist ein Consent Manager, KEINE Netzwerk-Firewall! Es kann nicht magisch alle HTTP-Requests abfangen. Das Anlegen eines Dienstes registriert ihn nur im Zustimmungssystem – es blockiert NICHTS automatisch.

Was du TUN MUSST:

Option 1: Theme-Code anpassen (Beste Lösung)

❌ Falsch (lädt immer):

<?php
// functions.php - DSGVO-VERSTOSS!
wp_enqueue_style('google-fonts',
    'https://fonts.googleapis.com/css2?family=Roboto');
// → Lädt IMMER, auch ohne Zustimmung!

✅ Richtig (lädt nur nach Zustimmung):

<?php
// Aus functions.php entfernen!
// Stattdessen zu CCT4U → Dienste → Skripte-Tab hinzufügen:

// Skript-Code (im CCT4U Admin):
<link href="https://fonts.googleapis.com/css2?family=Roboto"
      rel="stylesheet"
      type="text/css">

Option 2: Lokal hosten (Empfohlen!)

Lade die Schriftarten herunter und hoste sie auf deinem Server:

  • ✅ Kein externer Server
  • ✅ Keine Zustimmung nötig
  • ✅ Schnelleres Laden
  • ✅ 100% DSGVO-konform

Nutze google-webfonts-helper.herokuapp.com zum Herunterladen der Fonts

Praxis-Beispiel:

Problem: Dein Astra-Theme lädt Google Fonts vom CDN

Schritte:

  1. Gehe zu WordPress Admin → Tools → CCT4U Scanner
  2. Klicke "Scan starten" → Scanner findet Google Fonts im Theme
  3. Scanner zeigt EXAKTE Position (z.B. functions.php Zeile 42)
  4. Entferne wp_enqueue_style für Google Fonts
  5. Entweder: Fonts lokal hinzufügen ODER zu CCT4U Skripten hinzufügen
  6. Test: Mit Browser-DevTools prüfen, dass Fonts nur nach Zustimmung laden

Zusammenfassung:

  • ❌ Dienst in CCT4U = KEINE automatische Blockierung
  • ✅ Dienst in CCT4U = Nur Consent-Manager-Eintrag
  • 🔧 Du MUSST deinen Theme-Code anpassen, um Zustimmung zu respektieren
  • 🔍 Nutze den CCT4U Scanner, um hartcodierte externe Ressourcen zu finden

Backend-Platzhalter für Dienste (Contextual Consent)

Was sind Backend-Platzhalter?

Beim Erstellen oder Bearbeiten eines Dienstes im Backend findest du die Option "Platzhalter anzeigen". Diese aktiviert die sogenannte "Contextual Consent"-Funktion von Klaro.

Wie funktioniert es?

Statt blockierte Inhalte einfach zu verstecken, zeigt CCT4U einen ansprechenden Platzhalter mit zwei Buttons:

  • "Ja" – Aktiviert den Dienst nur für diese Sitzung
  • "Immer" – Aktiviert den Dienst dauerhaft (speichert Zustimmung)

Sobald der Besucher auf einen der Buttons klickt, verschwindet der Platzhalter und der eigentliche Inhalt (z.B. YouTube Video, Google Maps Karte) wird geladen.

Platzhalter-Hintergrundbild (optional)

Du kannst zusätzlich ein Hintergrundbild für den Platzhalter festlegen. Das ist besonders nützlich für:

  • Google Maps: Statisches Kartenbild als Vorschau
  • YouTube Videos: Screenshot des Videos oder Thumbnail
  • Andere Dienste: Logo oder relevante Grafik
Tipp: Das Hintergrundbild wird nur sichtbar, wenn du die Option "Platzhalter anzeigen" aktiviert hast. Es erscheint hinter dem Consent-Text mit den Ja/Immer-Buttons.

Wo konfiguriere ich das?

Im WordPress-Backend unter CCT4U → Dienste:

  1. Öffne oder erstelle einen Dienst (z.B. "Google Maps")
  2. Aktiviere die Checkbox "Platzhalter anzeigen"
  3. Optional: Klicke auf "Bild auswählen" und wähle ein Hintergrundbild aus deiner Mediathek
  4. Speichere die Änderungen

Wann sollte ich Backend-Platzhalter verwenden?

Ideal für:

  • YouTube Videos und Vimeo Embeds
  • Google Maps Karten
  • Social Media Feeds (Facebook, Instagram, Twitter)
  • Externe iframes, die visuell prominent sind

Vorteil: Der Besucher sieht sofort, dass hier etwas ist und kann mit einem Klick zustimmen – ohne erst die Cookie-Einstellungen öffnen zu müssen.

Beispiel: Google Maps mit Backend-Platzhalter

Schritt 1: Dienst mit Platzhalter erstellen

  • Name: google-maps
  • Titel: "Google Maps"
  • Kategorie: "Komfort"
  • ✓ Platzhalter anzeigen aktiviert
  • Platzhalter-Hintergrundbild: Statisches Kartenbild hochladen (optional)

Schritt 2: In Seite/Beitrag einbetten

<iframe data-src="https://www.google.com/maps/embed?pb=..."
        data-name="google-maps"
        width="600"
        height="450"
        style="border:0;">
</iframe>

Was passiert:

  1. Besucher sieht Platzhalter mit Kartenbild (falls konfiguriert) und Consent-Buttons
  2. Klick auf "Ja" oder "Immer" → Karte wird sofort geladen
  3. Keine zusätzliche Konfiguration im HTML nötig – alles im Backend gesteuert!
Unterschied zu data-without-consent:
  • Backend-Platzhalter: Automatischer Klaro-Platzhalter mit Ja/Immer-Buttons. Wird im Backend konfiguriert und funktioniert automatisch für alle Elemente mit dem entsprechenden data-name.
  • data-without-consent: Manuell erstellter HTML-Inhalt, der NUR ohne Consent angezeigt wird. Für individuelle Nachrichten und komplexere Platzhalter-Designs mit voller HTML-Kontrolle.

Du kannst beide Techniken auch kombinieren: Backend-Platzhalter für die Basis-Funktionalität + data-without-consent für zusätzliche Hinweise.


2a. Manuelle Integration mit data-name

Was ist data-name?

Das data-name-Attribut verbindet HTML-Elemente (Skripte, Iframes, Bilder, etc.) mit deinen konfigurierten Diensten. Elemente werden nur geladen, wenn der Besucher dem entsprechenden Dienst zugestimmt hat.

Wichtig: Der Wert von data-name muss exakt mit dem Dienst-Namen übereinstimmen (z.B. "google-maps", "youtube", "google-analytics"). Dadurch wird die Verbindung hergestellt!

Wann verwende ich data-name?

Verwende data-name, wenn du manuell externe Inhalte in deine Seiten oder Beiträge einbetten möchtest, die eine Benutzerzustimmung erfordern:

  • YouTube Videos
  • Google Maps Einbettungen
  • Social Media Einbettungen (Facebook, Instagram, etc.)
  • Externe Skripte, die Zustimmung benötigen
  • Bilder von externen Servern

Wie verwende ich data-name in verschiedenen Elementen:

A) Skripte mit data-name

Für Skripte, die erst nach Zustimmung geladen werden sollen, verwende:

<script data-type="application/javascript"
        type="text/plain"
        data-name="google-analytics">
  // Dein JavaScript-Code hier
  console.log('Google Analytics geladen!');
</script>

Erklärung:

  • type="text/plain" - Verhindert, dass der Browser das Skript sofort ausführt
  • data-type="application/javascript" - Der tatsächliche Skript-Typ nach Zustimmung
  • data-name="google-analytics" - Entspricht deinem Dienst-Namen
Tipp: In den meisten Fällen ist es einfacher, Skripte im Tab "Skripte" zu verwalten (siehe Abschnitt 3 unten). Verwende manuelle Integration mit data-name nur, wenn du eine spezifische Platzierungskontrolle in deinem Content benötigst.

B) iframes (YouTube, Google Maps) mit data-name

Für eingebettete Inhalte, ersetze src durch data-src:

YouTube Beispiel:
<iframe data-src="https://www.youtube.com/embed/VIDEO_ID"
        data-name="youtube"
        width="560"
        height="315"
        frameborder="0"
        allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"
        allowfullscreen>
</iframe>
Google Maps Beispiel:
<iframe data-src="https://www.google.com/maps/embed?pb=YOUR_EMBED_CODE"
        data-name="google-maps"
        width="600"
        height="450"
        style="border:0;"
        allowfullscreen=""
        loading="lazy">
</iframe>

Erklärung:

  • data-src statt src - Die iframe-URL wird erst nach Zustimmung aktiviert
  • data-name="youtube" - Muss exakt mit deinem Dienst-Namen übereinstimmen

C) Bilder mit data-name

Für Bilder von externen Servern, die Zustimmung benötigen:

<img data-src="https://external-server.com/image.jpg"
     data-name="external-service"
     alt="Beschreibung"
     width="600" />

D) Div/Container-Elemente mit data-name

Für komplexe Einbettungen oder Widgets:

<div data-name="facebook-widget">
  <!-- Facebook Widget Embed-Code hier -->
</div>

Wie füge ich das in WordPress hinzu:

Gutenberg Editor (Block-Editor):

  1. Füge einen "Eigenes HTML"-Block hinzu
  2. Füge deinen Code mit data-name-Attribut ein
  3. Veröffentliche oder aktualisiere die Seite/den Beitrag

Classic Editor:

  1. Wechsle zum "Text"-Modus (nicht "Visuell")
  2. Füge deinen Code mit data-name-Attribut ein
  3. Veröffentliche oder aktualisiere die Seite/den Beitrag

Vollständige Beispiele:

Beispiel 1: Google Maps Einbettung

Schritt 1: Dienst erstellen

  • Name: google-maps
  • Titel: "Google Maps"
  • Kategorie: "Komfort"

Schritt 2: Zur Seite hinzufügen

<iframe data-src="https://www.google.com/maps/embed?pb=..."
        data-name="google-maps"
        width="600"
        height="450">
</iframe>

Beispiel 2: YouTube Video

Schritt 1: Dienst erstellen

  • Name: youtube
  • Titel: "YouTube"
  • Kategorie: "Marketing"

Schritt 2: Zur Seite hinzufügen

<iframe data-src="https://www.youtube.com/embed/dQw4w9WgXcQ"
        data-name="youtube"
        width="560"
        height="315">
</iframe>

Beispiel 3: Google Analytics Inline-Skript

Schritt 1: Dienst erstellen

  • Name: google-analytics
  • Titel: "Google Analytics"
  • Kategorie: "Statistik"

Schritt 2: Zur Seite oder Theme hinzufügen

<script data-type="application/javascript"
        type="text/plain"
        data-name="google-analytics">
  gtag('event', 'page_view', {
    'page_title': 'Homepage',
    'page_path': '/'
  });
</script>
Tipp: Teste deine Einbettungen immer! Akzeptiere die Dienst-Zustimmung und überprüfe, dass der Inhalt korrekt geladen wird. Lehne dann die Zustimmung ab und prüfe, dass der Inhalt blockiert wird.
Häufige Fehler:
  • Falsches data-name: Stelle sicher, dass es exakt mit dem Dienst-Namen übereinstimmt (Groß-/Kleinschreibung beachten!)
  • Verwendung von src statt data-src für iframes und Bilder
  • Vergessen von type="text/plain" für Skripte
  • Dienst nicht erstellt: Das data-name muss auf einen existierenden Dienst verweisen

2b. Bedingte Inhaltsanzeige mit data-without-consent

Was ist data-without-consent?

Das data-without-consent-Attribut ermöglicht es, Inhalte NUR anzuzeigen, wenn der Besucher einem Dienst NICHT zugestimmt hat. Dies ist das Gegenteil von data-name.

Verhalten:
  • Error OHNE Zustimmung → Element wird angezeigt
  • Check MIT Zustimmung → Element wird versteckt (display: none)

Wann verwende ich data-without-consent?

Verwende data-without-consent für Platzhalter, Hinweise oder alternative Inhalte, die nur erscheinen sollen, solange der Besucher KEINEN Consent gegeben hat:

  • Placeholder-Nachrichten - "Zum Anzeigen der Karte bitte zustimmen"
  • Aktivierungs-Buttons - Button zum Öffnen der Consent-Einstellungen
  • Alternative Inhalte - Statisches Bild statt eingebettetem Video
  • Hinweistexte - Information über blockierte Inhalte

Technische Details:

  • Das ursprüngliche display-Attribut des Elements wird automatisch gespeichert
  • Bei Zustimmungswiderruf wird der ursprüngliche Wert wiederhergestellt
  • Falls der Dienst nicht existiert, wird das Element angezeigt (Graceful Degradation)
  • Keine Animationen, hartes display: none bzw. display: block

Vollständige Beispiele:

Beispiel 1: YouTube Video mit Platzhalter-Nachricht

Schritt 1: Dienst erstellen

  • Name: youtube
  • Titel: "YouTube"
  • Kategorie: "Marketing"

Schritt 2: Code zur Seite hinzufügen

<!-- Nachricht wird NUR angezeigt wenn YouTube NICHT zugestimmt wurde -->
<div data-without-consent="youtube"
     style="padding: 20px;
            background: #f5f5f5;
            text-align: center;
            border-radius: 8px;">
    <p><strong>⚠️ YouTube ist derzeit deaktiviert</strong></p>
    <p>Um dieses Video anzusehen, aktiviere bitte YouTube in den Cookie-Einstellungen.</p>
    <button onclick="klaro.show()"
            style="padding: 10px 20px;
                   background: #0073aa;
                   color: white;
                   border: none;
                   border-radius: 5px;
                   cursor: pointer;">
        YouTube aktivieren
    </button>
</div>

<!-- YouTube iframe wird NUR angezeigt wenn zugestimmt wurde -->
<iframe data-src="https://www.youtube.com/embed/dQw4w9WgXcQ"
        data-name="youtube"
        width="560"
        height="315"
        frameborder="0"
        allowfullscreen>
</iframe>

Ablauf:

  1. Besucher kommt auf die Seite → Sieht Platzhalter-Nachricht
  2. Klickt auf "YouTube aktivieren" → Consent-Modal öffnet sich
  3. Gibt Zustimmung → Platzhalter verschwindet, Video wird geladen
  4. Widerruft später Zustimmung → Video verschwindet, Platzhalter erscheint wieder

Beispiel 2: Google Maps mit Platzhalter-Bild

Schritt 1: Dienst erstellen

  • Name: google-maps
  • Titel: "Google Maps"
  • Kategorie: "Komfort"

Schritt 2: Code zur Seite hinzufügen

<!-- Container für beide Varianten -->
<div style="position: relative; width: 600px; height: 450px;">

    <!-- Platzhalter-Bild - wird NUR OHNE Consent angezeigt -->
    <div data-without-consent="google-maps"
         style="width: 100%;
                height: 100%;
                background: url('/pfad/zur/karten-vorschau.jpg') center/cover;
                display: flex;
                align-items: center;
                justify-content: center;">
        <div style="background: rgba(255,255,255,0.95);
                    padding: 30px;
                    border-radius: 10px;
                    text-align: center;
                    max-width: 300px;">
            <h3>📍 Kartenansicht</h3>
            <p>Aktiviere Google Maps um die interaktive Karte zu sehen.</p>
            <button onclick="klaro.show()">Karte aktivieren</button>
        </div>
    </div>

    <!-- Echte Google Maps - wird NUR MIT Consent angezeigt -->
    <iframe data-src="https://www.google.com/maps/embed?pb=YOUR_EMBED_CODE"
            data-name="google-maps"
            width="600"
            height="450"
            style="border:0;"
            allowfullscreen>
    </iframe>

</div>

Beispiel 3: Kontextabhängiger Hinweistext

<!-- Hinweis wird NUR angezeigt wenn Google Analytics NICHT aktiv ist -->
<div data-without-consent="google-analytics"
     style="background: #e7f7ff;
            padding: 15px;
            border-left: 4px solid #00a0d2;
            margin: 20px 0;">
    <p><strong>ℹ️ Anonyme Statistiken deaktiviert</strong></p>
    <p>
        Aktuell erfassen wir keine Nutzungsstatistiken.
        Wenn du uns helfen möchtest, die Website zu verbessern,
        kannst du anonyme Statistiken aktivieren.
    </p>
    <button onclick="klaro.show()">
        Zu den Einstellungen
    </button>
</div>

Kombination von data-without-consent und data-name:

Die wahre Stärke liegt in der Kombination beider Attribute für nahtlose User Experience:

Lightbulb Tipp: Immer beide Zustände abdecken!
<!-- Container für beide Zustände -->
<div class="video-container">

    <!-- Zustand 1: OHNE Consent -->
    <div data-without-consent="youtube">
        Platzhalter-Inhalt hier
    </div>

    <!-- Zustand 2: MIT Consent -->
    <iframe data-name="youtube" data-src="..."></iframe>

</div>

So sieht der Besucher IMMER passenden Inhalt, egal ob Consent gegeben wurde oder nicht!

Warning Häufige Fehler:
  • Falscher Dienst-Name: data-without-consent muss exakt mit dem Dienst-Namen übereinstimmen (z.B. "youtube", nicht "YouTube")
  • Display-Wert vergessen: Stelle sicher, dass das Element einen sichtbaren display-Wert hat (block, flex, etc.)
  • Dienst existiert nicht: Der referenzierte Dienst muss in CCT4U konfiguriert sein
  • Inkonsistente Namen: data-name und data-without-consent müssen denselben Dienst-Namen verwenden

Test-Anleitung:

  1. Initiale Ansicht: Öffne die Seite im Inkognito-Modus → Platzhalter (data-without-consent) sollte sichtbar sein
  2. Consent geben: Öffne Consent-Modal, akzeptiere den Dienst → Platzhalter verschwindet, echter Inhalt (data-name) erscheint
  3. Consent widerrufen: Öffne Consent-Modal erneut, widerrufe Zustimmung → Echter Inhalt verschwindet, Platzhalter erscheint wieder
  4. Browser DevTools: Überprüfe im "Elements"-Tab, dass display-Werte korrekt umgeschaltet werden
Check Vorteile von data-without-consent:
  • Check Bessere User Experience - Keine leeren Bereiche auf der Seite
  • Check Transparenz - Besucher wissen, was blockiert ist
  • Check Call-to-Action - Direkte Möglichkeit zur Aktivierung
  • Check Flexibilität - Jedes HTML-Element kann verwendet werden
  • Check Reaktiv - Automatische Aktualisierung bei Consent-Änderungen

3. Skripte – Der ausführbare Code

Was sind Skripte?

Skripte sind JavaScript-Code-Schnipsel, die nur ausgeführt werden, wenn der Besucher dem entsprechenden Dienst zugestimmt hat.

Zwei Arten von Skripten:

A) Vollständige Script-Tags:
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'GA_MEASUREMENT_ID');
</script>
B) Reiner JavaScript-Code:
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'GA_MEASUREMENT_ID');

Wie füge ich Skripte hinzu:

  1. Dienst: Wähle den Dienst (z.B. "google-analytics")
  2. Position:
    • "Head Start" = Wird in <head> geladen
    • "Body End" = Wird vor </body> geladen
  3. Code: Füge deinen JavaScript-Code ein
  4. Aktiv: Aktiviere das Häkchen, um das Skript zu aktivieren
Wichtig: Skripte werden nur ausgeführt, wenn der Besucher dem Dienst zugestimmt hat!

4. Cookies – Die gespeicherten Daten

Was sind Cookies?

Cookies sind kleine Dateien, die Dienste auf dem Computer des Besuchers speichern. Du musst sie registrieren, damit das Plugin sie verwalten kann.

Cookie-Beispiele:

  • _ga (Google Analytics Session Cookie)
  • _gid (Google Analytics Besucher-ID)
  • fbp (Facebook Pixel)
  • YSC (YouTube Session)

Wie füge ich Cookies hinzu:

  1. Name: _ga (exakter Cookie-Name)
  2. Domain: .your-website.com (mit Punkt = auch Subdomains)
  3. Pfad: / (normalerweise der Root-Pfad)
  4. Dienst: Wähle den entsprechenden Dienst
  5. Ablauf: "2 Jahre" oder "Session" (für Besucher-Info)
  6. Regex: Nur aktivieren für Muster wie _ga_*

Warum Cookies registrieren, wenn Skripte blockiert werden?

Die Frage:

"Wenn ich das Google Analytics Skript korrekt blockiere, werden keine Cookies gesetzt. Warum also die Cookies registrieren?"

Die Antwort: Drei kritische Gründe

1. Lightning Zustimmungswiderruf & Cookie-Löschung

Wichtigster Grund!

Szenario:

  1. Benutzer gibt Zustimmung → GA-Skript läuft → Cookies werden gesetzt (_ga, _gid)
  2. Benutzer widerruft Zustimmung später
  3. Plugin muss die Cookies LÖSCHEN
  4. Ohne Cookie-Registrierung → Keine Löschung möglich!

Check First-Party-Cookies KÖNNEN gelöscht werden

Error Ohne Registrierung bleiben Cookies → DSGVO-Verstoß!

2. Clipboard DSGVO-Transparenzanforderungen

Rechtliche Verpflichtung!

Die DSGVO verlangt:

  • Vollständige Information über ALLE Cookies, die gesetzt werden KÖNNTEN
  • Benutzer müssen VOR der Zustimmung informiert werden
  • Cookie-Liste wird im Consent-Modal angezeigt

Beispiel im CCT4U Modal:

Google Analytics
├─ _ga (2 Jahre) - Unterscheidet Benutzer
├─ _gid (24 Stunden) - Unterscheidet Benutzer
└─ _gat (1 Minute) - Drosselt Anfragen

3. Shield Fehlerschutz & Fallback

Sicherheitsnetz!

Was wenn:

  • Skript falsch konfiguriert ist (fehlendes type="text/plain")
  • Ein anderes Plugin GA lädt (außerhalb der CCT4U-Kontrolle)
  • Server-seitiger Code Cookies setzt

Dann:

  • Check Cookie-Registrierung ermöglicht Löschversuch
  • Check Benutzer können über CCT4U-Interface entfernen

Technische Einschränkungen

Was JavaScript löschen KANN:

  • Check First-Party-Cookies (gleiche Domain)
  • Check Cookies ohne HttpOnly-Flag
  • Check Die meisten Tracking-Cookies

Was JavaScript NICHT löschen kann:

  • Error Third-Party-Cookies (andere Domain)
  • Error HttpOnly-Cookies (nur Server)
  • Error Restriktive SameSite-Cookies

Beispiel:

  • Check GA im First-Party-Modus: Löschbar
  • Error GA im Third-Party-Modus: Nicht löschbar
  • Check YouTube Embed-Cookies: Normalerweise löschbar

Best Practice

Registriere ALLE Cookies, die ein Dienst setzen KÖNNTE!

Auch wenn:

  • Das Skript korrekt blockiert ist
  • "Theoretisch" keine Cookies ohne Zustimmung gesetzt werden

Weil:

  1. Check Zustimmung kann widerrufen werden (Löschung nötig!)
  2. Check DSGVO verlangt Transparenz (Information erforderlich!)
  3. Check Fehlertoleranz (Sicherheitsnetz!)
  4. Check Zukunftssicher (Browser-Kontrollen verbessern sich)

Fokus: Prävention + Löschung

  • Primär: Skripte blockieren → Cookie-Setzung verhindern
  • Backup: Cookies registrieren → Löschung ermöglichen

5. Search External Resources Scanner - DSGVO Compliance Tool

Warning KRITISCH: JavaScript Deaktiviert = Kein Schutz!

CCT4U kann externe Ressourcen NUR blockieren, wenn:

  • Check JavaScript im Browser aktiviert ist
  • Check Externe Ressourcen über CCT4U-Skripte geladen werden

Error CCT4U kann NICHT schützen, wenn:

  • JavaScript deaktiviert ist → Plugin läuft nicht!
  • Externe Ressourcen im Theme hartcodiert sind → Laden ohne Zustimmung!

Beispiel DSGVO-Verstoß:

<?php
// In functions.php oder header.php - FALSCH!
wp_enqueue_style('google-fonts',
    'https://fonts.googleapis.com/css2?family=Roboto');

// Das lädt IMMER, auch wenn:
// - JavaScript AUS ist
// - Benutzer Zustimmung verweigert hat
// → DSGVO-VERSTOSS!

Search Was macht der Scanner?

Der External Resources Scanner durchsucht dein aktives Theme nach externen Ressourcen (Google Fonts, Google Maps, CDNs, Tracking-Skripte, etc.), die hartcodiert sind und die DSGVO verletzen könnten.

Der Scanner findet:

  • Google Fonts - fonts.googleapis.com
  • Google Maps - maps.google.com
  • YouTube - youtube.com/embed
  • Google Analytics - google-analytics.com
  • Facebook - facebook.com, connect.facebook.net
  • CDN-Skripte - cdnjs.com, jsdelivr.net
  • Font Awesome - fontawesome.com
  • Und mehr...

Wie benutze ich den Scanner:

  1. Gehe zu WordPress Admin → Tools → CCT4U Scanner
  2. Klicke auf "Scan durchführen"
  3. Überprüfe die Ergebnisse gruppiert nach Schweregrad:
    • CRITICAL - DSGVO-Verstoß sehr wahrscheinlich (Google Fonts, Maps, YouTube, Analytics)
    • WARNING - Potentielles DSGVO-Risiko (CDNs, Font Awesome)
    • INFO - Empfehlung (jQuery CDN)
  4. Befolge die Lösungen, die für jeden Fund angezeigt werden

Check Lösungen:

Option 1: Lokal hosten (BESTE Lösung!)

Google Fonts:

<?php
// Fonts herunterladen von google-webfonts-helper.herokuapp.com
// Hochladen nach /wp-content/themes/dein-theme/fonts/

function load_local_fonts() {
    wp_enqueue_style('local-fonts',
        get_stylesheet_directory_uri() . '/fonts/roboto.css'
    );
}
add_action('wp_enqueue_scripts', 'load_local_fonts');

Vorteile:

  • Check Kein externer Server
  • Check Keine Zustimmung nötig
  • Check Schnelleres Laden
  • Check Funktioniert mit JavaScript AUS

Option 2: System-Schriften verwenden

body {
    font-family: -apple-system, BlinkMacSystemFont,
                 'Segoe UI', Roboto, Oxygen, Ubuntu,
                 sans-serif;
}

Kein externes Laden, keine Zustimmung nötig, sieht auf allen Geräten gut aus!

Option 3: NUR über CCT4U-Skripte laden

Für Dienste, die extern sein MÜSSEN (Maps, YouTube, etc.):

  • ENTFERNEN aus Theme-Code
  • HINZUFÜGEN über CCT4U Admin → Skripte
  • Lädt NUR mit Zustimmung

Error WARNUNG: Das schützt NICHT, wenn JavaScript deaktiviert ist!

Wrench Beispiel: Google Fonts beheben

Error VORHER (FALSCH - DSGVO-Verstoß):

<?php
// In functions.php
function load_google_fonts() {
    wp_enqueue_style('google-fonts',
        'https://fonts.googleapis.com/css2?family=Roboto'
    );
}
add_action('wp_enqueue_scripts', 'load_google_fonts');

// Problem: Lädt IMMER, auch ohne Zustimmung!

Check NACHHER (RICHTIG - DSGVO-konform):

<?php
// Option 1: Lokal hosten
function load_local_fonts() {
    wp_enqueue_style('local-roboto',
        get_stylesheet_directory_uri() . '/fonts/roboto.css'
    );
}
add_action('wp_enqueue_scripts', 'load_local_fonts');

// Option 2: System-Schriften in CSS
body {
    font-family: -apple-system, BlinkMacSystemFont,
                 'Segoe UI', Roboto, sans-serif;
}

Check Scanner aufrufen:

WordPress Admin → Tools → CCT4U Scanner

Scanne jetzt dein Theme um DSGVO-Risiken zu finden!


6. Globe Cookie Domain Scope - Cross-Domain Consent Sharing

Star NEU in v3.0: Cross-Domain Cookie Consent!

Du kannst jetzt die Cookie-Zustimmung über mehrere WordPress-Installationen auf Subdomains hinweg teilen!

  • Check Einmalige Zustimmung für alle Subdomains
  • Check Bessere User Experience (kein doppelter Banner)
  • Check DSGVO-konform innerhalb derselben Organisation

Warning WICHTIG: Banner erscheint erneut, wenn Domains unterschiedliche Dienste haben!

Wenn deine Domains UNTERSCHIEDLICHE Dienst-Konfigurationen haben, WIRD der Cookie-Banner erneut erscheinen, wenn Benutzer auf einen neuen Dienst stoßen. Dies ist rechtlich durch die DSGVO erforderlich!

Beispiel:

  • Domain A: Nur "Notwendige Dienste"
  • Domain B: "Notwendige Dienste" + "Google Maps"
  • → Benutzer stimmt auf Domain A zu, besucht dann Domain B
  • Warning Banner erscheint ERNEUT, weil "Google Maps" Zustimmung benötigt!

Lösungen:

  • Check Dieses Verhalten akzeptieren (empfohlen, DSGVO-konform)
  • Check ODER: Identische Dienste auf ALLEN Domains verwenden (beste UX)

Target Anwendungsfall:

Du hast mehrere WordPress-Installationen auf verschiedenen Subdomains:

  • shop.deine-firma.de - Dein Online-Shop
  • blog.deine-firma.de - Dein Firmenblog
  • support.deine-firma.de - Dein Support-Portal

Problem ohne Cookie Domain Scope:

Ein Besucher navigiert von deinem Shop zum Blog → Sieht den Cookie-Banner zweimal!

  1. Besucht shop.deine-firma.de → Akzeptiert Cookies
  2. Klickt auf Blog-Link → blog.deine-firma.de zeigt Banner erneut!
  3. Sad Schlechte User Experience

Lösung mit Cookie Domain Scope:

Mit "All subdomains *.deine-firma.de" wird die Zustimmung geteilt:

  1. Besucht shop.deine-firma.de → Akzeptiert Cookies
  2. Cookie wird gesetzt für .deine-firma.de (mit führendem Punkt)
  3. Klickt auf Blog-Link → blog.deine-firma.de liest das Cookie
  4. Party Banner erscheint nicht mehr!

Gear Einrichtung:

Schritt 1: CCT4U auf allen Domains installieren

Das Plugin muss auf ALLEN WordPress-Installationen installiert sein:

  • shop.deine-firma.de → CCT4U installiert
  • blog.deine-firma.de → CCT4U installiert
  • support.deine-firma.de → CCT4U installiert

Warum? Jede Installation hat ihre eigene Datenbank und eigene Plugin-Konfiguration!

Schritt 2: Cookie Domain Scope konfigurieren

Gehe auf JEDER Installation zu: WordPress Admin → CCT4U → License/Integration

Unter "Cookie Domain Scope" wähle:

  • Red Circle This domain shop.deine-firma.de only - Cookie nur für diese Domain (Standard)
  • Green Circle All subdomains *.deine-firma.de - Cookie für alle Subdomains teilen

Wichtig: Alle Installationen müssen die GLEICHE Einstellung haben!

Lightbulb Technische Details:

Option 1: "This domain only" (Standard)

// Cookie wird gesetzt für:
Domain: shop.deine-firma.de
Path: /

// Cookie ist gültig für:
✅ shop.deine-firma.de
❌ blog.deine-firma.de (anderes Cookie nötig)
❌ support.deine-firma.de (anderes Cookie nötig)

Option 2: "All subdomains" (Sharing aktiviert)

// Cookie wird gesetzt für:
Domain: .deine-firma.de (mit führendem Punkt!)
Path: /

// Cookie ist gültig für:
✅ shop.deine-firma.de
✅ blog.deine-firma.de
✅ support.deine-firma.de
✅ www.deine-firma.de
✅ ALLE Subdomains von deine-firma.de

Balance Rechtliche Aspekte (DSGVO):

Cross-Domain Cookie Sharing ist DSGVO-konform, wenn:

  • Check Alle Domains gehören zur GLEICHEN Organisation
  • Check Die Datenschutzerklärung ist auf allen Domains verlinkt
  • Check Die Cookie-Informationen sind transparent

Nicht erlaubt: Consent zwischen verschiedenen Firmen teilen!

Wrench Test-Anleitung:

  1. Browser-Test vorbereiten:
    • Öffne ein Inkognito/Privat-Fenster
    • Drücke F12 für DevTools
    • Gehe zum Tab "Application" → "Cookies"
  2. Teste auf Domain 1:
    • Besuche shop.deine-firma.de
    • Akzeptiere die Cookie-Zustimmung
    • Prüfe in DevTools: Cookie cct_4u sollte Domain .deine-firma.de haben
  3. Teste auf Domain 2:
    • Navigiere zu blog.deine-firma.de (ohne Tab zu schließen!)
    • Banner sollte NICHT mehr erscheinen
    • Prüfe in DevTools: Das gleiche cct_4u Cookie ist vorhanden

Warning Häufige Probleme:

  • Banner erscheint trotzdem:
    • Prüfe ob CCT4U auf beiden Domains installiert ist
    • Prüfe ob beide die gleiche Version haben (3.0.0+)
    • Prüfe ob auf beiden "All subdomains" gewählt ist
  • Cookie hat falsche Domain:
    • Sollte sein: .deine-firma.de (mit Punkt)
    • Nicht: shop.deine-firma.de (ohne Punkt)
    • Cache leeren und erneut testen
  • Andere Subdomains betroffen:
    • Wenn du Subdomains hast, die NICHT betroffen sein sollen
    • Verwende dort "This domain only"
    • Oder verwende verschiedene Parent-Domains

Check Zusammenfassung:

Cookie Domain Scope ermöglicht bessere UX bei Multi-Domain WordPress-Setups!

  • Check Installiere CCT4U auf allen Domains
  • Check Wähle "All subdomains" auf allen Installationen
  • Check Teste gründlich
  • Check Bessere User Experience genießen!

Lightbulb Unterschiedliche Dienste auf verschiedenen Domains:

Was passiert, wenn deine Subdomains UNTERSCHIEDLICHE Dienste haben?

Warning Wichtig: Banner erscheint bei neuen Diensten erneut!

Szenario:

  • shop.deine-firma.de: Nur "Notwendige Dienste" (keine optionalen Dienste)
  • blog.deine-firma.de: "Notwendige Dienste" + "Google Maps" + "YouTube"

Was passiert:

  1. Benutzer besucht shop.deine-firma.de
  2. Akzeptiert Banner (nur "Notwendige Dienste")
  3. Cookie wird gesetzt: Zustimmung für "Notwendige Dienste"
  4. Benutzer klickt auf Link zum Blog → blog.deine-firma.de
  5. Warning Banner erscheint ERNEUT!

Warum?

Der Blog hat NEUE Dienste (Google Maps, YouTube), für die noch keine Zustimmung vorliegt. Klaro erkennt: "Hey, hier gibt es Dienste, die der Benutzer noch nicht gesehen hat!" und zeigt den Banner erneut.

Check Das ist KORREKTES Verhalten - DSGVO-konform!

Die DSGVO verlangt:

  • Check Benutzer müssen EXPLIZIT jedem Dienst zustimmen
  • Check Neue Dienste = Neue Zustimmung erforderlich
  • Check Cross-Domain Sharing teilt nur BESTEHENDE Zustimmungen

Beispiel:

Domain A Cookie: { necessary: true }
Domain B erwartet: { necessary: true, google-maps: ?, youtube: ? }

→ Banner muss erscheinen, weil google-maps und youtube noch nicht zugestimmt wurden!

Lightbulb Lösungen für konsistente User Experience:

Option 1: Identische Dienste überall (Empfohlen)

  • Konfiguriere die GLEICHEN Dienste auf allen Domains
  • Auch wenn eine Domain einen Dienst nicht aktiv nutzt
  • Der Dienst wird in der Liste angezeigt, lädt aber keine Skripte

Beispiel:

Alle Domains haben:
- Notwendige Dienste
- Google Analytics
- Google Maps
- YouTube

→ Shop nutzt nur Analytics (Maps/YouTube sind konfiguriert, aber keine Skripte)
→ Blog nutzt alle Dienste
→ Banner erscheint nur EINMAL auf dem Shop, gilt dann für Blog!

Option 2: Verhalten akzeptieren (Pragmatisch)

  • Akzeptiere, dass Banner bei neuen Diensten erneut erscheint
  • Ist rechtlich korrekt und DSGVO-konform
  • Kein zusätzlicher Konfigurationsaufwand

Option 3: Keine Cross-Domain Sharing (Einfachste)

  • Verwende "This domain only" statt "All subdomains"
  • Jede Domain hat eigenen Cookie und eigenen Banner
  • Funktioniert out-of-the-box, keine Überraschungen

Error Was NICHT funktioniert (rechtlich bedenklich):

Error NICHT: Banner unterdrücken, wenn Cookie existiert

  • "Wenn Cookie von anderer Domain existiert → Banner IMMER verstecken"
  • → DSGVO-Verstoß! Neue Dienste werden ohne Zustimmung geladen!

Error NICHT: Automatisch "Ja" für neue Dienste annehmen

  • "Benutzer hat Notwendig akzeptiert → Automatisch Maps aktivieren"
  • → DSGVO-Verstoß! Explizite Zustimmung fehlt!

Check Zusammenfassung:

Cookie Domain Scope funktioniert perfekt, wenn:

  • Check Alle Domains die GLEICHEN Dienste haben
  • Check Banner erscheint nur EINMAL (auf erster Domain)
  • Check Zustimmung gilt für alle Subdomains

Bei unterschiedlichen Diensten:

  • Warning Banner erscheint ERNEUT bei neuen Diensten
  • Check Das ist KORREKT und DSGVO-konform!
  • Check Nutze identische Dienst-Konfiguration für beste UX

7. Praxis-Beispiel: Google Analytics komplett einrichten

Schritt 1: Kategorie erstellen

  • Titel: "Statistik"
  • Beschreibung: "Hilft uns zu verstehen, wie unsere Website genutzt wird"

Schritt 2: Dienst anlegen

  • Name: google-analytics
  • Titel: "Google Analytics"
  • Kategorie: "Statistik"
  • Beschreibung: "Analysiert das Besucherverhalten anonym"

Schritt 3: Skript hinzufügen

  • Dienst: "google-analytics"
  • Position: "Head Start"
  • Code:
<script async src="https://www.googletagmanager.com/gtag/js?id=GA_MEASUREMENT_ID"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'GA_MEASUREMENT_ID');
</script>

Schritt 4: Cookies registrieren

Cookie 1:

  • Name: _ga
  • Dienst: "google-analytics"
  • Ablauf: "2 Jahre"

Cookie 2:

  • Name: _gid
  • Dienst: "google-analytics"
  • Ablauf: "24 Stunden"

8. Wichtige Regeln & Tipps

Check Die richtige Reihenfolge:

  1. Kategorien erstellen
  2. Dienste anlegen
  3. Skripte hinzufügen
  4. Cookies registrieren

Check Namen konsistent verwenden:

  • Dienst-Name bei Skripten: genau gleicher Name!
  • Dienst-Name bei Cookies: genau gleicher Name!

Check Testen nicht vergessen:

  • Alle Cookies ablehnen → Skripte dürfen nicht laden
  • Dienst akzeptieren → Skripte müssen funktionieren
  • Einstellungen ändern → Muss sofort wirksam werden

Error Häufige Fehler:

  • Skripte ohne zugewiesenen Dienst
  • Cookies vergessen zu registrieren
  • Falsche Cookie-Namen (müssen exakt übereinstimmen)

Wrench Debugging-Tipp:

Nutze die Browser-Entwicklertools (F12) um zu prüfen:

  • Netzwerk-Tab: Werden Skripte geladen?
  • Application Tab → Cookies: Welche Cookies sind gesetzt?
  • Console: Gibt es JavaScript-Fehler?

Das Wichtigste: Alle vier Komponenten arbeiten zusammen. Ohne richtige Verknüpfung funktioniert die Cookie-Verwaltung nicht!

DIV Test mit data-name
DIV Test mit data-without-consent