Google Analyticator - Version 6.4.1

Version Description

  • Re-wrote caching on admin dashboard panel. Caches results for 6 hours, and speeds up display significantly using WordPress caching.
  • Added prevention on URI Class (Google) clashing.
Download this release

Release Info

Developer VideoUserManuals
Plugin Icon 128x128 Google Analyticator
Version 6.4.1
Comparing to
See all releases

Code changes from version 6.4 to 6.4.1

google-analyticator.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  /*
3
  * Plugin Name: Google Analyticator
4
- * Version: 6.4
5
  * Plugin URI: http://wordpress.org/extend/plugins/google-analyticator/
6
  * Description: Adds the necessary JavaScript code to enable <a href="http://www.google.com/analytics/">Google's Analytics</a>. After enabling this plugin you need to authenticate with Google, then select your domain and you're set.
7
  * Author: Video User Manuals
@@ -9,7 +9,7 @@
9
  * Text Domain: google-analyticator
10
  */
11
 
12
- define('GOOGLE_ANALYTICATOR_VERSION', '6.4');
13
 
14
  define('GOOGLE_ANALYTICATOR_CLIENTID', '1007949979410.apps.googleusercontent.com');
15
  define('GOOGLE_ANALYTICATOR_CLIENTSECRET', 'q06U41XDXtzaXD14E-KO1hti'); //don't worry - this don't need to be secret in our case
1
  <?php
2
  /*
3
  * Plugin Name: Google Analyticator
4
+ * Version: 6.4.1
5
  * Plugin URI: http://wordpress.org/extend/plugins/google-analyticator/
6
  * Description: Adds the necessary JavaScript code to enable <a href="http://www.google.com/analytics/">Google's Analytics</a>. After enabling this plugin you need to authenticate with Google, then select your domain and you're set.
7
  * Author: Video User Manuals
9
  * Text Domain: google-analyticator
10
  */
11
 
12
+ define('GOOGLE_ANALYTICATOR_VERSION', '6.4.1');
13
 
14
  define('GOOGLE_ANALYTICATOR_CLIENTID', '1007949979410.apps.googleusercontent.com');
15
  define('GOOGLE_ANALYTICATOR_CLIENTSECRET', 'q06U41XDXtzaXD14E-KO1hti'); //don't worry - this don't need to be secret in our case
google-analytics-summary-widget.php CHANGED
@@ -27,10 +27,8 @@ class GoogleAnalyticsSummary
27
  $this,
28
  'addTopJs'
29
  ));
30
- add_action('wp_ajax_ga_stats_widget', array(
31
- $this,
32
- 'ajaxWidget'
33
- ));
34
  }
35
 
36
  /**
@@ -120,63 +118,79 @@ class GoogleAnalyticsSummary
120
  {
121
  # Check the ajax widget
122
  check_ajax_referer('google-analyticator-statsWidget_get');
 
123
 
124
- # Attempt to login and get the current account
125
- $account = $this->getAnalyticsAccount();
126
-
127
- $this->id = $account;
128
-
129
- $this->api->setAccount($this->id);
130
-
131
- # Check that we can display the widget before continuing
132
- if ($account == false || $this->id == false) {
133
- # Output error message
134
- echo '<p style="margin: 0;">' . __('No Analytics account selected. Double check you are authenticated with Google on Google Analyticator\'s settings page and make sure an account is selected.', 'google-analyticator') . '</p>';
135
 
136
- # Add Javascript variable to prevent breaking the Javascript
137
- echo '<script type="text/javascript">var ga_visits = [];</script>';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
 
139
- die();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
140
  }
141
-
142
- # Add the header information for the visits graph
143
- echo '<p class="ga_visits_title" style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; margin-top: 0px; color: #777; font-size: 13px;">' . __('Visits Over the Past 30 Days', 'google-analyticator') . '</p>';
144
-
145
- # Add the sparkline for the past 30 days
146
- $this->getVisitsGraph();
147
-
148
- # Add the summary header
149
- echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Site Usage', 'google-analyticator') . '</p>';
150
-
151
- # Add the visitor summary
152
- $this->getSiteUsage();
153
-
154
- # Add the top 5 posts header
155
- echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Top Pages', 'google-analyticator') . '</p>';
156
-
157
- # Add the top 5 posts
158
- $this->getTopPages();
159
-
160
- # Add the tab information
161
- echo '<table width="100%"><tr><td width="50%" valign="top">';
162
-
163
- # Add the top 5 referrers header
164
- echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Top Referrers', 'google-analyticator') . '</p>';
165
-
166
- # Add the referrer information
167
- $this->getTopReferrers();
168
-
169
- # Add the second column
170
- echo '</td><td valign="top">';
171
-
172
- # Add the top 5 search header
173
- echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Top Searches', 'google-analyticator') . '</p>';
174
-
175
- # Add the search information
176
- $this->getTopSearches();
177
-
178
- # Close the table
179
- echo '</td></tr></table>';
180
 
181
  die();
182
  }
@@ -227,59 +241,54 @@ class GoogleAnalyticsSummary
227
  **/
