PrivacyWire - ProcessWire Modul: Unterschied zwischen den Versionen

Aus Wikizone
Wechseln zu: Navigation, Suche
 
(15 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 5: Zeile 5:
  
 
== Quickstart Cookie Consent für ProcessWire ==
 
== Quickstart Cookie Consent für ProcessWire ==
* Modul installieren (PrivacyWire)
+
* Modul '''installieren''' (PrivacyWire)
* In der Konfiguration Labels übersetzen
+
* In der Konfiguration '''Labels übersetzen'''
* Benötigte Ketegorien auswählen
+
* Benötigte '''Kategorien auswählen'''
 
** Zuordnung der Kategorien funktioniert über data-category Attribut.
 
** Zuordnung der Kategorien funktioniert über data-category Attribut.
* Skripte anpassen
+
* '''Externe Skripte''' anpassen
 
** type bei skripten mit text/plain (wird bei consent durch javascript ersetzt)
 
** type bei skripten mit text/plain (wird bei consent durch javascript ersetzt)
 
** src durch data-src ersetzen
 
** src durch data-src ersetzen
Zeile 15: Zeile 15:
 
** Normale Skripte: type="text/plain" data-type="text/javascript" data-category="marketing"
 
** Normale Skripte: type="text/plain" data-type="text/javascript" data-category="marketing"
 
** Externe Skripte: data-src="..."
 
** Externe Skripte: data-src="..."
 +
* '''Banner''' anpassen
 +
* '''Link zu Cookie Einstellungen'''
 +
* Google Consent V2 Skript
 +
 +
== Externe Skripte anpassen ==
 
Beispiele:
 
Beispiele:
 
  <script type="text/plain" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script>
 
  <script type="text/plain" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script>
Zeile 29: Zeile 34:
 
</pre>
 
</pre>
  
== Cookie Options anzeigen ==
+
== Link zu Cookie Einstellungen anzeigen ==
 
So gibst du einen Link aus mit dem der User die Cookie Einstellungen erneut setzen kann.
 
So gibst du einen Link aus mit dem der User die Cookie Einstellungen erneut setzen kann.
 +
=== Möglichkeit 1 - Textformatter ===
 +
Den Textformatter der mit PrivacyWire im Editor einbinden und dann den passenden Tag setzen:
 
<pre>
 
<pre>
[[privacywire-choose-cookies]] - Mit Textformatter
+
[[privacywire-choose-cookies]]
 +
</pre>
  
<a href="#" class="privacywire-show-options">Show Cookie Options</a> - als Link
+
=== Möglichkeit 2 - HTML Code ===
<button class="privacywire-show-options">Show Cookie Options</button> - als Button
+
<syntaxhighlight lang="html5">
</pre>
+
<a href="#" class="privacywire-show-options">Show Cookie Options</a> <!-- als Link -->
 +
<button class="privacywire-show-options">Show Cookie Options</button> <!-- als Button -->
 +
</syntaxhighlight>
  
 
== CSS ==
 
== CSS ==
Zeile 211: Zeile 221:
  
 
== PrivacyWire - Lokalisieren ==
 
== PrivacyWire - Lokalisieren ==
Dateien übersetzen oder in Einstellungen von Hand übersetzen. Siehe Webmynet Cloud, da gibt es CSV Dateien mit fertigen Übersetzungen zum Hochladen. De.utsch muss als Defaultsprache festgelegt sein.
+
Dateien übersetzen oder in Einstellungen von Hand übersetzen. Siehe Webmynet Cloud, da gibt es CSV Dateien mit fertigen Übersetzungen zum Hochladen. Deutsch muss als Defaultsprache festgelegt sein.
  
 
=== Übersetzung wird nicht angezeigt ===
 
=== Übersetzung wird nicht angezeigt ===
Zeile 218: Zeile 228:
  
 
== Google Consent v2 ==
 
== Google Consent v2 ==
Mit Google Consent v2 möchte Google Datenschutzkonform werden. Google Consent v2 verlangt, dass der Google Tagmanager sogenannte Signals an Google schickt, je nachdem welche Optionen der User ausgewählt hat. Dementsprechend verspricht Google sich and die Datenschutzvorgaben zu halten.
+
=== Links ===
Aus sicht des Datenschützers fragwürdig aber typisch Google. Es löst zumindest das Problem, dass man oft nicht weiß, zu welchem Zweck der GTag gerade verwendet wird.
+
[[Google Consent Mode v2]]
  
=== Einwilligungsmode ===
+
=== Integration und Implementierung ===
https://support.google.com/google-ads/answer/10000067?hl=de
 
Wenn man nicht wollte das Google einen Trackt musste man in seinem Google Konto dieses deaktivieren. Das ist eigentlich nicht DSGVO Konform. In V2 löst Google das anders. Die Idee ist, dass eine Website basierend auf den Cookie Banner Einstellungen Google informiert was die Wünsche des Users sind.
 
  
Es gibt zwei Modi:
+
'''Einfügen des Tags'''
  
'''Einfacher Einwilligungsmodus''' - das ist wie ein funktionierender Cookie Banner. Google bekommt nichts mit wenn jemand nicht einwilligt.
+
Der Google Consent Mode Tag muss in den Quellcode der Website eingebunden werden, vorzugsweise im Header.
  
'''Erweiterter Modus''' - Google bekommt den Ping mit, überträgt aber (hoffentlich) keine Daten bis der User zugestimmt hat.
+
'''Einwilligungszustände festlegen'''
  
=== Basics zum neuen Consent V2 ===
+
Festlegung der Einwilligungszustände (z. B. granted oder denied) für verschiedene Cookie-Typen.
https://support.google.com/tagmanager/answer/13695607?hl=de (Änderungen beim Consent erklärt)
 
Im wesentlichen kommen Parameter dazu, mit denen man den Datenschutz steuern kann:
 
https://support.google.com/tagmanager/answer/13802165
 
Im Link oben steht was man Einstellen kann und was man beachten sollte.
 
  
=== Consent für Google einrichten ===
+
'''Konfiguration der Tags'''
Google schlägt vor man solle eine CMP (consent management platform) nutzen. Also Cookie Bot o.ä. Allerdings verlangen diese mittlerweile um die 8 Euro aufwärts pro Monat. Es gibt aber auch die Möglichkeit selbst eine Lösung zu bauen.
 
  
  https://developers.google.com/tag-platform/tag-manager/templates/consent-apis?hl=de
+
Konfiguration der Google-Tags (z. B. Google Analytics, Google Ads), um das Verhalten basierend auf den Einwilligungszuständen zu steuern.
  
=== Lösung 1: Template für Google Tag Manager ===
+
Hier ein Beispiel, wie der Code für den Consent Mode aussehen könnte.
Googles vorgeschlagener Weg ist es Code über den Google Tagmanager einzuschleusen. Dafür soll man ein sog. Template im Google Tagmanager einrichten:
 
https://developers.google.com/tag-platform/tag-manager/templates/consent-apis?hl=de
 
  
Man kann als Developer solche Templates auch der Community zur Verfügung stellen:
+
Der Code für das Integrieren kommt so von Google:
https://developers.google.com/tag-platform/tag-manager/templates/gallery?hl=de
 
==== Allgemeines Vorgehen zur Template Erstellung ====
 
* Neue '''Vorlage''' im Tagmanager anlegen
 
* '''Default''' Settings werden festgelegt (deny für alles)
 
* '''Implementierungscode''' eingeben. Im Link oben gibt es ein Beispiel das darauf beruht, dass es Cookies gibt die ausgelesen werden können. Um diese zu setzen könnte man in PrivacyWire z.B. Cookies mit einer Custom Funktion passend setzen.
 
* Der Code läuft in einer Google Sandbox, deshalb muss man ihm explizit '''Rechte zum Cookie lesen etc.''' zuweisen.
 
* Google schlägt vor noch '''Unit Tests''' für den Code zu erstellen. Link wie das geht ist in der Beschreibung von Google.
 
* Um die '''Vorlage einzubauen''' gibt es noch einen Codeschnipsel, der einen EventListener Callback enthält, der auf einen Consent Change wartet.
 
* Zu guter letzt veranlasst man sein eigenes Banner bei einem Wechsel der Optionen '''updateConsentState''' aufzurufen. Man muss allerdings aufpassen, dass die Funktion auch schon geladen ist. Google schlägt vor erstmal 500ms zu warten.
 
  
 +
<syntaxhighlight lang="javascript">
  
 +
<!-- Google tag (gtag.js) -->
 +
<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());
  
