Slimstat Analytics - Version 3.9.5

Version Description

  • [Note] Some of our add-ons had a bug preventing them from properly checking for updates. Please contact us if you need to obtain the latest version of your add-ons.
  • [Update] The Save button in the settings is now always visible, so that there is no need to scroll all the way to the bottom to save your options.
  • [Update] More data layer updates introduced in wp_slimstat_db. Keep an eye on your custom add-ons!
  • [Fix] Pagination was not working as expected when a date range was set in the filters (thank you, nick-v)
Download this release

Release Info

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

Code changes from version 3.9.4 to 3.9.5

admin/css/slimstat.css CHANGED
@@ -459,6 +459,11 @@
459
  .form-table #slimstat-filter-name, .form-table #slimstat-filter-operator, .form-table #slimstat-filter-value{
460
  width: 20%;
461
  }
 
 
 
 
 
462
 
463
  /* Add-ons Page */
464
  .wp-list-table.slimstat-addons{
459
  .form-table #slimstat-filter-name, .form-table #slimstat-filter-operator, .form-table #slimstat-filter-value{
460
  width: 20%;
461
  }
462
+ .slimstat p.submit{
463
+ position: fixed;
464
+ right: 25px;
465
+ top: 30px;
466
+ }
467
 
468
  /* Add-ons Page */
469
  .wp-list-table.slimstat-addons{
admin/view/index.php CHANGED
@@ -95,8 +95,8 @@
95
  <input type="hidden" class="slimstat-filter-date" name="slimstat-filter-date" value=""/>
96
  <br/>
97
  <select name="interval_direction" class="short" id="slimstat-filter-interval_direction">
98
- <option value="minus" <?php selected(wp_slimstat_db::$filters_normalized['date']['interval_direction'], 'minus')?>>-</option>
99
- <option value="plus" <?php selected(wp_slimstat_db::$filters_normalized['date']['interval_direction'], 'plus')?>>+</option>
100
  </select>
101
  <input type="text" name="interval" id="slimstat-filter-interval" placeholder="<?php _e('days', 'wp-slimstat') ?>" class="short empty-on-focus" value="<?php echo !empty(wp_slimstat_db::$filters_normalized['date']['interval'])?wp_slimstat_db::$filters_normalized['date']['interval']:'' ?>">,
102
  <input type="text" name="interval_hours" id="slimstat-filter-interval_hours" placeholder="<?php _e('hours', 'wp-slimstat') ?>" class="short empty-on-focus" value="<?php echo !empty(wp_slimstat_db::$filters_normalized['date']['interval_hours'])?wp_slimstat_db::$filters_normalized['date']['interval_hours']:'' ?>">:
@@ -109,7 +109,7 @@
109
  !empty(wp_slimstat_db::$filters_normalized['date']['interval']) ||
110
  !empty(wp_slimstat_db::$filters_normalized['date']['interval_hours']) ||
111
  !empty(wp_slimstat_db::$filters_normalized['date']['interval_minutes'])): ?>
112
- <a class="slimstat-filter-link button-secondary" href="<?php echo wp_slimstat_reports::fs_url('minute equals 0&&&hour equals 0&&&day equals 0&&&month equals '.date_i18n('n').'&&&year equals 0&&&interval_direction equals future&&&interval equals 0&&&interval_hours equals 0&&&interval_minutes equals 0') ?>"><?php _e('Reset Filters','wp-slimstat') ?></a>
113
  <?php endif ?>
114
  </span>
115
  </fieldset><!-- .slimstat-date-filters -->
95
  <input type="hidden" class="slimstat-filter-date" name="slimstat-filter-date" value=""/>
96
  <br/>
97
  <select name="interval_direction" class="short" id="slimstat-filter-interval_direction">
98
+ <option value="minus" <?php selected(wp_slimstat_db::$filters_normalized['date']['interval_direction'], array('', 'minus')) ?>>-</option>
99
+ <option value="plus" <?php selected(wp_slimstat_db::$filters_normalized['date']['interval_direction'], 'plus') ?>>+</option>
100
  </select>