228
  function getVisitsGraph()
229
  {
230
- if (false === ($output = get_transient('ga_admin_stats_widget')) || ( defined( 'WP_DEBUG' ) && WP_DEBUG ) ) {
231
- # Get the metrics needed to build the visits graph
232
- $before = date('Y-m-d', strtotime('-31 days'));
233
- $yesterday = date('Y-m-d', strtotime('-1 day'));
234
-
235
- try {
236
- $stats = $this->api->getMetrics('ga:visits', $before, $yesterday, 'ga:date', 'ga:date');
237
- }
238
- catch (Exception $e) {
239
- print 'GA Summary Widget - there was a service error ' . $e->getCode() . ':' . $e->getMessage();
240
- }
241
-
242
- # Create a list of the data points for graphing
243
- $data = '';
244
- $max = 0;
245
-
246
- $rows = $stats->getRows();
247
-
248
- # Check the size of the stats array
249
- if (!isset($rows) || !is_array($rows) || count($rows) <= 0) {
250
- $data = '0,0';
251
- } else {
252
- foreach ($rows AS $stat) {
253
- # Verify the number is numeric
254
- if (is_numeric($stat[1]))
255
- $data .= $stat[1] . ',';
256
- else
257
- $data .= '0,';
258
-
259
- # Update the max value if greater
260
- if ($max < $stat[1])
261
- $max = $stat[1];
262
-
263
- }
264
-
265
- $yesterday_count = $rows[count($rows) - 1][1];
266
-
267
- # Shorten the string to remove the last comma
268
- $data = substr($data, 0, -1);
269
  }
270
-
271
- # Add a fake stat if need be
272
- if (!isset($stat[1]))
273
- $stat[1] = 0;
274
-
275
- # Output the graph
276
- $output = '<script type="text/javascript">var ga_visits = [' . $data . '];</script>';
277
- $output .= '<span class="ga_visits" title="' . sprintf(__('The most visits on a single day was %d. Yesterday there were %d visits.', 'google-analyticator'), $max, $yesterday_count) . '"></span>';
278
-
279
- # Save output for 12 hours.
280
- set_transient('ga_admin_stats_widget', $output, 60 * 60 * 12);
281
  }
282
-
 
 
 
 
 
 
 
 
283
  echo $output;
284
  }
285
 
@@ -288,124 +297,51 @@ class GoogleAnalyticsSummary
288
  **/
289
  function getSiteUsage()
