Simple History - Version 2.7.1

Version Description

(June 2016) =

  • Added: Add shortcut to history in Admin bar for current site and in Network Admin Bar for each site where plugin is installed. Can be disabled using filters simple_history/add_admin_bar_menu_item and simple_history/add_admin_bar_network_menu_item.
  • Added: Add check that mbstring is enabled and show a warning if it's not.
  • Changed: Changes to "Front Page Displays" in "Reading Settings" now show the name of the old and new page (before only id was logged).
  • Changed: Changes to "Default Post Category" and "Default Mail Category" in "Writing Settings" now show the name of the old and new category (before only id was logged).
  • Fixed: When changing "Front Page Displays" in "Reading Settings" the option "rewrite_rules" also got logged.
  • Fixed: Changes in Permalink Settings were not logged correctly.
  • Fixed: Actions done with WP-CLI was not correctly attributed. Now the log should say "WP-CLI" intead of "Other" for actions done in WP CLI.
Download this release

Release Info

Developer eskapism
Plugin Icon 128x128 Simple History
Version 2.7.1
Comparing to
See all releases

Code changes from version 2.7 to 2.7.1

inc/SimpleHistory.php CHANGED
@@ -63,8 +63,8 @@ class SimpleHistory {
63
  /** Slug for the settings menu */
64
  const SETTINGS_MENU_SLUG = "simple_history_settings_menu_slug";
65
 
66
- /** Slug for the settings menu */
67
- const SETTINGS_GENERAL_OPTION_GROUP = "simple_history_settings_group";
68
 
69
  /** ID for the general settings section */
70
  const SETTINGS_SECTION_GENERAL_ID = "simple_history_settings_section_general";
@@ -114,6 +114,9 @@ class SimpleHistory {
114
 
115
  add_filter( 'gettext', array( $this, "filter_gettext_storeLatestTranslations" ), 10, 3 );
116
 
 
 
 
117
  if ( is_admin() ) {
118
 
119
  $this->add_admin_actions();
@@ -183,8 +186,144 @@ class SimpleHistory {
183
 
184
  add_filter( 'plugin_action_links_simple-history/index.php', array( $this, 'plugin_action_links' ), 10, 4 );
185
 
 
186
  }
187
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
  /**
189
  * Get singleton intance
190
  * @return SimpleHistory instance
@@ -1525,22 +1664,22 @@ Because Simple History was just recently installed, this feed does not contain m
1525
 
1526
  <?php
1527
 
1528
- // Output contents for selected tab
1529
- $arr_active_tab = wp_filter_object_list( $arr_settings_tabs, array( "slug" => $active_tab ) );
1530
- $arr_active_tab = current( $arr_active_tab );
1531
 
1532
- // We must have found an active tab and it must have a callable function
1533
- if ( ! $arr_active_tab || ! is_callable( $arr_active_tab["function"] ) ) {
1534
- wp_die( __( "No valid callback found", "simple-history" ) );
1535
- }
1536
 
1537
- $args = array(
1538
- "arr_active_tab" => $arr_active_tab,
1539
- );
1540
 
1541
- call_user_func_array( $arr_active_tab["function"], $args );
1542
 
1543
- ?>
1544
 
1545
  </div>
1546
  <?php
@@ -1667,8 +1806,8 @@ Because Simple History was just recently installed, this feed does not contain m
1667
  );
1668
 
1669
  // Nonces for show where inputs
1670
- register_setting( SimpleHistory::SETTINGS_GENERAL_OPTION_GROUP, "simple_history_show_on_dashboard" );
1671
- register_setting( SimpleHistory::SETTINGS_GENERAL_OPTION_GROUP, "simple_history_show_as_page" );
1672
 
1673
  // Dropdown number if items to show
1674
  add_settings_field(
@@ -1786,6 +1925,7 @@ Because Simple History was just recently installed, this feed does not contain m
1786
 
1787
  $setting = get_option( "simple_history_show_as_page", 1 );
1788
  $setting = apply_filters( "simple_history_show_as_page", $setting );
 
1789
  return (bool) $setting;
1790
 
1791
  }
@@ -1821,6 +1961,7 @@ Because Simple History was just recently installed, this feed does not contain m
1821
 
1822
  $show_on_dashboard = $this->setting_show_on_dashboard();
1823
  $show_as_page = $this->setting_show_as_page();
 
1824
  ?>
1825
 
1826
  <input <?php echo $show_on_dashboard ? "checked='checked'" : ""?> type="checkbox" value="1" name="simple_history_show_on_dashboard" id="simple_history_show_on_dashboard" class="simple_history_show_on_dashboard" />
@@ -2979,7 +3120,7 @@ Because Simple History was just recently installed, this feed does not contain m
2979
  function get_num_events_last_n_days( $period_days = 28 ) {
2980
 
2981
  $transient_key = "sh_" . md5( __METHOD__ . $period_days . "_2");
2982
-
2983
  $count = get_transient( $transient_key );
2984
 
2985
 
@@ -2991,8 +3132,8 @@ Because Simple History was just recently installed, this feed does not contain m
2991
 
2992
  $sql = sprintf(
2993
  '
2994
- SELECT count(*)
2995
- FROM %1$s
2996
  WHERE UNIX_TIMESTAMP(date) >= %2$d
2997
  AND logger IN %3$s
2998
  ',
@@ -3000,13 +3141,13 @@ Because Simple History was just recently installed, this feed does not contain m
3000
  strtotime("-$period_days days"),
3001
  $sqlStringLoggersUserCanRead
3002
  );
3003
-
3004
  $count = $wpdb->get_var( $sql );
3005
 
3006
  set_transient( $transient_key, $count, HOUR_IN_SECONDS );
3007
 
3008
  }
3009
-
3010
  return $count;
3011
 
3012
  } // get_num_events_last_n_days
@@ -3015,7 +3156,7 @@ Because Simple History was just recently installed, this feed does not contain m
3015
  function get_num_events_per_day_last_n_days( $period_days = 28 ) {
3016
 
3017
  $transient_key = "sh_" . md5( __METHOD__ . $period_days . "_2");
3018
-
3019
  $dates = get_transient( $transient_key );
3020
 
3021
  if ( false === $dates ) {
@@ -3026,12 +3167,12 @@ Because Simple History was just recently installed, this feed does not contain m
3026
 
3027
  $sql = sprintf(
3028
  '
3029
- SELECT
3030
  date_format(date, "%%Y-%%m-%%d") AS yearDate,
3031
  count(date) AS count
3032
- FROM
3033
  %1$s
3034
- WHERE
3035
  UNIX_TIMESTAMP(date) >= %2$d
3036
  AND logger IN (%3$d)
3037
  GROUP BY yearDate
@@ -3048,7 +3189,7 @@ Because Simple History was just recently installed, this feed does not contain m
3048
  // echo "set";exit;
3049
 
3050
  } else {
3051
- // echo "get";exit;
3052
  }
3053
 
3054
  return $dates;
@@ -3069,13 +3210,13 @@ Because Simple History was just recently installed, this feed does not contain m
3069
  $numEvents = get_transient( $cache_key );
3070
 
3071
  if ( false == $numEvents ) {
3072
-
3073
  $sql = $wpdb->prepare("
3074
  SELECT count( DISTINCT occasionsID )
3075
  FROM $table_name
3076
- WHERE date >= DATE_ADD(CURDATE(), INTERVAL -%d DAY)
3077
  ", $days);
3078
-
3079
  $numEvents = $wpdb->get_var($sql);
3080
 
3081
  set_transient( $cache_key, $numEvents, HOUR_IN_SECONDS );
@@ -3189,7 +3330,7 @@ function simple_history_text_diff( $left_string, $right_string, $args = null ) {
3189
 
3190
  if ( ! $diff )
3191
  return '';
3192
-
3193
  $r = "";
3194
 
3195
  $r .= "<div class='SimpleHistory__diff__contents' tabindex='0'>";
63
  /** Slug for the settings menu */
64
  const SETTINGS_MENU_SLUG = "simple_history_settings_menu_slug";
65
 
66
+ /** Slug for the settings menu */
67
+ const SETTINGS_GENERAL_OPTION_GROUP = "simple_history_settings_group";
68
 
69
  /** ID for the general settings section */
70
  const SETTINGS_SECTION_GENERAL_ID = "simple_history_settings_section_general";
114
 
115
  add_filter( 'gettext', array( $this, "filter_gettext_storeLatestTranslations" ), 10, 3 );
116
 
117
+ add_action( 'admin_bar_menu', array( $this, 'add_admin_bar_network_menu_item' ), 40 );
118
+ add_action( 'admin_bar_menu', array( $this, 'add_admin_bar_menu_item' ), 40 );
119
+
120
  if ( is_admin() ) {
121
 
122
  $this->add_admin_actions();
186
 
187
  add_filter( 'plugin_action_links_simple-history/index.php', array( $this, 'plugin_action_links' ), 10, 4 );
188
 
189
+
190
  }
191
 
192
+ /**
193
+ * Adds a "View history" item/shortcut to the network admin, on blogs where Simple History is installed
194
+ *
195
+ * Useful because Simple History is something at least the author of this plugin often use on a site :)
196
+ *
197
+ * @since 2.7.1
198
+ */
199
+ function add_admin_bar_network_menu_item( $wp_admin_bar ) {
200
+
201
+ /**
202
+ * Filter to control if admin bar shortcut should be added
203
+ *
204
+ * @since 2.7.1
205
+ *
206
+ * @param bool Add item
207
+ */
208
+ $add_items = apply_filters( "simple_history/add_admin_bar_network_menu_item", true );
209
+
210
+ if ( ! $add_items ) {
211
+ return;
212
+ }
213
+
214
+ // Don't show for logged out users or single site mode.
215
+ if ( ! is_user_logged_in() || ! is_multisite() )
216
+ return;
217
+
218
+ // Show only when the user has at least one site, or they're a super admin.
219
+ if ( count( $wp_admin_bar->user->blogs ) < 1 && ! is_super_admin() )
220
+ return;
221
+
222
+ // Setting to show as page must be true
223
+ if ( ! $this->setting_show_as_page() ) {
224
+ return;
225
+ }
226
+
227
+ // User must have capability to view the history page
228
+ if ( ! current_user_can( $this->get_view_history_capability() ) ) {
229
+ return $actions;
230
+ }
231
+
232
+ /* menu_page_url() is defined in the WordPress Plugin Administration API, which is not loaded here by default */
233
+ /* dito for is_plugin_active() */
234
+ require_once(ABSPATH . 'wp-admin/includes/plugin.php');
235
+
236
+ foreach ( (array) $wp_admin_bar->user->blogs as $blog ) {
237
+
238
+ switch_to_blog( $blog->userblog_id );
239
+
240
+ if ( is_plugin_active( SIMPLE_HISTORY_BASENAME ) ) {
241
+
242
+ $menu_id = "simple-history-blog-" . $blog->userblog_id;
243
+ $parent_menu_id = 'blog-' . $blog->userblog_id;
244
+ $url = admin_url( "index.php?page=simple_history_page" );
245
+
246
+ // Each network site is added by WP core with id "blog-1", "blog-2" ... "blog-n"
247
+ // https://codex.wordpress.org/Function_Reference/add_node
248
+ $args = array(
249
+ 'id' => $menu_id,
250
+ 'parent' => $parent_menu_id,
251
+ 'title' => _x("View History", "Admin bar network name", "simple-history"),
252
+ 'href' => $url,
253
+ 'meta' => array(
254
+ 'class' => 'ab-item--simplehistory'
255
+ )
256
+ );
257
+
258
+ $wp_admin_bar->add_node( $args );
259
+
260
+ } // if plugin active
261
+
262
+ restore_current_blog();
263
+
264
+ } // foreach blog
265
+
266
+ } // func
267
+
268
+
269
+ /**
270
+ * Adds a "View history" item/shortcut to the admin bar
271
+ *
272
+ * Useful because Simple History is something at least the author of this plugin often use on a site :)
273
+ *
274
+ * @since 2.7.1
275
+ */
276
+ function add_admin_bar_menu_item( $wp_admin_bar ) {
277
+
278
+ /**
279
+ * Filter to control if admin bar shortcut should be added
280
+ *
281
+ * @since 2.7.1
282
+ *
283
+ * @param bool Add item
284
+ */
285
+ $add_item = apply_filters( "simple_history/add_admin_bar_menu_item", true );
286
+
287
+ if ( ! $add_item ) {
288
+ return;
289
+ }
290
+
291
+ // Don't show for logged out users
292
+ if ( ! is_user_logged_in() )
293
+ return;
294
+
295
+ // Setting to show as page must be true
296
+ if ( ! $this->setting_show_as_page() ) {
297
+ return;
298
+ }
299
+
300
+ // User must have capability to view the history page
301
+ if ( ! current_user_can( $this->get_view_history_capability() ) ) {
302
+ return $actions;
303
+ }
304
+
305
+ /* menu_page_url() is defined in the WordPress Plugin Administration API, which is not loaded here by default */
306
+ /* dito for is_plugin_active() */
307
+ require_once(ABSPATH . 'wp-admin/includes/plugin.php');
308
+
309
+ $menu_id = "simple-history-view-history";
310
+ $parent_menu_id = 'site-name';
311
+ $url = admin_url( "index.php?page=simple_history_page" );
312
+
313
+ $args = array(
314
+ 'id' => $menu_id,
315
+ 'parent' => $parent_menu_id,
316
+ 'title' => _x("Simple History", "Admin bar name", "simple-history"),
317
+ 'href' => $url,
318
+ 'meta' => array(
319
+ 'class' => 'ab-item--simplehistory'
320
+ )
321
+ );
322
+
323
+ $wp_admin_bar->add_node( $args );
324
+
325
+ } // func
326
+
327
  /**
328
  * Get singleton intance
329
  * @return SimpleHistory instance
1664
 
1665
  <?php
1666
 
1667
+ // Output contents for selected tab
1668
+ $arr_active_tab = wp_filter_object_list( $arr_settings_tabs, array( "slug" => $active_tab ) );
1669
+ $arr_active_tab = current( $arr_active_tab );
1670
 
1671
+ // We must have found an active tab and it must have a callable function
1672
+ if ( ! $arr_active_tab || ! is_callable( $arr_active_tab["function"] ) ) {
1673
+ wp_die( __( "No valid callback found", "simple-history" ) );
1674
+ }
1675
 
1676
+ $args = array(
1677
+ "arr_active_tab" => $arr_active_tab,
1678
+ );
1679
 
1680
+ call_user_func_array( $arr_active_tab["function"], $args );
1681
 
1682
+ ?>
1683
 
1684
  </div>
1685
  <?php
1806
  );
1807
 
1808
  // Nonces for show where inputs
1809
+ register_setting( SimpleHistory::SETTINGS_GENERAL_OPTION_GROUP, "simple_history_show_on_dashboard" );
1810
+ register_setting( SimpleHistory::SETTINGS_GENERAL_OPTION_GROUP, "simple_history_show_as_page" );
1811
 
1812
  // Dropdown number if items to show
1813
  add_settings_field(
1925
 
1926
  $setting = get_option( "simple_history_show_as_page", 1 );
1927
  $setting = apply_filters( "simple_history_show_as_page", $setting );
1928
+
1929
  return (bool) $setting;
1930
 
1931
  }
1961
 
1962
  $show_on_dashboard = $this->setting_show_on_dashboard();
1963
  $show_as_page = $this->setting_show_as_page();
1964
+
1965
  ?>
1966
 
1967
  <input <?php echo $show_on_dashboard ? "checked='checked'" : ""?> type="checkbox" value="1" name="simple_history_show_on_dashboard" id="simple_history_show_on_dashboard" class="simple_history_show_on_dashboard" />
3120
  function get_num_events_last_n_days( $period_days = 28 ) {
3121
 
3122
  $transient_key = "sh_" . md5( __METHOD__ . $period_days . "_2");
3123
+
3124
  $count = get_transient( $transient_key );
3125
 
3126
 
3132
 
3133
  $sql = sprintf(
3134
  '
3135
+ SELECT count(*)
3136
+ FROM %1$s
3137
  WHERE UNIX_TIMESTAMP(date) >= %2$d
3138
  AND logger IN %3$s
3139
  ',
3141
  strtotime("-$period_days days"),
3142
  $sqlStringLoggersUserCanRead
3143
  );
3144
+
3145
  $count = $wpdb->get_var( $sql );
3146
 
3147
  set_transient( $transient_key, $count, HOUR_IN_SECONDS );
3148
 
3149
  }
3150
+
3151
  return $count;
3152
 
3153
  } // get_num_events_last_n_days
3156
  function get_num_events_per_day_last_n_days( $period_days = 28 ) {
3157
 
3158
  $transient_key = "sh_" . md5( __METHOD__ . $period_days . "_2");
3159
+
3160
  $dates = get_transient( $transient_key );
3161
 
3162
  if ( false === $dates ) {
3167
 
3168
  $sql = sprintf(
3169
  '
3170
+ SELECT
3171
  date_format(date, "%%Y-%%m-%%d") AS yearDate,
3172
  count(date) AS count
3173
+ FROM
3174
  %1$s
3175
+ WHERE
3176
  UNIX_TIMESTAMP(date) >= %2$d
3177
  AND logger IN (%3$d)
3178
  GROUP BY yearDate
3189
  // echo "set";exit;
3190
 
3191
  } else {
3192
+ // echo "get";exit;
3193
  }
3194
 
3195
  return $dates;
3210
  $numEvents = get_transient( $cache_key );
3211
 
3212
  if ( false == $numEvents ) {
3213
+
3214
  $sql = $wpdb->prepare("
3215
  SELECT count( DISTINCT occasionsID )
3216
  FROM $table_name
3217
+ WHERE date >= DATE_ADD(CURDATE(), INTERVAL -%d DAY)
3218
  ", $days);
3219
+
3220
  $numEvents = $wpdb->get_var($sql);
3221
 
3222
  set_transient( $cache_key, $numEvents, HOUR_IN_SECONDS );
3330
 
3331
  if ( ! $diff )
3332
  return '';
3333
+
3334
  $r = "";
3335
 
3336
  $r .= "<div class='SimpleHistory__diff__contents' tabindex='0'>";
index.php CHANGED
@@ -5,7 +5,7 @@ Plugin URI: http://simple-history.com
5
  Text Domain: simple-history
6
  Domain Path: /languages
7
  Description: Plugin that logs various things that occur in WordPress and then presents those events in a very nice GUI.
8
- Version: 2.7
9
  Author: Pär Thernström
10
  Author URI: http://simple-history.com/
11
  License: GPL2
@@ -32,7 +32,7 @@ if ( ! defined( 'WPINC' ) ) {
32
  die;
33
  }
34
 
35
- if ( version_compare( phpversion(), "5.3", ">=") ) {
36
 
37
  /**
38
  * Register function that is called when plugin is installed
@@ -42,7 +42,7 @@ if ( version_compare( phpversion(), "5.3", ">=") ) {
42
  // register_activation_hook( trailingslashit(WP_PLUGIN_DIR) . trailingslashit( plugin_basename(__DIR__) ) . "index.php" , array("SimpleHistory", "on_plugin_activate" ) );
43
 
44
  if ( ! defined( 'SIMPLE_HISTORY_VERSION' ) ) {
45
- define( 'SIMPLE_HISTORY_VERSION', '2.7' );
46
  }
47
 
48
  if ( ! defined( 'SIMPLE_HISTORY_PATH' ) ) {
@@ -94,10 +94,16 @@ if ( version_compare( phpversion(), "5.3", ">=") ) {
94
  ?>
95
  <div class="updated error">
96
  <p><?php
 
97
  printf(
98
  __( 'Simple History is a great plugin, but to use it your server must have at least PHP 5.3 installed (you have version %s).', 'simple-history' ),
99
  phpversion()
100
  );
 
 
 
 
 
101
  ?></p>
102
  </div>
103
  <?php
5
  Text Domain: simple-history
6
  Domain Path: /languages
7
  Description: Plugin that logs various things that occur in WordPress and then presents those events in a very nice GUI.
8
+ Version: 2.7.1
9
  Author: Pär Thernström
10
  Author URI: http://simple-history.com/
11
  License: GPL2
32
  die;
33
  }
34
 
35
+ if ( version_compare( phpversion(), "5.3", ">=") && function_exists( "mb_strimwidth" ) ) {
36
 
37
  /**
38
  * Register function that is called when plugin is installed
42
  // register_activation_hook( trailingslashit(WP_PLUGIN_DIR) . trailingslashit( plugin_basename(__DIR__) ) . "index.php" , array("SimpleHistory", "on_plugin_activate" ) );
43
 
44
  if ( ! defined( 'SIMPLE_HISTORY_VERSION' ) ) {
45
+ define( 'SIMPLE_HISTORY_VERSION', '2.7.1' );
46
  }
47
 
48
  if ( ! defined( 'SIMPLE_HISTORY_PATH' ) ) {
94
  ?>
95
  <div class="updated error">
96
  <p><?php
97
+
98
  printf(
99
  __( 'Simple History is a great plugin, but to use it your server must have at least PHP 5.3 installed (you have version %s).', 'simple-history' ),
100
  phpversion()
101
  );
102
+
103
+ if ( ! function_exists("mb_strimwidth") ) {
104
+ __('You also need the mbstring extension to be enabled in PHP.', "simple-history");
105
+ }
106
+
107
  ?></p>
108
  </div>
109
  <?php
loggers/SimpleLogger.php CHANGED
@@ -1110,7 +1110,8 @@ class SimpleLogger {
1110
  // - it is a user that is manually doing this, on purpose, with intent, so not auto wordpress
1111
  // - it is a specific user, but we don't know who
1112
  // - sounds like a special case, set initiator to wp_cli
1113
- if ( isset( $_SERVER["WP_CLI_PHP_USED"] ) && "cli" == php_sapi_name() ) {
 
1114
 
1115
  $data["initiator"] = SimpleLoggerLogInitiators::WP_CLI;
1116
 
1110
  // - it is a user that is manually doing this, on purpose, with intent, so not auto wordpress
1111
  // - it is a specific user, but we don't know who
1112
  // - sounds like a special case, set initiator to wp_cli
1113
+ // Can be used by plugins/themes to check if WP-CLI is running or not
1114
+ if ( defined( "WP_CLI" ) && WP_CLI ) {
1115
 
1116
  $data["initiator"] = SimpleLoggerLogInitiators::WP_CLI;
1117
 
loggers/SimpleOptionsLogger.php CHANGED
@@ -2,122 +2,6 @@
2
 
3
  defined( 'ABSPATH' ) or die();
4
 
5
- /*
6
-
7
- <form> is posted to options.php
8
-
9
- If $_GET['action'] == 'update' we are saving settings sent from a settings page
10
-
11
- update_option( $option, $value );
12
- set_transient('settings_errors', get_settings_errors(), 30);
13
-
14
-
15
- * Fires immediately before an option value is updated.
16
- * @param string $option Name of the option to update.
17
- * @param mixed $old_value The old option value.
18
- * @param mixed $value The new option value.
19
- do_action( 'update_option', $option, $old_value, $value );
20
-
21
-
22
- * Fires after the value of an option has been successfully updated.
23
- *
24
- * @since 2.9.0
25
- *
26
- * @param string $option Name of the updated option.
27
- * @param mixed $old_value The old option value.
28
- * @param mixed $value The new option value.
29
- do_action( 'updated_option', $option, $old_value, $value );
30
-
31
- options white list.
32
- $whitelist_options = apply_filters( 'whitelist_options', $whitelist_options );
33
- Array
34
- (
35
- [general] => Array
36
- (
37
- [0] => blogname
38
- [1] => blogdescription
39
- [2] => gmt_offset
40
- [3] => date_format
41
- [4] => time_format
42
- [5] => start_of_week
43
- [6] => timezone_string
44
- [7] => siteurl
45
- [8] => home
46
- [9] => admin_email
47
- [10] => users_can_register
48
- [11] => default_role
49
- )
50
-
51
- [discussion] => Array
52
- (
53
- [0] => default_pingback_flag
54
- [1] => default_ping_status
55
- [2] => default_comment_status
56
- [3] => comments_notify
57
- [4] => moderation_notify
58
- [5] => comment_moderation
59
- [6] => require_name_email
60
- [7] => comment_whitelist
61
- [8] => comment_max_links
62
- [9] => moderation_keys
63
- [10] => blacklist_keys
64
- [11] => show_avatars
65
- [12] => avatar_rating
66
- [13] => avatar_default
67
- [14] => close_comments_for_old_posts
68
- [15] => close_comments_days_old
69
- [16] => thread_comments
70
- [17] => thread_comments_depth
71
- [18] => page_comments
72
- [19] => comments_per_page
73
- [20] => default_comments_page
74
- [21] => comment_order
75
- [22] => comment_registration
76
- )
77
-
78
- [media] => Array
79
- (
80
- [0] => thumbnail_size_w
81
- [1] => thumbnail_size_h
82
- [2] => thumbnail_crop
83
- [3] => medium_size_w
84
- [4] => medium_size_h
85
- [5] => large_size_w
86
- [6] => large_size_h
87
- [7] => image_default_size
88
- [8] => image_default_align
89
- [9] => image_default_link_type
90
- [10] => uploads_use_yearmonth_folders
91
- )
92
-
93
- [reading] => Array
94
- (
95
- [0] => posts_per_page
96
- [1] => posts_per_rss
97
- [2] => rss_use_excerpt
98
- [3] => show_on_front
99
- [4] => page_on_front
100
- [5] => page_for_posts
101
- [6] => blog_public
102
- )
103
-
104
- [writing] => Array
105
- (
106
- [0] => use_smilies
107
- [1] => default_category
108
- [2] => default_email_category
109
- [3] => use_balanceTags
110
- [4] => default_link_category
111
- [5] => default_post_format
112
- [6] => mailserver_url
113
- [7] => mailserver_port
114
- [8] => mailserver_login
115
- [9] => mailserver_pass
116
- [10] => ping_sites
117
- )
118
-
119
- */
120
-
121
  /**
122
  * Logs changes to wordpress options
123
  */
@@ -172,9 +56,9 @@ class SimpleOptionsLogger extends SimpleLogger
172
 
173
  }
174
 
175
- function on_updated_option($option, $old_value, $new_value) {
176
 
177
- if (empty( $_SERVER["REQUEST_URI"] )) {
178
  return;
179
  }
180
 
@@ -200,20 +84,103 @@ class SimpleOptionsLogger extends SimpleLogger
200
  'writing',
201
  );
202
 
203
- if ( $option_page && ! in_array($option_page, $arr_valid_option_pages) ) {
 
 
 
 
 
 
 
 
204
  return;
205
  }
206
 
207
- $this->debugMessage( 'option_updated', array(
 
 
 
 
 
 
 
 
 
 
208
  'option' => $option,
209
  'old_value' => $old_value,
210
  'new_value' => $new_value,
211
- 'REQUEST_URI' => $_SERVER['REQUEST_URI'],
212
- 'referer' => wp_get_referer(),
213
  'option_page' => $option_page,
214
- '$_REQUEST' => print_r($_REQUEST, true),
215
- ) );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
216
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
217
 
218
  }
219
 
@@ -225,6 +192,18 @@ class SimpleOptionsLogger extends SimpleLogger
225
  $context = $row->context;
226
  $message_key = $context["_message_key"];
227
  $output = "";
 
 
 
 
 
 
 
 
 
 
 
 
228
 
229
  if ( "option_updated" == $message_key ) {
230
 
@@ -234,31 +213,42 @@ class SimpleOptionsLogger extends SimpleLogger
234
  // Output old and new values
235
  if ( $context["new_value"] || $context["old_value"] ) {
236
 
237
- $output .= sprintf(
238
- '
239
- <tr>
240
- <td>%1$s</td>
241
- <td>%2$s</td>
242
- </tr>
243
- ',
244
- __("New value", "simple-history"),
245
- esc_html( mb_strimwidth( $context["new_value"], 0, 250, "..." ) )
246
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
 
248
- $output .= sprintf(
249
- '
250
- <tr>
251
- <td>%1$s</td>
252
- <td>%2$s</td>
253
- </tr>
254
- ',
255
- __("Old value", "simple-history"),
256
- esc_html( mb_strimwidth( $context["old_value"], 0, 250, "..." ) )
257
- );
258
- }
259
 
260
  // If key option_page this was saved from regular settings pages
261
- if ( ! empty( $context["option_page"] ) ) {
262
 
263
  $output .= sprintf(
264
  '
@@ -269,13 +259,13 @@ class SimpleOptionsLogger extends SimpleLogger
269
  ',
270
  __("Settings page", "simple-history"),
271
  esc_html( $context["option_page"] ),
272
- admin_url("options-{$context["option_page"]}.php")
273
  );
274
 
275
  }
276
 
277
  // If option = permalink_structure then we did it from permalink page
278
- if ( ! empty( $context["option"] ) && ( "permalink_structure" == $context["option"] || "tag_base" == $context["option"] || "category_base" == $context["option"] ) ) {
279
 
280
  $output .= sprintf(
281
  '
@@ -298,4 +288,206 @@ class SimpleOptionsLogger extends SimpleLogger
298
  return $output;
299
 
300
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
301
  }
2
 
3
  defined( 'ABSPATH' ) or die();
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  /**
6
  * Logs changes to wordpress options
7
  */
56
 
57
  }
58
 
59
+ function on_updated_option( $option, $old_value, $new_value ) {
60
 
61
+ if ( empty( $_SERVER["REQUEST_URI"] ) ) {
62
  return;
63
  }
64
 
84
  'writing',
85
  );
86
 
87
+ $is_valid_options_page = $option_page && in_array( $option_page, $arr_valid_option_pages );
88
+
89
+ // Permalink settings page does not post any "option_page", so use http referer instead
90
+ if ( strpos( $_SERVER["REQUEST_URI"], "options-permalink.php" ) !== false ) {
91
+ $is_valid_options_page = true;
92
+ $options_page = "permalink";
93
+ }
94
+
95
+ if ( ! $is_valid_options_page ) {
96
  return;
97
  }
98
 
99
+ // Check if option name is ok
100
+ // For example if you change front page displays setting the "rewrite_rules" options gets updated too
101
+ $arr_invalid_option_names = array(
102
+ "rewrite_rules"
103
+ );
104
+
105
+ if ( in_array( $option, $arr_invalid_option_names ) ) {
106
+ return;
107
+ }
108
+
109
+ $context = array(
110
  'option' => $option,
111
  'old_value' => $old_value,
112
  'new_value' => $new_value,
 
 
113
  'option_page' => $option_page,
114
+ #'referer' => wp_get_referer(),
115
+ #'REQUEST_URI' => $_SERVER['REQUEST_URI'],
116
+ #'$_REQUEST' => print_r($_REQUEST, true),
117
+ );
118
+
119
+ // Store a bit more about some options
120
+ // Like "page_on_front" we also store post title
121
+ // Check for a method for current option in this class and calls it automagically
122
+ $methodname = "add_context_for_option_{$option}";
123
+ if ( method_exists( $this, $methodname ) ) {
124
+ $context = $this->$methodname( $context, $old_value, $new_value, $option, $option_page );
125
+ }
126
+
127
+ $this->infoMessage( 'option_updated', $context );
128
+
129
+ }
130
+
131
+ /**
132
+ * Give some options better plain text output
133
+ *
134
+ * Not doing anything at the moment, because it was really difficaly to give them meaningful text values
135
+ */
136
+ public function getLogRowPlainTextOutput( $row ) {
137
+
138
+ $message = $row->message;
139
+ $context = $row->context;
140
+ $message_key = $context["_message_key"];
141
 
142
+ $return_message = "";
143
+
144
+ // Only link to attachment if it is still available
145
+ if ( "option_updated" == $message_key ) {
146
+
147
+ /*
148
+ $option = isset( $context["option"] ) ? $context["option"] : null;
149
+ $option_page = isset( $context["option_page"] ) ? $context["option_page"] : null;
150
+ $new_value = isset( $context["new_value"] ) ? $context["new_value"] : null;
151
+ $old_value = isset( $context["old_value"] ) ? $context["old_value"] : null;
152
+
153
+ # $return_message = "";
154
+ $arr_options_to_translate = array(
155
+ "$option_page/blog_public" => array(
156
+ "text" => "Updated setting Search Engine Visibility"
157
+ ),
158
+ "$option_page/rss_use_excerpt" => array(
159
+ "text" => "Updated setting For each article in a feed, show"
160
+ ),
161
+ "$option_page/posts_per_rss" => array(
162
+ "text" => "Updated setting for Syndication feeds show the most recent"
163
+ ),
164
+ "$option_page/posts_per_page" => array(
165
+ "text" => "Updated setting for Blog pages show at most"
166
+ )
167
+ );
168
+
169
+ if ( isset( $arr_options_to_translate[ "{$option_page}/{$option}" ] ) ) {
170
+ $return_message = $arr_options_to_translate[ "{$option_page}/{$option}" ]["text"];
171
+ }
172
+ */
173
+
174
+ }
175
+
176
+ if ( empty( $return_message ) ) {
177
+
178
+ // No specific text to output, fallback to default
179
+ $return_message = parent::getLogRowPlainTextOutput( $row );
180
+
181
+ }
182
+
183
+ return $return_message;
184
 
185
  }
186
 
192
  $context = $row->context;
193
  $message_key = $context["_message_key"];
194
  $output = "";
195
+
196
+ $option = isset( $context["option"] ) ? $context["option"] : null;
197
+ $option_page = isset( $context["option_page"] ) ? $context["option_page"] : null;
198
+ $new_value = isset( $context["new_value"] ) ? $context["new_value"] : null;
199
+ $old_value = isset( $context["old_value"] ) ? $context["old_value"] : null;
200
+
201
+ $tmpl_row = '
202
+ <tr>
203
+ <td>%1$s</td>
204
+ <td>%2$s</td>
205
+ </tr>
206
+ ';
207
 
208
  if ( "option_updated" == $message_key ) {
209
 
213
  // Output old and new values
214
  if ( $context["new_value"] || $context["old_value"] ) {
215
 
216
+ $option_custom_output = "";
217
+ $methodname = "get_details_output_for_option_{$option}";
218
+
219
+ if ( method_exists( $this, $methodname ) ) {
220
+ $option_custom_output = $this->$methodname( $context, $old_value, $new_value, $option, $option_page, $tmpl_row );
221
+ }
222
+
223
+ if ( empty( $option_custom_output ) ) {
224
+
225
+ // all other options or fallback if custom output did not find all it's stuff
226
+
227
+ $output .= sprintf(
228
+ $tmpl_row,
229
+ __("New value", "simple-history"),
230
+ esc_html( mb_strimwidth( $new_value, 0, 250, "..." ) )
231
+ );
232
+
233
+ $output .= sprintf(
234
+ $tmpl_row,
235
+ __("Old value", "simple-history"),
236
+ esc_html( mb_strimwidth( $old_value, 0, 250, "..." ) )
237
+ );
238
+
239
+
240
+ } else {
241
+
242
+ $output .= $option_custom_output;
243
+
244
+ } // if option output
245
+
246
+
247
+ } // if new or old val
248
 
 
 
 
 
 
 
 
 
 
 
 
249
 
250
  // If key option_page this was saved from regular settings pages
251
+ if ( ! empty( $option_page ) ) {
252
 
253
  $output .= sprintf(
254
  '
259
  ',
260
  __("Settings page", "simple-history"),
261
  esc_html( $context["option_page"] ),
262
+ admin_url("options-{$option_page}.php")
263
  );
264
 
265
  }
266
 
267
  // If option = permalink_structure then we did it from permalink page
268
+ if ( ! empty( $option ) && ( "permalink_structure" == $option || "tag_base" == $option || "category_base" == $option ) ) {
269
 
270
  $output .= sprintf(
271
  '
288
  return $output;
289
 
290
  }
291
+
292
+
293
+ /**
294
+ * Page on front = "Front page displays" -> Your latest posts / A static page
295
+ * value 0 = Your latest post
296
+ * value int n = A static page
297
+ */
298
+ function add_context_for_option_page_on_front( $context, $old_value, $new_value, $option, $option_page ) {
299
+
300
+ if ( ! empty( $old_value ) && is_numeric( $old_value ) ) {
301
+
302
+ $old_post = get_post( $old_value );
303
+
304
+ if ( $old_post ) {
305
+ $context["old_post_title"] = $old_post->post_title;
306
+ }
307
+
308
+ }
309
+
310
+ if ( ! empty( $new_value ) && is_numeric( $new_value ) ) {
311
+
312
+ $new_post = get_post( $new_value );
313
+
314
+ if ( $new_post ) {
315
+ $context["new_post_title"] = $new_post->post_title;
316
+ }
317
+
318
+ }
319
+
320
+ return $context;
321
+
322
+ }
323
+
324
+ function add_context_for_option_page_for_posts( $context, $old_value, $new_value, $option, $option_page ) {
325
+
326
+ // Get same info as for page_on_front
327
+ $context = call_user_func_array( array( $this, "add_context_for_option_page_on_front"), func_get_args() );
328
+
329
+ return $context;
330
+
331
+ }
332
+
333
+ function get_details_output_for_option_page_for_posts( $context, $old_value, $new_value, $option, $option_page ) {
334
+
335
+ $output = call_user_func_array( array( $this, "get_details_output_for_option_page_on_front"), func_get_args() );
336
+
337
+ return $output;
338
+
339
+ }
340
+
341
+ /**
342
+ * Add detailed putput for page_on_front
343
+ *
344
+ * @return string output
345
+ */
346
+ function get_details_output_for_option_page_on_front( $context, $old_value, $new_value, $option, $option_page, $tmpl_row ) {
347
+
348
+ $output = "";
349
+
350
+ if ( $new_value && ! empty( $context["new_post_title"] ) ) {
351
+
352
+ $post_title_with_link = "";
353
+
354
+ if ( get_post_status( $new_value ) ) {
355
+ $post_title_with_link = sprintf('<a href="%1$s">%2$s</a>', get_edit_post_link( $new_value ), esc_html( $context["new_post_title"] ) );
356
+ } else {
357
+ $post_title_with_link = esc_html( $context["new_post_title"] );
358
+ }
359
+
360
+ $output .= sprintf(
361
+ $tmpl_row,
362
+ __("New value", "simple-history"),
363
+ sprintf( __('Page %1$s', "simple-history" ), $post_title_with_link)
364
+ );
365
+
366
+ }
367
+ if ( intval( $new_value ) == 0 ) {
368
+
369
+ $output .= sprintf(
370
+ $tmpl_row,
371
+ __("New value", "simple-history"),
372
+ __("Your latests posts", "simple-history")
373
+ );
374
+
375
+ }
376
+
377
+ if ( $old_value && ! empty( $context["old_post_title"] ) ) {
378
+ $post_title_with_link = "";
379
+
380
+ if ( get_post_status( $old_value ) ) {
381
+ $post_title_with_link = sprintf('<a href="%1$s">%2$s</a>', get_edit_post_link( $old_value ), esc_html( $context["old_post_title"] ) );
382
+ } else {
383
+ $post_title_with_link = esc_html( $context["old_post_title"] );
384
+ }
385
+
386
+ $output .= sprintf(
387
+ $tmpl_row,
388
+ __("Old value", "simple-history"),
389
+ sprintf( __('Page %1$s', "simple-history" ), $post_title_with_link)
390
+ );
391
+
392
+ }
393
+
394
+ if ( intval( $old_value ) == 0 ) {
395
+
396
+ $output .= sprintf(
397
+ $tmpl_row,
398
+ __("Old value", "simple-history"),
399
+ __("Your latests posts", "simple-history")
400
+ );
401
+
402
+ }
403
+
404
+ return $output;
405
+
406
+ } // custom output page_on_front
407
+
408
+
409
+ /**
410
+ * "default_category" = Writing Settings » Default Post Category
411
+ */
412
+ function add_context_for_option_default_category( $context, $old_value, $new_value, $option, $option_page ) {
413
+
414
+ if ( ! empty( $old_value ) && is_numeric( $old_value ) ) {
415
+
416
+ $old_category_name = get_the_category_by_ID( $old_value );
417
+
418
+ if ( ! is_wp_error( $old_category_name) ) {
419
+
420
+ $context["old_category_name"] = $old_category_name;
421
+
422
+ }
423
+
424
+ }
425
+
426
+ if ( ! empty( $new_value ) && is_numeric( $new_value ) ) {
427
+
428
+ $new_category_name = get_the_category_by_ID( $new_value );
429
+
430
+ if ( ! is_wp_error( $new_category_name) ) {
431
+
432
+ $context["new_category_name"] = $new_category_name;
433
+
434
+ }
435
+
436
+ }
437
+
438
+ return $context;
439
+
440
+ }
441
+
442
+ function add_context_for_option_default_email_category( $context, $old_value, $new_value, $option, $option_page ) {
443
+
444
+ $context = call_user_func_array( array( $this, "add_context_for_option_default_category"), func_get_args() );
445
+
446
+ return $context;
447
+
448
+ }
449
+
450
+
451
+ /**
452
+ * Add detailed putput for default_category
453
+ *
454
+ * @return string output
455
+ */
456
+ function get_details_output_for_option_default_category( $context, $old_value, $new_value, $option, $option_page, $tmpl_row ) {
457
+
458
+ $old_category_name = isset( $context["old_category_name"] ) ? $context["old_category_name"] : null;
459
+ $new_category_name = isset( $context["new_category_name"] ) ? $context["new_category_name"] : null;
460
+
461
+ if ( $old_category_name ) {
462
+
463
+ $output .= sprintf(
464
+ $tmpl_row,
465
+ __("Old value", "simple-history"),
466
+ esc_html( $old_category_name )
467
+ );
468
+
469
+ }
470
+
471
+ if ( $new_category_name ) {
472
+
473
+ $output .= sprintf(
474
+ $tmpl_row,
475
+ __("New value", "simple-history"),
476
+ esc_html( $new_category_name )
477
+ );
478
+
479
+ }
480
+
481
+ return $output;
482
+
483
+ }
484
+
485
+ function get_details_output_for_option_default_email_category( $context, $old_value, $new_value, $option, $option_page, $tmpl_row ) {
486
+
487
+ $output = call_user_func_array( array( $this, "get_details_output_for_option_default_category"), func_get_args() );
488
+
489
+ return $output;
490
+
491
+ }
492
+
493
  }
loggers/SimplePluginLogger.php CHANGED
@@ -296,7 +296,7 @@ class SimplePluginLogger extends SimpleLogger
296
  * Saves info about all installed plugins to an option.
297
  * When we are done logging then we remove the option.
298
  */
299
- function save_versions_before_update($bool = null, $hook_extra = null) {
300
 
301
  $plugins = get_plugins();
302
 
296
  * Saves info about all installed plugins to an option.
297
  * When we are done logging then we remove the option.
298
  */
299
+ function save_versions_before_update($bool = null, $hook_extra = null) {
300
 
301
  $plugins = get_plugins();
302
 
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: http://eskapism.se/sida/donate/
4
  Tags: history, log, changes, changelog, audit, trail, pages, attachments, users, cms, dashboard, admin, syslog, feed, activity, stream, audit trail, brute-force
5
  Requires at least: 4.5.1
6
  Tested up to: 4.5.2
7
- Stable tag: 2.7
8
 
9
  View changes made by users within WordPress. See who created a page, uploaded an attachment or approved an comment, and more.
10
 
@@ -140,7 +140,7 @@ initiated by a specific user.
140
 
141
  6. See even more details about a logged event (by clicking on the date and time of the event).
142
 
143
- 7. A chart with some quick statistics is available, so you can see the number of events that has been logged each day.
144
  A simple way to see any uncommon activity, for example an increased number of logins or similar.
145
 
146
  8. When users are created or changed you can see details on what have changed.
@@ -149,6 +149,16 @@ A simple way to see any uncommon activity, for example an increased number of lo
149
 
150
  ## Changelog
151
 
 
 
 
 
 
 
 
 
 
 
152
  = 2.7 (May 2016) =
153
 
154
  - Added: When a user is created or edited the log now shows what fields have changed and from what old value to what new value. A much requested feature!
4
  Tags: history, log, changes, changelog, audit, trail, pages, attachments, users, cms, dashboard, admin, syslog, feed, activity, stream, audit trail, brute-force
5
  Requires at least: 4.5.1
6
  Tested up to: 4.5.2
7
+ Stable tag: 2.7.1
8
 
9
  View changes made by users within WordPress. See who created a page, uploaded an attachment or approved an comment, and more.
10
 
140
 
141
  6. See even more details about a logged event (by clicking on the date and time of the event).
142
 
143
+ 7. A chart with some quick statistics is available, so you can see the number of events that has been logged each day.
144
  A simple way to see any uncommon activity, for example an increased number of logins or similar.
145
 
146
  8. When users are created or changed you can see details on what have changed.
149
 
150
  ## Changelog
151
 
152
+ = 2.7.1 (June 2016) =
153
+
154
+ - Added: Add shortcut to history in Admin bar for current site and in Network Admin Bar for each site where plugin is installed. Can be disabled using filters `simple_history/add_admin_bar_menu_item` and `simple_history/add_admin_bar_network_menu_item`.
155
+ - Added: Add check that [´mbstring´](http://php.net/manual/en/book.mbstring.php) is enabled and show a warning if it's not.
156
+ - Changed: Changes to "Front Page Displays" in "Reading Settings" now show the name of the old and new page (before only id was logged).
157
+ - Changed: Changes to "Default Post Category" and "Default Mail Category" in "Writing Settings" now show the name of the old and new category (before only id was logged).
158
+ - Fixed: When changing "Front Page Displays" in "Reading Settings" the option "rewrite_rules" also got logged.
159
+ - Fixed: Changes in Permalink Settings were not logged correctly.
160
+ - Fixed: Actions done with [WP-CLI](https://wp-cli.org/) was not correctly attributed. Now the log should say "WP-CLI" intead of "Other" for actions done in WP CLI.
161
+
162
  = 2.7 (May 2016) =
163
 
164
  - Added: When a user is created or edited the log now shows what fields have changed and from what old value to what new value. A much requested feature!