CCT4U Dokumentation
Vollständige Anleitung zur Einrichtung und Konfiguration
Überblick: Wie die Komponenten zusammenarbeiten
Stell dir das Cookie-System wie eine Hierarchie vor:
- Kategorien = Die Hauptordner (z.B. "Marketing")
- Dienste = Die konkreten Dienste in den Ordnern (z.B. "Google Analytics")
- 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:
- Titel: Z.B. "Marketing und Werbung" (frei wählbar)
- Schlüssel: Wird automatisch generiert (z.B. "marketing-und-werbung"), kann aber bei Bedarf manuell angepasst werden
- Beschreibung: "Diese Dienste helfen uns, unsere Werbung zu verbessern und dir relevante Inhalte zu zeigen."
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:
- Name:
google-analytics(technischer Name, keine Leerzeichen! – frei wählbar, aber muss eindeutig sein) - Titel: "Google Analytics" (für Besucher sichtbar – frei wählbar)
- Beschreibung: "Hilft uns zu verstehen, wie unsere Website genutzt wird" (frei wählbar)
- Kategorie: Wähle aus deinen zuvor erstellten Kategorien
⚠️ 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:
- Du legst einen "Google Fonts"-Dienst in CCT4U an
- CCT4U fügt ihn zum Cookie-Consent-Banner hinzu
- ABER: Dein Theme lädt Google Fonts TROTZDEM OHNE Zustimmung!
- 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:
Praxis-Beispiel:
Problem: Dein Astra-Theme lädt Google Fonts vom CDN
Schritte:
- Gehe zu WordPress Admin → Tools → CCT4U Scanner
- Klicke "Scan starten" → Scanner findet Google Fonts im Theme
- Scanner zeigt EXAKTE Position (z.B. functions.php Zeile 42)
- Entferne wp_enqueue_style für Google Fonts
- Entweder: Fonts lokal hinzufügen ODER zu CCT4U Skripten hinzufügen
- 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
Wo konfiguriere ich das?
Im WordPress-Backend unter CCT4U → Dienste:
- Öffne oder erstelle einen Dienst (z.B. "Google Maps")
- Aktiviere die Checkbox "Platzhalter anzeigen"
- Optional: Klicke auf "Bild auswählen" und wähle ein Hintergrundbild aus deiner Mediathek
- 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:
- Besucher sieht Platzhalter mit Kartenbild (falls konfiguriert) und Consent-Buttons
- Klick auf "Ja" oder "Immer" → Karte wird sofort geladen
- Keine zusätzliche Konfiguration im HTML nötig – alles im Backend gesteuert!
- 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.
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ührtdata-type="application/javascript"- Der tatsächliche Skript-Typ nach Zustimmungdata-name="google-analytics"- Entspricht deinem Dienst-Namen
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-srcstattsrc- Die iframe-URL wird erst nach Zustimmung aktiviertdata-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):
- Füge einen "Eigenes HTML"-Block hinzu
- Füge deinen Code mit data-name-Attribut ein
- Veröffentliche oder aktualisiere die Seite/den Beitrag
Classic Editor:
- Wechsle zum "Text"-Modus (nicht "Visuell")
- Füge deinen Code mit data-name-Attribut ein
- 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>
- 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.
OHNE Zustimmung → Element wird angezeigt
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: nonebzw.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:
- Besucher kommt auf die Seite → Sieht Platzhalter-Nachricht
- Klickt auf "YouTube aktivieren" → Consent-Modal öffnet sich
- Gibt Zustimmung → Platzhalter verschwindet, Video wird geladen
- 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:
<!-- 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!
- 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:
- Initiale Ansicht: Öffne die Seite im Inkognito-Modus → Platzhalter (data-without-consent) sollte sichtbar sein
- Consent geben: Öffne Consent-Modal, akzeptiere den Dienst → Platzhalter verschwindet, echter Inhalt (data-name) erscheint
- Consent widerrufen: Öffne Consent-Modal erneut, widerrufe Zustimmung → Echter Inhalt verschwindet, Platzhalter erscheint wieder
- Browser DevTools: Überprüfe im "Elements"-Tab, dass display-Werte korrekt umgeschaltet werden
Bessere User Experience - Keine leeren Bereiche auf der Seite
Transparenz - Besucher wissen, was blockiert ist
Call-to-Action - Direkte Möglichkeit zur Aktivierung
Flexibilität - Jedes HTML-Element kann verwendet werden
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:
- Dienst: Wähle den Dienst (z.B. "google-analytics")
- Position:
- "Head Start" = Wird in <head> geladen
- "Body End" = Wird vor </body> geladen
- Code: Füge deinen JavaScript-Code ein
- Aktiv: Aktiviere das Häkchen, um das Skript zu aktivieren
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:
- Name:
_ga(exakter Cookie-Name) - Domain:
.your-website.com(mit Punkt = auch Subdomains) - Pfad:
/(normalerweise der Root-Pfad) - Dienst: Wähle den entsprechenden Dienst
- Ablauf: "2 Jahre" oder "Session" (für Besucher-Info)
- 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.
Zustimmungswiderruf & Cookie-Löschung
Wichtigster Grund!
Szenario:
- Benutzer gibt Zustimmung → GA-Skript läuft → Cookies werden gesetzt (_ga, _gid)
- Benutzer widerruft Zustimmung später
- Plugin muss die Cookies LÖSCHEN
- Ohne Cookie-Registrierung → Keine Löschung möglich!
First-Party-Cookies KÖNNEN gelöscht werden
Ohne Registrierung bleiben Cookies → DSGVO-Verstoß!
2.
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.
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:
Cookie-Registrierung ermöglicht Löschversuch
Benutzer können über CCT4U-Interface entfernen
Technische Einschränkungen
Was JavaScript löschen KANN:
First-Party-Cookies (gleiche Domain)
Cookies ohne HttpOnly-Flag
Die meisten Tracking-Cookies
Was JavaScript NICHT löschen kann:
Third-Party-Cookies (andere Domain)
HttpOnly-Cookies (nur Server)
Restriktive SameSite-Cookies
Beispiel:
GA im First-Party-Modus: Löschbar
GA im Third-Party-Modus: Nicht löschbar
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:
Zustimmung kann widerrufen werden (Löschung nötig!)
DSGVO verlangt Transparenz (Information erforderlich!)
Fehlertoleranz (Sicherheitsnetz!)
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.
External Resources Scanner - DSGVO Compliance Tool
KRITISCH: JavaScript Deaktiviert = Kein Schutz!
CCT4U kann externe Ressourcen NUR blockieren, wenn:
JavaScript im Browser aktiviert ist
Externe Ressourcen über CCT4U-Skripte geladen werden
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!
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:
- Gehe zu WordPress Admin → Tools → CCT4U Scanner
- Klicke auf "Scan durchführen"
- Ü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)
- Befolge die Lösungen, die für jeden Fund angezeigt werden
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:
Kein externer Server
Keine Zustimmung nötig
Schnelleres Laden
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
WARNUNG: Das schützt NICHT, wenn JavaScript deaktiviert ist!
Beispiel: Google Fonts beheben
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!
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;
}
Scanner aufrufen:
WordPress Admin → Tools → CCT4U Scanner
Scanne jetzt dein Theme um DSGVO-Risiken zu finden!
6.
Cookie Domain Scope - Cross-Domain Consent Sharing
NEU in v3.0: Cross-Domain Cookie Consent!
Du kannst jetzt die Cookie-Zustimmung über mehrere WordPress-Installationen auf Subdomains hinweg teilen!
Einmalige Zustimmung für alle Subdomains
Bessere User Experience (kein doppelter Banner)
DSGVO-konform innerhalb derselben Organisation
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
Banner erscheint ERNEUT, weil "Google Maps" Zustimmung benötigt!
Lösungen:
Dieses Verhalten akzeptieren (empfohlen, DSGVO-konform)
ODER: Identische Dienste auf ALLEN Domains verwenden (beste UX)
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!
- Besucht shop.deine-firma.de → Akzeptiert Cookies
- Klickt auf Blog-Link → blog.deine-firma.de zeigt Banner erneut!
Schlechte User Experience
Lösung mit Cookie Domain Scope:
Mit "All subdomains *.deine-firma.de" wird die Zustimmung geteilt:
- Besucht shop.deine-firma.de → Akzeptiert Cookies
- Cookie wird gesetzt für .deine-firma.de (mit führendem Punkt)
- Klickt auf Blog-Link → blog.deine-firma.de liest das Cookie
Banner erscheint nicht mehr!
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:
This domain shop.deine-firma.de only - Cookie nur für diese Domain (Standard)
All subdomains *.deine-firma.de - Cookie für alle Subdomains teilen
Wichtig: Alle Installationen müssen die GLEICHE Einstellung haben!
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
Rechtliche Aspekte (DSGVO):
Cross-Domain Cookie Sharing ist DSGVO-konform, wenn:
Alle Domains gehören zur GLEICHEN Organisation
Die Datenschutzerklärung ist auf allen Domains verlinkt
Die Cookie-Informationen sind transparent
Nicht erlaubt: Consent zwischen verschiedenen Firmen teilen!
Test-Anleitung:
- Browser-Test vorbereiten:
- Öffne ein Inkognito/Privat-Fenster
- Drücke F12 für DevTools
- Gehe zum Tab "Application" → "Cookies"
- 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
- 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
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
Zusammenfassung:
Cookie Domain Scope ermöglicht bessere UX bei Multi-Domain WordPress-Setups!
Installiere CCT4U auf allen Domains
Wähle "All subdomains" auf allen Installationen
Teste gründlich
Bessere User Experience genießen!
Unterschiedliche Dienste auf verschiedenen Domains:
Was passiert, wenn deine Subdomains UNTERSCHIEDLICHE Dienste haben?
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:
- Benutzer besucht shop.deine-firma.de
- Akzeptiert Banner (nur "Notwendige Dienste")
- Cookie wird gesetzt: Zustimmung für "Notwendige Dienste"
- Benutzer klickt auf Link zum Blog → blog.deine-firma.de
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.
Das ist KORREKTES Verhalten - DSGVO-konform!
Die DSGVO verlangt:
Benutzer müssen EXPLIZIT jedem Dienst zustimmen
Neue Dienste = Neue Zustimmung erforderlich
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!
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
Was NICHT funktioniert (rechtlich bedenklich):
NICHT: Banner unterdrücken, wenn Cookie existiert
- "Wenn Cookie von anderer Domain existiert → Banner IMMER verstecken"
- → DSGVO-Verstoß! Neue Dienste werden ohne Zustimmung geladen!
NICHT: Automatisch "Ja" für neue Dienste annehmen
- "Benutzer hat Notwendig akzeptiert → Automatisch Maps aktivieren"
- → DSGVO-Verstoß! Explizite Zustimmung fehlt!
Zusammenfassung:
Cookie Domain Scope funktioniert perfekt, wenn:
Alle Domains die GLEICHEN Dienste haben
Banner erscheint nur EINMAL (auf erster Domain)
Zustimmung gilt für alle Subdomains
Bei unterschiedlichen Diensten:
Banner erscheint ERNEUT bei neuen Diensten
Das ist KORREKT und DSGVO-konform!
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
Die richtige Reihenfolge:
- Kategorien erstellen
- Dienste anlegen
- Skripte hinzufügen
- Cookies registrieren
Namen konsistent verwenden:
- Dienst-Name bei Skripten: genau gleicher Name!
- Dienst-Name bei Cookies: genau gleicher Name!
Testen nicht vergessen:
- Alle Cookies ablehnen → Skripte dürfen nicht laden
- Dienst akzeptieren → Skripte müssen funktionieren
- Einstellungen ändern → Muss sofort wirksam werden
Häufige Fehler:
- Skripte ohne zugewiesenen Dienst
- Cookies vergessen zu registrieren
- Falsche Cookie-Namen (müssen exakt übereinstimmen)
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!