101
  <input type="text" name="interval" id="slimstat-filter-interval" placeholder="<?php _e('days', 'wp-slimstat') ?>" class="short empty-on-focus" value="<?php echo !empty(wp_slimstat_db::$filters_normalized['date']['interval'])?wp_slimstat_db::$filters_normalized['date']['interval']:'' ?>">,
102
  <input type="text" name="interval_hours" id="slimstat-filter-interval_hours" placeholder="<?php _e('hours', 'wp-slimstat') ?>" class="short empty-on-focus" value="<?php echo !empty(wp_slimstat_db::$filters_normalized['date']['interval_hours'])?wp_slimstat_db::$filters_normalized['date']['interval_hours']:'' ?>">:
109
  !empty(wp_slimstat_db::$filters_normalized['date']['interval']) ||
110
  !empty(wp_slimstat_db::$filters_normalized['date']['interval_hours']) ||
111
  !empty(wp_slimstat_db::$filters_normalized['date']['interval_minutes'])): ?>
112
+ <a class="slimstat-filter-link button-secondary" href="<?php echo wp_slimstat_reports::fs_url('minute equals 0&&&hour equals 0&&&day equals 0&&&month equals '.date_i18n('n').'&&&year equals 0&&&interval_direction equals plus&&&interval equals 0&&&interval_hours equals 0&&&interval_minutes equals 0') ?>"><?php _e('Reset Filters','wp-slimstat') ?></a>
113
  <?php endif ?>
114
  </span>
115
  </fieldset><!-- .slimstat-date-filters -->
admin/view/wp-slimstat-db.php CHANGED
@@ -463,7 +463,7 @@ class wp_slimstat_db {
463
  SELECT $_column ".(!empty($_as_column)?'AS '.$_as_column:'')." $_more_columns, COUNT(*) counthits
464
  FROM ".self::$sql_filters['from']['all'].' '.self::_add_filters_to_sql_from($_column.$_custom_where.$_more_columns).'
465
  WHERE '.(empty($_custom_where)?"$_column <> '' ":$_custom_where).' '.self::$sql_filters['where']['all'].' '.self::$sql_filters['where']['time_range']."
466
- GROUP BY $_column $_more_columns $_having_clause
467
  ORDER BY counthits ".self::$filters_normalized['misc']['direction']."
468
  LIMIT ".self::$filters_normalized['misc']['start_from'].', '.self::$filters_normalized['misc']['limit_results'],
469
  (!empty($_as_column)?$_as_column:$_column).' '.$_more_columns.', blog_id',
@@ -506,11 +506,11 @@ class wp_slimstat_db {
506
  'MAX(maxid), SUM(counthits)');
507
  }
508
 