290
  {
291
- # Get the value from the database
292
- $cached = maybe_unserialize(get_option('google_stats_siteUsage_' . $this->id));
293
- $updated = false;
294
-
295
- # Check if the call has been made before
296
- if (is_array($cached)) {
297
- # Check if the last time called was within two hours, if so, mark to not retrieve and grab the stats array
298
- if ($cached['lastcalled'] > (time() - 7200)) {
299
- $updated = true;
300
- $stats = $cached['stats'];
301
- }
302
-
303
- }
304
-
305
- # If the stats need to be updated
306
- if (!$updated) {
307
- # Get the metrics needed to build the usage table
308
- $before = date('Y-m-d', strtotime('-31 days'));
309
- $yesterday = date('Y-m-d', strtotime('-1 day'));
310
- $stats = $this->api->getMetrics('ga:visits,ga:bounces,ga:entrances,ga:pageviews,ga:timeOnSite,ga:newVisits', $before, $yesterday);
311
-
312
- # Store the serialized stats in the database
313
- update_option('google_stats_siteUsage_' . $this->id, array(
314
- 'stats' => $stats,
315
- 'lastcalled' => time()
316
- ));
317
-
318
- }
319
-
320
  # Create the site usage table
321
- if (isset($stats->totalsForAllResults)) {
322
- ?>
323
- <table width="100%">
324
- <tr>
325
- <td width=""><strong><?php
326
- echo number_format($stats->totalsForAllResults['ga:visits']);
327
- ?></strong></td>
328
- <td width=""><?php
329
- _e('Visits', 'google-analyticator');
330
- ?></td>
331
- <?php
332
- if ($stats->totalsForAllResults['ga:entrances'] <= 0) {
333
- ?>
334
- <td width="20%"><strong>0.00%</strong></td>
335
- <?php
336
- } else {
337
- ?>
338
- <td width="20%"><strong><?php
339
- echo number_format(round(($stats->totalsForAllResults['ga:bounces'] / $stats->totalsForAllResults['ga:entrances']) * 100, 2), 2);
340
- ?>%</strong></td>
341
- <?php
342
- }
343
- ?>
344
- <td width="30%"><?php
345
- _e('Bounce Rate', 'google-analyticator');
346
- ?></td>
347
- </tr>
348
- <tr>
349
- <td><strong><?php
350
- echo number_format($stats->totalsForAllResults['ga:pageviews']);
351
- ?></strong></td>
352
- <td><?php
353
- _e('Pageviews', 'google-analyticator');
354
- ?></td>
355
- <?php
356
- if ($stats->totalsForAllResults['ga:visits'] <= 0) {
357
- ?>
358
- <td><strong>00:00:00</strong></td>
359
- <?php
360
- } else {
361
- ?>
362
- <td><strong><?php
363
- echo $this->sec2Time($stats->totalsForAllResults['ga:timeOnSite'] / $stats->totalsForAllResults['ga:visits']);
364
- ?></strong></td>
365
- <?php
366
- }
367
- ?>
368
- <td><?php
369
- _e('Avg. Time on Site', 'google-analyticator');
370
- ?></td>
371
- </tr>
372
- <tr>
373
- <?php
374
- if ($stats->totalsForAllResults['ga:visits'] <= 0) {
375
- ?>
376
- <td><strong>0.00</strong></td>
377
- <?php
378
- } else {
379
- ?>
380
- <td><strong><?php
381
- echo number_format(round($stats->totalsForAllResults['ga:pageviews'] / $stats->totalsForAllResults['ga:visits'], 2), 2);
382
- ?></strong></td>
383
- <?php
384
- }
385
- ?>
386
- <td><?php
387
- _e('Pages/Visit', 'google-analyticator');
388
- ?></td>
389
- <?php
390
- if ($stats->totalsForAllResults['ga:visits'] <= 0) {
391
- ?>
392
- <td><strong>0.00%</strong></td>
393
- <?php
394
- } else {
395
- ?>
396
- <td><strong><?php
397
- echo number_format(round(($stats->totalsForAllResults['ga:newVisits'] / $stats->totalsForAllResults['ga:visits']) * 100, 2), 2);
398
- ?>%</strong></td>
399
- <?php
400
- }
401
- ?>
402
- <td><?php
403
- _e('% New Visits', 'google-analyticator');
404
- ?></td>
405
- </tr>
406
- </table>
407
- <?php
408
- }
409
  }
410
 
411
  /**
@@ -413,48 +349,23 @@ class GoogleAnalyticsSummary
413
  **/
414
  function getTopPages()
415
  {
416
- # Get the value from the database
417
- $cached = maybe_unserialize(get_option('google_stats_topPages_' . $this->id));
418
- $updated = false;
419
-
420
- # Check if the call has been made before
421
- if (is_array($cached)) {
422
- # Check if the last time called was within two hours, if so, mark to not retrieve and grab the stats array
423
- if ($cached['lastcalled'] > (time() - 7200)) {
424
- $updated = true;
425
- $stats = $cached['stats'];
426
- }
427
-
428
- }
429
-
430
- # If the stats need to be updated
431
- if (!$updated) {
432
- # Get the metrics needed to build the top pages
433
- $before = date('Y-m-d', strtotime('-31 days'));
434
- $yesterday = date('Y-m-d', strtotime('-1 day'));
435
- $stats = $this->api->getMetrics('ga:pageviews', $before, $yesterday, 'ga:pageTitle,ga:pagePath', '-ga:pageviews', 'ga:pagePath!=/', 10); //'ga:pagePath!%3D%2F'
436
-
437
- # Store the serialized stats in the database
438
- update_option('google_stats_topPages_' . $this->id, array(
439
- 'stats' => $stats,
440
- 'lastcalled' => time()
441
- ));
442
-
443
- }
444
-
445
  $rows = $stats->getRows();
446
-
447
  # Check the size of the stats array
448
  if (count($rows) <= 0 || !is_array($rows)) {
449
- echo '<p>' . __('There is no data for view.', 'google-analyticator') . '</p>';
450
  } else {
451
  # Build the top pages list
452
- echo '<ol>';
453
-
454
  # Set variables needed to correct (not set) bug
455
  $new_stats = array();
456
  $notset_stats = array();
457
-
458
  # Loop through each stat and create a new array
459
  foreach ($rows AS $stat) {
460
  # If the stat is not set
@@ -466,7 +377,7 @@ class GoogleAnalyticsSummary
466
  $new_stats[$stat[1]] = $stat;
467
  }
468
  }
469
-
470
  # Loop through all the (not set) stats and attempt to add them to their correct stat
471
  foreach ($notset_stats AS $stat) {
472
  # If the stat has a "partner"
@@ -477,34 +388,35 @@ class GoogleAnalyticsSummary
477
  # Stat goes to the ether since we couldn't find a partner (if anyone reads this and has a suggestion to improve, let me know)
478
  }
479
  }
