Neuigkeiten
  • Die modified eCommerce Shopsoftware ist kostenlos, aber nicht umsonst.
    Spenden
  • Damit wir die modified eCommerce Shopsoftware auch zukünftig kostenlos anbieten können:
    Spenden
  • Thema: ANLEITUNG: Cookie Banner mit Einwilligung für Google Analytics, Matomo & Facebook

    Martin109

    • Fördermitglied
    • Beiträge: 280
    • Geschlecht:
    Wurde natürlich wieder eingeschaltet. :-)

    HaldOn

    • Fördermitglied
    • Beiträge: 552
    Übrigens, laut Firefox setzt das Trusted Shops Widget auch ein Drittanbieter-Cookie.

    noRiddle (revilonetz)

    • Experte
    • Beiträge: 13.990
    • Geschlecht:
    Auf die Gefahr hin, daß ich (wieder mal) zu blind bin:
    Wo wird eigentlich
    Code: PHP  [Auswählen]
    $_SESSION['tracking']['allow']
    definiert ?,
    was doch u.A. als Condition für das G.ConversionTracking abgefragt wird.

    Gruß,
    noRiddle

    GTB

    • modified Team
    • Gravatar
    • Beiträge: 6.306
    • Geschlecht:
    Auf die Gefahr hin, daß ich (wieder mal) zu blind bin:
    Wo wird eigentlich
    Code: PHP  [Auswählen]
    $_SESSION['tracking']['allow']
    definiert ?,
    was doch u.A. als Condition für das G.ConversionTracking abgefragt wird.

    Siehe Antwort #28.

    Gruß Gerhard

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Sorry, ich hatte vergessen die "/includes/tracking.php" aus Antwort #28 mit ins Paket aus Beitrag 1 aufzunehmen.

    Grüße

    Torsten

    HaldOn

    • Fördermitglied
    • Beiträge: 552
    Hallo Gerhard,

    siehst du die Möglichkeit das Trusted Shops Widget (Trustbadge) mit in das Skript einzubinden, den dieses Cookie wird direkt beim Seitenbesuch gesetzt.

    GTB

    • modified Team
    • Gravatar
    • Beiträge: 6.306
    • Geschlecht:
    Klar, das können wir auf alles anwenden.

    Gruss Gerhard

    HaldOn

    • Fördermitglied
    • Beiträge: 552
    Ich möchte nicht unverschämt werden, aber würdest du mir verraten wie ich das umsetzen kann, oder werdet Ihr das in Skript einbauen?

    GTB

    • modified Team
    • Gravatar
    • Beiträge: 6.306
    • Geschlecht:
    Das ist im SVN in r12247 bereits enthalten und wird gleich gemacht wie für Google Conversion.

    Gruß Gerhard

    [EDIT Tomcraft 07.10.2019: Korrektur in Modul aus Beitrag 1 aufgenommen.]

    HaldOn

    • Fördermitglied
    • Beiträge: 552
    Könnte ich das direkt in die /includes/extra/application_bottom/10_trustedshops.php in etwas so einbauen?

    edit

    vor
    // include needed defaults

    Code: PHP  [Auswählen]
    if ($_SESSION['tracking']['allow'] === true) {

    und ganz am Ende vor dem  ?>

    Code: PHP  [Auswählen]
    }

    hpzeller

    • Experte
    • Beiträge: 4.129
    • Geschlecht:
    [...]
    Wenn ich nachträglich (also nachdem ich einmal eingewilligt habe) die Cookie Einstellungen auf "Ablehnen" stelle, werden in der Chrome Analyse trotzdem weiter die _ga / _gat / _gid Cookies angezeigt. Ist das so normal oder sollten die dann nicht gelöscht werden ? Oder verschwinden die Cookies erst nach Ablauf des "Expire" Datums von selbst ?

    Also ich bin der Meinung, dass in diesem Fall diese Cookies gelöscht werden sollten, denn es geht ja eigentlich darum das der Shopbesucher nicht essenzielle Cookies ablehnt und nicht nur darum, das der diese Cookies setzende und auswertende Code, nicht ausgeführt wird.

    Um Obiges, also das Löschen nicht essenzieller Cookies zu bewerkstelligen, hätte ich folgenden Vorschlag.
    In der Datei /templates/tpl_modified/javascript/general_bottom.js.php den folgenden Code am Ende

    Code: Javascript  [Auswählen]
    <script>
      var consent_type = "<?php echo ((TRACKING_GOOGLEANALYTICS_ACTIVE == 'true' || TRACKING_PIWIK_ACTIVE == 'true' || TRACKING_FACEBOOK_ACTIVE == 'true' || (defined('TRACKING_CUSTOM_ACTIVE') && TRACKING_CUSTOM_ACTIVE == 'true')) ? 'opt-in' : 'info'); ?>";
      window.cookieconsent.initialise({
       type: consent_type,
       revokable: ((consent_type == 'info') ? false : true),
       animateRevokable: ((consent_type == 'info') ? true : false),
       content: {
          "message": ((consent_type == 'info') ? "<?php echo TEXT_COOKIECONSENT_MESSAGE_INFO; ?>" : "<?php echo TEXT_COOKIECONSENT_MESSAGE_TRACKING; ?>"),
          "dismiss": "<?php echo TEXT_COOKIECONSENT_DISSMISS; ?>",
          "link": "<?php echo TEXT_COOKIECONSENT_LINK; ?>",
          "href": "<?php echo ((isset($privacy_link)) ? $privacy_link : xtc_href_link(FILENAME_POPUP_CONTENT, 'coID=2', $request_type)); ?>",
          "policy": "<?php echo TEXT_COOKIECONSENT_POLICY; ?>",
          "allow": "<?php echo TEXT_COOKIECONSENT_ALLOW; ?>",
          "deny": "<?php echo TEXT_COOKIECONSENT_DENY; ?>"
        },
        cookie: {
          "name": "MODtrack",
          "path": "<?php echo DIR_WS_CATALOG; ?>",
          "domain": "<?php echo (xtc_not_null($current_domain) ? '.'.$current_domain : ''); ?>",
          "secure": <?php echo ((HTTP_SERVER == HTTPS_SERVER && $request_type == 'SSL') ? "true" : "false"); ?>
        },
        onInitialise: function(status) {
          if(status == cookieconsent.status.allow) TrackingScripts();
        },
        onStatusChange: function(status, chosenBefore) {
          if (this.hasConsented()) TrackingScripts();
        }
      });
     
      function TrackingScripts() {
        if ($.isFunction(window.TrackingGoogle)) {
          TrackingGoogle();
        }
        if ($.isFunction(window.TrackingPiwik)) {
          TrackingPiwik();
        }
        if ($.isFunction(window.TrackingFacebook)) {
          TrackingFacebook();
        }
      }
    </script>
     

    mit diesem Code ersetzen, der die zusätzliche Funktion deleteCookies() enthält, welche dafür sorgt, dass bei nachträglicher Ablenung nicht essenzieller Cookies diese nicht essenziellen Cookies gelöscht werden. Ausserdem werden bei Ablehnung nicht essenzieller Cookies diese nach dem laden der Seite gelöscht, egal von welcher Quelle sie gesetzt werden.

    Code: Javascript  [Auswählen]
    <script>
    // document.cookie = "extra_essential_cookie=test; expires=Thu, 01 Jan 2020 00:00:00 GMT; path=/";
      window.addEventListener("load", function(){
        var consent_type = "<?php echo ((TRACKING_GOOGLEANALYTICS_ACTIVE == 'true' || TRACKING_PIWIK_ACTIVE == 'true' || TRACKING_FACEBOOK_ACTIVE == 'true' || (defined('TRACKING_CUSTOM_ACTIVE') && TRACKING_CUSTOM_ACTIVE == 'true')) ? 'opt-in' : 'info'); ?>";
        window.cookieconsent.initialise({
         type: consent_type,
         revokable: ((consent_type == 'info') ? false : true),
         animateRevokable: ((consent_type == 'info') ? true : false),
         content: {
            "message": ((consent_type == 'info') ? "<?php echo TEXT_COOKIECONSENT_MESSAGE_INFO; ?>" : "<?php echo TEXT_COOKIECONSENT_MESSAGE_TRACKING; ?>"),
            "dismiss": "<?php echo TEXT_COOKIECONSENT_DISSMISS; ?>",
            "link": "<?php echo TEXT_COOKIECONSENT_LINK; ?>",
            "href": "<?php echo ((isset($privacy_link)) ? $privacy_link : xtc_href_link(FILENAME_POPUP_CONTENT, 'coID=2', $request_type)); ?>",
            "policy": "<?php echo TEXT_COOKIECONSENT_POLICY; ?>",
            "allow": "<?php echo TEXT_COOKIECONSENT_ALLOW; ?>",
            "deny": "<?php echo TEXT_COOKIECONSENT_DENY; ?>"
          },
          cookie: {
            "name": "MODtrack",
            "path": "<?php echo DIR_WS_CATALOG; ?>",
            "domain": "<?php echo (xtc_not_null($current_domain) ? '.'.$current_domain : ''); ?>",    
            "secure": <?php echo ((HTTP_SERVER == HTTPS_SERVER && $request_type == 'SSL') ? "true" : "false"); ?>,
            "expiryDays": 120
          },
          onInitialise: function(status) {
            if(this.hasConsented()) {
              TrackingScripts();      
            }else{
              //If cookies not allowed delete them
              deleteCookies();
            }    
          },
          onStatusChange: function(status, chosenBefore) {
            if (status == 'allow') {
              TrackingScripts();      
            }else{
              //If cookies not allowed delete them
              deleteCookies();
            }    
          }
        });
       
        function TrackingScripts() {
          if ($.isFunction(window.TrackingGoogle)) {
            TrackingGoogle();
          }
          if ($.isFunction(window.TrackingPiwik)) {
            TrackingPiwik();
          }    
          if ($.isFunction(window.TrackingFacebook)) {
            TrackingFacebook();
          }
        }
       
        /*
         * deleteCookies
         * delete all cookies except those listed in the array essential
         */

        function deleteCookies() {
          //List of essential cookies - set as an empty array to delete everything - i.e. var essential = [];
          var essential = ["MODsid", "extra_essential_cookie"];
         
          //create array of cookies set
          var cookies = document.cookie.split(";");
         
          //loop through the cookies
          for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i];
           
            //Get the cookie name
            var eqPos = cookie.indexOf("=");
            var name = (eqPos > -1 ? cookie.substr(0, eqPos) : cookie).trim();
           
            //Delete all cookies except those listed in essential
            if (essential === undefined || essential.length == 0 || essential.indexOf(name) == -1){
              //Note assuming path is always = '/'
              document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
              document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=<?php echo DIR_WS_CATALOG; ?>";
            }
          }
        }
      });
    </script>
     

    Gruss
    Hanspeter

    AGI

    • modified Team
    • Beiträge: 305
    • Geschlecht:
    Hallo Hanspeter,

    ich finde die delete-Funktion gut und habe sie noch etwas erweitert.
    Ein zusätzliches Array erlaubt es cookies zu finden deren Namen bestimmten Zeichenfolgen beginnen. Dein essentials_array wird damit erweitert. So kann unter anderem das "ga-disable"-Cookie dynamisch aufgenommen werden.

    auch setzen die alten (nicht universal) Analytic-Scripts Cookies auf die nicht WWW-Domain, auch wenn die Cookies von einer www-Domain gesetzt wurden. Diese können dann aber nicht von einer www-Domain gelöscht werden.

    Meine delete-Funktion sieht nun so aus:
    Code: Javascript  [Auswählen]
    function deleteCookies() {
          //List of essential cookies - set as an empty array to delete everything - i.e. var essential = [];
          var essential = ["MODsid", "extra_essential_cookie"];
          var add_essentials_like = ["ga-disable%"];
         
          //create array of cookies set
          var cookies = document.cookie.split(";");
         
          //loop through add_essentials_like to add essential
          for (var i = 0; i < add_essentials_like.length; i++) {
            if(add_essentials_like[i].substr(-1) == '%') {
              var like_str = add_essentials_like[i].substr(0,add_essentials_like[i].length-1);
              for (var k = 0; k < cookies.length; k++) {
                var cookie = cookies[k];
                //Get the cookie name
                var eqPos = cookie.indexOf("=");
                var name = (eqPos > -1 ? cookie.substr(0, eqPos) : cookie).trim();
                if(name.indexOf(like_str) == 0)
                  essential[essential.length] = name;
              }
            }
            else
              essential[essential.length] = add_essentials_like[i];
          }
          //loop through the cookies
          for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i];
           
            //Get the cookie name
            var eqPos = cookie.indexOf("=");
            var name = (eqPos > -1 ? cookie.substr(0, eqPos) : cookie).trim();
           
            //Delete all cookies except those listed in essential
            if (essential === undefined || essential.length == 0 || essential.indexOf(name) == -1){
              //Note assuming path is always = '/'
              document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
              document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=<?php echo DIR_WS_CATALOG; ?>";
              if(document.domain.substr(0,4) == 'www.') {
                document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=."+document.domain.substr(4)+"; path=/";
                document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain="+document.domain.substr(4)+"; path=/";
                <?php if(DIR_WS_CATALOG != '/') { ?>
                document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain=."+document.domain.substr(4)+"; path=<?php echo DIR_WS_CATALOG; ?>";
                document.cookie = name + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; domain="+document.domain.substr(4)+"; path=<?php echo DIR_WS_CATALOG; ?>";
                <?php } ?>
              }
            }
          }
        }

    Meines Erachtens die aktuelle in Beitrag 1 ausgelieferte includes/external/smart/plugins/function.googleanalytics.php nicht korrekt. Die gaOptout-Funktion wird nicht geladen und bei Verwendung des nicht universal-Analytics werden die Cookies nicht gesetzt.
    Ich lege eine angepasste Version in den Anhang und möchte euch bitten nochmals drauf zu schauen. Ich habe es aktuell nur aufgrund von Fehlern bei einem Kunden angepasst.

    Viele Grüße
    Andreas

    GTB

    • modified Team
    • Gravatar
    • Beiträge: 6.306
    • Geschlecht:
    Ich habe jetzt nur mal schnell auf den Code geschaut. In deiner Version wird die ga.js immer geladen. Das sehe ich sehr kritisch. Die opt-out Funktion rausnehmen ist eine gute Idee.

    Gruss Gerhard

    Tomcraft

    • modified Team
    • Gravatar
    • Beiträge: 46.369
    • Geschlecht:
    Ich bekam den Hinweis, dass ich doch bitte schreiben solle, was sich bei den Updates geändert hat, damit man nicht alle 4 Punkte erneut durcharbeiten muss. In allen bisherigen Updates wurden nur Dateien in "shoproot.zip" geändert bzw. hinzugefügt und die "jquery.cookieconsent.min.js.zip" aktualisiert.

    Grüße

    Torsten

    AGI

    • modified Team
    • Beiträge: 305
    • Geschlecht:
    @Gerhard,

    du hast recht, die ga.js sollte nicht immer geladen werden.

    Ich habe den Code nochmals geändert, sodass das klassische Google-Analytics nun auch trackt.

    [EDIT Tomcraft 08.10.2019: Korrektur in r12263 ins SVN und Modul aus Beitrag 1 übernommen.]
    0 Antworten
    1105 Aufrufe
    30. Juli 2021, 11:58:38 von ShopUser
    1 Antworten
    2199 Aufrufe
    24. November 2021, 19:10:05 von Timm
    98 Antworten
    73476 Aufrufe
    01. Juni 2015, 19:24:32 von arno_nuehm
               
    anything