WP Upgrade; DNT support

This commit is contained in:
Jarek Rozanski 2024-05-01 22:11:05 +00:00
parent f9597f16ae
commit 590ae448bc
7 changed files with 48 additions and 50 deletions

View file

@ -6,7 +6,7 @@ Easily add [Wide Angle Analytics](https://wideangle.co) tracker script to your W
* Requires at least: 5.2 * Requires at least: 5.2
* Tested up to: 6.1.1 * Tested up to: 6.5.2
* Requires PHP: 7.2 * Requires PHP: 7.2

View file

@ -2,9 +2,9 @@
Contributors: jrozanski,inputobjects Contributors: jrozanski,inputobjects
Tags: web analytics, tracking, web traffic, analytics, statistics, stats Tags: web analytics, tracking, web traffic, analytics, statistics, stats
Requires at least: 5.2 Requires at least: 5.2
Tested up to: 6.1.1 Tested up to: 6.5.2
Requires PHP: 7.2 Requires PHP: 7.2
Stable tag: 1.0.7 Stable tag: 1.0.8
License: GPLv2 License: GPLv2
Easily add Wide Angle Analytics tracker script to your WordPress site. You can quickly configure your web analytics tracker script. Easily add Wide Angle Analytics tracker script to your WordPress site. You can quickly configure your web analytics tracker script.
@ -61,7 +61,12 @@ We run a business around serving the needs of our customer. That's you.
You will find most of your answers in the [Knowledge Base](https://wideangle.co/documentation). Should you require further assistance, please [get in touch](https://wideangle.co/support) with our team. You will find most of your answers in the [Knowledge Base](https://wideangle.co/documentation). Should you require further assistance, please [get in touch](https://wideangle.co/support) with our team.
== Changelog == == Changelog ==
V1.0.7 V1.0.8
- Expose DNT Flag override
- Test with WordPress 6.5.2
- Drop un-used ePrivacy flag
V1.0.7
- Fix configuration of custom RegEx in the exclusion paths - Fix configuration of custom RegEx in the exclusion paths
- Test with WordPress 6.1.1 - Test with WordPress 6.1.1
@ -71,4 +76,3 @@ V1.0.6
V1.0.5 V1.0.5
- Support for `data-waa-fingerprint` toggle enabling optional browser fingerprinting. - Support for `data-waa-fingerprint` toggle enabling optional browser fingerprinting.
- Fix the header generate to use valid `prefetch` attribute - Fix the header generate to use valid `prefetch` attribute

View file

@ -3,13 +3,13 @@ class WideAngleAttributes {
public $siteId; public $siteId;
public $ignoreHash; public $ignoreHash;
public $fingerprint; public $fingerprint;
public $ePrivacyMode;
public $trackerDomain; public $trackerDomain;
public $exclusionString; public $exclusionString;
public $includeParamsString; public $includeParamsString;
public $supressDnt;
private $helpers; private $helpers;
public function __construct($siteId, $trackerDomain, $ignoreHash, $exclusionString, $includeParamsString, $fingerprint, $ePrivacyMode) { public function __construct($siteId, $trackerDomain, $ignoreHash, $exclusionString, $includeParamsString, $fingerprint, $supressDnt) {
$this->siteId = $siteId; $this->siteId = $siteId;
$this->trackerDomain = $trackerDomain; $this->trackerDomain = $trackerDomain;
$this->ignoreHash = $ignoreHash; $this->ignoreHash = $ignoreHash;
@ -17,6 +17,7 @@ class WideAngleAttributes {
$this->includeParamsString = $includeParamsString; $this->includeParamsString = $includeParamsString;
$this->fingerprint = $fingerprint; $this->fingerprint = $fingerprint;
$this->ePrivacyMode = $ePrivacyMode; $this->ePrivacyMode = $ePrivacyMode;
$this->supressDnt = $supressDnt;
$this->helpers = new WideAngleHelpers(); $this->helpers = new WideAngleHelpers();
} }
@ -26,7 +27,7 @@ class WideAngleAttributes {
'tracker_domain' => $this->trackerDomain, 'tracker_domain' => $this->trackerDomain,
'ignore_hash' => $this->ignoreHash, 'ignore_hash' => $this->ignoreHash,
'fingerprint' => $this->fingerprint, 'fingerprint' => $this->fingerprint,
'eprivacy_mode' => $this->ePrivacyMode, 'supress_dnt' => $this->supressDnt,
'exclusion_paths' => $this->generateExclusionsAttribute(), 'exclusion_paths' => $this->generateExclusionsAttribute(),
'include_params' => $this->generateIncludeParamsAttribute() 'include_params' => $this->generateIncludeParamsAttribute()
); );

View file

@ -15,7 +15,7 @@ class WideAngleGenerator {
$this->exclusionPaths = $attributes['exclusion_paths']; $this->exclusionPaths = $attributes['exclusion_paths'];
$this->includeParams = $attributes['include_params']; $this->includeParams = $attributes['include_params'];
$this->fingerprint = $attributes['fingerprint']; $this->fingerprint = $attributes['fingerprint'];
$this->ePrivacyMode = $attributes['eprivacy_mode']; $this->supressDnt = $attributes['supress_dnt'];
} }
@ -33,13 +33,13 @@ EOD;
$includeParamsAttribute = $this->includeParams != '' ? "data-waa-inc-params=\"" . esc_attr($this->includeParams) . "\"": ''; $includeParamsAttribute = $this->includeParams != '' ? "data-waa-inc-params=\"" . esc_attr($this->includeParams) . "\"": '';
$ignoreHashAttribute = $this->ignoreHash != '' ? "data-waa-ignore-hash=\"" . esc_attr($this->ignoreHash) . "\"": 'data-waa-ignore-hash="false"'; $ignoreHashAttribute = $this->ignoreHash != '' ? "data-waa-ignore-hash=\"" . esc_attr($this->ignoreHash) . "\"": 'data-waa-ignore-hash="false"';
$fingerprintAttribute = $this->fingerprint != '' ? "data-waa-fingerprint=\"" . esc_attr($this->fingerprint) . "\"": ''; $fingerprintAttribute = $this->fingerprint != '' ? "data-waa-fingerprint=\"" . esc_attr($this->fingerprint) . "\"": '';
$ePrivacyModeAttribute = $this->ePrivacyMode == 'consent' ? "data-waa-eprivacy-mode=\"" . esc_attr($this->ePrivacyMode) . "\"": ''; $supressDntAttribute = $this->supressDnt != '' ? "data-waa-dnt-supress=\"" . esc_attr($this->supressDnt) . "\"": 'data-waa-dnt-supress="false"';
$script = <<<EOD $script = <<<EOD
<script async defer <script async defer
src="{$trackerUrlAttribute}" src="{$trackerUrlAttribute}"
$fingerprintAttribute $fingerprintAttribute
$ePrivacyModeAttribute
$ignoreHashAttribute $ignoreHashAttribute
$supressDntAttribute
$includeParamsAttribute $includeParamsAttribute
$pathExlusionsAttribute></script> $pathExlusionsAttribute></script>
EOD; EOD;

View file

@ -29,6 +29,14 @@ class WideAngleHelpers {
} }
} }
function validateSupressDntFlag($name, $supressDnt) {
if(filter_var($supressDnt, FILTER_VALIDATE_BOOLEAN)) {
return WideAngleValidated::createValid($name, $supressDnt, "true");
} else {
return WideAngleValidated::createValid($name, $supressDnt, "false");
}
}
function validateFingerprint($name, $fingerprint) { function validateFingerprint($name, $fingerprint) {
if(filter_var($fingerprint, FILTER_VALIDATE_BOOLEAN)) { if(filter_var($fingerprint, FILTER_VALIDATE_BOOLEAN)) {
return WideAngleValidated::createValid($name, $fingerprint, "true"); return WideAngleValidated::createValid($name, $fingerprint, "true");
@ -37,14 +45,6 @@ class WideAngleHelpers {
} }
} }
function validateEPrivacyMode($name, $ePrivacyMode) {
if($ePrivacyMode === 'consent') {
return WideAngleValidated::createValid($name, $ePrivacyMode, "consent");
} else {
return WideAngleValidated::createValid($name, $ePrivacyMode, "disabled");
}
}
function validateSiteId($name, $siteId) { function validateSiteId($name, $siteId) {
if(preg_match("/^[a-zA-Z0-9]{10,24}$/", $siteId)) { if(preg_match("/^[a-zA-Z0-9]{10,24}$/", $siteId)) {
return WideAngleValidated::createValid($name, $siteId, strtoupper(trim($siteId))); return WideAngleValidated::createValid($name, $siteId, strtoupper(trim($siteId)));
@ -85,7 +85,7 @@ class WideAngleHelpers {
if(preg_match(self::excludePathRequestKeyPattern, $key, $idx)) { if(preg_match(self::excludePathRequestKeyPattern, $key, $idx)) {
$valueKey = "waa_exc_path_".$idx[1]."_value"; $valueKey = "waa_exc_path_".$idx[1]."_value";
$sanitizedValue = trim(sanitize_text_field($request[$valueKey])); $sanitizedValue = trim(sanitize_text_field($request[$valueKey]));
if($sanitizedValue != null) { if($sanitizedValue != null) {
$asRegExp = "/" . wp_unslash($sanitizedValue) . "/"; $asRegExp = "/" . wp_unslash($sanitizedValue) . "/";
if(@preg_match($asRegExp, null) === 0) { if(@preg_match($asRegExp, null) === 0) {
$typedExclusion = "[" . $exclusionType . "]" . filter_var($sanitizedValue, FILTER_SANITIZE_SPECIAL_CHARS); $typedExclusion = "[" . $exclusionType . "]" . filter_var($sanitizedValue, FILTER_SANITIZE_SPECIAL_CHARS);

View file

@ -2,8 +2,8 @@
$siteId = wp_unslash($this->settings[self::WAA_CONF_SITE_ID]); $siteId = wp_unslash($this->settings[self::WAA_CONF_SITE_ID]);
$trackerDomain = wp_unslash($this->settings[self::WAA_CONF_TRACKER_DOMAIN]); $trackerDomain = wp_unslash($this->settings[self::WAA_CONF_TRACKER_DOMAIN]);
$ignoreHash = filter_var($this->settings[self::WAA_CONF_IGNORE_HASH], FILTER_VALIDATE_BOOLEAN); $ignoreHash = filter_var($this->settings[self::WAA_CONF_IGNORE_HASH], FILTER_VALIDATE_BOOLEAN);
$supressDnt = filter_var($this->settings[self::WAA_CONF_SUPRESS_DNT], FILTER_VALIDATE_BOOLEAN);
$fingerprint = filter_var($this->settings[self::WAA_CONF_FINGERPRINT], FILTER_VALIDATE_BOOLEAN); $fingerprint = filter_var($this->settings[self::WAA_CONF_FINGERPRINT], FILTER_VALIDATE_BOOLEAN);
$ePrivacyMode = wp_unslash($this->settings[self::WAA_CONF_EPRIVACY_MODE]);
$parsedExclusions = $this->plugin->helpers->parseExclusionSetting(wp_unslash($this->settings[self::WAA_CONF_EXC_PATHS])); $parsedExclusions = $this->plugin->helpers->parseExclusionSetting(wp_unslash($this->settings[self::WAA_CONF_EXC_PATHS]));
$parsedIncludeParams = $this->plugin->helpers->parseIncludeParamsSetting(wp_unslash($this->settings[self::WAA_CONF_INC_PARAMS])); $parsedIncludeParams = $this->plugin->helpers->parseIncludeParamsSetting(wp_unslash($this->settings[self::WAA_CONF_INC_PARAMS]));
$generator = new WideAngleGenerator($this->settings[self::WAA_CONF_ATTRIBUTES]); $generator = new WideAngleGenerator($this->settings[self::WAA_CONF_ATTRIBUTES]);
@ -124,7 +124,19 @@ $generator = new WideAngleGenerator($this->settings[self::WAA_CONF_AT
<input id="waa_ignore_hash" type="checkbox" name="waa_ignore_hash" <?php if($ignoreHash) { echo "checked"; } ?>/> Ignore <input id="waa_ignore_hash" type="checkbox" name="waa_ignore_hash" <?php if($ignoreHash) { echo "checked"; } ?>/> Ignore
</label> </label>
</fieldset> </fieldset>
<p class="description" id="tagline-description">By default, w URL Fragment/hash is trasmitted as part of the tracking event. You can disable this behaviour. The fragment will be stripped before sending an event.</p> <p class="description" id="tagline-description">By default, URL Fragment/hash is trasmitted as part of the tracking event. You can disable this behaviour. The fragment will be stripped before sending an event.</p>
</td>
</tr>
<tr>
<th scope="row"><label>Supress Do-Not-Track</label></th>
<td>
<fieldset>
<legend class="screen-reader-text"><span>Supress Do-Not-Track</span></legend>
<label>
<input id="waa_supress_dnt" type="checkbox" name="waa_supress_dnt" <?php if($supressDnt) { echo "checked"; } ?>/> Supress
</label>
</fieldset>
<p class="description" id="tagline-description">Wide Angle Analytics respects Do-Not-Track (DNT) browser flag by default. You override this behaviour and always ignore this flag. Please consult relevant laws and regulation whether overriding DNT requires user consent.</p>
</td> </td>
</tr> </tr>
<tr> <tr>
@ -139,26 +151,6 @@ $generator = new WideAngleGenerator($this->settings[self::WAA_CONF_AT
<p class="description" id="tagline-description">The tracker script will <b>not</b> attempt to fingerprint the browser by default. You can improve tracking qaulity by enabling more reliable browser fingerprinting. Enabling this feature might require collecting consent.</p> <p class="description" id="tagline-description">The tracker script will <b>not</b> attempt to fingerprint the browser by default. You can improve tracking qaulity by enabling more reliable browser fingerprinting. Enabling this feature might require collecting consent.</p>
</td> </td>
</tr> </tr>
<tr>
<th scope="row"><label>ePrivacyMode</label></th>
<td>
<fieldset>
<legend class="screen-reader-text"><span>Browser Fingerprinting</span></legend>
<label>
<select name="waa_eprivacy_mode" id="waa_eprivacy_mode">
<?php
foreach($this->plugin->ePrivacyModes as $id => $label) {
?>
<option value="<?php echo esc_attr($id); ?>"<?php if($ePrivacyMode == $id) echo ' selected'; ?>><?php echo esc_html($label); ?></option>
<?php
}
?>
</select>
</label>
</fieldset>
<p class="description" id="tagline-description">When you disable tracking, the script collects only bare-bone information. You can opt for more verbose tracking, but be aware that according to ePrivacy Regulations, this might require visitor's consent.</p>
</td>
</tr>
</tbody> </tbody>
</table> </table>
<?php wp_nonce_field( $this->plugin->name, $this->plugin->name . '_nonce' ); ?> <?php wp_nonce_field( $this->plugin->name, $this->plugin->name . '_nonce' ); ?>

View file

@ -5,7 +5,7 @@
Description: Easily enable and configure Wide Angle Analytics on your Wordpress site Description: Easily enable and configure Wide Angle Analytics on your Wordpress site
Author: Wide Angle Analytics by Input Objects GmbH Author: Wide Angle Analytics by Input Objects GmbH
Author URI: https://wideangle.co Author URI: https://wideangle.co
Version: 1.0.7 Version: 1.0.8
Requires at least: 5.2 Requires at least: 5.2
Requires PHP: 7.2 Requires PHP: 7.2
License: GPL v2 License: GPL v2
@ -18,10 +18,10 @@ class WideAngleAnalytics {
const WAA_CONF_SITE_ID = "waa_site_id"; const WAA_CONF_SITE_ID = "waa_site_id";
const WAA_CONF_TRACKER_DOMAIN = "waa_tracker_domain"; const WAA_CONF_TRACKER_DOMAIN = "waa_tracker_domain";
const WAA_CONF_FINGERPRINT = "waa_fingerprint"; const WAA_CONF_FINGERPRINT = "waa_fingerprint";
const WAA_CONF_EPRIVACY_MODE = "waa_eprivacy_mode";
const WAA_CONF_EXC_PATHS = "waa_exc_path"; const WAA_CONF_EXC_PATHS = "waa_exc_path";
const WAA_CONF_INC_PARAMS = "waa_inc_params"; const WAA_CONF_INC_PARAMS = "waa_inc_params";
const WAA_CONF_IGNORE_HASH = "waa_ignore_hash"; const WAA_CONF_IGNORE_HASH = "waa_ignore_hash";
const WAA_CONF_SUPRESS_DNT = "waa_supress_dnt";
const WAA_CONF_ATTRIBUTES = "waa_attributes"; const WAA_CONF_ATTRIBUTES = "waa_attributes";
public function __construct() { public function __construct() {
@ -123,12 +123,12 @@ class WideAngleAnalytics {
$waaTrackerDomain = $this->plugin->helpers->validateTrackerDomain(self::WAA_CONF_TRACKER_DOMAIN, sanitize_text_field($_REQUEST['waa_tracker_domain'])); $waaTrackerDomain = $this->plugin->helpers->validateTrackerDomain(self::WAA_CONF_TRACKER_DOMAIN, sanitize_text_field($_REQUEST['waa_tracker_domain']));
$waaIgnoreHash = $this->plugin->helpers->validateIgnoreHashFlag(self::WAA_CONF_IGNORE_HASH, sanitize_text_field($_REQUEST['waa_ignore_hash'])); $waaIgnoreHash = $this->plugin->helpers->validateIgnoreHashFlag(self::WAA_CONF_IGNORE_HASH, sanitize_text_field($_REQUEST['waa_ignore_hash']));
$waaFingerprint = $this->plugin->helpers->validateFingerprint(self::WAA_CONF_FINGERPRINT, sanitize_text_field($_REQUEST['waa_fingerprint'])); $waaFingerprint = $this->plugin->helpers->validateFingerprint(self::WAA_CONF_FINGERPRINT, sanitize_text_field($_REQUEST['waa_fingerprint']));
$waaEPrivacyMode = $this->plugin->helpers->validateEPrivacyMode(self::WAA_CONF_EPRIVACY_MODE, sanitize_text_field($_REQUEST['waa_eprivacy_mode'])); $waaSupressDnt = $this->plugin->helpers->validateSupressDntFlag(self::WAA_CONF_SUPRESS_DNT, sanitize_text_field($_REQUEST['waa_supress_dnt']));
$waaIncParams = $this->plugin->helpers->validateIncludeParams(self::WAA_CONF_INC_PARAMS, $_REQUEST); $waaIncParams = $this->plugin->helpers->validateIncludeParams(self::WAA_CONF_INC_PARAMS, $_REQUEST);
$waaExclusionPaths = $this->plugin->helpers->validateExclusionPathsRequest(self::WAA_CONF_EXC_PATHS, $_REQUEST); $waaExclusionPaths = $this->plugin->helpers->validateExclusionPathsRequest(self::WAA_CONF_EXC_PATHS, $_REQUEST);
include_once( $this->plugin->folder . '/types/WideAngleAttributes.php'); include_once( $this->plugin->folder . '/types/WideAngleAttributes.php');
$merged = array($waaSiteId, $waaTrackerDomain, $waaIgnoreHash, $waaIncParams, $waaExclusionPaths); $merged = array($waaSiteId, $waaTrackerDomain, $waaIgnoreHash, $waaIncParams, $waaExclusionPaths, $waaSupressDnt);
$errors = array(); $errors = array();
foreach($merged as $validated) { foreach($merged as $validated) {
if(!$validated->is_valid()) { if(!$validated->is_valid()) {
@ -144,7 +144,7 @@ class WideAngleAnalytics {
$waaExclusionPaths->get_value(), $waaExclusionPaths->get_value(),
$waaIncParams->get_value(), $waaIncParams->get_value(),
$waaFingerprint->get_value(), $waaFingerprint->get_value(),
$waaEPrivacyMode->get_value() $waaSupressDnt->get_value()
); );
update_option(self::WAA_CONF_SITE_ID, $waaSiteId->get_value()); update_option(self::WAA_CONF_SITE_ID, $waaSiteId->get_value());
update_option(self::WAA_CONF_TRACKER_DOMAIN, $waaTrackerDomain->get_value()); update_option(self::WAA_CONF_TRACKER_DOMAIN, $waaTrackerDomain->get_value());
@ -152,7 +152,7 @@ class WideAngleAnalytics {
update_option(self::WAA_CONF_EXC_PATHS, $waaExclusionPaths->get_value()); update_option(self::WAA_CONF_EXC_PATHS, $waaExclusionPaths->get_value());
update_option(self::WAA_CONF_INC_PARAMS, $waaIncParams->get_value()); update_option(self::WAA_CONF_INC_PARAMS, $waaIncParams->get_value());
update_option(self::WAA_CONF_FINGERPRINT, $waaFingerprint->get_value()); update_option(self::WAA_CONF_FINGERPRINT, $waaFingerprint->get_value());
update_option(self::WAA_CONF_EPRIVACY_MODE, $waaEPrivacyMode->get_value()); update_option(self::WAA_CONF_SUPRESS_DNT, $waaSupressDnt->get_value());
update_option(self::WAA_CONF_ATTRIBUTES, $attributes->generateAttributes()); update_option(self::WAA_CONF_ATTRIBUTES, $attributes->generateAttributes());
$this->message = __('Settings updated', $this->plugin->name); $this->message = __('Settings updated', $this->plugin->name);
} else { } else {
@ -167,7 +167,7 @@ class WideAngleAnalytics {
self::WAA_CONF_TRACKER_DOMAIN => get_option(self::WAA_CONF_TRACKER_DOMAIN), self::WAA_CONF_TRACKER_DOMAIN => get_option(self::WAA_CONF_TRACKER_DOMAIN),
self::WAA_CONF_IGNORE_HASH => get_option(self::WAA_CONF_IGNORE_HASH), self::WAA_CONF_IGNORE_HASH => get_option(self::WAA_CONF_IGNORE_HASH),
self::WAA_CONF_FINGERPRINT => get_option(self::WAA_CONF_FINGERPRINT), self::WAA_CONF_FINGERPRINT => get_option(self::WAA_CONF_FINGERPRINT),
self::WAA_CONF_EPRIVACY_MODE => get_option(self::WAA_CONF_EPRIVACY_MODE), self::WAA_CONF_SUPRESS_DNT => get_option(self::WAA_CONF_SUPRESS_DNT),
self::WAA_CONF_ATTRIBUTES => get_option(self::WAA_CONF_ATTRIBUTES) self::WAA_CONF_ATTRIBUTES => get_option(self::WAA_CONF_ATTRIBUTES)
); );
include_once( $this->plugin->folder . '/views/admin_settings.php' ); include_once( $this->plugin->folder . '/views/admin_settings.php' );
@ -182,6 +182,7 @@ class WideAngleAnalytics {
* - waa_exc_path * - waa_exc_path
* - waa_inc_params * - waa_inc_params
* - waa_ignore_hash * - waa_ignore_hash
* - waa_supress_dnt
* - waa_header_script * - waa_header_script
* - waa_footer_script * - waa_footer_script
*/ */
@ -192,7 +193,7 @@ class WideAngleAnalytics {
register_setting($this->plugin->name, self::WAA_CONF_TRACKER_DOMAIN, array('default' => 'stats.wideangle.co')); register_setting($this->plugin->name, self::WAA_CONF_TRACKER_DOMAIN, array('default' => 'stats.wideangle.co'));
register_setting($this->plugin->name, self::WAA_CONF_IGNORE_HASH, array('default' => 'false')); register_setting($this->plugin->name, self::WAA_CONF_IGNORE_HASH, array('default' => 'false'));
register_setting($this->plugin->name, self::WAA_CONF_FINGERPRINT, array('default' => 'false')); register_setting($this->plugin->name, self::WAA_CONF_FINGERPRINT, array('default' => 'false'));
register_setting($this->plugin->name, self::WAA_CONF_EPRIVACY_MODE, array('default' => 'disabled')); register_setting($this->plugin->name, self::WAA_CONF_SUPRESS_DNT, array('default' => 'false'));
register_setting($this->plugin->name, self::WAA_CONF_ATTRIBUTES, array('type' => 'array')); register_setting($this->plugin->name, self::WAA_CONF_ATTRIBUTES, array('type' => 'array'));
} }