480
-
481
  # Renew new_stats back to stats
482
  $stats = $new_stats;
483
-
484
  # Sort the stats array, since adding the (not set) items may have changed the order
485
  usort($stats, array(
486
  $this,
487
  'statSort'
488
  ));
489
-
490
  # Since we can no longer rely on the API as a limiter, we need to keep track of this ourselves
491
  $stat_count = 0;
492
-
493
  # Loop through each stat for display
494
  foreach ($stats AS $stat) {
495
- echo '<li><a href="' . esc_url($stat[1]) . '">' . esc_html($stat[0]) . '</a> - ' . number_format($stat[2]) . ' ' . __('Views', 'google-analyticator') . '</li>';
496
-
497
  # Increase the stat counter
498
  $stat_count++;
499
-
500
  # Stop at 5
501
  if ($stat_count >= 5)
502
  break;
503
  }
504
-
505
  # Finish the list
506
- echo '</ol>';
507
  }
 
508
  }
509
 
510
  /**
@@ -512,49 +424,24 @@ class GoogleAnalyticsSummary
512
  **/
513
  function getTopReferrers()
514
  {
515
- # Get the value from the database
516
- $cached = maybe_unserialize(get_option('google_stats_topReferrers_' . $this->id));
517
- $updated = false;
518
-
519
- # Check if the call has been made before
520
- if (is_array($cached)) {
521
- # Check if the last time called was within two hours, if so, mark to not retrieve and grab the stats array
522
- if ($cached['lastcalled'] > (time() - 7200)) {
523
- $updated = true;
524
- $stats = $cached['stats'];
525
- }
526
-
527
- }
528
-
529
- # If the stats need to be updated
530
- if (!$updated) {
531
- # Get the metrics needed to build the top referrers
532
- $before = date('Y-m-d', strtotime('-31 days'));
533
- $yesterday = date('Y-m-d', strtotime('-1 day'));
534
- $stats = $this->api->getMetrics('ga:visits', $before, $yesterday, 'ga:source,ga:medium', '-ga:visits', 'ga:medium==referral', '5');
535
-
536
- # Store the serialized stats in the database
537
- update_option('google_stats_topReferrers_' . $this->id, array(
538
- 'stats' => $stats,
539
- 'lastcalled' => time()
540
- ));
541
-
542
- }
543
-
544
  $rows = $stats->getRows();
545
-
546
  # Check the size of the stats array
547
  if (count($rows) <= 0 || !is_array($rows)) {
548
  echo '<p>' . __('There is no data for view.', 'google-analyticator') . '</p>';
549
  } else {
550
  # Build the top pages list
551
  echo '<ol>';
552
-
553
  # Loop through each stat
554
  foreach ($rows AS $stat) {
555
  echo '<li><strong>' . esc_html($stat[0]) . '</strong> - ' . number_format($stat[2]) . ' ' . __('Visits', 'google-analyticator') . '</li>';
556
  }
557
-
558
  # Finish the list
559
  echo '</ol>';
560
  }
@@ -565,49 +452,22 @@ class GoogleAnalyticsSummary
565
  **/
566
  function getTopSearches()
567
  {
568
- # Get the value from the database
569
- $cached = maybe_unserialize(get_option('google_stats_topSearches_' . $this->id));
570
- $updated = false;
571
-
572
- # Check if the call has been made before
573
- if (is_array($cached)) {
574
- # Check if the last time called was within two hours, if so, mark to not retrieve and grab the stats array
575
- if ($cached['lastcalled'] > (time() - 7200)) {
576
- $updated = true;
577
- $stats = $cached['stats'];
578
- }
579
-
580
- }
581
-
582
- # If the stats need to be updated
583
- if (!$updated) {
584
- # Get the metrics needed to build the top searches
585
- $before = date('Y-m-d', strtotime('-31 days'));
586
- $yesterday = date('Y-m-d', strtotime('-1 day'));
587
- $stats = $this->api->getMetrics('ga:visits', $before, $yesterday, 'ga:keyword', '-ga:visits', 'ga:keyword!=(not set)', '5'); //'ga:keyword!=(not_set)'
588
-
589
- # Store the serialized stats in the database
590
- update_option('google_stats_topSearches_' . $this->id, array(
591
- 'stats' => $stats,
592
- 'lastcalled' => time()
593
- ));
594
-
595
- }
596
-
597
- $rows = $stats->getRows();
598
-
599
  # Check the size of the stats array
600
  if (count($rows) <= 0 || !is_array($rows)) {
601
  echo '<p>' . __('There is no data for view.', 'google-analyticator') . '</p>';
602
  } else {
603
  # Build the top pages list
604
  echo '<ol>';
605
-
606
  # Loop through each stat
607
  foreach ($rows AS $stat) {
608
  echo '<li><strong>' . esc_html($stat[0]) . '</strong> - ' . number_format($stat[1]) . ' ' . __('Visits', 'google-analyticator') . '</li>';
609
  }
610
-
611
  # Finish the list
612
  echo '</ol>';
613
  }
@@ -666,8 +526,4 @@ class GoogleAnalyticsSummary
666
  return false;
667
  }
668
  }