=== Lösung 2: Eigner Code auf der Webseite ===
+
  gtag('config', 'GA_MEASUREMENT_ID');
Todo
+
</script>
 +
</syntaxhighlight>
 +
 
 +
Wir können beim laden der Webseite Default Einstellungen mitgeben:
 +
 
 +
<syntaxhighlight lang="javascript">
 +
 
 +
// Einfügen des gtag.js-Tags mit Unterstützung für Consent Mode
 +
<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('consent', 'default', {
 +
    'ad_storage': 'denied',
 +
    'analytics_storage': 'denied'
 +
    'ad_user_data': 'denied',
 +
    'ad_personalization': 'denied',
 +
    'wait_for_update': 2000 // milliseconds to wait for update
 +
  });
 +
 
 +
  gtag('js', new Date());
 +
  gtag('config', 'GA_MEASUREMENT_ID');
 +
</script>
 +
</syntaxhighlight>
 +
 
 +
Wenn sich die Einwilligungspräferenzen des Nutzers ändern, kann der Code dynamisch angepasst werden:
 +
 
 +
<syntaxhighlight lang="javascript">
 +
// Aktualisieren der Einwilligungspräferenzen basierend auf Nutzerentscheidung
 +
gtag('consent', 'update', {
 +
  'ad_storage': 'granted',
 +
  'analytics_storage': 'granted'
 +
});
 +
