Plugin Directory

Changeset 3039607


Ignore:
Timestamp:
02/22/2024 09:24:03 AM (2 years ago)
Author:
yuvalo
Message:

Releasing version 1.1.2

Location:
goal-tracker-ga
Files:
3 deleted
5 edited
34 copied

Legend:

Unmodified
Added
Removed
  • goal-tracker-ga/tags/1.1.2/README.txt

    r3018646 r3039607  
    44Tags: analytics, events, wordpress, ga4
    55Requires at least: 5.5
    6 Tested up to: 6.4.2
    7 Stable tag: 1.1.1
     6Tested up to: 6.4.3
     7Stable tag: 1.1.2
    88Requires PHP: 5.6.20
    99License: GPLv2 or later
     
    7878 == Changelog ==
    7979
     80 = 1.1.2 - 2024-02-20 =
     811. Fixing an issue with video popups
     82
    8083 = 1.1.1 - 2024-01-08 =
    81841. UI changes
  • goal-tracker-ga/tags/1.1.2/apps/basic/package.json

    r3018646 r3039607  
    11{
    22    "name": "wp-goal-tracker-ga-free",
    3     "version": "1.1.1",
     3    "version": "1.1.2",
    44    "description": "WP Goal Tracker GA - Custom Events Tracking for Google Analytics 4",
    55    "author": "pinewise",
  • goal-tracker-ga/tags/1.1.2/goal-tracker-ga.php

    r3018646 r3039607  
    1717 * Plugin URI:        https://www.wpgoaltracker.com/goal-tracker-ga
    1818 * Description:       Custom Event Tracking for Google Analytics GA4
    19  * Version:           1.1.1
     19 * Version:           1.1.2
    2020 * Author:            pinewise
    2121 * Author URI:        https://www.wpgoaltracker.com
     
    8787define( 'WP_CUSTOM_EVENTS_TRACKER_PATH', plugin_dir_path( __FILE__ ) );
    8888define( 'WP_CUSTOM_EVENTS_TRACKER_URL', plugin_dir_url( __FILE__ ) );
    89 define( 'WP_CUSTOM_EVENTS_TRACKER_VERSION', '1.1.1' );
    90 define( 'WP_CUSTOM_EVENTS_TRACKER_DB_VERSION', '1.1.1' );
     89define( 'WP_CUSTOM_EVENTS_TRACKER_VERSION', '1.1.2' );
     90define( 'WP_CUSTOM_EVENTS_TRACKER_DB_VERSION', '1.1.2' );
    9191/**
    9292 * The code that runs during plugin activation.
  • goal-tracker-ga/tags/1.1.2/includes/class-wp-goal-tracker-ga.php

    r3018646 r3039607  
    269269        if ( !isset( $options["db_version"] ) ) {
    270270            # it is the first DB convert from version 1.0.0 to 1.0.2
    271             $options["db_version"] = "1.1.1";
     271            $options["db_version"] = "1.1.2";
    272272            # set the db_version param for the first time
    273273            # move general settings parameters from the options root to a "general_settings" array.
     
    331331        // plugin management capability
    332332        global  $wp_roles ;
    333         error_log( json_encode( $wp_roles ) );
    334333        foreach ( (array) $roles as $role ) {
    335334            error_log( json_encode( $role["id"] ) );
  • goal-tracker-ga/tags/1.1.2/public/js/wp-goal-tracker-ga-public.js

    r3013028 r3039607  
    1 var __assign = (this && this.__assign) || function () {
    2     __assign = Object.assign || function(t) {
     1var __assign =
     2  (this && this.__assign) ||
     3  function () {
     4    __assign =
     5      Object.assign ||
     6      function (t) {
    37        for (var s, i = 1, n = arguments.length; i < n; i++) {
    4             s = arguments[i];
    5             for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
    6                 t[p] = s[p];
     8          s = arguments[i];
     9          for (var p in s)
     10            if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
    711        }
    812        return t;
     13      };
     14    return __assign.apply(this, arguments);
     15  };
     16var gtgaMainJs = (function ($) {
     17  'use strict';
     18  var _this = this;
     19  /**
     20   * Binds Download Tracking
     21   *
     22   * @returns {undefined}
     23   */
     24  var VideoPercent = {
     25    ZERO: 0,
     26    TWENTYFIVE: 25,
     27    FIFTY: 50,
     28    SEVENTYFIVE: 75,
     29    ONEHUNDRED: 100,
     30  };
     31  function elementAddedCallback(addedNode) {
     32    checkVisibilityEvents();
     33  }
     34  var observer = new MutationObserver(function (mutationsList) {
     35    mutationsList.forEach(function (mutation) {
     36      if (mutation.type === 'childList') {
     37        Array.prototype.forEach.call(mutation.addedNodes, function (addedNode) {
     38          if (addedNode.nodeType === Node.ELEMENT_NODE) {
     39            elementAddedCallback(addedNode);
     40          }
     41        });
     42      }
     43    });
     44  });
     45  function getLinkClickParameters(event, url) {
     46    var tmpURL = new URL(url);
     47    var linkHostname = tmpURL.hostname;
     48    var linkEvent = {
     49      page_title: wpGoalTrackerGa.pageTitle,
     50      link_url: url,
     51      // page_location: window.location.href,
     52      outbound: isLinkExternal(url),
     53      link_domain: linkHostname,
     54      link_text: $(event.target).text(),
     55      link_classes: $(event.target).attr('class'),
    956    };
    10     return __assign.apply(this, arguments);
    11 };
    12 var gtgaMainJs = (function ($) {
    13     'use strict';
    14     var _this = this;
    15     /**
    16      * Binds Download Tracking
    17      *
    18      * @returns {undefined}
    19      */
    20     var VideoPercent = {
    21         ZERO: 0,
    22         TWENTYFIVE: 25,
    23         FIFTY: 50,
    24         SEVENTYFIVE: 75,
    25         ONEHUNDRED: 100,
    26     };
    27     function elementAddedCallback(addedNode) {
    28         checkVisibilityEvents();
    29     }
    30     var observer = new MutationObserver(function (mutationsList) {
    31         mutationsList.forEach(function (mutation) {
    32             if (mutation.type === 'childList') {
    33                 Array.prototype.forEach.call(mutation.addedNodes, function (addedNode) {
    34                     if (addedNode.nodeType === Node.ELEMENT_NODE) {
    35                         elementAddedCallback(addedNode);
    36                     }
    37                 });
    38             }
    39         });
     57    return linkEvent;
     58  }
     59  var click_event = function (event) {
     60    trackCustomEvent(this, event.data.eventName, event.data.props);
     61    if (
     62      (typeof event.target.href !== 'undefined' &&
     63        event.target.nodeName == 'A') ||
     64      (typeof event.currentTarget.href !== 'undefined' &&
     65        event.currentTarget.nodeName == 'A')
     66    ) {
     67      if ($(event.target).parent().attr('role') !== 'tab') {
     68        handleLinks(this, event);
     69      }
     70    }
     71  }; // End of click event function
     72  function bindEmailLinksTracking() {
     73    if (wpGoalTrackerGa.trackEmailLinks === '1') {
     74      $('body').on('click', 'a[href^="mailto:"]', function (e) {
     75        e.preventDefault();
     76        var email = this.href.split(':').pop();
     77        var page = getPageName();
     78        var eventParameters = {
     79          page_title: page,
     80          email_address: email,
     81          page_location: window.location.href,
     82          link_text: $(e.target).text(),
     83          link_classes: $(e.target).attr('class'),
     84        };
     85        trackCustomEvent(this, 'email_link_click', eventParameters);
     86        handleLinks(this, e);
     87      });
     88    }
     89  }
     90  var isLinkExternal = function (url) {
     91    var query = new RegExp('//' + location.host + '($|/)');
     92    if (url.substring(0, 4) === 'http') {
     93      if (!query.test(url)) {
     94        return true;
     95      }
     96    }
     97    return false;
     98  };
     99  var link_track_external = function (event) {
     100    var url = getUrl(event);
     101    if (typeof url !== 'undefined' && url !== '') {
     102      if (isLinkExternal(url)) {
     103        link_track_all(event);
     104      }
     105    }
     106  };
     107  var link_track_external_new_tab = function (event) {
     108    var url = getUrl(event);
     109    if (isLinkExternal(url)) {
     110      var eventParameters = getLinkClickParameters(event, url);
     111      trackCustomEvent(this, 'link_click', eventParameters);
     112    }
     113  };
     114  var link_track_all = function (event) {
     115    var url = getUrl(event);
     116    var hash = isJustHashLink(url);
     117    if (
     118      typeof url !== 'undefined' &&
     119      url !== '' &&
     120      hash != '#' &&
     121      $(this).parent().attr('role') !== 'tab'
     122    ) {
     123      var eventParameters = getLinkClickParameters(event, url);
     124      trackCustomEvent(this, 'link_click', eventParameters);
     125      event.preventDefault();
     126      if (typeof hash !== 'undefined' && hash !== '') {
     127        window.location.hash = hash;
     128      } else {
     129        setTimeout(function () {
     130          window.location.href = url;
     131        }, 250);
     132      }
     133    }
     134  };
     135  var link_track_all_new_tab = function (event) {
     136    var url = getUrl(event);
     137    if (typeof url !== 'undefined' && url !== '') {
     138      var eventParameters = getLinkClickParameters(event, url);
     139      trackCustomEvent(this, 'link_click', eventParameters);
     140    }
     141  };
     142  var handleLinks = function (self, event) {
     143    event.preventDefault();
     144    var link = getUrl(event);
     145    if (link === '') return;
     146    var w;
     147    var openInNewTab = isNewTab(self);
     148    if (openInNewTab) {
     149      w = window.open('', '_blank');
     150    }
     151    var hash = isJustHashLink(link);
     152    if (typeof hash !== 'undefined' && hash !== '') {
     153      window.location.hash = hash;
     154    } else if (window.location.href !== link) {
     155      setTimeout(
     156        function () {
     157          if (openInNewTab) {
     158            w.location.href = link;
     159          } else {
     160            window.location.href = link;
     161          }
     162        },
     163        250,
     164        w,
     165      );
     166    }
     167  };
     168  var getUrl = function (event) {
     169    var url = '';
     170    var $target = $(event.target);
     171    var $link = $target.closest('a');
     172    if ($link.length) {
     173      var href = $link.attr('href');
     174      if (href && href !== '#') {
     175        url = $link.prop('href');
     176      }
     177    }
     178    return url;
     179  };
     180  var isJustHashLink = function (url) {
     181    if (url.indexOf('#') === 0) {
     182      return url;
     183    }
     184    var currentUrl = new URL(window.location.href);
     185    var targetUrl = new URL(url, currentUrl);
     186    if (targetUrl.origin !== currentUrl.origin) {
     187      return '';
     188    }
     189    if (
     190      targetUrl.pathname === currentUrl.pathname &&
     191      targetUrl.search === currentUrl.search &&
     192      targetUrl.hash !== ''
     193    ) {
     194      return targetUrl.hash;
     195    }
     196    return '';
     197  };
     198  var isNewTab = function (self) {
     199    var target = $(self).attr('target');
     200    if (typeof target !== 'undefined' && target.trim() === '_blank') {
     201      return true;
     202    }
     203    return false;
     204  };
     205  $(document).ready(function () {
     206    var targetNode = document.body;
     207    var config = { childList: true, subtree: true };
     208    observer.observe(targetNode, config);
     209    $(window).on('scroll', checkVisibilityEvents);
     210    // We also want to check it when
     211    checkVisibilityEvents();
     212    if (wpGoalTrackerGa.trackEmailLinks) {
     213      bindEmailLinksTracking();
     214    }
     215    // Bind link tracking events
     216    if (wpGoalTrackerGa.trackLinks.enabled) {
     217      if (wpGoalTrackerGa.trackLinks.type === 'all') {
     218        $('body').on(
     219          'click',
     220          "a:not([target~='_blank']):not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     221          link_track_all,
     222        );
     223        $('body').on(
     224          'click',
     225          "a[target~='_blank']:not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     226          link_track_all_new_tab,
     227        );
     228      } else if (wpGoalTrackerGa.trackLinks.type === 'external') {
     229        $('body').on(
     230          'click',
     231          "a:not([target~='_blank']):not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     232          link_track_external,
     233        );
     234        $('body').on(
     235          'click',
     236          "a[target~='_blank']:not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     237          link_track_external_new_tab,
     238        );
     239      }
     240    }
     241    wpGoalTrackerGa.click.forEach(function (el) {
     242      var selector = makeSelector(el);
     243      $('body').on('click', selector, el, click_event);
    40244    });
    41     function getLinkClickParameters(event, url) {
    42         var tmpURL = new URL(url);
    43         var linkHostname = tmpURL.hostname;
    44         var linkEvent = {
    45             page_title: wpGoalTrackerGa.pageTitle,
    46             link_url: url,
    47             // page_location: window.location.href,
    48             outbound: isLinkExternal(url),
    49             link_domain: linkHostname,
    50             link_text: $(event.target).text(),
    51             link_classes: $(event.target).attr('class'),
    52         };
    53         return linkEvent;
    54     }
    55     var click_event = function (event) {
    56         trackCustomEvent(this, event.data.eventName, event.data.props);
    57         if ((typeof event.target.href !== 'undefined' &&
    58             event.target.nodeName == 'A') ||
    59             (typeof event.currentTarget.href !== 'undefined' &&
    60                 event.currentTarget.nodeName == 'A')) {
    61             if ($(event.target).parent().attr('role') !== 'tab') {
    62                 handleLinks(this, event);
    63             }
     245  });
     246  function makeSelector(click_option) {
     247    var selector = '';
     248    if (click_option.selectorType === 'class') {
     249      selector += '.';
     250    } else if (click_option.selectorType === 'id') {
     251      selector += '#';
     252    }
     253    selector += click_option.selector;
     254    return selector;
     255  }
     256  function checkVisibilityEvents() {
     257    // TO DO this code can be simplified a lot. May be better to use
     258    // $('element').visibility()
     259    var ga_window = $(window).height();
     260    var ga_visibility_top = $(document).scrollTop();
     261    for (var i = 0; i < wpGoalTrackerGa.visibility.length; i++) {
     262      if (!wpGoalTrackerGa.visibility[i].sent) {
     263        // NB was unescapeChars( wpGoalTrackerGa.visibility[i].select)
     264        var $select = $(makeSelector(wpGoalTrackerGa.visibility[i]));
     265        wpGoalTrackerGa.visibility[i].offset = $select.offset();
     266        if (
     267          wpGoalTrackerGa.visibility[i].offset &&
     268          ga_visibility_top + ga_window >=
     269            wpGoalTrackerGa.visibility[i].offset.top + $select.height()
     270        ) {
     271          trackCustomEvent(
     272            $select,
     273            wpGoalTrackerGa.visibility[i].eventName,
     274            wpGoalTrackerGa.visibility[i].props,
     275          );
     276          wpGoalTrackerGa.visibility[i].sent = true;
    64277        }
    65     }; // End of click event function
    66     function bindEmailLinksTracking() {
    67         if (wpGoalTrackerGa.trackEmailLinks === '1') {
    68             $('body').on('click', 'a[href^="mailto:"]', function (e) {
    69                 e.preventDefault();
    70                 var email = this.href.split(':').pop();
    71                 var page = getPageName();
    72                 var eventParameters = {
    73                     page_title: page,
    74                     email_address: email,
    75                     page_location: window.location.href,
    76                     link_text: $(e.target).text(),
    77                     link_classes: $(e.target).attr('class'),
    78                 };
    79                 trackCustomEvent(this, 'email_link_click', eventParameters);
    80                 handleLinks(this, e);
    81             });
    82         }
    83     }
    84     var isLinkExternal = function (url) {
    85         var query = new RegExp('//' + location.host + '($|/)');
    86         if (url.substring(0, 4) === 'http') {
    87             if (!query.test(url)) {
    88                 return true;
    89             }
    90         }
    91         return false;
    92     };
    93     var link_track_external = function (event) {
    94         var url = getUrl(event);
    95         if (typeof url !== 'undefined' && url !== '') {
    96             if (isLinkExternal(url)) {
    97                 link_track_all(event);
    98             }
    99         }
    100     };
    101     var link_track_external_new_tab = function (event) {
    102         var url = getUrl(event);
    103         if (isLinkExternal(url)) {
    104             var eventParameters = getLinkClickParameters(event, url);
    105             trackCustomEvent(this, 'link_click', eventParameters);
    106         }
    107     };
    108     var link_track_all = function (event) {
    109         var url = getUrl(event);
    110         var hash = isJustHashLink(url);
    111         if (typeof url !== 'undefined' &&
    112             url !== '' &&
    113             hash != '#' &&
    114             $(this).parent().attr('role') !== 'tab') {
    115             var eventParameters = getLinkClickParameters(event, url);
    116             trackCustomEvent(this, 'link_click', eventParameters);
    117             event.preventDefault();
    118             if (typeof hash !== 'undefined' && hash !== '') {
    119                 window.location.hash = hash;
    120             }
    121             else {
    122                 setTimeout(function () {
    123                     window.location.href = url;
    124                 }, 250);
    125             }
    126         }
    127     };
    128     var link_track_all_new_tab = function (event) {
    129         var url = getUrl(event);
    130         if (typeof url !== 'undefined' && url !== '') {
    131             var eventParameters = getLinkClickParameters(event, url);
    132             trackCustomEvent(this, 'link_click', eventParameters);
    133         }
    134     };
    135     var handleLinks = function (self, event) {
    136         event.preventDefault();
    137         var link = getUrl(event);
    138         if (link === '')
    139             return;
    140         var w;
    141         var openInNewTab = isNewTab(self);
    142         if (openInNewTab) {
    143             w = window.open('', '_blank');
    144         }
    145         var hash = isJustHashLink(link);
    146         if (typeof hash !== 'undefined' && hash !== '') {
    147             window.location.hash = hash;
    148         }
    149         else if (window.location.href !== link) {
    150             setTimeout(function () {
    151                 if (openInNewTab) {
    152                     w.location.href = link;
    153                 }
    154                 else {
    155                     window.location.href = link;
    156                 }
    157             }, 250, w);
    158         }
    159     };
    160     var getUrl = function (event) {
    161         var url = '';
    162         var $target = $(event.target);
    163         var $link = $target.closest('a');
    164         if ($link.length) {
    165             var href = $link.attr('href');
    166             if (href && href !== '#') {
    167                 url = $link.prop('href');
    168             }
    169         }
    170         return url;
    171     };
    172     var isJustHashLink = function (url) {
    173         if (url.indexOf('#') === 0) {
    174             return url;
    175         }
    176         var currentUrl = new URL(window.location.href);
    177         var targetUrl = new URL(url, currentUrl);
    178         if (targetUrl.origin !== currentUrl.origin) {
    179             return '';
    180         }
    181         if (targetUrl.pathname === currentUrl.pathname &&
    182             targetUrl.search === currentUrl.search &&
    183             targetUrl.hash !== '') {
    184             return targetUrl.hash;
    185         }
    186         return '';
    187     };
    188     var isNewTab = function (self) {
    189         var target = $(self).attr('target');
    190         if (typeof target !== 'undefined' && target.trim() === '_blank') {
    191             return true;
    192         }
    193         return false;
    194     };
    195     $(document).ready(function () {
    196         var targetNode = document.body;
    197         var config = { childList: true, subtree: true };
    198         observer.observe(targetNode, config);
    199         $(window).on('scroll', checkVisibilityEvents);
    200         // We also want to check it when
    201         checkVisibilityEvents();
    202         if (wpGoalTrackerGa.trackEmailLinks) {
    203             bindEmailLinksTracking();
    204         }
    205         // Bind link tracking events
    206         if (wpGoalTrackerGa.trackLinks.enabled) {
    207             if (wpGoalTrackerGa.trackLinks.type === 'all') {
    208                 $('body').on('click', 'a:not([target~="_blank"])', link_track_all);
    209                 $('body').on('click', 'a[target~="_blank"]', link_track_all_new_tab);
    210             }
    211             else if (wpGoalTrackerGa.trackLinks.type === 'external') {
    212                 $('body').on('click', 'a:not([target~="_blank"])', link_track_external);
    213                 $('body').on('click', 'a[target~="_blank"]', link_track_external_new_tab);
    214             }
    215         }
    216         wpGoalTrackerGa.click.forEach(function (el) {
    217             var selector = makeSelector(el);
    218             $('body').on('click', selector, el, click_event);
    219         });
     278      }
     279    }
     280  } // End of bindVisibilityEvents
     281  var trackCustomEventBasic = function (self, name, props) {
     282    Object.keys(props).forEach(function (key) {
     283      props[key] = prepareProps(self, props[key]);
    220284    });
    221     function makeSelector(click_option) {
    222         var selector = '';
    223         if (click_option.selectorType === 'class') {
    224             selector += '.';
    225         }
    226         else if (click_option.selectorType === 'id') {
    227             selector += '#';
    228         }
    229         selector += click_option.selector;
    230         return selector;
    231     }
    232     function checkVisibilityEvents() {
    233         // TO DO this code can be simplified a lot. May be better to use
    234         // $('element').visibility()
    235         var ga_window = $(window).height();
    236         var ga_visibility_top = $(document).scrollTop();
    237         for (var i = 0; i < wpGoalTrackerGa.visibility.length; i++) {
    238             if (!wpGoalTrackerGa.visibility[i].sent) {
    239                 // NB was unescapeChars( wpGoalTrackerGa.visibility[i].select)
    240                 var $select = $(makeSelector(wpGoalTrackerGa.visibility[i]));
    241                 wpGoalTrackerGa.visibility[i].offset = $select.offset();
    242                 if (wpGoalTrackerGa.visibility[i].offset &&
    243                     ga_visibility_top + ga_window >=
    244                         wpGoalTrackerGa.visibility[i].offset.top + $select.height()) {
    245                     trackCustomEvent($select, wpGoalTrackerGa.visibility[i].eventName, wpGoalTrackerGa.visibility[i].props);
    246                     wpGoalTrackerGa.visibility[i].sent = true;
    247                 }
    248             }
    249         }
    250     } // End of bindVisibilityEvents
    251     var trackCustomEventBasic = function (self, name, props) {
    252         Object.keys(props).forEach(function (key) {
    253             props[key] = prepareProps(self, props[key]);
    254         });
    255         gtag('event', name, __assign({}, props));
    256     };
    257    
    258     function returnOriginalProp(self, prop) {
    259         return prop;
    260     }
    261     function getPageName() {
    262         if ('1' === wpGoalTrackerGa.isFrontPage) {
    263             return 'Home';
    264         }
    265         else {
    266             if (typeof wpGoalTrackerGa.pageTitle !== 'undefined') {
    267                 return wpGoalTrackerGa.pageTitle;
    268             }
    269         }
    270         return '';
    271     }
    272     var trackCustomEvent = typeof trackCustomEventPro === 'function'
    273         ? trackCustomEventPro
    274         : trackCustomEventBasic;
    275     var prepareProps = typeof get_placeholder === 'function'
    276         ? get_placeholder
    277         : returnOriginalProp;
    278     return { isJustHashLink: isJustHashLink };
     285    gtag('event', name, __assign({}, props));
     286  };
     287 
     288  function returnOriginalProp(self, prop) {
     289    return prop;
     290  }
     291  function getPageName() {
     292    if ('1' === wpGoalTrackerGa.isFrontPage) {
     293      return 'Home';
     294    } else {
     295      if (typeof wpGoalTrackerGa.pageTitle !== 'undefined') {
     296        return wpGoalTrackerGa.pageTitle;
     297      }
     298    }
     299    return '';
     300  }
     301  var trackCustomEvent =
     302    typeof trackCustomEventPro === 'function'
     303      ? trackCustomEventPro
     304      : trackCustomEventBasic;
     305  var prepareProps =
     306    typeof get_placeholder === 'function'
     307      ? get_placeholder
     308      : returnOriginalProp;
     309  return { isJustHashLink: isJustHashLink };
    279310})(jQuery);
    280311
  • goal-tracker-ga/trunk/README.txt

    r3018646 r3039607  
    44Tags: analytics, events, wordpress, ga4
    55Requires at least: 5.5
    6 Tested up to: 6.4.2
    7 Stable tag: 1.1.1
     6Tested up to: 6.4.3
     7Stable tag: 1.1.2
    88Requires PHP: 5.6.20
    99License: GPLv2 or later
     
    7878 == Changelog ==
    7979
     80 = 1.1.2 - 2024-02-20 =
     811. Fixing an issue with video popups
     82
    8083 = 1.1.1 - 2024-01-08 =
    81841. UI changes
  • goal-tracker-ga/trunk/apps/basic/package.json

    r3018646 r3039607  
    11{
    22    "name": "wp-goal-tracker-ga-free",
    3     "version": "1.1.1",
     3    "version": "1.1.2",
    44    "description": "WP Goal Tracker GA - Custom Events Tracking for Google Analytics 4",
    55    "author": "pinewise",
  • goal-tracker-ga/trunk/goal-tracker-ga.php

    r3018646 r3039607  
    1717 * Plugin URI:        https://www.wpgoaltracker.com/goal-tracker-ga
    1818 * Description:       Custom Event Tracking for Google Analytics GA4
    19  * Version:           1.1.1
     19 * Version:           1.1.2
    2020 * Author:            pinewise
    2121 * Author URI:        https://www.wpgoaltracker.com
     
    8787define( 'WP_CUSTOM_EVENTS_TRACKER_PATH', plugin_dir_path( __FILE__ ) );
    8888define( 'WP_CUSTOM_EVENTS_TRACKER_URL', plugin_dir_url( __FILE__ ) );
    89 define( 'WP_CUSTOM_EVENTS_TRACKER_VERSION', '1.1.1' );
    90 define( 'WP_CUSTOM_EVENTS_TRACKER_DB_VERSION', '1.1.1' );
     89define( 'WP_CUSTOM_EVENTS_TRACKER_VERSION', '1.1.2' );
     90define( 'WP_CUSTOM_EVENTS_TRACKER_DB_VERSION', '1.1.2' );
    9191/**
    9292 * The code that runs during plugin activation.
  • goal-tracker-ga/trunk/includes/class-wp-goal-tracker-ga.php

    r3018646 r3039607  
    269269        if ( !isset( $options["db_version"] ) ) {
    270270            # it is the first DB convert from version 1.0.0 to 1.0.2
    271             $options["db_version"] = "1.1.1";
     271            $options["db_version"] = "1.1.2";
    272272            # set the db_version param for the first time
    273273            # move general settings parameters from the options root to a "general_settings" array.
     
    331331        // plugin management capability
    332332        global  $wp_roles ;
    333         error_log( json_encode( $wp_roles ) );
    334333        foreach ( (array) $roles as $role ) {
    335334            error_log( json_encode( $role["id"] ) );
  • goal-tracker-ga/trunk/public/js/wp-goal-tracker-ga-public.js

    r3013028 r3039607  
    1 var __assign = (this && this.__assign) || function () {
    2     __assign = Object.assign || function(t) {
     1var __assign =
     2  (this && this.__assign) ||
     3  function () {
     4    __assign =
     5      Object.assign ||
     6      function (t) {
    37        for (var s, i = 1, n = arguments.length; i < n; i++) {
    4             s = arguments[i];
    5             for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
    6                 t[p] = s[p];
     8          s = arguments[i];
     9          for (var p in s)
     10            if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
    711        }
    812        return t;
     13      };
     14    return __assign.apply(this, arguments);
     15  };
     16var gtgaMainJs = (function ($) {
     17  'use strict';
     18  var _this = this;
     19  /**
     20   * Binds Download Tracking
     21   *
     22   * @returns {undefined}
     23   */
     24  var VideoPercent = {
     25    ZERO: 0,
     26    TWENTYFIVE: 25,
     27    FIFTY: 50,
     28    SEVENTYFIVE: 75,
     29    ONEHUNDRED: 100,
     30  };
     31  function elementAddedCallback(addedNode) {
     32    checkVisibilityEvents();
     33  }
     34  var observer = new MutationObserver(function (mutationsList) {
     35    mutationsList.forEach(function (mutation) {
     36      if (mutation.type === 'childList') {
     37        Array.prototype.forEach.call(mutation.addedNodes, function (addedNode) {
     38          if (addedNode.nodeType === Node.ELEMENT_NODE) {
     39            elementAddedCallback(addedNode);
     40          }
     41        });
     42      }
     43    });
     44  });
     45  function getLinkClickParameters(event, url) {
     46    var tmpURL = new URL(url);
     47    var linkHostname = tmpURL.hostname;
     48    var linkEvent = {
     49      page_title: wpGoalTrackerGa.pageTitle,
     50      link_url: url,
     51      // page_location: window.location.href,
     52      outbound: isLinkExternal(url),
     53      link_domain: linkHostname,
     54      link_text: $(event.target).text(),
     55      link_classes: $(event.target).attr('class'),
    956    };
    10     return __assign.apply(this, arguments);
    11 };
    12 var gtgaMainJs = (function ($) {
    13     'use strict';
    14     var _this = this;
    15     /**
    16      * Binds Download Tracking
    17      *
    18      * @returns {undefined}
    19      */
    20     var VideoPercent = {
    21         ZERO: 0,
    22         TWENTYFIVE: 25,
    23         FIFTY: 50,
    24         SEVENTYFIVE: 75,
    25         ONEHUNDRED: 100,
    26     };
    27     function elementAddedCallback(addedNode) {
    28         checkVisibilityEvents();
    29     }
    30     var observer = new MutationObserver(function (mutationsList) {
    31         mutationsList.forEach(function (mutation) {
    32             if (mutation.type === 'childList') {
    33                 Array.prototype.forEach.call(mutation.addedNodes, function (addedNode) {
    34                     if (addedNode.nodeType === Node.ELEMENT_NODE) {
    35                         elementAddedCallback(addedNode);
    36                     }
    37                 });
    38             }
    39         });
     57    return linkEvent;
     58  }
     59  var click_event = function (event) {
     60    trackCustomEvent(this, event.data.eventName, event.data.props);
     61    if (
     62      (typeof event.target.href !== 'undefined' &&
     63        event.target.nodeName == 'A') ||
     64      (typeof event.currentTarget.href !== 'undefined' &&
     65        event.currentTarget.nodeName == 'A')
     66    ) {
     67      if ($(event.target).parent().attr('role') !== 'tab') {
     68        handleLinks(this, event);
     69      }
     70    }
     71  }; // End of click event function
     72  function bindEmailLinksTracking() {
     73    if (wpGoalTrackerGa.trackEmailLinks === '1') {
     74      $('body').on('click', 'a[href^="mailto:"]', function (e) {
     75        e.preventDefault();
     76        var email = this.href.split(':').pop();
     77        var page = getPageName();
     78        var eventParameters = {
     79          page_title: page,
     80          email_address: email,
     81          page_location: window.location.href,
     82          link_text: $(e.target).text(),
     83          link_classes: $(e.target).attr('class'),
     84        };
     85        trackCustomEvent(this, 'email_link_click', eventParameters);
     86        handleLinks(this, e);
     87      });
     88    }
     89  }
     90  var isLinkExternal = function (url) {
     91    var query = new RegExp('//' + location.host + '($|/)');
     92    if (url.substring(0, 4) === 'http') {
     93      if (!query.test(url)) {
     94        return true;
     95      }
     96    }
     97    return false;
     98  };
     99  var link_track_external = function (event) {
     100    var url = getUrl(event);
     101    if (typeof url !== 'undefined' && url !== '') {
     102      if (isLinkExternal(url)) {
     103        link_track_all(event);
     104      }
     105    }
     106  };
     107  var link_track_external_new_tab = function (event) {
     108    var url = getUrl(event);
     109    if (isLinkExternal(url)) {
     110      var eventParameters = getLinkClickParameters(event, url);
     111      trackCustomEvent(this, 'link_click', eventParameters);
     112    }
     113  };
     114  var link_track_all = function (event) {
     115    var url = getUrl(event);
     116    var hash = isJustHashLink(url);
     117    if (
     118      typeof url !== 'undefined' &&
     119      url !== '' &&
     120      hash != '#' &&
     121      $(this).parent().attr('role') !== 'tab'
     122    ) {
     123      var eventParameters = getLinkClickParameters(event, url);
     124      trackCustomEvent(this, 'link_click', eventParameters);
     125      event.preventDefault();
     126      if (typeof hash !== 'undefined' && hash !== '') {
     127        window.location.hash = hash;
     128      } else {
     129        setTimeout(function () {
     130          window.location.href = url;
     131        }, 250);
     132      }
     133    }
     134  };
     135  var link_track_all_new_tab = function (event) {
     136    var url = getUrl(event);
     137    if (typeof url !== 'undefined' && url !== '') {
     138      var eventParameters = getLinkClickParameters(event, url);
     139      trackCustomEvent(this, 'link_click', eventParameters);
     140    }
     141  };
     142  var handleLinks = function (self, event) {
     143    event.preventDefault();
     144    var link = getUrl(event);
     145    if (link === '') return;
     146    var w;
     147    var openInNewTab = isNewTab(self);
     148    if (openInNewTab) {
     149      w = window.open('', '_blank');
     150    }
     151    var hash = isJustHashLink(link);
     152    if (typeof hash !== 'undefined' && hash !== '') {
     153      window.location.hash = hash;
     154    } else if (window.location.href !== link) {
     155      setTimeout(
     156        function () {
     157          if (openInNewTab) {
     158            w.location.href = link;
     159          } else {
     160            window.location.href = link;
     161          }
     162        },
     163        250,
     164        w,
     165      );
     166    }
     167  };
     168  var getUrl = function (event) {
     169    var url = '';
     170    var $target = $(event.target);
     171    var $link = $target.closest('a');
     172    if ($link.length) {
     173      var href = $link.attr('href');
     174      if (href && href !== '#') {
     175        url = $link.prop('href');
     176      }
     177    }
     178    return url;
     179  };
     180  var isJustHashLink = function (url) {
     181    if (url.indexOf('#') === 0) {
     182      return url;
     183    }
     184    var currentUrl = new URL(window.location.href);
     185    var targetUrl = new URL(url, currentUrl);
     186    if (targetUrl.origin !== currentUrl.origin) {
     187      return '';
     188    }
     189    if (
     190      targetUrl.pathname === currentUrl.pathname &&
     191      targetUrl.search === currentUrl.search &&
     192      targetUrl.hash !== ''
     193    ) {
     194      return targetUrl.hash;
     195    }
     196    return '';
     197  };
     198  var isNewTab = function (self) {
     199    var target = $(self).attr('target');
     200    if (typeof target !== 'undefined' && target.trim() === '_blank') {
     201      return true;
     202    }
     203    return false;
     204  };
     205  $(document).ready(function () {
     206    var targetNode = document.body;
     207    var config = { childList: true, subtree: true };
     208    observer.observe(targetNode, config);
     209    $(window).on('scroll', checkVisibilityEvents);
     210    // We also want to check it when
     211    checkVisibilityEvents();
     212    if (wpGoalTrackerGa.trackEmailLinks) {
     213      bindEmailLinksTracking();
     214    }
     215    // Bind link tracking events
     216    if (wpGoalTrackerGa.trackLinks.enabled) {
     217      if (wpGoalTrackerGa.trackLinks.type === 'all') {
     218        $('body').on(
     219          'click',
     220          "a:not([target~='_blank']):not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     221          link_track_all,
     222        );
     223        $('body').on(
     224          'click',
     225          "a[target~='_blank']:not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     226          link_track_all_new_tab,
     227        );
     228      } else if (wpGoalTrackerGa.trackLinks.type === 'external') {
     229        $('body').on(
     230          'click',
     231          "a:not([target~='_blank']):not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     232          link_track_external,
     233        );
     234        $('body').on(
     235          'click',
     236          "a[target~='_blank']:not(.video_popup):not(.dtq-video-popup-trigger):not(:has(.video_popup)):not(.video_popup *)",
     237          link_track_external_new_tab,
     238        );
     239      }
     240    }
     241    wpGoalTrackerGa.click.forEach(function (el) {
     242      var selector = makeSelector(el);
     243      $('body').on('click', selector, el, click_event);
    40244    });
    41     function getLinkClickParameters(event, url) {
    42         var tmpURL = new URL(url);
    43         var linkHostname = tmpURL.hostname;
    44         var linkEvent = {
    45             page_title: wpGoalTrackerGa.pageTitle,
    46             link_url: url,
    47             // page_location: window.location.href,
    48             outbound: isLinkExternal(url),
    49             link_domain: linkHostname,
    50             link_text: $(event.target).text(),
    51             link_classes: $(event.target).attr('class'),
    52         };
    53         return linkEvent;
    54     }
    55     var click_event = function (event) {
    56         trackCustomEvent(this, event.data.eventName, event.data.props);
    57         if ((typeof event.target.href !== 'undefined' &&
    58             event.target.nodeName == 'A') ||
    59             (typeof event.currentTarget.href !== 'undefined' &&
    60                 event.currentTarget.nodeName == 'A')) {
    61             if ($(event.target).parent().attr('role') !== 'tab') {
    62                 handleLinks(this, event);
    63             }
     245  });
     246  function makeSelector(click_option) {
     247    var selector = '';
     248    if (click_option.selectorType === 'class') {
     249      selector += '.';
     250    } else if (click_option.selectorType === 'id') {
     251      selector += '#';
     252    }
     253    selector += click_option.selector;
     254    return selector;
     255  }
     256  function checkVisibilityEvents() {
     257    // TO DO this code can be simplified a lot. May be better to use
     258    // $('element').visibility()
     259    var ga_window = $(window).height();
     260    var ga_visibility_top = $(document).scrollTop();
     261    for (var i = 0; i < wpGoalTrackerGa.visibility.length; i++) {
     262      if (!wpGoalTrackerGa.visibility[i].sent) {
     263        // NB was unescapeChars( wpGoalTrackerGa.visibility[i].select)
     264        var $select = $(makeSelector(wpGoalTrackerGa.visibility[i]));
     265        wpGoalTrackerGa.visibility[i].offset = $select.offset();
     266        if (
     267          wpGoalTrackerGa.visibility[i].offset &&
     268          ga_visibility_top + ga_window >=
     269            wpGoalTrackerGa.visibility[i].offset.top + $select.height()
     270        ) {
     271          trackCustomEvent(
     272            $select,
     273            wpGoalTrackerGa.visibility[i].eventName,
     274            wpGoalTrackerGa.visibility[i].props,
     275          );
     276          wpGoalTrackerGa.visibility[i].sent = true;
    64277        }
    65     }; // End of click event function
    66     function bindEmailLinksTracking() {
    67         if (wpGoalTrackerGa.trackEmailLinks === '1') {
    68             $('body').on('click', 'a[href^="mailto:"]', function (e) {
    69                 e.preventDefault();
    70                 var email = this.href.split(':').pop();
    71                 var page = getPageName();
    72                 var eventParameters = {
    73                     page_title: page,
    74                     email_address: email,
    75                     page_location: window.location.href,
    76                     link_text: $(e.target).text(),
    77                     link_classes: $(e.target).attr('class'),
    78                 };
    79                 trackCustomEvent(this, 'email_link_click', eventParameters);
    80                 handleLinks(this, e);
    81             });
    82         }
    83     }
    84     var isLinkExternal = function (url) {
    85         var query = new RegExp('//' + location.host + '($|/)');
    86         if (url.substring(0, 4) === 'http') {
    87             if (!query.test(url)) {
    88                 return true;
    89             }
    90         }
    91         return false;
    92     };
    93     var link_track_external = function (event) {
    94         var url = getUrl(event);
    95         if (typeof url !== 'undefined' && url !== '') {
    96             if (isLinkExternal(url)) {
    97                 link_track_all(event);
    98             }
    99         }
    100     };
    101     var link_track_external_new_tab = function (event) {
    102         var url = getUrl(event);
    103         if (isLinkExternal(url)) {
    104             var eventParameters = getLinkClickParameters(event, url);
    105             trackCustomEvent(this, 'link_click', eventParameters);
    106         }
    107     };
    108     var link_track_all = function (event) {
    109         var url = getUrl(event);
    110         var hash = isJustHashLink(url);
    111         if (typeof url !== 'undefined' &&
    112             url !== '' &&
    113             hash != '#' &&
    114             $(this).parent().attr('role') !== 'tab') {
    115             var eventParameters = getLinkClickParameters(event, url);
    116             trackCustomEvent(this, 'link_click', eventParameters);
    117             event.preventDefault();
    118             if (typeof hash !== 'undefined' && hash !== '') {
    119                 window.location.hash = hash;
    120             }
    121             else {
    122                 setTimeout(function () {
    123                     window.location.href = url;
    124                 }, 250);
    125             }
    126         }
    127     };
    128     var link_track_all_new_tab = function (event) {
    129         var url = getUrl(event);
    130         if (typeof url !== 'undefined' && url !== '') {
    131             var eventParameters = getLinkClickParameters(event, url);
    132             trackCustomEvent(this, 'link_click', eventParameters);
    133         }
    134     };
    135     var handleLinks = function (self, event) {
    136         event.preventDefault();
    137         var link = getUrl(event);
    138         if (link === '')
    139             return;
    140         var w;
    141         var openInNewTab = isNewTab(self);
    142         if (openInNewTab) {
    143             w = window.open('', '_blank');
    144         }
    145         var hash = isJustHashLink(link);
    146         if (typeof hash !== 'undefined' && hash !== '') {
    147             window.location.hash = hash;
    148         }
    149         else if (window.location.href !== link) {
    150             setTimeout(function () {
    151                 if (openInNewTab) {
    152                     w.location.href = link;
    153                 }
    154                 else {
    155                     window.location.href = link;
    156                 }
    157             }, 250, w);
    158         }
    159     };
    160     var getUrl = function (event) {
    161         var url = '';
    162         var $target = $(event.target);
    163         var $link = $target.closest('a');
    164         if ($link.length) {
    165             var href = $link.attr('href');
    166             if (href && href !== '#') {
    167                 url = $link.prop('href');
    168             }
    169         }
    170         return url;
    171     };
    172     var isJustHashLink = function (url) {
    173         if (url.indexOf('#') === 0) {
    174             return url;
    175         }
    176         var currentUrl = new URL(window.location.href);
    177         var targetUrl = new URL(url, currentUrl);
    178         if (targetUrl.origin !== currentUrl.origin) {
    179             return '';
    180         }
    181         if (targetUrl.pathname === currentUrl.pathname &&
    182             targetUrl.search === currentUrl.search &&
    183             targetUrl.hash !== '') {
    184             return targetUrl.hash;
    185         }
    186         return '';
    187     };
    188     var isNewTab = function (self) {
    189         var target = $(self).attr('target');
    190         if (typeof target !== 'undefined' && target.trim() === '_blank') {
    191             return true;
    192         }
    193         return false;
    194     };
    195     $(document).ready(function () {
    196         var targetNode = document.body;
    197         var config = { childList: true, subtree: true };
    198         observer.observe(targetNode, config);
    199         $(window).on('scroll', checkVisibilityEvents);
    200         // We also want to check it when
    201         checkVisibilityEvents();
    202         if (wpGoalTrackerGa.trackEmailLinks) {
    203             bindEmailLinksTracking();
    204         }
    205         // Bind link tracking events
    206         if (wpGoalTrackerGa.trackLinks.enabled) {
    207             if (wpGoalTrackerGa.trackLinks.type === 'all') {
    208                 $('body').on('click', 'a:not([target~="_blank"])', link_track_all);
    209                 $('body').on('click', 'a[target~="_blank"]', link_track_all_new_tab);
    210             }
    211             else if (wpGoalTrackerGa.trackLinks.type === 'external') {
    212                 $('body').on('click', 'a:not([target~="_blank"])', link_track_external);
    213                 $('body').on('click', 'a[target~="_blank"]', link_track_external_new_tab);
    214             }
    215         }
    216         wpGoalTrackerGa.click.forEach(function (el) {
    217             var selector = makeSelector(el);
    218             $('body').on('click', selector, el, click_event);
    219         });
     278      }
     279    }
     280  } // End of bindVisibilityEvents
     281  var trackCustomEventBasic = function (self, name, props) {
     282    Object.keys(props).forEach(function (key) {
     283      props[key] = prepareProps(self, props[key]);
    220284    });
    221     function makeSelector(click_option) {
    222         var selector = '';
    223         if (click_option.selectorType === 'class') {
    224             selector += '.';
    225         }
    226         else if (click_option.selectorType === 'id') {
    227             selector += '#';
    228         }
    229         selector += click_option.selector;
    230         return selector;
    231     }
    232     function checkVisibilityEvents() {
    233         // TO DO this code can be simplified a lot. May be better to use
    234         // $('element').visibility()
    235         var ga_window = $(window).height();
    236         var ga_visibility_top = $(document).scrollTop();
    237         for (var i = 0; i < wpGoalTrackerGa.visibility.length; i++) {
    238             if (!wpGoalTrackerGa.visibility[i].sent) {
    239                 // NB was unescapeChars( wpGoalTrackerGa.visibility[i].select)
    240                 var $select = $(makeSelector(wpGoalTrackerGa.visibility[i]));
    241                 wpGoalTrackerGa.visibility[i].offset = $select.offset();
    242                 if (wpGoalTrackerGa.visibility[i].offset &&
    243                     ga_visibility_top + ga_window >=
    244                         wpGoalTrackerGa.visibility[i].offset.top + $select.height()) {
    245                     trackCustomEvent($select, wpGoalTrackerGa.visibility[i].eventName, wpGoalTrackerGa.visibility[i].props);
    246                     wpGoalTrackerGa.visibility[i].sent = true;
    247                 }
    248             }
    249         }
    250     } // End of bindVisibilityEvents
    251     var trackCustomEventBasic = function (self, name, props) {
    252         Object.keys(props).forEach(function (key) {
    253             props[key] = prepareProps(self, props[key]);
    254         });
    255         gtag('event', name, __assign({}, props));
    256     };
    257    
    258     function returnOriginalProp(self, prop) {
    259         return prop;
    260     }
    261     function getPageName() {
    262         if ('1' === wpGoalTrackerGa.isFrontPage) {
    263             return 'Home';
    264         }
    265         else {
    266             if (typeof wpGoalTrackerGa.pageTitle !== 'undefined') {
    267                 return wpGoalTrackerGa.pageTitle;
    268             }
    269         }
    270         return '';
    271     }
    272     var trackCustomEvent = typeof trackCustomEventPro === 'function'
    273         ? trackCustomEventPro
    274         : trackCustomEventBasic;
    275     var prepareProps = typeof get_placeholder === 'function'
    276         ? get_placeholder
    277         : returnOriginalProp;
    278     return { isJustHashLink: isJustHashLink };
     285    gtag('event', name, __assign({}, props));
     286  };
     287 
     288  function returnOriginalProp(self, prop) {
     289    return prop;
     290  }
     291  function getPageName() {
     292    if ('1' === wpGoalTrackerGa.isFrontPage) {
     293      return 'Home';
     294    } else {
     295      if (typeof wpGoalTrackerGa.pageTitle !== 'undefined') {
     296        return wpGoalTrackerGa.pageTitle;
     297      }
     298    }
     299    return '';
     300  }
     301  var trackCustomEvent =
     302    typeof trackCustomEventPro === 'function'
     303      ? trackCustomEventPro
     304      : trackCustomEventBasic;
     305  var prepareProps =
     306    typeof get_placeholder === 'function'
     307      ? get_placeholder
     308      : returnOriginalProp;
     309  return { isJustHashLink: isJustHashLink };
    279310})(jQuery);
    280311
Note: See TracChangeset for help on using the changeset viewer.