669
-
670
-
671
-
672
-
673
  } // END class
27
  $this,
28
  'addTopJs'
29
  ));
30
+
31
+ add_action( 'wp_ajax_ga_stats_widget', array( $this, 'ajaxWidget' ), -1000000 );
 
 
32
  }
33
 
34
  /**
118
  {
119
  # Check the ajax widget
120
  check_ajax_referer('google-analyticator-statsWidget_get');
121
+ $doing_transient = false;
122
 
123
+ # If WP_DEBUG is true,.
124
+ if ( ( defined('WP_DEBUG') && WP_DEBUG ) || ( false === ( $ga_output = get_transient( 'ga_admin_dashboard_'. GOOGLE_ANALYTICATOR_VERSION ) ) ) ) {
 
 
 
 
 
 
 
 
 
125
 
126
+ ob_start();
127
+
128
+ # Attempt to login and get the current account
129
+ $account = $this->getAnalyticsAccount();
130
+
131
+ $this->id = $account;
132
+
133
+ $this->api->setAccount($this->id);
134
+
135
+ # Check that we can display the widget before continuing
136
+ if ($account == false || $this->id == false) {
137
+ # Output error message
138
+ echo '<p style="margin: 0;">' . __('No Analytics account selected. Double check you are authenticated with Google on Google Analyticator\'s settings page and make sure an account is selected.', 'google-analyticator') . '</p>';
139
+ # Add Javascript variable to prevent breaking the Javascript
140
+ echo '<script type="text/javascript">var ga_visits = [];</script>';
141
+ die;
142
+ }
143
 
144
+ # Add the header information for the visits graph
145
+ echo '<p class="ga_visits_title" style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; margin-top: 0px; color: #777; font-size: 13px;">' . __('Visits Over the Past 30 Days', 'google-analyticator') . '</p>';
146
+
147
+ # Add the sparkline for the past 30 days
148
+ $this->getVisitsGraph();
149
+
150
+ # Add the summary header
151
+ echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Site Usage', 'google-analyticator') . '</p>';
152
+
153
+ # Add the visitor summary
154
+ $this->getSiteUsage();
155
+
156
+ # Add the top 5 posts header
157
+ echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Top Pages', 'google-analyticator') . '</p>';
158
+
159
+ # Add the top 5 posts
160
+ $this->getTopPages();
161
+
162
+ # Add the tab information
163
+ echo '<table width="100%"><tr><td width="50%" valign="top">';
164
+
165
+ # Add the top 5 referrers header
166
+ echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Top Referrers', 'google-analyticator') . '</p>';
167
+
168
+ # Add the referrer information
169
+ $this->getTopReferrers();
170
+
171
+ # Add the second column
172
+ echo '</td><td valign="top">';
173
+
174
+ # Add the top 5 search header
175
+ echo '<p style="font-style: italic; font-family: Georgia, \'Times New Roman\', \'Bitstream Charter\', Times, serif; color: #777; font-size: 13px;">' . __('Top Searches', 'google-analyticator') . '</p>';
176
+
177
+ # Add the search information
178
+ $this->getTopSearches();
179
+
180
+ # Close the table
181
+ echo '</td></tr></table>';
182
+
183
+ # Grab the above outputs and cache it!
184
+ $ga_output = ob_get_flush();
185
+
186
+ // Cache the admin dashboard for 6 hours at a time.
187
+ set_transient( 'ga_admin_dashboard_'. GOOGLE_ANALYTICATOR_VERSION , $ga_output, 60*60*6 );
188
+ $doing_transient = true;
189
+
190
  }
191
+
192
+ if( $doing_transient == false )
193
+ echo $ga_output;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
194
 
195
  die();
196
  }
241
  **/