</syntaxhighlight>
  
 
=== Google Tag mit PrivacyWire ===
 
=== Google Tag mit PrivacyWire ===
 +
Wir benötigen einen Weg damit PrivacyWire die oben gezeigte Einwilligungsänderung steuern kann.
 +
 +
Allgemein müssen wir folgendes realsieren:
 +
 
# Google Tag integrieren (mit v2 Option)
 
# Google Tag integrieren (mit v2 Option)
 
# Google Tag NICHT mit PrivacyWire aussperren
 
# Google Tag NICHT mit PrivacyWire aussperren
Zeile 271: Zeile 307:
 
# Google Tag defaultmäßig auf keine Cookies erlaubt stellen.
 
# Google Tag defaultmäßig auf keine Cookies erlaubt stellen.
  
== PrivacyWire - in depth ==
+
=== Implementierung in PrivacyWire - in depth ===
'''Einige hilfreiche Details.'''
+
Das Wichtigste:
 +
* PrivacyWire kann eine Funktion aufrufen, nachdem es die User Preferences aktualisiert hat. Du trägst den Namen dieser Funktion einfach in der Konfiguration ein. Z.b. updateConsentFromPrivacyWire.
 +
* Diese Funktion trägst du z.B. zusätzlich zum Google GTAG Code im Header ein.
 +
* PrivacyWire legt die Usereinstellungen im LocalStorage ab. Dort kann sich die neue Funktion die Einstellungen holen und an Google weiterreichen.
 +
Sonst:
 +
* Im localStorage wird der Schlüssel privacyWire angelegt und ein JSON Objekt mit den Usereinstellungen abgelegt. Der alte Schlüssel wird gelöscht.
 +
privacywire:"{"version":1,"cookieGroups":{"necessary":true,"functional":false,"statistics":true,"marketing":false,"external_media":false}}"
 +
* Danach wird der Banner ausgeblendet und die Bestätigung angezeigt. Dann wird der Code der betroffenen Skripte etc. upgedatet. Am Ende wird eine Custom Funktion aufgerufen die man selbst erstellen kann.
 +
* Es gibt den Parameter silent=false der wohl an die custom Function mit übergeben wird. Bedeutung habe ich noch nicht recherchiert.
 +
 
 +
=== Komplettes Beispiel PrivacyWire und Google Consent v2 ===
 +
Trage in der Konfiguration von PrivacyWire die Funktion '''updateConsentFromPrivacyWire''' ein.
 +
 
 +
Hier folgt der Code für
 +
* Google Tag Manager (kannst du auch auf der Google Tag Manager Seite kopieren)
 +
* Google Consent V2 + Default Settings
 +
* Update Funktion die von PrivacyWire aufgerufen wird und die neuen Preferences an Google sendet.
 +
 
 +
<syntaxhighlight lang="html5">
 +
<!-- Google Tag Manager -->
 +
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
 +
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
 +
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
 +
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
 +
})(window,document,'script','dataLayer','GTM-ID-HERE');</script>
 +
<!-- End Google Tag Manager -->
 +
 
 +
<!-- GOOGLE CONSENT V2 -->
 +
<script async src="https://www.googletagmanager.com/gtag/js?id=GTM-ID-HERE"></script>
 +
<script>
 +
  window.dataLayer = window.dataLayer || [];
 +
  function gtag(){dataLayer.push(arguments);}
 +
  gtag('consent', 'default', {
 +
    'ad_storage': 'denied',
 +
    'analytics_storage': 'denied',
 +
    'ad_user_data': 'denied',
 +
    'ad_personalization': 'denied',
 +
    'wait_for_update': 2000 // milliseconds to wait for update
 +
  });
 +
 
 +
  gtag('js', new Date());
 +
  gtag('config', 'GTM-ID-HERE');
 +
</script>
 +
<!-- End GOOGLE CONSENT V2 -->
  
'''saveConsent(silent = false) Funktion'''
+
<!-- Update user preferences -->
 +
<script>
  
