Slimstat Analytics - Version 4.2.1

Version Description

  • [Note] If you're upgrading from a version prior to 4.0, please upgrade to version 4.0 first. To simplify our codebase, we removed all the upgrade scripts to support versions prior to 4.0.
  • [New] Say hi to your new charts: search terms (total and unique per day or even hour), outbound links, users. If you can't see the new charts, don't forget to give the No Panic button a try.
  • [Update] We are dropping old unused columns from the main table: ip_temp, other_ip_temp, ip_num, other_ip_num. Please make sure you have a backup, in case you need those columns for other custom purposes.
  • [Fix] Some users were seeing "ghost reports" in their admin screens. A residue from Halloween, we assume.
  • [Fix] Our "loading" animated icon was not being displayed correctly on refresh.
  • [Fix] Chart legend was not being displayed as expected.
Download this release

Release Info

Developer coolmann
Plugin Icon 128x128 Slimstat Analytics
Version 4.2.1
Comparing to
See all releases

Code changes from version 4.2.0.1 to 4.2.1

admin/css/slimstat.css CHANGED
@@ -761,4 +761,4 @@
761
  .slimstat-font-stopwatch:before { content: '\e815'; } /* '' */
762
  .slimstat-font-docs:before { content: '\e816'; } /* '' */
763
 
764
- .animate-spin{-moz-animation:spin 3s infinite linear;-o-animation:spin 3s infinite linear;-webkit-animation:spin 3s infinite linear;animation:spin 3s infinite linear;display:inline-block}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
761
  .slimstat-font-stopwatch:before { content: '\e815'; } /* '' */
762
  .slimstat-font-docs:before { content: '\e816'; } /* '' */
763
 
764
+ .animate-spin{-moz-animation:spin 3s infinite linear;-o-animation:spin 3s infinite linear;-webkit-animation:spin 3s infinite linear;animation:spin 3s infinite linear;display:inline-block;line-height:1em;}@-moz-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-webkit-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-o-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@-ms-keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes spin{0%{-moz-transform:rotate(0deg);-o-transform:rotate(0deg);-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-moz-transform:rotate(359deg);-o-transform:rotate(359deg);-webkit-transform:rotate(359deg);transform:rotate(359deg)}}
admin/js/slimstat.admin.js CHANGED
@@ -15,7 +15,7 @@ var SlimStatAdmin = {
15
  clickable: true
16
  },
17
  legend: {
18
- container: '#chart-legend',
19
  noColumns: 4
20
  },
21
  pan: { interactive: true },