242
  function getVisitsGraph()
243
  {
244
+ # Get the metrics needed to build the visits graph
245
+ $before = date('Y-m-d', strtotime('-31 days'));
246
+ $yesterday = date('Y-m-d', strtotime('-1 day'));
247
+
248
+ try {
249
+ $stats = $this->api->getMetrics('ga:visits', $before, $yesterday, 'ga:date', 'ga:date');
250
+ }
251
+ catch (Exception $e) {
252
+ print 'GA Summary Widget - there was a service error ' . $e->getCode() . ':' . $e->getMessage();
253
+ }
254
+
255
+ # Create a list of the data points for graphing
256
+ $data = '';
257
+ $max = 0;
258
+
259
+ $rows = $stats->getRows();
260
+
261
+ # Check the size of the stats array
262
+ if (!isset($rows) || !is_array($rows) || count($rows) <= 0) {
263
+ $data = '0,0';
264
+ } else {
265
+ foreach ($rows AS $stat) {
266
+ # Verify the number is numeric
267
+ if (is_numeric($stat[1]))
268
+ $data .= $stat[1] . ',';
269
+ else
270
+ $data .= '0,';
271
+
272
+ # Update the max value if greater
273
+ if ($max < $stat[1])
274
+ $max = $stat[1];
275
+
 
 
 
 
 
 
 
276
  }
277
+
278
+ $yesterday_count = $rows[count($rows) - 1][1];
279
+
280
+ # Shorten the string to remove the last comma
281
+ $data = substr($data, 0, -1);
 
 
 
 
 
 
282
  }
283
+
284
+ # Add a fake stat if need be
285
+ if (!isset($stat[1]))
286
+ $stat[1] = 0;
287
+
288
+ # Output the graph
289
+ $output = '<script type="text/javascript">var ga_visits = [' . $data . '];</script>';
290
+ $output .= '<span class="ga_visits" title="' . sprintf(__('The most visits on a single day was %d. Yesterday there were %d visits.', 'google-analyticator'), $max, $yesterday_count) . '"></span>';
291
+
292
  echo $output;
293
  }
294
 
297
  **/
298
  function getSiteUsage()