Im localStorage wird der Schlüssel privacyWire angelegt und ein JSON Objekt mit den Usereinstellungen abgelegt. Der alte Schlüssel wird gelöscht.
+
function updateConsentFromPrivacyWire() {
privacywire:"{"version":1,"cookieGroups":{"necessary":true,"functional":false,"statistics":true,"marketing":false,"external_media":false}}"
+
  console.log('update consent from privacy wire...');
 +
  const privacyWireData = localStorage.getItem('privacywire');
 +
  if (privacyWireData) {
 +
    try {
 +
      const consentData = JSON.parse(privacyWireData);
 +
      const consentPreferences = {
 +
        'ad_storage': consentData.cookieGroups.marketing ? 'granted' : 'denied',
 +
        'analytics_storage': consentData.cookieGroups.statistics ? 'granted' : 'denied',
 +
        'ad_user_data': consentData.cookieGroups.marketing ? 'granted' : 'denied',
 +
        'ad_personalization': consentData.cookieGroups.marketing ? 'granted' : 'denied'
 +
      };
 +
     
 +
      // Update gogle consent
 +
      gtag('consent', 'update', consentPreferences);
 +
      console.log(consentPreferences);
 +
    } catch (e) {
 +
      console.error('Error parsing PrivacyWire-Data:', e);
 +
    }
 +
  } else {
 +
    console.warn('No PrivacyWire-Data found in localStorage');
 +
  }
 +
}
 +
// Update consent at pageload
 +
document.addEventListener('DOMContentLoaded', updateConsentFromPrivacyWire);
 +
</script>
 +
</syntaxhighlight>
 +
 
 +
=== Testen der Implementierung ===
 +
Über tagassistant.google.com
 +
 
 +
Sollte etwa so ausschauen:
 +
[[Datei:Google Tagassistant 1.png|gerahmt|links|Testen der Google Consent V2 Einstellung]]
 +
 
 +
=== Analytics und Conversions ===
 +
==== Analytics ====
 +
Google Analytics Tag im GTM erstellen
 +
 
 +
    Gehe zu deinem Google Tag Manager Konto und öffne den entsprechenden Container.
 +
    Erstelle ein neues Tag:
 +
        Klicke auf "Tags" im linken Menü.
 +
        Klicke auf "Neu" und gib dem Tag einen Namen (z. B. "Google Analytics - Universal Analytics").
 +
    Tag-Typ auswählen:
 +
        Klicke auf "Tag-Konfiguration" und wähle "Google Analytics: Universal Analytics" aus.
 +
    Tracking-Typ auswählen:
 +
        Wähle "Seitenaufruf" als Tracking-Typ.
 +
    Google Analytics Einstellungen konfigurieren:
 +
        Klicke auf "Neue Variable" unter "Google Analytics-Einstellungen" und erstelle eine neue Variable für deine Google Analytics ID (z. B. "GA-XXXXXX").
 +
        Gib deine Google Analytics Tracking-ID ein (UA-XXXXXX-Y).
 +
        Speichere die Variable.
 +
    Trigger hinzufügen:
 +
        Klicke auf "Triggering" und wähle "All Pages" (Alle Seiten) aus.
 +
    Tag speichern:
 +
        Speichere das Tag und veröffentliche die Änderungen im GTM.
 +
==== Conversions ====
 +
'''Werden die Tags für das Conversion Tracking auch über den GTM ausgespielt?'''
 +
 
 +
ChatGPT
 +
 
 +
Ja, auch die Tags für das Conversion Tracking können (und sollten) über den Google Tag Manager (GTM) verwaltet werden. Das hat den Vorteil, dass du alle deine Tags zentral an einem Ort verwalten und flexibel auf Einwilligungen reagieren kannst.
 +
Einrichten von Conversion Tracking im Google Tag Manager
 +
 
 +
Hier sind die Schritte, um Conversion Tracking Tags im GTM einzurichten:
 +
1. Conversion Tracking Tag im GTM erstellen
 +
 
 +
    Öffne dein Google Tag Manager Konto und wähle den entsprechenden Container.
 +
    Erstelle ein neues Tag:
 +
        Klicke auf "Tags" im linken Menü.
 +
        Klicke auf "Neu" und gib dem Tag einen Namen (z. B. "Google Ads Conversion Tracking").
 +
    Tag-Typ auswählen:
 +
        Klicke auf "Tag-Konfiguration" und wähle den entsprechenden Tag-Typ aus, z. B. "Google Ads Conversion Tracking".
 +
    Conversion ID und Conversion Label eingeben:
 +
        Gib die Conversion ID und das Conversion Label ein, die du von deinem Google Ads Konto erhalten hast.
 +
 
 +
2. Conversion Tracking Trigger hinzufügen
 +
 
 +
    Trigger hinzufügen:
 +
        Klicke auf "Triggering" und wähle einen passenden Trigger aus, z. B. "Page View" für alle Seitenaufrufe oder einen benutzerdefinierten Trigger für spezifische Conversion-Ereignisse.
 +
        Du kannst benutzerdefinierte Trigger für spezifische Conversion-Aktionen wie Formulareinsendungen oder Käufe erstellen.
 +
 
 +
3. Google Consent Mode und PrivacyWire Einbindung
 +
 
 +
