Passed
Push — master ( ad1bda...a722cd )
by Chris
02:54
created

MonsterInsights_Tracking_Analytics::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 1
Code Lines 0

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 0
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 1
rs 10
1
<?php
2
/**
3
 * Tracking analytics.js class.
4
 *
5
 * @since 6.0.0
6
 *
7
 * @package MonsterInsights
8
 * @author  Chris Christoff
9
 */
10
11
// Exit if accessed directly
12
if ( ! defined( 'ABSPATH' ) ) {
13
	exit;
14
}
15
16
class MonsterInsights_Tracking_Analytics extends MonsterInsights_Tracking_Abstract {
17
	
18
	/**
19
	 * Holds the name of the tracking type.
20
	 *
21
	 * @since 6.0.0
22
	 * @access public
23
	 *
24
	 * @var string $name Name of the tracking type.
25
	 */
26
	public $name = 'analytics';
27
28
	/**
29
	 * Version of the tracking class.
30
	 *
31
	 * @since 6.0.0
32
	 * @access public
33
	 *
34
	 * @var string $version Version of the tracking class.
35
	 */
36
	public $version = '1.0.0';
37
38
	/**
39
	 * Primary class constructor.
40
	 *
41
	 * @since 6.0.0
42
	 * @access public
43
	 */
44
	public function __construct() {
45
		
46
	}
47
48
	/**
49
	 * Get frontend tracking options.
50
	 *
51
	 * This function is used to return an array of parameters
52
	 * for the frontend_output() function to output. These are 
53
	 * generally dimensions and turned on GA features.
54
	 *
55
	 * @since 6.0.0
56
	 * @access public
57
	 *
58
	 * @return array Array of the options to use.
59
	 */
60
	public function frontend_tracking_options( ) {
61
		global $wp_query;
62
		$options = array();
63
64
		$ua_code = monsterinsights_get_ua_to_output();
65
		if ( empty( $ua_code ) ) {
66
			return $options;
67
		}
68
69
		$track_user = monsterinsights_track_user();
70
71
		if ( ! $track_user ) {
72
			$options['create'] = "'create', '" . esc_js( $ua_code ) . "', '" . esc_js( 'auto' ) . "'";
73
			$options['forceSSL'] = "'set', 'forceSSL', true";
74
			$options['send'] = "'send','pageview'";
75
			return $options;
76
		}
77
78
		$domain = esc_attr( monsterinsights_get_option( 'subdomain_tracking', 'auto' ) );
79
80
		$allow_linker = monsterinsights_get_option( 'add_allow_linker', false );
81
		$allow_anchor = monsterinsights_get_option( 'allow_anchor', false );
82
83
84
		$create = array();
85
		if ( $allow_anchor ) {
86
			$create['allowAnchor'] = true;
87
		}
88
89
		if ( $allow_linker ) {
90
			$create['allowLinker'] = true;
91
		}
92
93
		if ( class_exists( 'MonsterInsights_AMP' ) ) {
94
			$create['useAmpClientId'] = true;
95
		}
96
97
		$create = apply_filters( 'monsterinsights_frontend_tracking_options_analytics_create', $create );
98
99
		if ( $create && ! empty( $create ) && is_array( $create ) ) {
100
			$create = json_encode( $create );
101
			$create = str_replace( '"', "'",  $create );
102
			$options['create'] = "'create', '" . esc_js( $ua_code ). "', '" . esc_js( $domain ) . "', " . $create;
103
		} else {
104
			$options['create'] = "'create', '" . esc_js( $ua_code ) . "', '" . esc_js( $domain ) . "'";
105
		}
106
107
		$options['forceSSL'] = "'set', 'forceSSL', true";
108
109
		$code = monsterinsights_get_option( 'custom_code', false );
110
		if ( ! empty( $code ) ) {
111
			// Add custom code to the view
112
			$options['custom_code'] = array(
113
				'type'  => 'custom_code',
114
				'value' => stripslashes( $code ),
115
			);
116
		}
117
118
		// Anonymous data
119
		if ( monsterinsights_get_option( 'anonymize_ips', false ) ) {
120
			$options['anonymize_ips'] = "'set', 'anonymizeIp', true";
121
		}
122
123
		$options = apply_filters( 'monsterinsights_frontend_tracking_options_analytics_before_scripts', $options );
124
125
		// add demographics
126
		if ( monsterinsights_get_option( 'demographics', false ) ) {
127
			$options['demographics'] = "'require', 'displayfeatures'";
128
		}
129
130
		// Add Enhanced link attribution
131
		$options['enhanced_link_attribution'] = "'require', 'linkid', 'linkid.js'";
132
133
		$options = apply_filters( 'monsterinsights_frontend_tracking_options_analytics_before_pageview', $options );
134
		$options = apply_filters( 'monsterinsights_frontend_tracking_options_before_pageview', $options, $this->name, $this->version );
135
136
		if ( is_404() ) {
137
			if ( monsterinsights_get_option( 'hash_tracking', false ) ) {
138
				$options['send'] = "'send','pageview','/404.html?page=' + document.location.pathname + document.location.search + location.hash + '&from=' + document.referrer";
139
			} else {
140
				$options['send'] = "'send','pageview','/404.html?page=' + document.location.pathname + document.location.search + '&from=' + document.referrer";
141
			}
142
		} else if ( $wp_query->is_search ) {
143
			$pushstr = "'send','pageview','/?s=";
144
			if ( (int) $wp_query->found_posts === 0 ) {
145
				$options['send'] = $pushstr . 'no-results:' . rawurlencode( $wp_query->query_vars['s'] ) . "&cat=no-results'";
146
			} else if ( (int) $wp_query->found_posts === 1 ) {
147
				$options['send'] = $pushstr . rawurlencode( $wp_query->query_vars['s'] ) . "&cat=1-result'";
148
			} else if ( $wp_query->found_posts > 1 && $wp_query->found_posts < 6 ) {
149
				$options['send'] = $pushstr . rawurlencode( $wp_query->query_vars['s'] ) . "&cat=2-5-results'";
150
			} else {
151
				$options['send'] = $pushstr . rawurlencode( $wp_query->query_vars['s'] ) . "&cat=plus-5-results'";
152
			}
153
		} else if ( monsterinsights_get_option( 'hash_tracking', false ) ) {
154
			$options['send'] = "'send','pageview', location.pathname + location.search + location.hash";
155
		} else {
156
			$options['send'] = "'send','pageview'";
157
		}
158
159
		$options = apply_filters( 'monsterinsights_frontend_tracking_options_analytics_end', $options );
160
		return $options;
161
	}
162
163
	/**
164
	 * Get frontend output.
165
	 *
166
	 * This function is used to return the Javascript
167
	 * to output in the head of the page for the given
168
	 * tracking method.
169
	 *
170
	 * @since 6.0.0
171
	 * @access public
172
	 *
173
	 * @return string Javascript to output.
174
	 */
175
	public function frontend_output( ) {
176
		$options        = $this->frontend_tracking_options();
177
		$src     	    = apply_filters( 'monsterinsights_frontend_output_analytics_src', '//www.google-analytics.com/analytics.js' );
178
		$compat     	= monsterinsights_get_option( 'gatracker_compatibility_mode', false );
179
		$compat    	 	= $compat ? 'window.ga = __gaTracker;' : '';
180
		$track_user 	= monsterinsights_track_user();
181
		$ua         	= monsterinsights_get_ua();
182
		$output     	= '';
183
		$reason     	= '';
184
		$attributes     = apply_filters( 'monsterinsights_tracking_analytics_script_attributes', array( 'type' => "text/javascript", 'data-cfasync' => 'false'  ) );
185
		$attr_string    = '';
186
		if ( ! empty( $attributes ) ) {
187
			foreach( $attributes as $attr_name => $attr_value ) {
188
	 			if ( ! empty( $attr_name ) ) {
189
	 				$attr_string .= ' ' . sanitize_key( $attr_name ) . '="' . esc_attr( $attr_value ) . '"';
190
	 			} else {
191
	 				$attr_string .= ' ' . sanitize_key( $attr_value );
192
	 			}
193
			}
194
		}
195
		ob_start();
196
		?>
197
<!-- This site uses the Google Analytics by MonsterInsights plugin v<?php echo MONSTERINSIGHTS_VERSION; ?> - Using Analytics tracking - https://www.monsterinsights.com/ -->
198
<?php if ( ! $track_user ) {
199
	if ( empty( $ua ) ) {
200
		$reason = __( 'Note: MonsterInsights is not currently configured on this site. The site owner needs to authenticate with Google Analytics in the MonsterInsights settings panel.', 'google-analytics-for-wordpress' );
201
	    $output .=  '<!-- ' . esc_html( $reason ) . ' -->' . PHP_EOL;
202
	} else if ( current_user_can( 'monsterinsights_save_settings' ) ) {
203
		$reason = __( 'Note: MonsterInsights does not track you as a logged in site administrator to prevent site owners from accidentally skewing their own Google Analytics data.'. PHP_EOL . 'If you are testing Google Analytics code, please do so either logged out or in the private browsing/incognito mode of your web browser.', 'google-analytics-for-wordpress' );
204
	    $output .=  '<!-- ' . esc_html( $reason ) . ' -->' . PHP_EOL;
205
	} else {
206
		$reason = __( 'Note: The site owner has disabled Google Analytics tracking for your user role.', 'google-analytics-for-wordpress' );
207
	    $output .=  '<!-- ' . esc_html( $reason ) . ' -->' . PHP_EOL;
208
	}
209
	echo $output;
210
} ?>
211
<?php if ( $ua ) { ?>
212
<script<?php echo $attr_string;?>>
213
	var mi_version         = '<?php echo MONSTERINSIGHTS_VERSION; ?>';
214
	var mi_track_user      = <?php echo ( $track_user ? 'true' : 'false' ); ?>;
215
	var mi_no_track_reason = <?php echo ( $reason ? "'" . esc_js( $reason)  . "'": "''" ); ?>;
216
	<?php do_action( 'monsterinsights_tracking_analytics_frontend_output_after_mi_track_user' ); ?>
217
218
<?php if ( $this->should_do_optout() ) { ?>
219
	var disableStr = 'ga-disable-<?php echo monsterinsights_get_ua(); ?>';
220
221
	/* Function to detect opted out users */
222
	function __gaTrackerIsOptedOut() {
223
		return document.cookie.indexOf(disableStr + '=true') > -1;
224
	}
225
226
	/* Disable tracking if the opt-out cookie exists. */
227
	if ( __gaTrackerIsOptedOut() ) {
228
		window[disableStr] = true;
229
	}
230
231
	/* Opt-out function */
232
	function __gaTrackerOptout() {
233
	  document.cookie = disableStr + '=true; expires=Thu, 31 Dec 2099 23:59:59 UTC; path=/';
234
	  window[disableStr] = true;
235
	}
236
	<?php } ?>
237
238
	if ( mi_track_user ) {
239
		(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
240
			(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
241
			m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
242
		})(window,document,'script','<?php echo $src; ?>','__gaTracker');
243
244
<?php
245
	echo $compat;
246
247
	if ( count( $options ) >= 1 ) {
248
		foreach ( $options as $item ) {
249
			if ( ! is_array( $item ) ) {
250
				echo '		__gaTracker(' . $item . ");\n";
251
			} else if ( ! empty ( $item['value'] ) ) {
252
				echo '	' . $item['value'] . "\n";
253
			}
254
		}
255
	}
256
	?>
257
	} else {
258
<?php if ( $this->should_do_optout() ) { ?>
259
		console.log( "<?php echo esc_js( $reason );?>" );
260
		(function() {
261
			/* https://developers.google.com/analytics/devguides/collection/analyticsjs/ */
262
			var noopfn = function() {
263
				return null;
264
			};
265
			var noopnullfn = function() {
266
				return null;
267
			};
268
			var Tracker = function() {
269
				return null;
270
			};
271
			var p = Tracker.prototype;
272
			p.get = noopfn;
273
			p.set = noopfn;
274
			p.send = noopfn;
275
			var __gaTracker = function() {
276
				var len = arguments.length;
277
				if ( len === 0 ) {
278
					return;
279
				}
280
				var f = arguments[len-1];
281
				if ( typeof f !== 'object' || f === null || typeof f.hitCallback !== 'function' ) {
282
					console.log( '<?php echo esc_js( __("Not running function", "google-analytics-for-wordpress" ) );?> __gaTracker(' + arguments[0] + " ....) <?php echo esc_js( __( "because you are not being tracked.", 'google-analytics-for-wordpress' ) );?> " + mi_no_track_reason );
283
					return;
284
				}
285
				try {
286
					f.hitCallback();
287
				} catch (ex) {
288
289
				}
290
			};
291
			__gaTracker.create = function() {
292
				return new Tracker();
293
			};
294
			__gaTracker.getByName = noopnullfn;
295
			__gaTracker.getAll = function() {
296
				return [];
297
			};
298
			__gaTracker.remove = noopfn;
299
			window['__gaTracker'] = __gaTracker;
300
			<?php echo $compat; ?>
301
		})();
302
	<?php } ?>
303
	}
304
</script>
305
<?php } else {  ?>
306
<!-- No UA code set -->
307
<?php } ?>
308
<!-- / Google Analytics by MonsterInsights -->
309
<?php
310
		$output = ob_get_contents();
311
		ob_end_clean();
312
		return $output;
313
	}
314
315
	public function should_do_optout() {
316
		return ! ( defined( 'MI_NO_TRACKING_OPTOUT' ) && MI_NO_TRACKING_OPTOUT );
0 ignored issues
show
Bug introduced by
The constant MI_NO_TRACKING_OPTOUT was not found. Maybe you did not declare it correctly or list all dependencies?
Loading history...
317
	}
318
}
319