299
  {
300
+ # Get the metrics needed to build the usage table
301
+ $before = date('Y-m-d', strtotime('-31 days'));
302
+ $yesterday = date('Y-m-d', strtotime('-1 day'));
303
+ $stats = $this->api->getMetrics('ga:visits,ga:bounces,ga:entrances,ga:pageviews,ga:timeOnSite,ga:newVisits', $before, $yesterday);
304
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305
  # Create the site usage table
306
+ if (isset($stats->totalsForAllResults)) { ?>
307
+ <table width="100%">
308
+ <tr>
309
+ <td width=""><strong><?php echo number_format($stats->totalsForAllResults['ga:visits']); ?></strong></td>
310
+ <td width=""><?php _e('Visits', 'google-analyticator'); ?></td>
311
+ <?php if ($stats->totalsForAllResults['ga:entrances'] <= 0) { ?>
312
+ <td width="20%"><strong>0.00%</strong></td>
313
+ <?php } else { ?>
314
+ <td width="20%"><strong><?php echo number_format(round(($stats->totalsForAllResults['ga:bounces'] / $stats->totalsForAllResults['ga:entrances']) * 100, 2), 2); ?>%</strong></td>
315
+ <?php } ?>
316
+ <td width="30%"><?php _e('Bounce Rate', 'google-analyticator'); ?></td>
317
+ </tr>
318
+ <tr>
319
+ <td><strong><?php echo number_format($stats->totalsForAllResults['ga:pageviews']); ?></strong></td>
320
+ <td><?php _e('Pageviews', 'google-analyticator'); ?></td>
321
+ <?php if ($stats->totalsForAllResults['ga:visits'] <= 0) { ?>
322
+ <td><strong>00:00:00</strong></td>
323
+ <?php } else { ?>
324
+ <td><strong><?php echo $this->sec2Time($stats->totalsForAllResults['ga:timeOnSite'] / $stats->totalsForAllResults['ga:visits']); ?></strong></td>
325
+ <?php } ?>
326
+ <td><?php _e('Avg. Time on Site', 'google-analyticator'); ?></td>
327
+ </tr>
328
+ <tr>
329
+ <?php if ($stats->totalsForAllResults['ga:visits'] <= 0) { ?>
330
+ <td><strong>0.00</strong></td>
331
+ <?php } else { ?>
332
+ <td><strong><?php echo number_format(round($stats->totalsForAllResults['ga:pageviews'] / $stats->totalsForAllResults['ga:visits'], 2), 2); ?></strong></td>
333
+ <?php } ?>
334
+ <td><?php _e('Pages/Visit', 'google-analyticator'); ?></td>
335
+ <?php if ($stats->totalsForAllResults['ga:visits'] <= 0) { ?>
336
+ <td><strong>0.00%</strong></td>
337
+ <?php } else { ?>
338
+ <td><strong><?php echo number_format(round(($stats->totalsForAllResults['ga:newVisits'] / $stats->totalsForAllResults['ga:visits']) * 100, 2), 2); ?>%</strong></td>
339
+ <td><?php _e('% New Visits', 'google-analyticator'); ?></td>
340
+ <?php } ?>
341
+ </tr>
342
+ </table>
343
+ <?php }
344
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
345
  }
346
 
347
  /**
349
  **/
350
  function getTopPages()
351
  {
352
+ # Get the metrics needed to build the top pages
353
+ $before = date('Y-m-d', strtotime('-31 days'));
354
+ $yesterday = date('Y-m-d', strtotime('-1 day'));
355
+ $stats = $this->api->getMetrics('ga:pageviews', $before, $yesterday, 'ga:pageTitle,ga:pagePath', '-ga:pageviews', 'ga:pagePath!=/', 10); //'ga:pagePath!%3D%2F'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
356
  $rows = $stats->getRows();
357
+
358
  # Check the size of the stats array
359
  if (count($rows) <= 0 || !is_array($rows)) {
360
+ $return = '<p>' . __('There is no data for view.', 'google-analyticator') . '</p>';
361
  } else {
362
  # Build the top pages list
363
+ $return = '<ol>';
364
+
365
  # Set variables needed to correct (not set) bug
366
  $new_stats = array();
367
  $notset_stats = array();
368
+
369
  # Loop through each stat and create a new array
370
  foreach ($rows AS $stat) {
371
  # If the stat is not set
377
  $new_stats[$stat[1]] = $stat;
378
  }
379
  }
380
+
381
  # Loop through all the (not set) stats and attempt to add them to their correct stat
382
  foreach ($notset_stats AS $stat) {
383
  # If the stat has a "partner"
388
  # Stat goes to the ether since we couldn't find a partner (if anyone reads this and has a suggestion to improve, let me know)
389
  }
390
  }
391
+
392
  # Renew new_stats back to stats
393
  $stats = $new_stats;
394
+
395
  # Sort the stats array, since adding the (not set) items may have changed the order
396
  usort($stats, array(
397
  $this,
398
  'statSort'
399
  ));
400
+
401
  # Since we can no longer rely on the API as a limiter, we need to keep track of this ourselves
402
  $stat_count = 0;
403
+
404
  # Loop through each stat for display
405
  foreach ($stats AS $stat) {
406
+ $return .= '<li><a href="' . esc_url($stat[1]) . '">' . esc_html($stat[0]) . '</a> - ' . number_format($stat[2]) . ' ' . __('Views', 'google-analyticator') . '</li>';
407
+
408
  # Increase the stat counter
409
  $stat_count++;
410
+
411
  # Stop at 5
412
  if ($stat_count >= 5)
413
  break;
414
  }
415
+
416
  # Finish the list
417
+ $return .= '</ol>';
418
  }
419
+ echo $return;
420
  }
421
 
422
  /**
424
  **/
425
  function getTopReferrers()