Stelle sicher, dass du den Google Consent Mode und die PrivacyWire Einbindung gemäß den Einwilligungen der Nutzer aktualisierst.
 +
 
 +
 
 +
Einrichten von Conversion Tracking im GTM
 +
1. Gehe zu deinem GTM-Konto und erstelle ein neues Tag für Conversion Tracking.
 +
 
 +
    Klicke auf "Tags" und dann auf "Neu".
 +
    Wähle "Google Ads Conversion Tracking" als Tag-Typ.
 +
    Gib deine Conversion ID und dein Conversion Label ein.
 +
 
 +
2. Erstelle den Trigger für das Conversion Tracking.
 +
 
 +
    Klicke auf "Trigger" und dann auf "Neu".
 +
    Wähle einen Trigger-Typ aus, z. B. "Page View" oder einen benutzerdefinierten Trigger für spezifische Aktionen.
 +
 
 +
3. Füge den Trigger zum Conversion Tracking Tag hinzu.
 +
 
 +
    Verknüpfe den Trigger mit deinem Conversion Tracking Tag.
 +
 
 +
4. Veröffentliche die Änderungen im GTM.
 +
 
 +
    Klicke auf "Senden" und dann auf "Veröffentlichen", um die Änderungen zu aktivieren.
  
Danach wird der Banner ausgeblendet und die Bestätigung angezeigt. Dann wird der Code der betroffenen Skripte etc. upgedatet. Am Ende wird eine Custom Funktion aufgerufen die man selbst erstellen kann.
+
Mit dieser Konfiguration werden alle Tags, einschließlich der Conversion Tracking Tags, über den Google Tag Manager verwaltet und basierend auf den Einwilligungen der Nutzer korrekt ausgelöst.

Aktuelle Version vom 28. November 2024, 18:28 Uhr

Modul zum Anzeigen eines Cookie Banners und zum Blockieren von Skripten, Externen Medien etc. Das Modul passt das HTML an

Links[Bearbeiten]

https://processwire.com/modules/privacy-wire/
https://processwire.com/talk/topic/23118-privacywire-cookie-management-async-external-asset-loading/

Quickstart Cookie Consent für ProcessWire[Bearbeiten]

  • Modul installieren (PrivacyWire)
  • In der Konfiguration Labels übersetzen
  • Benötigte Kategorien auswählen
    • Zuordnung der Kategorien funktioniert über data-category Attribut.
  • Externe Skripte anpassen
    • type bei skripten mit text/plain (wird bei consent durch javascript ersetzt)
    • src durch data-src ersetzen
    • data-category hinzufügen
    • Normale Skripte: type="text/plain" data-type="text/javascript" data-category="marketing"
    • Externe Skripte: data-src="..."
  • Banner anpassen
  • Link zu Cookie Einstellungen
  • Google Consent V2 Skript

Externe Skripte anpassen[Bearbeiten]

Beispiele:

<script type="text/plain" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script>
<script type="text/plain" data-type="text/javascript" data-category="marketing" data-src="/path/to/your/marketing/script.js"></script>
<script type="text/plain" data-type="text/javascript" data-category="external_media" data-src="/path/to/your/external-media/script.js">  </script>
<script type="text/plain" data-type="text/javascript" data-category="marketing">console.log("Inline scripts are also working!");</script>
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async type="text/plain" data-type="text/javascript" data-category="marketing" data-src="https://www.googletagmanager.com/gtag/js?id=G-DQPX4V13MY"></script>
<script type="text/plain" data-type="text/javascript" data-category="marketing">
window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', 'G-DQPX4V13MY');
</script>

Link zu Cookie Einstellungen anzeigen[Bearbeiten]

So gibst du einen Link aus mit dem der User die Cookie Einstellungen erneut setzen kann.

Möglichkeit 1 - Textformatter[Bearbeiten]

Den Textformatter der mit PrivacyWire im Editor einbinden und dann den passenden Tag setzen:

 [[privacywire-choose-cookies]]

Möglichkeit 2 - HTML Code[Bearbeiten]

<a href="#" class="privacywire-show-options">Show Cookie Options</a> <!-- als Link -->
<button class="privacywire-show-options">Show Cookie Options</button> <!-- als Button -->

CSS[Bearbeiten]

Hinweis: Zusätzliche Styles. Standardstyles müssen eingebunden sein.

.pricacywire,
.privacywire-banner,
.privacywire-options,
.privacywire-message{
    background-color: #009999 !important;
}
.pricacywire a,
.privacywire-banner a,
.privacywire-options a{
    color: #fff !important;
}
.pricacywire,
.privacywire-banner,
.privacywire-options,
.privacywire-message{ 
    background-color: #0e71b1 !important;
    color: #fff;
}
.pricacywire a,
.privacywire-banner a,
.privacywire-options a{
    color: #fff !important;
}
.privacywire button{
    cursor: pointer;
}
.privacywire input{
    position: relative;
    opacity: 1;
    margin-right: 0.5em;
    color: #fff;
    opacity: 1;
}
.privacywire label{
    color: #fff;;
}