509
- public static function get_recent($_column = 't1.id', $_custom_where = '', $_join_tables = '', $_having_clause = '', $_order_by = '', $_use_date_filters = true){
510
  if ($_column == 't1.id'){
511
  return self::get_results('
512
- SELECT t1.*'.(!empty($_join_tables)?', '.$_join_tables:'').'
513
- FROM '.self::$sql_filters['from']['all'].' '.(!empty($_join_tables)?self::_add_filters_to_sql_from($_join_tables):'').'
514
  WHERE '.(empty($_custom_where)?"$_column <> 0 ":$_custom_where).' '.self::$sql_filters['where']['all'].' '.($_use_date_filters?self::$sql_filters['where']['time_range']:'').'
515
  ORDER BY '.(empty($_order_by)?'t1.dt '.self::$filters_normalized['misc']['direction']:$_order_by).'
516
  LIMIT '.self::$filters_normalized['misc']['start_from'].', '.self::$filters_normalized['misc']['limit_results'],
@@ -520,17 +520,17 @@ class wp_slimstat_db {
520
  }
521
  else{
522
  return self::get_results('
523
- SELECT t1.*, '.(!empty($_join_tables)?$_join_tables:'ts1.maxid')."
524
  FROM (
525
  SELECT $_column, MAX(t1.id) maxid
526
  FROM ".self::$sql_filters['from']['all'].' '.self::_add_filters_to_sql_from($_column.$_custom_where).'
527
  WHERE '.(empty($_custom_where)?"$_column <> '' ":$_custom_where).' '.self::$sql_filters['where']['all'].' '.($_use_date_filters?self::$sql_filters['where']['time_range']:'')."
528
  GROUP BY $_column $_having_clause
529
  ) AS ts1 INNER JOIN {$GLOBALS['wpdb']->prefix}slim_stats t1 ON ts1.maxid = t1.id ".
530
- (!empty($_join_tables)?self::_add_filters_to_sql_from($_join_tables):'').'
531
  ORDER BY '.(empty($_order_by)?'t1.dt '.self::$filters_normalized['misc']['direction']:$_order_by).'
532
  LIMIT '.self::$filters_normalized['misc']['start_from'].', '.self::$filters_normalized['misc']['limit_results'],
533
- 't1.*, '.(!empty($_join_tables)?$_join_tables:'ts1.maxid'),
534
  empty($_order_by)?'t1.dt '.self::$filters_normalized['misc']['direction']:$_order_by);
535
  }
536
  }
@@ -573,7 +573,7 @@ class wp_slimstat_db {
573
  break;
574
  case 'interval':
575
  $group_by = array('MONTH', 'DAY', 'j');
576
- $values_in_interval = array(abs(self::$filters_normalized['date']['interval']) + 1, abs(self::$filters_normalized['date']['interval']) + 1, 0, 86400);
577
  break;
578
  default:
579
  $previous['start'] = mktime(0, 0, 0, (!empty(self::$filters_normalized['date']['month'])?self::$filters_normalized['date']['month']:date_i18n('n'))-1, 1, !empty(self::$filters_normalized['date']['year'])?self::$filters_normalized['date']['year']:date_i18n('Y'));
@@ -661,7 +661,7 @@ class wp_slimstat_db {
661
  $filters_normalized = array(
662
  'columns' => array(),
663
  'date' => array(
664
- 'interval_direction' => 'minus',
665
  'is_past' => false
666
  ),
667
  'misc' => $_init_misc?array(
@@ -757,7 +757,7 @@ class wp_slimstat_db {
757
  $intval_filter = intval($a_filter[3]);
758
  $filters_normalized['date'][$a_filter[1]] = abs($intval_filter);
759
  if ($intval_filter < 0){
760
- $filters_normalized['date'][interval_direction] = 'minus';
761
  }
762
  break;
763
  case 'interval_direction':
463
  SELECT $_column ".(!empty($_as_column)?'AS '.$_as_column:'')." $_more_columns, COUNT(*) counthits
464
  FROM ".self::$sql_filters['from']['all'].' '.self::_add_filters_to_sql_from($_column.$_custom_where.$_more_columns).'
465
  WHERE '.(empty($_custom_where)?"$_column <> '' ":$_custom_where).' '.self::$sql_filters['where']['all'].' '.self::$sql_filters['where']['time_range']."
466
+ GROUP BY $_column $_having_clause
467
  ORDER BY counthits ".self::$filters_normalized['misc']['direction']."
468
  LIMIT ".self::$filters_normalized['misc']['start_from'].', '.self::$filters_normalized['misc']['limit_results'],
469
  (!empty($_as_column)?$_as_column:$_column).' '.$_more_columns.', blog_id',
506
  'MAX(maxid), SUM(counthits)');
507
  }
508
 
509
+ public static function get_recent($_column = 't1.id', $_custom_where = '', $_more_columns = '', $_having_clause = '', $_order_by = '', $_use_date_filters = true){
510
  if ($_column == 't1.id'){
511
  return self::get_results('
512
+ SELECT t1.*'.(!empty($_more_columns)?', '.$_more_columns:'').'
513
+ FROM '.self::$sql_filters['from']['all'].' '.(!empty($_more_columns)?self::_add_filters_to_sql_from($_more_columns):'').'
514
  WHERE '.(empty($_custom_where)?"$_column <> 0 ":$_custom_where).' '.self::$sql_filters['where']['all'].' '.($_use_date_filters?self::$sql_filters['where']['time_range']:'').'
515
  ORDER BY '.(empty($_order_by)?'t1.dt '.self::$filters_normalized['misc']['direction']:$_order_by).'
516
  LIMIT '.self::$filters_normalized['misc']['start_from'].', '.self::$filters_normalized['misc']['limit_results'],
520
  }
521
  else{
522
  return self::get_results('
523
+ SELECT t1.*, '.(!empty($_more_columns)?$_more_columns:'ts1.maxid')."
524
  FROM (
525
  SELECT $_column, MAX(t1.id) maxid
526
  FROM ".self::$sql_filters['from']['all'].' '.self::_add_filters_to_sql_from($_column.$_custom_where).'
527
  WHERE '.(empty($_custom_where)?"$_column <> '' ":$_custom_where).' '.self::$sql_filters['where']['all'].' '.($_use_date_filters?self::$sql_filters['where']['time_range']:'')."
528
  GROUP BY $_column $_having_clause
529
  ) AS ts1 INNER JOIN {$GLOBALS['wpdb']->prefix}slim_stats t1 ON ts1.maxid = t1.id ".
530
+ (!empty($_more_columns)?self::_add_filters_to_sql_from($_more_columns):'').'
531
  ORDER BY '.(empty($_order_by)?'t1.dt '.self::$filters_normalized['misc']['direction']:$_order_by).'
532
  LIMIT '.self::$filters_normalized['misc']['start_from'].', '.self::$filters_normalized['misc']['limit_results'],
533
+ 't1.*, '.(!empty($_more_columns)?$_more_columns:'ts1.maxid'),
534
  empty($_order_by)?'t1.dt '.self::$filters_normalized['misc']['direction']:$_order_by);
535
  }
536
  }
573
  break;
574
  case 'interval':
575
  $group_by = array('MONTH', 'DAY', 'j');
576
+ $values_in_interval = array(abs(self::$filters_normalized['date']['interval']), abs(self::$filters_normalized['date']['interval']), 0, 86400);
577
  break;
578
  default:
579
  $previous['start'] = mktime(0, 0, 0, (!empty(self::$filters_normalized['date']['month'])?self::$filters_normalized['date']['month']:date_i18n('n'))-1, 1, !empty(self::$filters_normalized['date']['year'])?self::$filters_normalized['date']['year']:date_i18n('Y'));
661
  $filters_normalized = array(
662
  'columns' => array(),
663
  'date' => array(
664
+ 'interval_direction' => '',
665
  'is_past' => false
666
  ),
667
  'misc' => $_init_misc?array(
757
  $intval_filter = intval($a_filter[3]);
758
  $filters_normalized['date'][$a_filter[1]] = abs($intval_filter);
759
  if ($intval_filter < 0){
760
+ $filters_normalized['date']['interval_direction'] = 'minus';
761
  }
762
  break;
763
  case 'interval_direction':
admin/view/wp-slimstat-reports.php CHANGED
@@ -276,7 +276,7 @@ class wp_slimstat_reports {
276
  }
277
 
278
  public static function report_header($_id = 'p0', $_postbox_class = 'normal', $_tooltip = '', $_title = '', $_show_reload = true){
279
- $header_buttons = $_show_reload?'<a class="button-ajax refresh slimstat-font-spin3" title="'.__('Refresh','wp-slimstat').'" href="'.wp_slimstat_reports::fs_url().'"></a>':'';
280
  $header_buttons = apply_filters('slimstat_report_header_buttons', $header_buttons, $_id);
281
  $header_buttons = '<div class="slimstat-header-buttons">'.$header_buttons.'</div>';
282
 
@@ -311,21 +311,27 @@ class wp_slimstat_reports {
311
  $filters_normalized = wp_slimstat_db::parse_filters($_filters, false);
312
  if (!empty($filters_normalized['columns'])){
313
  foreach($filters_normalized['columns'] as $a_key => $a_filter){
314
- $filtered_url .= "&amp;fs%5B$a_key%5D=".urlencode($a_filter[0].' '.$a_filter[1]);
 
 
315
  }
316
  }
317
 
318
  // Date ranges
319
  if (!empty($filters_normalized['date'])){
320
  foreach($filters_normalized['date'] as $a_key => $a_filter){
321
- $filtered_url .= "&amp;fs%5B$a_key%5D=".urlencode('equals '.$a_filter);
 
 
322
  }
323
  }
324
 
325
  // Misc filters
326
  if (!empty($filters_normalized['misc'])){
327
  foreach($filters_normalized['misc'] as $a_key => $a_filter){
328
- $filtered_url .= "&amp;fs%5B$a_key%5D=".urlencode('equals '.$a_filter);
 
 
329
  }
330
  }
331
 
@@ -421,7 +427,7 @@ class wp_slimstat_reports {
421
  //$count_all_results = wp_slimstat_db::count_records();
422
  switch($_type){
423
  case 'recent':
424
- $all_results = wp_slimstat_db::get_recent($column, $_args['custom_where'], $_args['join_tables'], $_args['having_clause'], $_args['order_by'], $_args['use_date_filters']);
425
  break;
426
  case 'popular':
427
  $all_results = wp_slimstat_db::get_popular($column, $_args['custom_where'], $_args['more_columns'], $_args['having_clause'], $_args['as_column']);
@@ -1250,13 +1256,13 @@ class wp_slimstat_reports {
1250
  self::show_results('recent', $_report_id, 'country');
1251
  break;
1252
  case 'slim_p2_14':
1253
- self::show_results('recent', $_report_id, 'resolution', array('join_tables' => 'tss.*'));
1254
  break;
1255
  case 'slim_p2_15':
1256
- self::show_results('recent', $_report_id, 'platform', array('join_tables' => 'tb.*'));
1257
  break;
1258
  case 'slim_p2_16':
1259
- self::show_results('recent', $_report_id, 'browser', array('join_tables' => 'tb.*'));
1260
  break;
1261
  case 'slim_p2_17':
1262
  self::show_results('recent', $_report_id, 'language');
@@ -1319,7 +1325,7 @@ class wp_slimstat_reports {
1319
  self::show_results('popular', $_report_id, 'searchterms', array('total_for_percentage' => wp_slimstat_db::count_records('(t1.resource = "__l_s__" OR t1.resource = "" OR tci.content_type LIKE "%search%")'), 'custom_where' => '(t1.resource = "__l_s__" OR t1.resource = "" OR tci.content_type LIKE "%search%")'));
1320
  break;
1321
  case 'slim_p4_15':
1322
- self::show_results('recent', $_report_id, 'resource', array('custom_where' => '(tci.content_type = "category" OR tci.content_type = "tag")', 'join_tables' => 'tci.*'));
1323
  break;
1324
  case 'slim_p4_16':
1325
  self::show_results('popular', $_report_id, 'resource', array('total_for_percentage' => wp_slimstat_db::count_records('(t1.resource LIKE "[404]%" OR tci.content_type LIKE "%404%")'), 'custom_where' => '(t1.resource LIKE "[404]%" OR tci.content_type LIKE "%404%")'));
276
  }
277
 
278
  public static function report_header($_id = 'p0', $_postbox_class = 'normal', $_tooltip = '', $_title = '', $_show_reload = true){
279
+ $header_buttons = $_show_reload?'<a class="button-ajax refresh slimstat-font-spin3" title="'.__('Refresh','wp-slimstat').'" href="'.self::fs_url().'"></a>':'';
280
  $header_buttons = apply_filters('slimstat_report_header_buttons', $header_buttons, $_id);
281
  $header_buttons = '<div class="slimstat-header-buttons">'.$header_buttons.'</div>';
282
 
311
  $filters_normalized = wp_slimstat_db::parse_filters($_filters, false);
312
  if (!empty($filters_normalized['columns'])){
313
  foreach($filters_normalized['columns'] as $a_key => $a_filter){
314
+ if (!empty($a_filter[1])){
315
+ $filtered_url .= "&amp;fs%5B$a_key%5D=".urlencode($a_filter[0].' '.$a_filter[1]);
316
+ }
317
  }
318
  }
319
 
320
  // Date ranges
321
  if (!empty($filters_normalized['date'])){
322
  foreach($filters_normalized['date'] as $a_key => $a_filter){
323
+ if (!empty($a_filter) || $a_filter === 0){
324
+ $filtered_url .= "&amp;fs%5B$a_key%5D=".urlencode('equals '.$a_filter);
325
+ }
326
  }
327
  }
328
 
329
  // Misc filters
330
  if (!empty($filters_normalized['misc'])){
331
  foreach($filters_normalized['misc'] as $a_key => $a_filter){
332
+ if (!empty($a_filter)){
333
+ $filtered_url .= "&amp;fs%5B$a_key%5D=".urlencode('equals '.$a_filter);
334
+ }
335
  }
336
  }
337
 
427
  //$count_all_results = wp_slimstat_db::count_records();
428
  switch($_type){
429
  case 'recent':
430
+ $all_results = wp_slimstat_db::get_recent($column, $_args['custom_where'], $_args['more_columns'], $_args['having_clause'], $_args['order_by'], $_args['use_date_filters']);
431
  break;
432
  case 'popular':
433
  $all_results = wp_slimstat_db::get_popular($column, $_args['custom_where'], $_args['more_columns'], $_args['having_clause'], $_args['as_column']);
1256
  self::show_results('recent', $_report_id, 'country');
1257
  break;
1258
  case 'slim_p2_14':
1259
+ self::show_results('recent', $_report_id, 'resolution', array('more_columns' => 'tss.*'));
1260
  break;
1261
  case 'slim_p2_15':
1262
+ self::show_results('recent', $_report_id, 'platform', array('more_columns' => 'tb.*'));
1263
  break;
1264
  case 'slim_p2_16':
1265
+ self::show_results('recent', $_report_id, 'browser', array('more_columns' => 'tb.*'));
1266
  break;
1267
  case 'slim_p2_17':
1268
  self::show_results('recent', $_report_id, 'language');
1325
  self::show_results('popular', $_report_id, 'searchterms', array('total_for_percentage' => wp_slimstat_db::count_records('(t1.resource = "__l_s__" OR t1.resource = "" OR tci.content_type LIKE "%search%")'), 'custom_where' => '(t1.resource = "__l_s__" OR t1.resource = "" OR tci.content_type LIKE "%search%")'));
1326
  break;
1327
  case 'slim_p4_15':
1328
+ self::show_results('recent', $_report_id, 'resource', array('custom_where' => '(tci.content_type = "category" OR tci.content_type = "tag")', 'more_columns' => 'tci.*'));
1329
  break;
1330
  case 'slim_p4_16':
1331
  self::show_results('popular', $_report_id, 'resource', array('total_for_percentage' => wp_slimstat_db::count_records('(t1.resource LIKE "[404]%" OR tci.content_type LIKE "%404%")'), 'custom_where' => '(t1.resource LIKE "[404]%" OR tci.content_type LIKE "%404%")'));
admin/wp-slimstat-admin.php CHANGED
@@ -12,8 +12,7 @@ class wp_slimstat_admin{
12
  */
13
  public static function init(){
14
  if ((wp_slimstat::$options['enable_ads_network'] == 'yes' || wp_slimstat::$options['enable_ads_network'] == 'no')){
15
- self::$admin_notice = 'Our plans to update the database layer are moving forward. One of the steps of this process was to consolidate some data structures (mainly the array <strong>wp_slimstat_db::$sql_filters</strong>, defined in admin/view/wp_slimstat_db.php). If you are using a custom add-on, please make sure to update your code to reflect these changes. Feel free to <a href="http://support.getused.to.it" target="_blank">contact us</a> if you need help. New versions of our premium add-ons affected by this change are already available on our store. We apologize for the inconvenience this may have caused.';
16
-
17
  // self::$admin_notice = "The wait is over: our heatmap add-on is finally available <a href='http://slimstat.getused.to.it/downloads/heatmap/' target='_blank'>on our store</a>. We would like to thank all our users who helped us shape this initial release. Go grab your own copy today!";
18
  // self::$admin_notice = "We've been working on the documentation for Slimstat. Now you can find <a href='https://slimstat.freshdesk.com/support/solutions' target='_blank'>detailed information</a> about all the actions and filters available in our source code. Developers can use them to build their own custom add-ons. More information coming soon!";
19
  // self::$admin_notice = "Our add-ons update checker had been unavailable for a while, we apologize for the inconvenience. Now the service is up and running again. Please make sure to update your add-ons to the latest version. If you don't get a message that a new version is available for your add-on (and yet you see the newer version number on our website), feel free to contact us on our support site, and we will send it to you via email.";
12
  */
13
  public static function init(){
14
  if ((wp_slimstat::$options['enable_ads_network'] == 'yes' || wp_slimstat::$options['enable_ads_network'] == 'no')){
15
+ self::$admin_notice = "We discovered a bug in our Export to Excel and User Overview add-ons, which prevents them from properly checking for updates, under certain circumstances. Please go to Slimstat > Add-ons to see what the current version available is, and then compare it with the version number you see in your Plugins admin screen. Feel free to <a href='http://support.getused.to.it/' target='_blank'>contact us</a>, if you need to obtain the latest version. Thank you for your cooperation.";
 
16
  // self::$admin_notice = "The wait is over: our heatmap add-on is finally available <a href='http://slimstat.getused.to.it/downloads/heatmap/' target='_blank'>on our store</a>. We would like to thank all our users who helped us shape this initial release. Go grab your own copy today!";
17
  // self::$admin_notice = "We've been working on the documentation for Slimstat. Now you can find <a href='https://slimstat.freshdesk.com/support/solutions' target='_blank'>detailed information</a> about all the actions and filters available in our source code. Developers can use them to build their own custom add-ons. More information coming soon!";
18
  // self::$admin_notice = "Our add-ons update checker had been unavailable for a while, we apologize for the inconvenience. Now the service is up and running again. Please make sure to update your add-ons to the latest version. If you don't get a message that a new version is available for your add-on (and yet you see the newer version number on our website), feel free to contact us on our support site, and we will send it to you via email.";
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: coolmann
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BNJR5EZNY3W38
4
  Tags: analytics, tracking, reports, analyze, wassup, geolocation, online users, spider, tracker, pageviews, stats, maxmind, statistics, statpress
5
  Requires at least: 3.8
6
- Tested up to: 4.1
7
- Stable tag: 3.9.4
8
 
9
  == Description ==
10
  Visit our [website](http://slimstat.getused.to.it/) for more information and to [watch our introductory videos](http://slimstat.getused.to.it/features/video-tutorials/).
@@ -63,6 +63,12 @@ Our knowledge base is available on our [support center](https://slimstat.freshde
63
 
64
  == Changelog ==
65
 
 
 
 
 
 
 
66
  = 3.9.4 =
67
  * [Note] The URL of the CDN has changed, and is now using the official WordPress repository as a source: cdn.jsdelivr.net/wp/wp-slimstat/trunk/wp-slimstat.js - Please update your "external" tracking codes accordingly.
68
  * [Note] The structure of the array **wp_slimstat_db::$sql_filters** has changed! Please make sure to update your custom code accordingly. Feel free to [contact us](http://support.getused.to.it) for more information.
@@ -73,7 +79,7 @@ Our knowledge base is available on our [support center](https://slimstat.freshde
73
  * [Fix] Line height of report rows has been added to avoid conflicts with other plugins tweaking this parameter in the admin (thank you, [yk11](https://wordpress.org/support/topic/widgets-bottom-is-cut-off)).
74
 
75
  = 3.9.3 =
76
- * [New] We're starting to work on a completely redesigned data layer, which will require less SQL resources and offer a much needed performance improvement. Stay tuned.
77
  * [New] Three new settings to turn off the tracker completely on specific links (internal and external), by class name, rel attribute or simply by URL.
78
  * [Update] MaxMind GeoLite IP has been updated to the latest version (2015-01-06).
79
  * [Fix] Bug affecting our add-ons setting page, in some specific circumstances (thank you, Erik).
3
  Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=BNJR5EZNY3W38
4
  Tags: analytics, tracking, reports, analyze, wassup, geolocation, online users, spider, tracker, pageviews, stats, maxmind, statistics, statpress
5
  Requires at least: 3.8
6
+ Tested up to: 4.2
7
+ Stable tag: 3.9.5
8
 
9
  == Description ==
10
  Visit our [website](http://slimstat.getused.to.it/) for more information and to [watch our introductory videos](http://slimstat.getused.to.it/features/video-tutorials/).
63
 
64
  == Changelog ==
65
 
66
+ = 3.9.5 =
67
+ * [Note] Some of our add-ons had a bug preventing them from properly checking for updates. Please [contact us](http://support.getused.to.it) if you need to obtain the latest version of your add-ons.
68
+ * [Update] The Save button in the settings is now always visible, so that there is no need to scroll all the way to the bottom to save your options.
69
+ * [Update] More data layer updates introduced in wp_slimstat_db. Keep an eye on your custom add-ons!
70
+ * [Fix] Pagination was not working as expected when a date range was set in the filters (thank you, [nick-v](https://wordpress.org/support/topic/paging-is-broke))
71
+
72
  = 3.9.4 =
73
  * [Note] The URL of the CDN has changed, and is now using the official WordPress repository as a source: cdn.jsdelivr.net/wp/wp-slimstat/trunk/wp-slimstat.js - Please update your "external" tracking codes accordingly.
74
  * [Note] The structure of the array **wp_slimstat_db::$sql_filters** has changed! Please make sure to update your custom code accordingly. Feel free to [contact us](http://support.getused.to.it) for more information.
79
  * [Fix] Line height of report rows has been added to avoid conflicts with other plugins tweaking this parameter in the admin (thank you, [yk11](https://wordpress.org/support/topic/widgets-bottom-is-cut-off)).
80
 
81
  = 3.9.3 =
82
+ * [Note] We're starting to work on a completely redesigned data layer, which will require less SQL resources and offer a much needed performance improvement. Stay tuned.
83
  * [New] Three new settings to turn off the tracker completely on specific links (internal and external), by class name, rel attribute or simply by URL.
84
  * [Update] MaxMind GeoLite IP has been updated to the latest version (2015-01-06).
85
  * [Fix] Bug affecting our add-ons setting page, in some specific circumstances (thank you, Erik).
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: 3.9.4
7
  Author: Camu
8
  Author URI: http://slimstat.getused.to.it/
9
  */
@@ -11,7 +11,7 @@ Author URI: http://slimstat.getused.to.it/
11
  if (!empty(wp_slimstat::$options)) return true;
12
 
13
  class wp_slimstat{
14
- public static $version = '3.9.4';
15
  public static $options = array();
16
 
17
  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: 3.9.5
7
  Author: Camu
8
  Author URI: http://slimstat.getused.to.it/
9
  */
11
  if (!empty(wp_slimstat::$options)) return true;
12
 
13
  class wp_slimstat{
14
+ public static $version = '3.9.5';
15
  public static $options = array();
16
 
17
  public static $wpdb = '';