426
  {
427
+ # Get the metrics needed to build the top referrers
428
+ $before = date('Y-m-d', strtotime('-31 days'));
429
+ $yesterday = date('Y-m-d', strtotime('-1 day'));
430
+ $stats = $this->api->getMetrics('ga:visits', $before, $yesterday, 'ga:source,ga:medium', '-ga:visits', 'ga:medium==referral', '5');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
431
  $rows = $stats->getRows();
432
+
433
  # Check the size of the stats array
434
  if (count($rows) <= 0 || !is_array($rows)) {
435
  echo '<p>' . __('There is no data for view.', 'google-analyticator') . '</p>';
436
  } else {
437
  # Build the top pages list
438
  echo '<ol>';
439
+
440
  # Loop through each stat
441
  foreach ($rows AS $stat) {
442
  echo '<li><strong>' . esc_html($stat[0]) . '</strong> - ' . number_format($stat[2]) . ' ' . __('Visits', 'google-analyticator') . '</li>';
443
  }
444
+
445
  # Finish the list
446
  echo '</ol>';
447
  }
452
  **/
453
  function getTopSearches()
454
  {
455
+ # Get the metrics needed to build the top searches
456
+ $before = date('Y-m-d', strtotime('-31 days'));
457
+ $yesterday = date('Y-m-d', strtotime('-1 day'));
458
+ $stats = $this->api->getMetrics('ga:visits', $before, $yesterday, 'ga:keyword', '-ga:visits', 'ga:keyword!=(not set)', '5'); //'ga:keyword!=(not_set)'
459
+ $rows = $stats->getRows();
460
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
461
  # Check the size of the stats array
462
  if (count($rows) <= 0 || !is_array($rows)) {
463
  echo '<p>' . __('There is no data for view.', 'google-analyticator') . '</p>';
464
  } else {
465
  # Build the top pages list
466
  echo '<ol>';
 
467
  # Loop through each stat
468
  foreach ($rows AS $stat) {
469
  echo '<li><strong>' . esc_html($stat[0]) . '</strong> - ' . number_format($stat[1]) . ' ' . __('Visits', 'google-analyticator') . '</li>';
470
  }
 
471
  # Finish the list
472
  echo '</ol>';
473
  }
526
  return false;
527
  }
528
  }
 
 
 
 
529
  } // END class
google-api-php-client/src/external/URITemplateParser.php CHANGED
@@ -27,6 +27,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27
  * Blogpost: http://lab.kevburnsjr.com/php-uri-template-parser
28
  * Source: http://github.com/KevBurnsJr/php-uri-template-parser
29
  */
 
 
 
30
  class URI_Template_Parser {
31
 
32
  public static $operators = array('+', ';', '?', '/', '.');
@@ -207,3 +210,5 @@ class URI_Template_Parser {
207
  return $this->template;
208
  }
209
  }
 
 
27
  * Blogpost: http://lab.kevburnsjr.com/php-uri-template-parser
28
  * Source: http://github.com/KevBurnsJr/php-uri-template-parser
29
  */
30
+
31
+ if( !class_exists( 'URI_Template_Parser' ) ){
32
+
33
  class URI_Template_Parser {
34
 
35
  public static $operators = array('+', ';', '?', '/', '.');
210
  return $this->template;
211
  }
212
  }
213
+
214
+ } // End class check if exists.
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: VideoUserManuals
3
  Tags: stats, statistics, google, analytics, google analytics, tracking, widget
4
  Requires at least: 3.2
5
  Tested up to: 3.5
6
- Stable tag: 6.4
7
 
8
  Adds the necessary JavaScript code to enable Google Analytics. Includes widgets for Analytics data display.
9
 
@@ -59,6 +59,10 @@ For any support issues, please use the official WordPress support forums.
59
 
60
  == Changelog ==
61
 
 
 
 
 
62
  = 6.4 =
63
  * Added better caching of dashboard widget.
64
  * Added better error handling with Google API calls. Prevents breaking widget section if an error is found.
3
  Tags: stats, statistics, google, analytics, google analytics, tracking, widget
4
  Requires at least: 3.2
5
  Tested up to: 3.5
6
+ Stable tag: 6.4.1
7
 
8
  Adds the necessary JavaScript code to enable Google Analytics. Includes widgets for Analytics data display.
9
 
59
 
60
  == Changelog ==
61
 
62
+ = 6.4.1 =
63
+ * Re-wrote caching on admin dashboard panel. Caches results for 6 hours, and speeds up display significantly using WordPress caching.
64
+ * Added prevention on URI Class (Google) clashing.
65
+
66
  = 6.4 =
67
  * Added better caching of dashboard widget.
68
  * Added better error handling with Google API calls. Prevents breaking widget section if an error is found.