Betonter Accept Button / bessere Abstände / saubere Buttons:

.privacywire{
    padding: 2em !important;
}
.pricacywire,
.privacywire-banner,
.privacywire-options,
.privacywire-message{ 
    background-color: #17428b !important;
    color: #fff;
}
.pricacywire a,
.privacywire-banner a,
.privacywire-options a{
    color: #fff !important;
}
.privacywire ul{
    list-style-type: none;
}
.privacywire input{
    position: relative;
    opacity: 1;
    margin-right: 0.5em;
    color: #fff;
    opacity: 1;
}
.privacywire label{
    color: #fff;;
}
.privacywire-page-links{
    margin-top: 0.5rem;
}
.privacywire button{
    background: #b3b3b3;
    color: #fff;
    font-weight: normal;
    border: none;
    padding: 12px;
    border-radius: 0px;
    cursor: pointer;
    text-transform: uppercase;
}
.privacywire button.allow-all{
    background: #3fa535;
    border-color: #3fa535;
    color: #fff;
}

SCSS Beispiel

// Privacy Banner
$privacywire-bg-color:#d0c5b8;
$privacywire-text-color: #000;
$privacywire-button-text-color: #fff;
$privacywire-button-allow-text-color: #fff;
$privacywire-button-bg-color: #b3b3b3;
$privacywire-button-allow-bg-color: #3fa535;
#privacywire-wrapper{
	ul{
		list-style-type: none;
	}
	input{
		position: relative;
		opacity: 1;
		margin-right: 0.5em;
		color: $privacywire-text-color;
		opacity: 1;
	}
	label{
		color: $privacywire-text-color;;
	}
	.privacywire{
		z-index: 999!important;
		padding: 2em !important;
	}
	.privacywire-banner,
	.privacywire-options,
	.privacywire-message{ 
		background-color: $privacywire-bg-color !important;
		color: $privacywire-text-color;
		a{
			color: $privacywire-text-color !important;
		}
		button{
			background: $privacywire-button-bg-color;
			color: $privacywire-button-text-color;
			font-weight: normal;
			border: none;
			padding: 12px;
			border-radius: 0px;
			cursor: pointer;
			text-transform: uppercase;
			&.allow-all{
				background: $privacywire-button-allow-bg-color;
				border-color: $privacywire-button-allow-bg-color;
				color: $privacywire-button-allow-text-color;
			}
		}

	}
	.privacywire-page-links{
		margin-top: 0.5rem;
	}
}

Video Embed Opt-In[Bearbeiten]

Im VideoEmbed Plugin kann man die Kategorie auswählen (z.B. external Media)

Bsp. iFrame mit eigenem Opt Out[Bearbeiten]

Mit dem Attribut data-ask-consent="1" kann man auch einzelne Elemente freigeben.

<iframe data-src="https://processwire.com/" data-category="marketing" data-ask-consent="1" class="require-consent" frameborder="0" height="400" width="400"></iframe>

Available attributes:

Attribute	Info	Description	Type
class require-consent	optional (required if config option enabled)	If the config option "Detect consent windows by class require-consent instead of data-attribute" is enabled	string
data-category	required	defines the assigned cookie group for this element	string
data-type	optional (required for scripts)	replaces the type attribute after giving consent	string
data-src	optional (required for external scripts, images or iframes)	replaces the src attribute after giving consent	string
data-srset	optional	replaces the srcset attribute for images after giving consent	string
data-ask-consent	optional	Replace element with Opt-In-Element	bool 0/1

For script tags it is required to add type="text/plain", otherwise the script executes directly.

PrivacyWire - Lokalisieren[Bearbeiten]

Dateien übersetzen oder in Einstellungen von Hand übersetzen. Siehe Webmynet Cloud, da gibt es CSV Dateien mit fertigen Übersetzungen zum Hochladen. Deutsch muss als Defaultsprache festgelegt sein.

Übersetzung wird nicht angezeigt[Bearbeiten]

  • Schau ob die Defaultsprache Deutsch ist.
  • Wenn du angemeldet bist muss deine Usersprache ebenfalls auf Deutsch stehen.

Google Consent v2[Bearbeiten]

Links[Bearbeiten]

Google Consent Mode v2

Integration und Implementierung[Bearbeiten]

Einfügen des Tags

Der Google Consent Mode Tag muss in den Quellcode der Website eingebunden werden, vorzugsweise im Header.

Einwilligungszustände festlegen

Festlegung der Einwilligungszustände (z. B. granted oder denied) für verschiedene Cookie-Typen.

Konfiguration der Tags

Konfiguration der Google-Tags (z. B. Google Analytics, Google Ads), um das Verhalten basierend auf den Einwilligungszuständen zu steuern.