@@ -50,6 +50,7 @@ var SlimStatAdmin = {
50
  jQuery(".chart-placeholder").each( function() {
51
  SlimStatAdmin._placeholder = jQuery(this);
52
  SlimStatAdmin._chart_id = jQuery(this).parents('.postbox').attr('id');
 
53
 
54
  // Don't do anything if no placeholder or if hidden
55
  if (!SlimStatAdmin._placeholder.length || SlimStatAdmin._placeholder.is(':hidden')){
@@ -66,7 +67,7 @@ var SlimStatAdmin = {
66
 
67
  // Calculate the remaining options
68
  SlimStatAdmin._chart_options.colors = SlimStatAdminParams.chart_colors,
69
- //
70
  SlimStatAdmin._chart_options.xaxis = {
71
  ticks: (SlimStatAdmin.ticks[0][1].indexOf('/') > 0 && SlimStatAdmin.ticks.length > 16) ? [] : SlimStatAdmin.ticks,
72
  tickDecimals: 0,
@@ -198,7 +199,7 @@ var SlimStatAdmin = {
198
  else{
199
  report_id = 'slim_p7_02';
200
  data = {action: 'slimstat_load_report', report_id: report_id, security: jQuery('#meta-box-order-nonce').val(), page: SlimStatAdmin.get_query_string_value( 'page' ) };
201
- jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin3 animate-spin"></i></p>');
202
  SlimStatAdmin.refresh_report(report_id, data);
203
 
204
  window.clearTimeout(refresh_handle);
@@ -215,7 +216,7 @@ var SlimStatAdmin = {
215
  data[filters_input[i]['name']] = filters_input[i]['value'];
216
  }
217
 
218
- jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin3 animate-spin"></i></p>');
219
 
220
  jQuery.post(ajaxurl, data, function(response){
221
  if (report_id.indexOf('_01') > 0){
15
  clickable: true
16
  },
17
  legend: {
18
+ container: '',
19
  noColumns: 4
20
  },
21
  pan: { interactive: true },
50
  jQuery(".chart-placeholder").each( function() {
51
  SlimStatAdmin._placeholder = jQuery(this);
52
  SlimStatAdmin._chart_id = jQuery(this).parents('.postbox').attr('id');
53
+ SlimStatAdmin._chart_options.legend.container = '#' + SlimStatAdmin._chart_id + ' .chart-legend';
54
 
55
  // Don't do anything if no placeholder or if hidden
56
  if (!SlimStatAdmin._placeholder.length || SlimStatAdmin._placeholder.is(':hidden')){
67
 
68
  // Calculate the remaining options
69
  SlimStatAdmin._chart_options.colors = SlimStatAdminParams.chart_colors,
70
+
71
  SlimStatAdmin._chart_options.xaxis = {
72
  ticks: (SlimStatAdmin.ticks[0][1].indexOf('/') > 0 && SlimStatAdmin.ticks.length > 16) ? [] : SlimStatAdmin.ticks,
73
  tickDecimals: 0,
199
  else{
200
  report_id = 'slim_p7_02';
201
  data = {action: 'slimstat_load_report', report_id: report_id, security: jQuery('#meta-box-order-nonce').val(), page: SlimStatAdmin.get_query_string_value( 'page' ) };
202
+ jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin4 animate-spin"></i></p>');
203
  SlimStatAdmin.refresh_report(report_id, data);
204
 
205
  window.clearTimeout(refresh_handle);
216
  data[filters_input[i]['name']] = filters_input[i]['value'];
217
  }
218
 
219
+ jQuery('#'+report_id+' .inside').html('<p class="loading"><i class="slimstat-font-spin4 animate-spin"></i></p>');
220
 
221
  jQuery.post(ajaxurl, data, function(response){
222
  if (report_id.indexOf('_01') > 0){
admin/view/wp-slimstat-db.php CHANGED
@@ -630,7 +630,8 @@ class wp_slimstat_db {
630
  'SUM(counthits) AS counthits' ) );
631
  }
632
 
633
- public static function get_data_for_chart( $_data1 = '', $_data2 = '', $_where = '' ) {
 
634
  $previous = array( 'end' => self::$filters_normalized[ 'utime' ][ 'start' ] - 1 );
635
  $label_date_format = '';
636
  $output = array();
@@ -671,22 +672,26 @@ class wp_slimstat_db {
671
  break;
672
  }
673
 
 
 
 
 
674
  // Custom intervals don't have a comparison chart ('previous' range)
675
  if ( empty( self::$filters_normalized[ 'date' ][ 'interval' ] ) ) {
676
- $_where = self::get_combined_where( $_where, '*', false );
677
  $previous_time_range = ' AND (dt BETWEEN '.$previous[ 'start' ].' AND '.$previous[ 'end' ].' OR dt BETWEEN '.self::$filters_normalized[ 'utime' ][ 'start' ].' AND '.self::$filters_normalized[ 'utime' ][ 'end' ].')';
678
  }
679
  else {
680
- $_where = self::get_combined_where( $_where );
681
  $previous_time_range = '';
682
  }
683
 
684
  // Build the SQL query
685
  $group_by_string = "GROUP BY {$group_by[0]}(CONVERT_TZ(FROM_UNIXTIME(dt), @@session.time_zone, '+00:00')), {$group_by[1]}(CONVERT_TZ(FROM_UNIXTIME(dt), @@session.time_zone, '+00:00'))";
686
  $sql = "
687
- SELECT dt, $_data1 first_metric, $_data2 second_metric
688
  FROM {$GLOBALS['wpdb']->prefix}slim_stats
689
- WHERE $_where $previous_time_range
690
  $group_by_string";
691
 
692
  // Get the data
630
  'SUM(counthits) AS counthits' ) );
631
  }
632
 
633
+ // public static function get_data_for_chart( $_data1 = '', $_data2 = '', $_where = '' ) {
634
+ public static function get_data_for_chart( $_args = array() ) {
635
  $previous = array( 'end' => self::$filters_normalized[ 'utime' ][ 'start' ] - 1 );
636
  $label_date_format = '';
637
  $output = array();
672
  break;
673
  }
674
 
675
+ if ( empty( $_args[ 'where' ] ) ) {
676
+ $_args[ 'where' ] = '';
677
+ }
678
+
679
  // Custom intervals don't have a comparison chart ('previous' range)
680
  if ( empty( self::$filters_normalized[ 'date' ][ 'interval' ] ) ) {
681
+ $_args[ 'where' ] = self::get_combined_where( $_args[ 'where' ], '*', false );
682
  $previous_time_range = ' AND (dt BETWEEN '.$previous[ 'start' ].' AND '.$previous[ 'end' ].' OR dt BETWEEN '.self::$filters_normalized[ 'utime' ][ 'start' ].' AND '.self::$filters_normalized[ 'utime' ][ 'end' ].')';
683
  }
684
  else {
685
+ $_args[ 'where' ] = self::get_combined_where( $_args[ 'where' ] );
686
  $previous_time_range = '';
687
  }
688
 
689
  // Build the SQL query
690
  $group_by_string = "GROUP BY {$group_by[0]}(CONVERT_TZ(FROM_UNIXTIME(dt), @@session.time_zone, '+00:00')), {$group_by[1]}(CONVERT_TZ(FROM_UNIXTIME(dt), @@session.time_zone, '+00:00'))";
691
  $sql = "
692
+ SELECT dt, {$_args[ 'data1' ]} first_metric, {$_args[ 'data2' ]} second_metric
693
  FROM {$GLOBALS['wpdb']->prefix}slim_stats
694
+ WHERE {$_args[ 'where' ]} $previous_time_range
695
  $group_by_string";
696
 
697
  // Get the data
admin/view/wp-slimstat-reports.php CHANGED
@@ -100,7 +100,15 @@ class wp_slimstat_reports {
100
  'title' => __( 'Pageviews', 'wp-slimstat' ),
101
  'callback' => array( __CLASS__, 'show_chart' ),
102
  'callback_args' => array(
103
- 'type' => 'slim_p1_01'
 
 
 
 
 
 
 
 
104
  ),
105
  'classes' => array( 'wide', 'chart' ),
106
  'screens' => array( 'slimview2', 'dashboard' ),
@@ -163,7 +171,7 @@ class wp_slimstat_reports {
163
  ),
164
  'classes' => array( 'normal' ),
165
  'screens' => array( 'slimview2', 'dashboard' ),
166
- 'tooltip' => __( 'Here a "page" is not just a WordPress page type, but any webpage on your site, including posts, products, categories, and so on.', 'wp-slimstat' )
167
  ),
168
  'slim_p1_10' => array(
169
  'title' => __('Top Traffic Sources', 'wp-slimstat'),
@@ -245,12 +253,39 @@ class wp_slimstat_reports {
245
  'screens' => array( 'slimview2', 'dashboard' ),
246
  'tooltip' => __( 'When visitors leave a comment on your blog, WordPress assigns them a cookie. Slimstat leverages this information to identify returning visitors. Please note that visitors also include registered users.', 'wp-slimstat' )
247
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
248
 
249
  'slim_p2_01' => array(
250
  'title' => __( 'Human Visits', 'wp-slimstat' ),
251
  'callback' => array( __CLASS__, 'show_chart' ),
252
  'callback_args' => array(
253
- 'type' => 'slim_p2_01'
 
 
 
 
 
 
 
 
 
254
  ),
255
  'classes' => array( 'wide', 'chart' ),
256
  'screens' => array( 'slimview3' ),
@@ -458,12 +493,39 @@ class wp_slimstat_reports {
458
  'classes' => array( 'normal', 'hidden' ),
459
  'screens' => array( 'slimview3', 'dashboard' )
460
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
461
 
462
  'slim_p3_01' => array(
463
  'title' => __( 'Traffic Sources', 'wp-slimstat' ),
464
  'callback' => array( __CLASS__, 'show_chart' ),
465
  'callback_args' => array(
466
- 'type' => 'slim_p3_01'
 
 
 
 
 
 
 
 
 
467
  ),
468
  'classes' => array( 'wide', 'chart' ),
469
  'screens' => array( 'slimview5' ),
@@ -777,6 +839,24 @@ class wp_slimstat_reports {
777
  'classes' => array( 'normal', 'hidden' ),
778
  'screens' => array( 'slimview4' )
779
  ),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
780
 
781
  'slim_p6_01' => array(
782
  'title' => __( 'World Map', 'wp-slimstat' ),
@@ -792,18 +872,19 @@ class wp_slimstat_reports {
792
 
793
  // Define what reports have been deprecated over time, to remove them from the user's settings
794
  $deprecated_reports = array(
795
- 'slim_p1_05',
796
- 'slim_p1_18',
797
- 'slim_p2_10',
798
- 'slim_p3_03',
799
- 'slim_p3_04',
800
- 'slim_p3_05',
801
- 'slim_p3_08',
802
- 'slim_p3_09',
803
- 'slim_p3_10',
804
- 'slim_p4_08',
805
- 'slim_p4_14',
806
- 'slim_p4_17'
 
807
  );
808
 
809
  // Retrieve this user's list of active reports,
@@ -1127,39 +1208,37 @@ class wp_slimstat_reports {
1127
  }
1128
 
1129
  public static function show_chart( $_args = array() ){
1130
- wp_slimstat_db::$debug_message = '';
1131
-
1132
- switch ( $_args[ 'type' ] ) {
1133
- case 'slim_p1_01':
1134
- $chart_data = wp_slimstat_db::get_data_for_chart( 'COUNT(ip)', 'COUNT(DISTINCT(ip))' );
1135
- $chart_labels = array( __( 'Pageviews', 'wp-slimstat' ), __( 'Unique IPs', 'wp-slimstat' ) );
1136
- break;
1137
-
1138
- case 'slim_p2_01':
1139
- $chart_data = wp_slimstat_db::get_data_for_chart( 'COUNT(DISTINCT visit_id)', 'COUNT(DISTINCT ip)', '(visit_id > 0 AND browser_type <> 1)' );
1140
- $chart_labels = array( __( 'Visits', 'wp-slimstat' ), __( 'Unique IPs', 'wp-slimstat' ) );
1141
- break;
1142
-
1143
- case 'slim_p3_01':
1144
- $chart_data = wp_slimstat_db::get_data_for_chart( 'COUNT(DISTINCT(referer))', 'COUNT(DISTINCT(ip))', '(referer IS NOT NULL AND referer NOT LIKE "%' . home_url() . '%")' );
1145
- $chart_labels = array( __( 'Domains', 'wp-slimstat' ), __( 'Unique IPs', 'wp-slimstat' ) );
1146
- break;
1147
-
1148
- default:
1149
- $chart_data = array();
1150
- $chart_labels = array( '', '' );
1151
- break;
1152
- }
1153
-
1154
- echo wp_slimstat_db::$debug_message;
1155
  ?>
1156
  <div class="chart-placeholder"></div><div class="chart-legend"></div>
1157
  <script type="text/javascript">
1158
- SlimStatAdmin.chart_data[ '<?php echo $_args[ 'type' ] ?>' ] = [];
1159
 
1160
  <?php if ( !empty( $chart_data[ 'previous' ][ 'label' ] ) ) : ?>
1161
- SlimStatAdmin.chart_data[ '<?php echo $_args[ 'type' ] ?>' ].push({
1162
- label: '<?php echo $chart_labels[ 0 ] . ' ' . $chart_data[ 'previous' ][ 'label' ] ?>',
1163
  data: [<?php
1164
  $tmp_serialize = array();
1165
  $j = 0;
@@ -1176,8 +1255,8 @@ class wp_slimstat_reports {
1176
  }
1177
  }
1178
  });
1179
- SlimStatAdmin.chart_data[ '<?php echo $_args[ 'type' ] ?>' ].push({
1180
- label: '<?php echo $chart_labels[ 1 ] . ' ' . $chart_data[ 'previous' ][ 'label' ] ?>',
1181
  data: [<?php
1182
  $tmp_serialize = array();
1183
  $j = 0;
@@ -1196,8 +1275,8 @@ class wp_slimstat_reports {
1196
  });
1197
  <?php endif ?>
1198
 
1199
- SlimStatAdmin.chart_data[ '<?php echo $_args[ 'type' ] ?>' ].push({
1200
- label: '<?php echo $chart_labels[ 0 ] . ' ' . $chart_data[ 'current' ][ 'label' ] ?>',
1201
  data: [<?php
1202
  $tmp_serialize = array();
1203
  $j = 0;
@@ -1214,8 +1293,8 @@ class wp_slimstat_reports {
1214
  }
1215
  }
1216
  });
1217
- SlimStatAdmin.chart_data[ '<?php echo $_args[ 'type' ] ?>' ].push({
1218
- label: '<?php echo $chart_labels[ 1 ] . ' ' . $chart_data[ 'current' ][ 'label' ] ?>',
1219
  data: [<?php
1220
  $tmp_serialize = array();
1221
  $j = 0;
100
  'title' => __( 'Pageviews', 'wp-slimstat' ),
101
  'callback' => array( __CLASS__, 'show_chart' ),
102
  'callback_args' => array(
103
+ 'id' => 'slim_p1_01',
104
+ 'chart_data' => array(
105
+ 'data1' => 'COUNT( ip )',
106
+ 'data2' => 'COUNT( DISTINCT ip )'
107
+ ),
108
+ 'chart_labels' => array(
109
+ __( 'Pageviews', 'wp-slimstat' ),
110
+ __( 'Unique IPs', 'wp-slimstat' )
111
+ )
112
  ),
113
  'classes' => array( 'wide', 'chart' ),
114
  'screens' => array( 'slimview2', 'dashboard' ),
171
  ),
172
  'classes' => array( 'normal' ),
173
  'screens' => array( 'slimview2', 'dashboard' ),
174
+ 'tooltip' => __( 'Here a "page" is not just a WordPress page type, but any webpage on your site, including posts, products, categories, and so on. You can set the corresponding filter where Resource Content Type equals cpt:you_cpt_slug_here to get top web pages for a specific custom post type you have.', 'wp-slimstat' )
175
  ),
176
  'slim_p1_10' => array(
177
  'title' => __('Top Traffic Sources', 'wp-slimstat'),
253
  'screens' => array( 'slimview2', 'dashboard' ),
254
  'tooltip' => __( 'When visitors leave a comment on your blog, WordPress assigns them a cookie. Slimstat leverages this information to identify returning visitors. Please note that visitors also include registered users.', 'wp-slimstat' )
255
  ),
256
+ 'slim_p1_19_01' => array( // Chart Reports need to always have a _01 suffix to tell our custom "refresh" code to avoid fading the chart, which apparently doesn't work
257
+ 'title' => __( 'Search Terms', 'wp-slimstat' ),
258
+ 'callback' => array( __CLASS__, 'show_chart' ),
259
+ 'callback_args' => array(
260
+ 'id' => 'slim_p1_19_01',
261
+ 'chart_data' => array(
262
+ 'data1' => 'COUNT( searchterms )',
263
+ 'data2' => 'COUNT( DISTINCT searchterms )'
264
+ ),
265
+ 'chart_labels' => array(
266
+ __( 'Search Terms', 'wp-slimstat' ),
267
+ __( 'Unique Terms', 'wp-slimstat' )
268
+ )
269
+ ),
270
+ 'classes' => array( 'wide', 'chart' ),
271
+ 'screens' => array( 'slimview2' ),
272
+ 'tooltip' => $chart_tooltip
273
+ ),
274
 
275
  'slim_p2_01' => array(
276
  'title' => __( 'Human Visits', 'wp-slimstat' ),
277
  'callback' => array( __CLASS__, 'show_chart' ),
278
  'callback_args' => array(
279
+ 'id' => 'slim_p2_01',
280
+ 'chart_data' => array(
281
+ 'data1' => 'COUNT( DISTINCT visit_id )',
282
+ 'data2' => 'COUNT( DISTINCT ip )'
283
+ ),
284
+ 'chart_labels' => array(
285
+ __( 'Visits', 'wp-slimstat' ),
286
+ __( 'Unique IPs', 'wp-slimstat' )
287
+ ),
288
+ 'where' => '(visit_id > 0 AND browser_type <> 1)'
289
  ),
290
  'classes' => array( 'wide', 'chart' ),
291
  'screens' => array( 'slimview3' ),
493
  'classes' => array( 'normal', 'hidden' ),
494
  'screens' => array( 'slimview3', 'dashboard' )
495
  ),
496
+ 'slim_p2_22_01' => array( // Chart Reports need to always have a _01 suffix to tell our custom "refresh" code to avoid fading the chart, which apparently doesn't work
497
+ 'title' => __( 'Users', 'wp-slimstat' ),
498
+ 'callback' => array( __CLASS__, 'show_chart' ),
499
+ 'callback_args' => array(
500
+ 'id' => 'slim_p2_22_01',
501
+ 'chart_data' => array(
502
+ 'data1' => 'COUNT( username )',
503
+ 'data2' => 'COUNT( DISTINCT username )'
504
+ ),
505
+ 'chart_labels' => array(
506
+ __( 'Users', 'wp-slimstat' ),
507
+ __( 'Unique Users', 'wp-slimstat' )
508
+ )
509
+ ),
510
+ 'classes' => array( 'wide', 'chart' ),
511
+ 'screens' => array( 'slimview3' ),
512
+ 'tooltip' => $chart_tooltip
513
+ ),
514
 
515
  'slim_p3_01' => array(
516
  'title' => __( 'Traffic Sources', 'wp-slimstat' ),
517
  'callback' => array( __CLASS__, 'show_chart' ),
518
  'callback_args' => array(
519
+ 'id' => 'slim_p3_01',
520
+ 'chart_data' => array(
521
+ 'data1' => 'COUNT( DISTINCT referer )',
522
+ 'data2' => 'COUNT( DISTINCT ip )'
523
+ ),
524
+ 'chart_labels' => array(
525
+ __( 'Domains', 'wp-slimstat' ),
526
+ __( 'Unique IPs', 'wp-slimstat' )
527
+ ),
528
+ 'where' => '(referer IS NOT NULL AND referer NOT LIKE "%' . home_url() . '%")'
529
  ),
530
  'classes' => array( 'wide', 'chart' ),
531
  'screens' => array( 'slimview5' ),
839
  'classes' => array( 'normal', 'hidden' ),
840
  'screens' => array( 'slimview4' )
841
  ),
842
+ 'slim_p4_26_01' => array( // Chart Reports need to always have a _01 suffix to tell our custom "refresh" code to avoid fading the chart, which apparently doesn't work
843
+ 'title' => __( 'Outbound Links', 'wp-slimstat' ),
844
+ 'callback' => array( __CLASS__, 'show_chart' ),
845
+ 'callback_args' => array(
846
+ 'id' => 'slim_p4_26_01',
847
+ 'chart_data' => array(
848
+ 'data1' => 'COUNT( outbound_resource )',
849
+ 'data2' => 'COUNT( DISTINCT outbound_resource )'
850
+ ),
851
+ 'chart_labels' => array(
852
+ __( 'Outbound Links', 'wp-slimstat' ),
853
+ __( 'Unique Outbound', 'wp-slimstat' )
854
+ )
855
+ ),
856
+ 'classes' => array( 'wide', 'chart' ),
857
+ 'screens' => array( 'slimview4' ),
858
+ 'tooltip' => $chart_tooltip
859
+ ),
860
 
861
  'slim_p6_01' => array(
862
  'title' => __( 'World Map', 'wp-slimstat' ),
872
 
873
  // Define what reports have been deprecated over time, to remove them from the user's settings
874
  $deprecated_reports = array(
875
+ 'slim_p1_05' => 1,
876
+ 'slim_p1_18' => 1,
877
+ 'slim_p2_10' => 1,
878
+ 'slim_p3_03' => 1,
879
+ 'slim_p3_04' => 1,
880
+ 'slim_p3_05' => 1,
881
+ 'slim_p3_08' => 1,
882
+ 'slim_p3_09' => 1,
883
+ 'slim_p3_10' => 1,
884
+ 'slim_p4_08' => 1,
885
+ 'slim_p4_14' => 1,
886
+ 'slim_p4_16' => 1,
887
+ 'slim_p4_17' => 1
888
  );
889
 
890
  // Retrieve this user's list of active reports,
1208
  }
1209
 
1210
  public static function show_chart( $_args = array() ){
1211
+ $chart_data = wp_slimstat_db::get_data_for_chart( $_args[ 'chart_data' ] );
1212
+
1213
+ // switch ( $_args[ 'type' ] ) {
1214
+ // case 'slim_p1_01':
1215
+ // $chart_data = wp_slimstat_db::get_data_for_chart( 'COUNT(ip)', 'COUNT(DISTINCT(ip))' );
1216
+ // $chart_labels = array( __( 'Pageviews', 'wp-slimstat' ), __( 'Unique IPs', 'wp-slimstat' ) );
1217
+ // break;
1218
+
1219
+ // case 'slim_p2_01':
1220
+ // $chart_data = wp_slimstat_db::get_data_for_chart( 'COUNT(DISTINCT visit_id)', 'COUNT(DISTINCT ip)', '(visit_id > 0 AND browser_type <> 1)' );
1221
+ // $chart_labels = array( __( 'Visits', 'wp-slimstat' ), __( 'Unique IPs', 'wp-slimstat' ) );
1222
+ // break;
1223
+
1224
+ // case 'slim_p3_01':
1225
+ // $chart_data = wp_slimstat_db::get_data_for_chart( 'COUNT(DISTINCT(referer))', 'COUNT(DISTINCT(ip))', '(referer IS NOT NULL AND referer NOT LIKE "%' . home_url() . '%")' );
1226
+ // $chart_labels = array( __( 'Domains', 'wp-slimstat' ), __( 'Unique IPs', 'wp-slimstat' ) );
1227
+ // break;
1228
+
1229
+ // default:
1230
+ // $chart_data = array();
1231
+ // $chart_labels = array( '', '' );
1232
+ // break;
1233
+ // }
 
 
1234
  ?>
1235
  <div class="chart-placeholder"></div><div class="chart-legend"></div>
1236
  <script type="text/javascript">
1237
+ SlimStatAdmin.chart_data[ '<?php echo $_args[ 'id' ] ?>' ] = [];
1238
 
1239
  <?php if ( !empty( $chart_data[ 'previous' ][ 'label' ] ) ) : ?>
1240
+ SlimStatAdmin.chart_data[ '<?php echo $_args[ 'id' ] ?>' ].push({
1241
+ label: '<?php echo $_args[ 'chart_labels' ][ 0 ] . ' ' . $chart_data[ 'previous' ][ 'label' ] ?>',
1242
  data: [<?php
1243
  $tmp_serialize = array();
1244
  $j = 0;
1255
  }
1256
  }
1257
  });
1258
+ SlimStatAdmin.chart_data[ '<?php echo $_args[ 'id' ] ?>' ].push({
1259
+ label: '<?php echo $_args[ 'chart_labels' ][ 1 ] . ' ' . $chart_data[ 'previous' ][ 'label' ] ?>',
1260
  data: [<?php
1261
  $tmp_serialize = array();
1262
  $j = 0;
1275
  });
1276
  <?php endif ?>
1277
 
1278
+ SlimStatAdmin.chart_data[ '<?php echo $_args[ 'id' ] ?>' ].push({
1279
+ label: '<?php echo $_args[ 'chart_labels' ][ 0 ] . ' ' . $chart_data[ 'current' ][ 'label' ] ?>',
1280
  data: [<?php
1281
  $tmp_serialize = array();
1282
  $j = 0;
1293
  }
1294
  }
1295
  });
1296
+ SlimStatAdmin.chart_data[ '<?php echo $_args[ 'id' ] ?>' ].push({
1297
+ label: '<?php echo $_args[ 'chart_labels' ][ 1 ] . ' ' . $chart_data[ 'current' ][ 'label' ] ?>',
1298
  data: [<?php
1299
  $tmp_serialize = array();
1300
  $j = 0;
admin/wp-slimstat-admin.php CHANGED
@@ -311,211 +311,6 @@ class wp_slimstat_admin{
311
  public static function update_tables_and_options(){
312
  $my_wpdb = apply_filters('slimstat_custom_wpdb', $GLOBALS['wpdb']);
313
 
314
- // --- Updates for version 3.8.4 ---
315
- if (version_compare(wp_slimstat::$options['version'], '3.8.4', '<')){
316
- $my_wpdb->query("CREATE TABLE {$GLOBALS['wpdb']->prefix}slim_stats_archive LIKE {$GLOBALS['wpdb']->prefix}slim_stats");
317
- }
318
- // --- END: Updates for version 3.8.4 ---
319
-
320
- // --- Updates for version 3.9.6 ---
321
- if (version_compare(wp_slimstat::$options['version'], '3.9.6', '<')){
322
- // Consolidate some settings
323
- $classes = wp_slimstat::string_to_array(wp_slimstat::$options['ignore_outbound_classes']);
324
- $rel = wp_slimstat::string_to_array(wp_slimstat::$options['ignore_outbound_rel']);
325
- $href = wp_slimstat::string_to_array(wp_slimstat::$options['ignore_outbound_href']);
326
- wp_slimstat::$options['ignore_outbound_classes_rel_href'] = implode(',', array_merge($classes, $rel, $href));
327
-
328
- $classes = wp_slimstat::string_to_array(wp_slimstat::$options['do_not_track_outbound_classes']);
329
- $rel = wp_slimstat::string_to_array(wp_slimstat::$options['do_not_track_outbound_rel']);
330
- $href = wp_slimstat::string_to_array(wp_slimstat::$options['do_not_track_outbound_href']);
331
- wp_slimstat::$options['do_not_track_outbound_classes_rel_href'] = implode(',', array_merge($classes, $rel, $href));
332
-
333
- // More secure secret key
334
- wp_slimstat::$options['secret'] = wp_hash(uniqid(time(), true));
335
- }
336
- // --- END: Updates for version 3.9.6 ---
337
-
338
- // --- Updates for version 3.9.8.2 ---
339
- if (version_compare(wp_slimstat::$options['version'], '3.9.8.2', '<')){
340
- // The GeoLite DB is already installed, let's unzip it to improve the tracker's performance
341
- if (file_exists(wp_slimstat::$maxmind_path.'.gz')){
342
- @unlink(wp_slimstat::$maxmind_path.'.gz');
343
- wp_slimstat::download_maxmind_database();
344
- }
345
- }
346
- // --- END: Updates for version 3.9.8.2 ---
347
-
348
- // --- Updates for version 4.0 ---
349
- if (version_compare(wp_slimstat::$options['version'], '4.0', '<')){
350
- $GLOBALS['wpdb']->query("DELETE FROM {$GLOBALS['wpdb']->prefix}usermeta WHERE meta_key LIKE 'meta-box-order_slimstat%'");
351
-
352
- $have_innodb = $GLOBALS['wpdb']->get_results("SHOW VARIABLES LIKE 'have_innodb'", ARRAY_A);
353
- $use_innodb = (!empty($have_innodb[0]) && $have_innodb[0]['Value'] == 'YES')?'ENGINE=InnoDB':'';
354
-
355
- // Create the new table
356
- self::_create_table ("
357
- CREATE TABLE IF NOT EXISTS {$GLOBALS['wpdb']->prefix}slim_stats_4 (
358
- id INT UNSIGNED NOT NULL auto_increment,
359
- ip INT UNSIGNED DEFAULT 0,
360
- other_ip INT UNSIGNED DEFAULT 0,
361
- username VARCHAR(255) DEFAULT NULL,
362
- country VARCHAR(16) DEFAULT NULL,
363
- referer VARCHAR(2048) DEFAULT NULL,
364
- resource VARCHAR(2048) DEFAULT NULL,
365
- searchterms VARCHAR(2048) DEFAULT NULL,
366
- plugins VARCHAR(255) DEFAULT NULL,
367
- notes VARCHAR(2048) DEFAULT NULL,
368
- visit_id INT UNSIGNED NOT NULL DEFAULT 0,
369
- server_latency INT(10) UNSIGNED DEFAULT 0,
370
- page_performance INT(10) UNSIGNED DEFAULT 0,
371
-
372
- browser VARCHAR(40) DEFAULT NULL,
373
- browser_version VARCHAR(15) DEFAULT NULL,
374
- browser_type TINYINT UNSIGNED DEFAULT 0,
375
- platform VARCHAR(15) DEFAULT NULL,
376
- language VARCHAR(5) DEFAULT NULL,
377
- user_agent VARCHAR(2048) DEFAULT NULL,
378
-
379
- resolution VARCHAR(12) DEFAULT NULL,
380
- screen_width SMALLINT UNSIGNED DEFAULT 0,
381
- screen_height SMALLINT UNSIGNED DEFAULT 0,
382
-
383
- content_type VARCHAR(64) DEFAULT NULL,
384
- category VARCHAR(256) DEFAULT NULL,
385
- author VARCHAR(64) DEFAULT NULL,
386
- content_id BIGINT(20) UNSIGNED DEFAULT 0,
387
-
388
- outbound_resource VARCHAR(2048) DEFAULT NULL,
389
-
390
- dt INT(10) UNSIGNED DEFAULT 0,
391
-
392
- CONSTRAINT PRIMARY KEY (id),
393
- INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
394
- ) COLLATE utf8_general_ci $use_innodb", $GLOBALS['wpdb']->prefix.'slim_stats_4', $my_wpdb );
395
-
396
- // Create the archive table
397
- $my_wpdb->query( "CREATE TABLE IF NOT EXISTS {$GLOBALS['wpdb']->prefix}slim_stats_archive_4 LIKE {$GLOBALS['wpdb']->prefix}slim_stats_4" );
398
-
399
- // Rename old and new tables
400
- $my_wpdb->query( "RENAME TABLE {$GLOBALS['wpdb']->prefix}slim_stats TO {$GLOBALS['wpdb']->prefix}slim_stats_3" );
401
- $my_wpdb->query( "RENAME TABLE {$GLOBALS['wpdb']->prefix}slim_stats_4 TO {$GLOBALS['wpdb']->prefix}slim_stats" );
402
- $my_wpdb->query( "RENAME TABLE {$GLOBALS['wpdb']->prefix}slim_stats_archive TO {$GLOBALS['wpdb']->prefix}slim_stats_archive_3" );
403
- $my_wpdb->query( "RENAME TABLE {$GLOBALS['wpdb']->prefix}slim_stats_archive_4 TO {$GLOBALS['wpdb']->prefix}slim_stats_archive" );
404
-
405
- // Create the new events table
406
- $my_wpdb->query( "
407
- CREATE TABLE IF NOT EXISTS {$GLOBALS['wpdb']->prefix}slim_events (
408
- event_id INT(10) NOT NULL AUTO_INCREMENT,
409
- type TINYINT UNSIGNED DEFAULT 0,
410
- event_description VARCHAR(64) DEFAULT NULL,
411
- notes VARCHAR(256) DEFAULT NULL,
412
- position VARCHAR(32) DEFAULT NULL,
413
- id INT UNSIGNED NOT NULL DEFAULT 0,
414
- dt INT(10) UNSIGNED DEFAULT 0,
415
-
416
- CONSTRAINT PRIMARY KEY (event_id),
417
- INDEX idx_{$GLOBALS['wpdb']->prefix}slim_events (dt),
418
- CONSTRAINT fk_{$GLOBALS['wpdb']->prefix}id FOREIGN KEY (id) REFERENCES {$GLOBALS['wpdb']->prefix}slim_stats(id) ON UPDATE CASCADE ON DELETE CASCADE
419
- ) COLLATE utf8_general_ci $use_innodb" );
420
-
421
- // Copy the data if less than 750k records
422
- $count_records = $my_wpdb->get_var("SELECT COUNT(*) FROM {$GLOBALS['wpdb']->prefix}slim_stats");
423
- if ($count_records <= 750000){
424
- $my_wpdb->query( "
425
- INSERT INTO {$GLOBALS['wpdb']->prefix}slim_stats (
426
- id,
427
- ip,
428
- other_ip,
429
- username,
430
- country,
431
- referer,
432
- resource,
433
- searchterms,
434
- plugins,
435
- notes,
436
- visit_id,
437
- server_latency,
438
- page_performance,
439
-
440
- browser,
441
- browser_version,
442
- browser_type,
443
- platform,
444
- language,
445
- user_agent,
446
-
447
- screen_width,
448
- screen_height,
449
-
450
- content_type,
451
- category,
452
- author,
453
- content_id,
454
-
455
- outbound_resource,
456
-
457
- dt
458
- )
459
- SELECT
460
- t1.id,
461
- t1.ip,
462
- t1.other_ip,
463
- NULLIF(t1.user, ''),
464
- NULLIF(t1.country, ''),
465
- NULLIF(t1.referer, ''),
466
- NULLIF(t1.resource, ''),
467
- NULLIF(t1.searchterms, ''),
468
- NULLIF(t1.plugins, ''),
469
- NULLIF(t1.notes, ''),
470
- t1.visit_id,
471
- t1.server_latency,
472
- t1.page_performance,
473
-
474
- NULLIF(tb.browser, ''),
475
- NULLIF(tb.version, ''),
476
- tb.type,
477
- NULLIF(tb.platform, ''),
478
- NULLIF(t1.language, ''),
479
- NULLIF(tb.user_agent, ''),
480
-
481
- 9812,
482
- 9812,
483
-
484
- NULLIF(tci.content_type, ''),
485
- NULLIF(tci.category, ''),
486
- NULLIF(tci.author, ''),
487
- tci.content_id,
488
-
489
- NULL,
490
-
491
- t1.dt
492
-
493
- FROM {$GLOBALS['wpdb']->prefix}slim_stats_3 AS t1
494
- INNER JOIN {$GLOBALS['wpdb']->base_prefix}slim_browsers AS tb ON t1.browser_id = tb.browser_id
495
- INNER JOIN {$GLOBALS['wpdb']->base_prefix}slim_content_info AS tci ON t1.content_info_id = tci.content_info_id" );
496
-
497
- // Copy the events
498
- $my_wpdb->query( "
499
- INSERT INTO {$GLOBALS['wpdb']->prefix}slim_events (
500
- type,
501
- event_description,
502
- notes,
503
- position,
504
- id,
505
- dt
506
- )
507
- SELECT
508
- tob.type,
509
- SUBSTRING(tob.notes, LOCATE('Event:', tob.notes)+6, LOCATE(',', tob.notes, LOCATE('Event:', tob.notes)+6) - LOCATE('Event:', tob.notes)-6),
510
- SUBSTRING(tob.notes, 1, LOCATE('Event:', tob.notes) - 3),
511
- tob.position,
512
- tob.id,
513
- tob.dt
514
- FROM {$GLOBALS['wpdb']->prefix}slim_outbound AS tob" );
515
- }
516
- }
517
- // --- END: Updates for version 4.0 ---
518
-
519
  // --- Updates for version 4.1.3 ---
520
  if ( version_compare( wp_slimstat::$options[ 'version' ], '4.1.3', '<' ) ) {
521
  // Change column type to add IPv6 support
@@ -533,6 +328,7 @@ class wp_slimstat_admin{
533
  // Change column type to add IPv6 support
534
  $my_wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD dt_out INT(10) UNSIGNED DEFAULT 0 AFTER outbound_resource" );
535
  }
 
536
 
537
  // --- Updates for version 4.2 ---
538
  if ( version_compare( wp_slimstat::$options[ 'version' ], '4.2', '<' ) ) {
@@ -556,8 +352,16 @@ class wp_slimstat_admin{
556
  }
557
  // --- END: Updates for version 4.2 ---
558
 
 
 
 
 
 
 
 
 
559
  // Now we can update the version stored in the database
560
- //wp_slimstat::$options['version'] = wp_slimstat::$version;
561
 
562
  return true;
563
  }
311
  public static function update_tables_and_options(){
312
  $my_wpdb = apply_filters('slimstat_custom_wpdb', $GLOBALS['wpdb']);
313
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
314
  // --- Updates for version 4.1.3 ---
315
  if ( version_compare( wp_slimstat::$options[ 'version' ], '4.1.3', '<' ) ) {
316
  // Change column type to add IPv6 support
328
  // Change column type to add IPv6 support
329
  $my_wpdb->query( "ALTER TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats ADD dt_out INT(10) UNSIGNED DEFAULT 0 AFTER outbound_resource" );
330
  }
331
+ // --- END: Updates for version 4.1.7 ---
332
 
333
  // --- Updates for version 4.2 ---
334
  if ( version_compare( wp_slimstat::$options[ 'version' ], '4.2', '<' ) ) {
352
  }
353
  // --- END: Updates for version 4.2 ---
354
 
355
+ // --- Updates for version 4.2.1 ---
356
+ if ( version_compare( wp_slimstat::$options[ 'version' ], '4.2.1', '<' ) ) {
357
+ // Remove old unused columns, if still there.
358
+ $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats DROP COLUMN ip_temp, DROP COLUMN other_ip_temp, DROP COLUMN ip_num, DROP COLUMN other_ip_num" );
359
+ $my_wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats_archive DROP COLUMN ip_temp, DROP COLUMN other_ip_temp, DROP COLUMN ip_num, DROP COLUMN other_ip_num" );
360
+ }
361
+ // --- END: Updates for version 4.2.1 ---
362
+
363
  // Now we can update the version stored in the database
364
+ wp_slimstat::$options['version'] = wp_slimstat::$version;
365
 
366
  return true;
367
  }
readme.txt CHANGED
@@ -5,7 +5,7 @@ Tags: analytics, tracking, reports, analyze, wassup, geolocation, online users,
5
  Text Domain: wp-slimstat
6
  Requires at least: 3.8
7
  Tested up to: 4.4
8
- Stable tag: 4.2.0.1
9
 
10
  == Description ==
11
  [youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
@@ -27,9 +27,9 @@ Stable tag: 4.2.0.1
27
  * WordPress 3.8+
28
  * PHP 5.3+
29
  * MySQL 5.0.3+
30
- * At least 25 MB of free web space
31
  * At least 5 MB of free DB space
32
- * At least 20 Mb of free PHP memory for the tracker (peak memory usage)
33
  * IE9+ or any browser supporting HTML5, to access the reports
34
 
35
  = Premium Add-ons =
@@ -44,7 +44,9 @@ Visit [our website](http://www.wp-slimstat.com/addons/) for a list of available
44
  5. Go to Slimstat > Settings > Maintenance tab > MaxMind IP to Country section and click on "Install GeoLite DB" to detect your visitors' countries based on their IP addresses
45
  6. If your `wp-admin` folder is not publicly accessible, make sure to check the [FAQs](http://wordpress.org/extend/plugins/wp-slimstat/faq/) to see if there's anything else you need to do
46
 
47
- Please note: if you decide to uninstall Slimstat, all the stats will be **PERMANENTLY** deleted from your database. Make sure to setup a database backup (wp_slim_*) to avoid losing your data.
 
 
48
 
49
  == Frequently Asked Questions ==
50
 
@@ -60,6 +62,14 @@ Our knowledge base is available on our [support center](http://docs.wp-slimstat.
60
 
61
  == Changelog ==
62
 
 
 
 
 
 
 
 
 
63
  = 4.2.0.1 =
64
  * [Fix] The Access Log report was not displaying referrers and other critical information.
65
 
@@ -158,11 +168,6 @@ Our knowledge base is available on our [support center](http://docs.wp-slimstat.
158
  * [Fix] Quotes in post titles were being escaped twice (better safe than sorry, right? thank you, Victor).
159
  * [Fix] Bug affecting the Export to Excel add-on.
160
 
161
- == Special Thanks To ==
162
-
163
- * [Vitaly](http://www.visbiz.org/), who volunteers quite a lot of time for QA, testing, and for his Russian localization.
164
- * Davide Tomasello, who provided great feedback and plenty of ideas to take this plugin to the next level.
165
-
166
  == Supporters ==
167
  Slimstat is an Open Source project, dependent in large parts on donations. [This page](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BNJR5EZNY3W38)
168
  is for those who want to donate money - be it once, be it regularly, be it a small or a big amount. Everything is set up for an easy donation process.
@@ -212,13 +217,7 @@ Thomas Weiss,
212
  Wayne Liebman,
213
  Willow Ridge Press
214
 
215
- == Tools of the trade ==
216
- [Duri.Me](http://duri.me/),
217
- [Filezilla](https://filezilla-project.org/),
218
- [Fontello](http://fontello.com/),
219
- [Gimp](http://www.gimp.org/),
220
- [Google Chrome](https://www.google.com/intl/en/chrome/browser/),
221
- [poEdit](http://www.poedit.net/),
222
- [Notepad++](http://notepad-plus-plus.org/),
223
- [Tortoise SVN](http://tortoisesvn.net/),
224
- [WAMP Server](http://www.wampserver.com/en/)
5
  Text Domain: wp-slimstat
6
  Requires at least: 3.8
7
  Tested up to: 4.4
8
+ Stable tag: 4.2.1
9
 
10
  == Description ==
11
  [youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
27
  * WordPress 3.8+
28
  * PHP 5.3+
29
  * MySQL 5.0.3+
30
+ * At least 35 MB of free web space
31
  * At least 5 MB of free DB space
32
+ * At least 30 Mb of free PHP memory for the tracker (peak memory usage)
33
  * IE9+ or any browser supporting HTML5, to access the reports
34
 
35
  = Premium Add-ons =
44
  5. Go to Slimstat > Settings > Maintenance tab > MaxMind IP to Country section and click on "Install GeoLite DB" to detect your visitors' countries based on their IP addresses
45
  6. If your `wp-admin` folder is not publicly accessible, make sure to check the [FAQs](http://wordpress.org/extend/plugins/wp-slimstat/faq/) to see if there's anything else you need to do
46
 
47
+ == Please note ==
48
+ * If you decide to uninstall Slimstat, all the stats will be **PERMANENTLY** deleted from your database. Make sure to setup a database backup (wp_slim_*) to avoid losing your data.
49
+ * If you are upgrading from a version prior to 4.0, please install version 4.0 first to upgrade the database structure and download the new Geolocation data.
50
 
51
  == Frequently Asked Questions ==
52
 
62
 
63
  == Changelog ==
64
 
65
+ = 4.2.1 =
66
+ * [Note] If you're upgrading from a version prior to 4.0, please upgrade to version 4.0 first. To simplify our codebase, we removed all the upgrade scripts to support versions prior to 4.0.
67
+ * [New] Say hi to your new charts: search terms (total and unique per day or even hour), outbound links, users. If you can't see the new charts, don't forget to give the No Panic button a try.
68
+ * [Update] We are dropping old unused columns from the main table: ip_temp, other_ip_temp, ip_num, other_ip_num. Please make sure you have a backup, in case you need those columns for other custom purposes.
69
+ * [Fix] Some users were seeing "ghost reports" in their admin screens. A residue from Halloween, we assume.
70
+ * [Fix] Our "loading" animated icon was not being displayed correctly on refresh.
71
+ * [Fix] Chart legend was not being displayed as expected.
72
+
73
  = 4.2.0.1 =
74
  * [Fix] The Access Log report was not displaying referrers and other critical information.
75
 
168
  * [Fix] Quotes in post titles were being escaped twice (better safe than sorry, right? thank you, Victor).
169
  * [Fix] Bug affecting the Export to Excel add-on.
170
 
 
 
 
 
 
171
  == Supporters ==
172
  Slimstat is an Open Source project, dependent in large parts on donations. [This page](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BNJR5EZNY3W38)
173
  is for those who want to donate money - be it once, be it regularly, be it a small or a big amount. Everything is set up for an easy donation process.
217
  Wayne Liebman,
218
  Willow Ridge Press
219
 
220
+ == Special Thanks To ==
221
+
222
+ * [Vitaly](http://www.visbiz.org/), who volunteers quite a lot of time for QA, testing, and for his Russian localization.
223
+ * Davide Tomasello, who provided great feedback and plenty of ideas to take this plugin to the next level.
 
 
 
 
 
 
wp-slimstat.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP Slimstat
4
  Plugin URI: http://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
- Version: 4.2.0.1
7
  Author: Camu
8
  Author URI: http://www.wp-slimstat.com/
9
  Text Domain: wp-slimstat
@@ -13,7 +13,7 @@ Domain Path: /languages
13
  if ( !empty( wp_slimstat::$options ) ) return true;
14
 
15
  class wp_slimstat {
16
- public static $version = '4.2.0.1';
17
  public static $options = array();
18
 
19
  public static $wpdb = '';
3
  Plugin Name: WP Slimstat
4
  Plugin URI: http://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
+ Version: 4.2.1
7
  Author: Camu
8
  Author URI: http://www.wp-slimstat.com/
9
  Text Domain: wp-slimstat
13
  if ( !empty( wp_slimstat::$options ) ) return true;
14
 
15
  class wp_slimstat {
16
+ public static $version = '4.2.1';
17
  public static $options = array();
18
 
19
  public static $wpdb = '';