- PHP 59.2%
- JavaScript 22.3%
- Twig 17.3%
- SCSS 1.2%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01N3GxdDaptEQhdqrUrJ6Fbh |
||
| .forgejo/workflows | ||
| .idea | ||
| matomo-container-backups | ||
| src | ||
| tests | ||
| .gitattributes | ||
| .gitignore | ||
| .php-cs-fixer.dist.php | ||
| AGENTS.md | ||
| CICD-Actions.md | ||
| CLAUDE.md | ||
| composer.json | ||
| Event-Testmatrix.md | ||
| LICENSE | ||
| Matomo-BOT-Tracker.md | ||
| Matomo-Installation.md | ||
| noch-zu-machen.md | ||
| phpstan.neon | ||
| phpunit.xml | ||
| Projekt.md | ||
| README.md | ||
| STATUS.md | ||
| Variable-Reference-add_payment_info.md | ||
| Variable-Reference-add_shipping_info.md | ||
| Variable-Reference-add_to_cart.md | ||
| Variable-Reference-add_to_wishlist.md | ||
| Variable-Reference-begin_checkout.md | ||
| Variable-Reference-common.md | ||
| Variable-Reference-generate_lead.md | ||
| Variable-Reference-login.md | ||
| Variable-Reference-purchase.md | ||
| Variable-Reference-remove_from_cart.md | ||
| Variable-Reference-search.md | ||
| Variable-Reference-select_item.md | ||
| Variable-Reference-select_promotion.md | ||
| Variable-Reference-sign_up.md | ||
| Variable-Reference-user_data.md | ||
| Variable-Reference-view_cart.md | ||
| Variable-Reference-view_item.md | ||
| Variable-Reference-view_item_list.md | ||
| Variable-Reference-view_promotion.md | ||
| Variable-Reference-view_search_results.md | ||
| was-noch-zu-tun-ist.md | ||
| was-wir-haben.md | ||
WSC DataLayer Plugin für Shopware 6
Shopware 6 Plugin für Google Tag Manager (GTM), Google Analytics 4 (GA4) und Matomo Tag Manager Integration mit hierarchischer Event- und Feld-Konfiguration.
Features
- 🎯 Hierarchische Feld-Verwaltung: Organisiere DataLayer-Felder wie Kategorien mit Baum-Struktur
- 🏷️ Google Tag Manager (GTM) Integration mit Server-Side Support
- 📊 Matomo Tag Manager (MTM) Integration
- 🔒 DSGVO-konform: Integrierter Hash-Filter für personenbezogene Daten
- ⚙️ Flexible Konfiguration: Platzhalter wie
{customer.email}oder{item.price}für dynamische Feldwerte - 🔄 Shopware Native Events: Nutzt Shopware 6.7.7.0+ GA4-Events
- 🎨 Pro Event konfigurierbar: Jedes Event einzeln anpassbar
- 📝 Default-Felder: Vorkonfigurierte Shopware-Standard-Felder
Installation
# Plugin ins custom/plugins Verzeichnis kopieren
cd custom/plugins
git clone <repository-url> WSCPluginSWDatalayerGA4Matomo
# Plugin installieren und aktivieren
bin/console plugin:refresh
bin/console plugin:install --activate WSCPluginSWDatalayerGA4Matomo
# Frontend neu kompilieren
bin/build-storefront.sh
# Administration neu kompilieren
./bin/build-administration.sh
# Cache leeren
bin/console cache:clear
Konfiguration
Plugin-Einstellungen
Navigiere zu: Einstellungen → System → Plugins → WSC DataLayer
1. DataLayer Settings
- Enable DataLayer: Master-Schalter für gesamte Funktionalität
- Google DataLayer: Aktiviert
window.dataLayerfür GTM/GA4 - Matomo DataLayer: Aktiviert
window._mtmfür Matomo Tag Manager - Debug Mode: Zeigt Debug-Ausgaben in der Browser-Konsole
2. Google Tag Manager
- Enable GTM: Google Tag Manager aktivieren
- GTM Container ID: z.B.
GTM-XXXXXXX - Server-Side GTM: Optional für Server-Side Tracking
- Server-Side URL: URL deines Server-Side GTM Containers
3. Matomo Tag Manager
- Enable MTM: Matomo Tag Manager aktivieren
- Matomo Server URL: z.B.
https://matomo.yourdomain.com/ - Container ID: z.B.
container_abc123
4. Cookie Consent Integration
- Cookie Consent Plugin: Wähle dein Cookie-Consent-Plugin
- Consent Category: Kategorie für Tracking-Zustimmung
- Consent Wait Time: Wartezeit auf Consent in Millisekunden (Standard: 500ms)
Event-Konfiguration
Navigiere zu: Einstellungen → WSC DataLayer Events
Hier siehst du alle verfügbaren Events:
view_item,add_to_cart,remove_from_cartbegin_checkout,add_payment_info,purchaselogin,sign_upsearch,view_item_list- uvm.
Für jedes Event kannst du:
- Eigenen Event-Namen definieren
- Felder hierarchisch organisieren
- Google/Matomo einzeln aktivieren/deaktivieren
- Custom Fields hinzufügen
Hierarchische Feld-Verwaltung
Baum-Struktur
Events organisieren ihre Felder in einer Baum-Struktur ähnlich wie Kategorien:
ecommerce
├── currency
├── value
└── items (Array)
├── item_id
├── item_name
├── price
└── quantity
Feld-Editor
Wenn du ein Event bearbeitest, siehst du:
- Links (450px): Feld-Baum mit allen Feldern
- Rechts: Feld-Editor für ausgewähltes Feld
Feld-Eigenschaften:
- Name: Feldname im DataLayer (z.B.
email,price) - Typ:
shopware: Von Shopware bereitgestellter Wertstatic: Statischer Wert
dynamic: Dynamischer Wert mit Platzhalterncalculated: Berechneter Wert
- Wert: Fester Wert oder Platzhalter in
{path}-Syntax, z.B.{customer.email} - Beschreibung: Interne Notiz
- Aktiviert: Feld im DataLayer ausgeben
- Als Event feuern: Feld als separates Event feuern (nur Root-Level)
Default-Felder vs. Custom Fields
🔒 Default-Felder (Shopware-Standard):
- Automatisch beim Plugin-Installation erstellt
- Gekennzeichnet mit Schloss-Icon 🔒
- Können nur aktiviert/deaktiviert werden
- Name, Typ und Wert sind nicht änderbar
✏️ Custom Fields:
- Vom Benutzer erstellt
- Vollständig editierbar
- Können gelöscht werden
- Hierarchisch organisierbar
Platzhalter und Hashing
Übersicht
Feldwerte werden nicht als Twig gerendert. Verwende Platzhalter in {path}-Syntax und steuere Hashing über das Feld Hash-Algorithmus im Admin.
Verfügbare Algorithmen:
sha256(Standard)sha512sha1md5
Verwendung
Basis-Syntax
{customer.email}
{customer.firstName}
{customer.defaultBillingAddress.phoneNumber}
{item.price}
{context.currency.isoCode}
Hashing
Wähle im Feld-Editor SHA-256 oder SHA-512. Der Wert wird vor dem Hashing automatisch getrimmt und kleingeschrieben.
Best Practices für DSGVO
Google Enhanced Conversions / Facebook CAPI:
Gemäß Google/Facebook-Richtlinien sollten personenbezogene Daten gehasht UND normalisiert werden:
email: {customer.email} mit Hash-Algorithmus SHA-256
first_name: {customer.firstName} mit Hash-Algorithmus SHA-256
last_name: {customer.lastName} mit Hash-Algorithmus SHA-256
phone_number: {customer.defaultBillingAddress.phoneNumber} mit Hash-Algorithmus SHA-256
city: {customer.defaultBillingAddress.city} mit Hash-Algorithmus SHA-256
postal_code: {customer.defaultBillingAddress.zipcode} mit Hash-Algorithmus SHA-256
country: {customer.defaultBillingAddress.country.iso} mit Hash-Algorithmus SHA-256
Beispiel: Login Event
user_data.email: {customer.email}, Hash-Algorithmus SHA-256
user_data.phone_number: {customer.defaultBillingAddress.phoneNumber}, Hash-Algorithmus SHA-256
user_data.city: {customer.defaultBillingAddress.city}, Hash-Algorithmus SHA-256
Resultierende DataLayer:
{
event: 'login',
method: 'email',
user_data: {
email: 'a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3', // SHA-256 von "test@example.com"
first_name: '96d9632f363564cc3032521409cf22a852f2032eec099ed5967c0d000cec607a',
last_name: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08',
phone_number: '2c6ee24b09816a6f14f95d1698b24ead40bcc53a39b7e2d2cd5c8e87e45e88cd',
city: '4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce',
postal_code: 'd4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35',
country: '3f39d5c348e5b79d06e842c114e6cc571583bbf44e4b0ebfda1a01ec05745d43'
}
}
Default-Werte für Login/Sign-Up Events
Das Plugin erstellt automatisch user_data Felder mit Feld-basiertem Hashing für login und sign_up Events:
- ✅
email:{customer.email}, Hash-AlgorithmusSHA-256 - ✅
first_name:{customer.firstName}, Hash-AlgorithmusSHA-256 - ✅
last_name:{customer.lastName}, Hash-AlgorithmusSHA-256 - ✅
phone_number:{customer.defaultBillingAddress.phoneNumber}, Hash-AlgorithmusSHA-256 - ✅
city:{customer.defaultBillingAddress.city}, Hash-AlgorithmusSHA-256 - ✅
postal_code:{customer.defaultBillingAddress.zipcode}, Hash-AlgorithmusSHA-256 - ✅
country:{customer.defaultBillingAddress.country.iso}, Hash-AlgorithmusSHA-256
Diese Felder können:
- ✅ Aktiviert/Deaktiviert werden
- ❌ Nicht in Name/Typ/Wert geändert werden (Shopware-Standard)
Für andere Felder:
- Du kannst eigene Custom Fields erstellen
- Hash-Algorithmus nach Bedarf setzen oder entfernen
- Verschiedene Algorithmen verwenden
Verfügbare Platzhalter
Je nach Event stehen dir verschiedene Variablen zur Verfügung:
E-Commerce Events
{currency} # EUR, USD, etc.
{value} # Gesamtwert
{tax} # Steuern
{shipping} # Versandkosten
{coupon} # Gutscheincode
{transaction_id} # Bestellnummer
{affiliation} # Shop-Name
# In items-Array
{item.id} # Produkt-ID
{item.label} # Produktname
{item.manufacturer.name}# Marke
{item.category} # Kategorie
{item.price} # Preis
{item.quantity} # Menge
User Events (login, sign_up)
{customer.email}
{customer.firstName}
{customer.lastName}
{customer.customerNumber}
{customer.defaultBillingAddress.phoneNumber}
{customer.defaultBillingAddress.street}
{customer.defaultBillingAddress.city}
{customer.defaultBillingAddress.zipcode}
{customer.defaultBillingAddress.country.iso}
{customer.defaultBillingAddress.country.name}
Search Event
{search_term} # Suchbegriff
Shopware Native Events
Shopware 6.7.7.0+ bietet native GA4-Events:
Automatisch von Shopware gepusht:
- ✅
add_to_cart(Produkt in Warenkorb) - ✅
remove_from_cart(Produkt aus Warenkorb) - ✅
view_item(Produktseite) - ✅
view_cart(Warenkorb anzeigen) - ✅
begin_checkout(Checkout starten) - ✅
add_shipping_info(Versandart wählen) - ✅
add_payment_info(Zahlungsart wählen) - ✅
purchase(Bestellung abschließen) - ✅
add_to_wishlist(Zur Wunschliste) - ✅
remove_from_wishlist(Von Wunschliste entfernen)
Zusätzlich vom Plugin:
- 🔸
view_item_list(Kategorie/Listing) - 🔸
view_search_results(Suchfunktion) - 🔸
login(Benutzer-Login) - 🔸
sign_up(Registrierung) - 🔸
select_item(Produktklick im Listing) - 🔸
select_promotion(Promotion-Klick) - 🔸
view_promotion(Promotion-View)
Debugging
Browser-Konsole
Aktiviere Debug Mode in den Plugin-Einstellungen.
Ausgabe:
[WSC DataLayer] GTM loaded: GTM-XXXXXXX
[WSC DataLayer] Matomo Tag Manager loaded: container_abc123
[WSC DataLayer] Event pushed: view_item_list
{
event: 'view_item_list',
ecommerce: {
currency: 'EUR',
value: 29.99,
items: [...]
}
}
Google Tag Manager Preview
- GTM Container öffnen
- Preview Klicken
- Shop-URL eingeben
- Events im Tag Assistant prüfen
DataLayer-Inspektion
Browser-Konsole:
// Google DataLayer
console.log(window.dataLayer);
// Matomo DataLayer
console.log(window._mtm);
// Letztes Event
console.log(window.dataLayer[window.dataLayer.length - 1]);
Migration von älteren Versionen
Von globalem Hash-Switch zu Feld-basiertem Hashing
Alt (bis v1.x):
- Globaler Switch: "Benutzerdaten hashen (SHA-256)"
- Alle User-Daten automatisch gehasht
Neu (ab v2.x):
- Hash-Algorithmus pro Feld konfigurierbar
- Default-Felder bereits mit SHA-256 konfiguriert
- Flexibler: Nur gewünschte Felder hashen
Keine Aktion erforderlich: Default-Felder für login/sign_up sind bereits mit SHA-256 vorkonfiguriert.
Support & Entwicklung
Logs
Fehler prüfen:
# Shopware Logs
tail -f var/log/dev.log
tail -f var/log/prod.log
# Plugin-spezifische Logs
grep "WSC\|DataLayer" var/log/dev.log
Cache leeren
Nach Änderungen an Feldern:
bin/console cache:clear
Frontend neu kompilieren
Nach Template-Änderungen:
bin/build-storefront.sh
Administration neu kompilieren
Nach Admin-Änderungen:
./bin/build-administration.sh
bin/console cache:clear
Lizenz
Copyright (C) 2026 Christian Säum – web-seo-consulting.eu
Dieses Projekt steht unter der GNU General Public License, Version 3 oder
(nach deiner Wahl) einer späteren Version (GPL-3.0-or-later). Der
vollständige Lizenztext steht in der Datei LICENSE.
Du darfst die Software nutzen, weitergeben und – auch kommerziell – verkaufen.
Gibst du eine veränderte Fassung weiter, muss deren Quellcode ebenfalls unter
der GPL-3.0-or-later verfügbar sein. Der Copyright-Hinweis und die Nennung
des ursprünglichen Autors dürfen nicht entfernt werden.
Support
Bei Fragen oder Problemen:
- 📧 E-Mail: support@example.com
- 🌐 Website: https://example.com
Version: 2.0.0 Shopware Kompatibilität: 6.7.7.0+ PHP: 8.1+