Hier ein Beispiel, wie der Code für den Consent Mode aussehen könnte.

Der Code für das Integrieren kommt so von Google:

<!-- Google tag (gtag.js) -->
<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>

Wir können beim laden der Webseite Default Einstellungen mitgeben:

// Einfügen des gtag.js-Tags mit Unterstützung für Consent Mode
<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('consent', 'default', {
    'ad_storage': 'denied',
    'analytics_storage': 'denied'
    'ad_user_data': 'denied',
    'ad_personalization': 'denied',
    'wait_for_update': 2000 // milliseconds to wait for update
  });

  gtag('js', new Date());
  gtag('config', 'GA_MEASUREMENT_ID');
</script>

Wenn sich die Einwilligungspräferenzen des Nutzers ändern, kann der Code dynamisch angepasst werden:

// Aktualisieren der Einwilligungspräferenzen basierend auf Nutzerentscheidung
gtag('consent', 'update', {
  'ad_storage': 'granted',
  'analytics_storage': 'granted'
});

Google Tag mit PrivacyWire[Bearbeiten]

Wir benötigen einen Weg damit PrivacyWire die oben gezeigte Einwilligungsänderung steuern kann.

Allgemein müssen wir folgendes realsieren:

  1. Google Tag integrieren (mit v2 Option)
  2. Google Tag NICHT mit PrivacyWire aussperren
  3. PrivacyWire mit JS Funktion ausstatten, die passenden Signals an Google sendet.
  4. Funktionen auslösen bei:
    1. User speichert Banner
    2. User hat Banner gespeichert und kommt auf die Seite => Cookies checken und Signale senden.
  5. Google Tag defaultmäßig auf keine Cookies erlaubt stellen.

Implementierung in PrivacyWire - in depth[Bearbeiten]

Das Wichtigste:

  • PrivacyWire kann eine Funktion aufrufen, nachdem es die User Preferences aktualisiert hat. Du trägst den Namen dieser Funktion einfach in der Konfiguration ein. Z.b. updateConsentFromPrivacyWire.
  • Diese Funktion trägst du z.B. zusätzlich zum Google GTAG Code im Header ein.
  • PrivacyWire legt die Usereinstellungen im LocalStorage ab. Dort kann sich die neue Funktion die Einstellungen holen und an Google weiterreichen.

Sonst:

  • Im localStorage wird der Schlüssel privacyWire angelegt und ein JSON Objekt mit den Usereinstellungen abgelegt. Der alte Schlüssel wird gelöscht.
privacywire:"{"version":1,"cookieGroups":{"necessary":true,"functional":false,"statistics":true,"marketing":false,"external_media":false}}"
  • Danach wird der Banner ausgeblendet und die Bestätigung angezeigt. Dann wird der Code der betroffenen Skripte etc. upgedatet. Am Ende wird eine Custom Funktion aufgerufen die man selbst erstellen kann.
  • Es gibt den Parameter silent=false der wohl an die custom Function mit übergeben wird. Bedeutung habe ich noch nicht recherchiert.

Komplettes Beispiel PrivacyWire und Google Consent v2[Bearbeiten]

Trage in der Konfiguration von PrivacyWire die Funktion updateConsentFromPrivacyWire ein.

Hier folgt der Code für

  • Google Tag Manager (kannst du auch auf der Google Tag Manager Seite kopieren)
  • Google Consent V2 + Default Settings
  • Update Funktion die von PrivacyWire aufgerufen wird und die neuen Preferences an Google sendet.
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-ID-HERE');</script>
<!-- End Google Tag Manager -->

<!-- GOOGLE CONSENT V2 -->
<script async src="https://www.googletagmanager.com/gtag/js?id=GTM-ID-HERE"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('consent', 'default', {
    'ad_storage': 'denied',
    'analytics_storage': 'denied',
    'ad_user_data': 'denied',
    'ad_personalization': 'denied',
    'wait_for_update': 2000 // milliseconds to wait for update
  });

  gtag('js', new Date());
  gtag('config', 'GTM-ID-HERE');
</script>
<!-- End GOOGLE CONSENT V2 -->

<!-- Update user preferences -->
<script>

function updateConsentFromPrivacyWire() {
  console.log('update consent from privacy wire...');
  const privacyWireData = localStorage.getItem('privacywire');
  if (privacyWireData) {
    try {
      const consentData = JSON.parse(privacyWireData);
      const consentPreferences = {
        'ad_storage': consentData.cookieGroups.marketing ? 'granted' : 'denied',
        'analytics_storage': consentData.cookieGroups.statistics ? 'granted' : 'denied',
        'ad_user_data': consentData.cookieGroups.marketing ? 'granted' : 'denied',
        'ad_personalization': consentData.cookieGroups.marketing ? 'granted' : 'denied'
      };
      
      // Update gogle consent
      gtag('consent', 'update', consentPreferences);
      console.log(consentPreferences);
    } catch (e) {
      console.error('Error parsing PrivacyWire-Data:', e);
    }
  } else {
    console.warn('No PrivacyWire-Data found in localStorage');
  }
}
// Update consent at pageload
document.addEventListener('DOMContentLoaded', updateConsentFromPrivacyWire);
</script>

Testen der Implementierung[Bearbeiten]

Über tagassistant.google.com

Sollte etwa so ausschauen:

Testen der Google Consent V2 Einstellung

Analytics und Conversions[Bearbeiten]

Analytics[Bearbeiten]

Google Analytics Tag im GTM erstellen

   Gehe zu deinem Google Tag Manager Konto und öffne den entsprechenden Container.
   Erstelle ein neues Tag:
       Klicke auf "Tags" im linken Menü.
       Klicke auf "Neu" und gib dem Tag einen Namen (z. B. "Google Analytics - Universal Analytics").
   Tag-Typ auswählen:
       Klicke auf "Tag-Konfiguration" und wähle "Google Analytics: Universal Analytics" aus.
   Tracking-Typ auswählen:
       Wähle "Seitenaufruf" als Tracking-Typ.
   Google Analytics Einstellungen konfigurieren:
       Klicke auf "Neue Variable" unter "Google Analytics-Einstellungen" und erstelle eine neue Variable für deine Google Analytics ID (z. B. "GA-XXXXXX").
       Gib deine Google Analytics Tracking-ID ein (UA-XXXXXX-Y).
       Speichere die Variable.
   Trigger hinzufügen:
       Klicke auf "Triggering" und wähle "All Pages" (Alle Seiten) aus.
   Tag speichern:
       Speichere das Tag und veröffentliche die Änderungen im GTM.

Conversions[Bearbeiten]

Werden die Tags für das Conversion Tracking auch über den GTM ausgespielt?

ChatGPT

Ja, auch die Tags für das Conversion Tracking können (und sollten) über den Google Tag Manager (GTM) verwaltet werden. Das hat den Vorteil, dass du alle deine Tags zentral an einem Ort verwalten und flexibel auf Einwilligungen reagieren kannst. Einrichten von Conversion Tracking im Google Tag Manager

Hier sind die Schritte, um Conversion Tracking Tags im GTM einzurichten: 1. Conversion Tracking Tag im GTM erstellen

   Öffne dein Google Tag Manager Konto und wähle den entsprechenden Container.
   Erstelle ein neues Tag:
       Klicke auf "Tags" im linken Menü.
       Klicke auf "Neu" und gib dem Tag einen Namen (z. B. "Google Ads Conversion Tracking").
   Tag-Typ auswählen:
       Klicke auf "Tag-Konfiguration" und wähle den entsprechenden Tag-Typ aus, z. B. "Google Ads Conversion Tracking".
   Conversion ID und Conversion Label eingeben:
       Gib die Conversion ID und das Conversion Label ein, die du von deinem Google Ads Konto erhalten hast.

2. Conversion Tracking Trigger hinzufügen

   Trigger hinzufügen:
       Klicke auf "Triggering" und wähle einen passenden Trigger aus, z. B. "Page View" für alle Seitenaufrufe oder einen benutzerdefinierten Trigger für spezifische Conversion-Ereignisse.
       Du kannst benutzerdefinierte Trigger für spezifische Conversion-Aktionen wie Formulareinsendungen oder Käufe erstellen.

3. Google Consent Mode und PrivacyWire Einbindung

Stelle sicher, dass du den Google Consent Mode und die PrivacyWire Einbindung gemäß den Einwilligungen der Nutzer aktualisierst.


Einrichten von Conversion Tracking im GTM 1. Gehe zu deinem GTM-Konto und erstelle ein neues Tag für Conversion Tracking.

   Klicke auf "Tags" und dann auf "Neu".
   Wähle "Google Ads Conversion Tracking" als Tag-Typ.
   Gib deine Conversion ID und dein Conversion Label ein.

2. Erstelle den Trigger für das Conversion Tracking.

   Klicke auf "Trigger" und dann auf "Neu".
   Wähle einen Trigger-Typ aus, z. B. "Page View" oder einen benutzerdefinierten Trigger für spezifische Aktionen.

3. Füge den Trigger zum Conversion Tracking Tag hinzu.

   Verknüpfe den Trigger mit deinem Conversion Tracking Tag.

4. Veröffentliche die Änderungen im GTM.

   Klicke auf "Senden" und dann auf "Veröffentlichen", um die Änderungen zu aktivieren.

Mit dieser Konfiguration werden alle Tags, einschließlich der Conversion Tracking Tags, über den Google Tag Manager verwaltet und basierend auf den Einwilligungen der Nutzer korrekt ausgelöst.