Version Description
(May 2016) =
- 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!
- Fixed: If you edited your own profile the log would say that you edited "their profile". Now it says that you edited "your profile" instead.
- Changed: Post diffs could get very tall. Now they are max approx 8 rows by default, but if you hover the diff (or give it focus with your keyboard) you get a scrollbar and can scroll the contents. Fixes https://wordpress.org/support/topic/dashboard-max-length-of-content and https://wordpress.org/support/topic/feature-request-make-content-diff-report-expandable-and-closed-by-default.
- Fixed: Maybe fix a notice varning if a transient was missing a name or value.
Download this release
Release Info
Developer | eskapism |
Plugin | Simple History |
Version | 2.7 |
Comparing to | |
See all releases |
Code changes from version 2.6 to 2.7
- css/styles.css +41 -0
- inc/SimpleHistory.php +10 -2
- index.php +2 -2
- loggers/SimplePluginLogger.php +1 -1
- loggers/SimplePostLogger.php +9 -8
- loggers/SimpleUserLogger.php +445 -21
- readme.txt +14 -3
css/styles.css
CHANGED
@@ -330,6 +330,15 @@ Style different log levels.
|
|
330 |
}
|
331 |
|
332 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
333 |
|
334 |
/* wrap span.SimpleHistoryLogitem__inlineDivided around things that should have a bullet between them */
|
335 |
.SimpleHistoryLogitem__inlineDivided {
|
@@ -928,3 +937,35 @@ Modal window with detailss
|
|
928 |
padding: 10px;
|
929 |
font-weight: bold;
|
930 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
330 |
}
|
331 |
|
332 |
|
333 |
+
.SimpleHistoryLogitem__keyValueTable__addedThing {
|
334 |
+
text-decoration: none;
|
335 |
+
}
|
336 |
+
|
337 |
+
.SimpleHistoryLogitem__keyValueTable__removedThing {
|
338 |
+
text-decoration: line-through;
|
339 |
+
color: #999;
|
340 |
+
}
|
341 |
+
|
342 |
|
343 |
/* wrap span.SimpleHistoryLogitem__inlineDivided around things that should have a bullet between them */
|
344 |
.SimpleHistoryLogitem__inlineDivided {
|
937 |
padding: 10px;
|
938 |
font-weight: bold;
|
939 |
}
|
940 |
+
|
941 |
+
|
942 |
+
/* diff contents can be very high sometimes, so we limit the height and add scrollbars in those cases */
|
943 |
+
.SimpleHistory__diff__contents {
|
944 |
+
max-height: 11em;
|
945 |
+
overflow: hidden;
|
946 |
+
position: relative;
|
947 |
+
}
|
948 |
+
|
949 |
+
/* fade out that indicate more content */
|
950 |
+
/*.SimpleHistory__diff__contents:after {
|
951 |
+
content: "";
|
952 |
+
position: absolute;
|
953 |
+
bottom: 0;
|
954 |
+
left: 0;
|
955 |
+
width: 100%;
|
956 |
+
height: 30px;
|
957 |
+
background: linear-gradient(transparent, white);
|
958 |
+
}*/
|
959 |
+
|
960 |
+
.SimpleHistory__diff__contents:hover,
|
961 |
+
.SimpleHistory__diff__contents:focus {
|
962 |
+
overflow-y: auto;
|
963 |
+
}
|
964 |
+
|
965 |
+
.SimpleHistory__diff__contents:focus {
|
966 |
+
outline: 1px solid rgb(0, 115, 170);
|
967 |
+
box-shadow: 0 0 0 1px #5b9dd9,0 0 2px 1px rgba(30,140,190,.8);
|
968 |
+
}
|
969 |
+
|
970 |
+
.SimpleHistory__diff__contentsInner {
|
971 |
+
}
|
inc/SimpleHistory.php
CHANGED
@@ -3189,8 +3189,13 @@ function simple_history_text_diff( $left_string, $right_string, $args = null ) {
|
|
3189 |
|
3190 |
if ( ! $diff )
|
3191 |
return '';
|
|
|
|
|
|
|
|
|
|
|
3192 |
|
3193 |
-
$r
|
3194 |
|
3195 |
if ( ! empty( $args[ 'show_split_view' ] ) ) {
|
3196 |
$r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />";
|
@@ -3211,8 +3216,11 @@ function simple_history_text_diff( $left_string, $right_string, $args = null ) {
|
|
3211 |
if ( $args['title'] || $args['title_left'] || $args['title_right'] )
|
3212 |
$r .= "</thead>\n";
|
3213 |
|
3214 |
-
$r .= "<tbody>\n$diff
|
3215 |
$r .= "</table>";
|
3216 |
|
|
|
|
|
|
|
3217 |
return $r;
|
3218 |
}
|
3189 |
|
3190 |
if ( ! $diff )
|
3191 |
return '';
|
3192 |
+
|
3193 |
+
$r = "";
|
3194 |
+
|
3195 |
+
$r .= "<div class='SimpleHistory__diff__contents' tabindex='0'>";
|
3196 |
+
$r .= "<div class='SimpleHistory__diff__contentsInner'>";
|
3197 |
|
3198 |
+
$r .= "<table class='diff SimpleHistory__diff'>\n";
|
3199 |
|
3200 |
if ( ! empty( $args[ 'show_split_view' ] ) ) {
|
3201 |
$r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />";
|
3216 |
if ( $args['title'] || $args['title_left'] || $args['title_right'] )
|
3217 |
$r .= "</thead>\n";
|
3218 |
|
3219 |
+
$r .= "<tbody>\n$diff</div>\n</tbody>\n";
|
3220 |
$r .= "</table>";
|
3221 |
|
3222 |
+
$r .= "</div>";
|
3223 |
+
$r .= "</div>";
|
3224 |
+
|
3225 |
return $r;
|
3226 |
}
|
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.
|
9 |
Author: Pär Thernström
|
10 |
Author URI: http://simple-history.com/
|
11 |
License: GPL2
|
@@ -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.
|
46 |
}
|
47 |
|
48 |
if ( ! defined( 'SIMPLE_HISTORY_PATH' ) ) {
|
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
|
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' ) ) {
|
loggers/SimplePluginLogger.php
CHANGED
@@ -314,7 +314,7 @@ class SimplePluginLogger extends SimpleLogger
|
|
314 |
* We detect when that transient is set and then we have all info needed to log the plugin delete
|
315 |
*
|
316 |
*/
|
317 |
-
public function on_setted_transient_for_remove_files($transient, $value) {
|
318 |
|
319 |
if ( ! $user_id = get_current_user_id() ) {
|
320 |
return;
|
314 |
* We detect when that transient is set and then we have all info needed to log the plugin delete
|
315 |
*
|
316 |
*/
|
317 |
+
public function on_setted_transient_for_remove_files( $transient = "", $value = "" ) {
|
318 |
|
319 |
if ( ! $user_id = get_current_user_id() ) {
|
320 |
return;
|
loggers/SimplePostLogger.php
CHANGED
@@ -399,13 +399,13 @@ class SimplePostLogger extends SimpleLogger
|
|
399 |
* Adds diff data to the context array. Is called just before the event is logged.
|
400 |
*
|
401 |
* Since 2.0.29
|
402 |
-
|
403 |
-
To detect
|
404 |
-
|
405 |
-
|
406 |
-
|
407 |
-
|
408 |
-
|
409 |
function add_post_data_diff_to_context($context, $old_post_data, $new_post_data) {
|
410 |
|
411 |
$old_data = $old_post_data["post_data"];
|
@@ -625,6 +625,8 @@ class SimplePostLogger extends SimpleLogger
|
|
625 |
}
|
626 |
|
627 |
/**
|
|
|
|
|
628 |
* Since 2.0.29
|
629 |
*/
|
630 |
function add_diff($post_data_diff, $key, $old_value, $new_value) {
|
@@ -778,7 +780,6 @@ class SimplePostLogger extends SimpleLogger
|
|
778 |
__("Status", "simple-history"),
|
779 |
esc_html($post_old_value),
|
780 |
esc_html($post_new_value)
|
781 |
-
|
782 |
);
|
783 |
|
784 |
} else if ( "post_date" == $key_to_diff ) {
|
399 |
* Adds diff data to the context array. Is called just before the event is logged.
|
400 |
*
|
401 |
* Since 2.0.29
|
402 |
+
*
|
403 |
+
* To detect
|
404 |
+
* - post thumb (part of custom fields)
|
405 |
+
* - categories
|
406 |
+
* - tags
|
407 |
+
* @return array $context with diff data added
|
408 |
+
*/
|
409 |
function add_post_data_diff_to_context($context, $old_post_data, $new_post_data) {
|
410 |
|
411 |
$old_data = $old_post_data["post_data"];
|
625 |
}
|
626 |
|
627 |
/**
|
628 |
+
* Add diff to array if old and new values are different
|
629 |
+
*
|
630 |
* Since 2.0.29
|
631 |
*/
|
632 |
function add_diff($post_data_diff, $key, $old_value, $new_value) {
|
780 |
__("Status", "simple-history"),
|
781 |
esc_html($post_old_value),
|
782 |
esc_html($post_new_value)
|
|
|
783 |
);
|
784 |
|
785 |
} else if ( "post_date" == $key_to_diff ) {
|
loggers/SimpleUserLogger.php
CHANGED
@@ -106,7 +106,7 @@ class SimpleUserLogger extends SimpleLogger {
|
|
106 |
add_filter('authenticate', array($this, "on_authenticate"), 10, 3);
|
107 |
|
108 |
// User is changed
|
109 |
-
add_action("profile_update", array($this, "on_profile_update"), 10, 2);
|
110 |
|
111 |
// User is created
|
112 |
add_action("user_register", array($this, "on_user_register"), 10, 2);
|
@@ -122,18 +122,178 @@ class SimpleUserLogger extends SimpleLogger {
|
|
122 |
|
123 |
add_action( 'retrieve_password_message', array( $this, "on_retrieve_password_message" ), 10, 4 );
|
124 |
|
|
|
|
|
|
|
125 |
}
|
126 |
|
127 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
128 |
|
129 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
130 |
|
131 |
-
|
|
|
132 |
|
133 |
-
|
134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
135 |
|
136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
function on_retrieve_password_message( $message, $key, $user_login, $user_data ) {
|
138 |
|
139 |
if ( isset( $_GET["action"] ) && ( "lostpassword" == $_GET["action"] ) ) {
|
@@ -143,9 +303,6 @@ class SimpleUserLogger extends SimpleLogger {
|
|
143 |
"message" => $message,
|
144 |
"key" => $key,
|
145 |
"user_login" => $user_login,
|
146 |
-
// "user_data" => $user_data,
|
147 |
-
"GET" => $_GET,
|
148 |
-
"POST" => $_POST
|
149 |
);
|
150 |
|
151 |
if ( is_a( $user_data, "WP_User" ) ) {
|
@@ -297,7 +454,9 @@ class SimpleUserLogger extends SimpleLogger {
|
|
297 |
}
|
298 |
|
299 |
/**
|
300 |
-
* Modify row output
|
|
|
|
|
301 |
*/
|
302 |
public function getLogRowPlainTextOutput($row) {
|
303 |
|
@@ -316,12 +475,15 @@ class SimpleUserLogger extends SimpleLogger {
|
|
316 |
|
317 |
if ( $wp_user ) {
|
318 |
|
319 |
-
$context["edit_profile_link"] = get_edit_user_link($wp_user->ID);
|
320 |
|
321 |
$use_you = apply_filters("simple_history/user_logger/plain_text_output_use_you", true);
|
|
|
|
|
|
|
322 |
|
323 |
// User still exist, so link to their profile
|
324 |
-
if ( $current_user_id === $context["_user_id"] && $use_you ) {
|
325 |
|
326 |
// User that is viewing the log is the same as the edited user
|
327 |
$msg = __('Edited <a href="{edit_profile_link}">your profile</a>', "simple-history");
|
@@ -344,7 +506,7 @@ class SimpleUserLogger extends SimpleLogger {
|
|
344 |
} else {
|
345 |
|
346 |
// User edited another users profile
|
347 |
-
if ($wp_user) {
|
348 |
|
349 |
// Edited user still exist, so link to their profile
|
350 |
$context["edit_profile_link"] = get_edit_user_link($wp_user->ID);
|
@@ -359,7 +521,38 @@ class SimpleUserLogger extends SimpleLogger {
|
|
359 |
|
360 |
}
|
361 |
|
362 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
363 |
|
364 |
return $output;
|
365 |
}
|
@@ -424,9 +617,14 @@ class SimpleUserLogger extends SimpleLogger {
|
|
424 |
|
425 |
/**
|
426 |
* User is edited
|
|
|
|
|
|
|
|
|
427 |
*/
|
428 |
-
function on_profile_update($user_id) {
|
429 |
|
|
|
430 |
if (!$user_id || !is_numeric($user_id)) {
|
431 |
return;
|
432 |
}
|
@@ -437,19 +635,26 @@ class SimpleUserLogger extends SimpleLogger {
|
|
437 |
"edited_user_id" => $wp_user_edited->ID,
|
438 |
"edited_user_email" => $wp_user_edited->user_email,
|
439 |
"edited_user_login" => $wp_user_edited->user_login,
|
440 |
-
"server_http_user_agent" => isset( $_SERVER["HTTP_USER_AGENT"] ) ? $_SERVER["HTTP_USER_AGENT"] : null
|
|
|
441 |
);
|
442 |
|
|
|
443 |
$this->infoMessage("user_updated_profile", $context);
|
|
|
444 |
|
445 |
}
|
446 |
|
447 |
/**
|
448 |
* User is created
|
|
|
|
|
|
|
|
|
449 |
*/
|
450 |
-
function on_user_register($user_id) {
|
451 |
|
452 |
-
if (
|
453 |
return;
|
454 |
}
|
455 |
|
@@ -457,15 +662,21 @@ class SimpleUserLogger extends SimpleLogger {
|
|
457 |
|
458 |
// wp_user->roles (array) - the roles the user is part of.
|
459 |
$role = null;
|
460 |
-
if (is_array($wp_user_added->roles) && !empty($wp_user_added->roles[0])) {
|
461 |
$role = $wp_user_added->roles[0];
|
462 |
}
|
463 |
|
|
|
|
|
464 |
$context = array(
|
465 |
"created_user_id" => $wp_user_added->ID,
|
466 |
"created_user_email" => $wp_user_added->user_email,
|
467 |
-
"created_user_login" => $wp_user_added->user_login,
|
468 |
"created_user_role" => $role,
|
|
|
|
|
|
|
|
|
469 |
"server_http_user_agent" => isset( $_SERVER["HTTP_USER_AGENT"] ) ? $_SERVER["HTTP_USER_AGENT"] : null
|
470 |
);
|
471 |
|
@@ -580,5 +791,218 @@ class SimpleUserLogger extends SimpleLogger {
|
|
580 |
return $user;
|
581 |
|
582 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
583 |
|
584 |
}
|
106 |
add_filter('authenticate', array($this, "on_authenticate"), 10, 3);
|
107 |
|
108 |
// User is changed
|
109 |
+
#add_action("profile_update", array($this, "on_profile_update"), 10, 2);
|
110 |
|
111 |
// User is created
|
112 |
add_action("user_register", array($this, "on_user_register"), 10, 2);
|
122 |
|
123 |
add_action( 'retrieve_password_message', array( $this, "on_retrieve_password_message" ), 10, 4 );
|
124 |
|
125 |
+
add_filter( 'insert_user_meta', array( $this, "on_insert_user_meta" ), 10, 3 );
|
126 |
+
|
127 |
+
|
128 |
}
|
129 |
|
130 |
+
/*
|
131 |
+
* Called before the user is updated
|
132 |
+
*
|
133 |
+
* Filter a user's meta values and keys before the user is created or updated.
|
134 |
+
*
|
135 |
+
* Does not include contact methods. These are added using `wp_get_user_contact_methods( $user )`.
|
136 |
+
*
|
137 |
+
* @param array $meta {
|
138 |
+
* Default meta values and keys for the user.
|
139 |
+
*
|
140 |
+
* @type string $nickname The user's nickname. Default is the user's username.
|
141 |
+
* @type string $first_name The user's first name.
|
142 |
+
* @type string $last_name The user's last name.
|
143 |
+
* @type string $description The user's description.
|
144 |
+
* @type bool $rich_editing Whether to enable the rich-editor for the user. False if not empty.
|
145 |
+
* @type bool $comment_shortcuts Whether to enable keyboard shortcuts for the user. Default false.
|
146 |
+
* @type string $admin_color The color scheme for a user's admin screen. Default 'fresh'.
|
147 |
+
* @type int|bool $use_ssl Whether to force SSL on the user's admin area. 0|false if SSL is
|
148 |
+
* not forced.
|
149 |
+
* @type bool $show_admin_bar_front Whether to show the admin bar on the front end for the user.
|
150 |
+
* Default true.
|
151 |
+
* }
|
152 |
+
* @param WP_User $user User object.
|
153 |
+
* @param bool $update Whether the user is being updated rather than created.
|
154 |
+
*/
|
155 |
+
function on_insert_user_meta( $meta, $user, $update ) {
|
156 |
+
|
157 |
+
// We only log updates here
|
158 |
+
if ( ! $update ) {
|
159 |
+
return $meta;
|
160 |
+
}
|
161 |
+
|
162 |
+
// $user should be set, but check just in case
|
163 |
+
if ( empty( $user ) || ! is_object( $user ) ) {
|
164 |
+
return $meta;
|
165 |
+
}
|
166 |
|
167 |
+
// Make of copy of the posted data, because we change the keys
|
168 |
+
$posted_data = $_POST;
|
169 |
+
$posted_data = stripslashes_deep( $posted_data );
|
170 |
+
|
171 |
+
// Paranoid mode, just in case some other plugin fires the "insert_user_meta" filter and the user.php file is not loaded for some super wierd reason
|
172 |
+
if ( ! function_exists( "_get_additional_user_keys" ) ) {
|
173 |
+
return $meta;
|
174 |
+
}
|
175 |
+
|
176 |
+
// Get the default fields to include. This includes contact methods (including filter, so more could have been added)
|
177 |
+
$arr_keys_to_check = _get_additional_user_keys( $user );
|
178 |
+
|
179 |
+
// Somehow some fields are not include above, so add them manually
|
180 |
+
$arr_keys_to_check = array_merge( $arr_keys_to_check, array("user_email", "user_url", "display_name") );
|
181 |
|
182 |
+
// Skip some keys, because to much info or I don't know what they are
|
183 |
+
$arr_keys_to_check = array_diff( $arr_keys_to_check, array("use_ssl") );
|
184 |
|
185 |
+
// Some keys have different ways of getting data from user
|
186 |
+
// so change posted object to match those
|
187 |
+
$posted_data["user_url"] = isset( $posted_data["url"] ) ? $posted_data["url"] : null;
|
188 |
+
$posted_data["show_admin_bar_front"] = isset( $posted_data["admin_bar_front"] ) ? true : null;
|
189 |
+
$posted_data["user_email"] = isset( $posted_data["email"] ) ? $posted_data["email"] : null;
|
190 |
+
|
191 |
+
// Display name publicly as = POST "display_name"
|
192 |
+
#var_dump($user->display_name);
|
193 |
+
|
194 |
+
// Set vals for Enable keyboard shortcuts for comment moderation
|
195 |
+
$posted_data['comment_shortcuts'] = isset( $posted_data['comment_shortcuts'] ) ? "true" : "false";
|
196 |
+
|
197 |
+
// Set vals for Disable the visual editor when writing
|
198 |
+
// posted val = string "false" = yes, disable
|
199 |
+
$posted_data['rich_editing'] = isset( $posted_data['rich_editing'] ) ? "false" : "true";
|
200 |
+
|
201 |
+
// Set vals for Show Toolbar when viewing site
|
202 |
+
$posted_data['show_admin_bar_front'] = isset( $posted_data['admin_bar_front'] ) ? "true" : "false";
|
203 |
+
|
204 |
+
// if checkbox is checked in admin then this is the saved value on the user object
|
205 |
+
// @todo:
|
206 |
+
|
207 |
+
// Check if password was updated
|
208 |
+
$password_changed = false;
|
209 |
+
if ( ! empty( $posted_data['pass1'] ) && ! empty( $posted_data['pass2'] ) && $posted_data['pass1'] == $posted_data['pass2'] ) {
|
210 |
+
$password_changed = 1;
|
211 |
+
}
|
212 |
+
|
213 |
+
// Check if role was changed
|
214 |
+
//[role] => bbp_moderator
|
215 |
+
$role_changed = false;
|
216 |
+
|
217 |
+
// if user is network admin then role dropdown does not exist and role is not posted here
|
218 |
+
$new_role = isset( $posted_data["role"] ) ? $posted_data["role"] : null;
|
219 |
+
|
220 |
+
if ( $new_role ) {
|
221 |
+
// as done in user-edit.php
|
222 |
+
// Compare user role against currently editable roles
|
223 |
+
$user_roles = array_intersect( array_values( $user->roles ), array_keys( get_editable_roles() ) );
|
224 |
+
$old_role = reset( $user_roles );
|
225 |
+
|
226 |
+
$role_changed = $new_role != $old_role;
|
227 |
+
}
|
228 |
+
|
229 |
+
// Will contain the differences
|
230 |
+
$user_data_diff = array();
|
231 |
+
|
232 |
+
// Check all keys for diff values
|
233 |
+
foreach ( $arr_keys_to_check as $one_key_to_check ) {
|
234 |
+
|
235 |
+
$old_val = $user->$one_key_to_check;
|
236 |
+
$new_val = isset( $posted_data[ $one_key_to_check ] ) ? $posted_data[ $one_key_to_check ] : null;
|
237 |
+
|
238 |
+
#echo "<hr>key: $one_key_to_check";
|
239 |
+
#echo "<br>old val: $old_val";
|
240 |
+
#echo "<br>new val: $new_val";
|
241 |
+
|
242 |
+
// new val must be set, because otherwise we are not setting anything
|
243 |
+
if ( ! isset( $new_val ) ) {
|
244 |
+
continue;
|
245 |
+
}
|
246 |
+
|
247 |
+
$user_data_diff = $this->add_diff($user_data_diff, $one_key_to_check, $old_val, $new_val);
|
248 |
+
|
249 |
+
}
|
250 |
+
|
251 |
+
// Setup basic context
|
252 |
+
$context = array(
|
253 |
+
"edited_user_id" => $user->ID,
|
254 |
+
"edited_user_email" => $user->user_email,
|
255 |
+
"edited_user_login" => $user->user_login,
|
256 |
+
"server_http_user_agent" => isset( $_SERVER["HTTP_USER_AGENT"] ) ? $_SERVER["HTTP_USER_AGENT"] : null,
|
257 |
+
);
|
258 |
+
|
259 |
+
if ( $password_changed ) {
|
260 |
+
$context["edited_user_password_changed"] = "1";
|
261 |
+
}
|
262 |
+
|
263 |
+
if ( $role_changed ) {
|
264 |
+
$context["user_prev_role"] = $old_role;
|
265 |
+
$context["user_new_role"] = $new_role;
|
266 |
+
}
|
267 |
+
|
268 |
+
// Add diff to context
|
269 |
+
if ( $user_data_diff ) {
|
270 |
+
|
271 |
+
foreach ( $user_data_diff as $one_diff_key => $one_diff_vals ) {
|
272 |
+
/*
|
273 |
+
One diff looks like:
|
274 |
+
"nickname": {
|
275 |
+
"old": "MyOldNick",
|
276 |
+
"new": "MyNewNick"
|
277 |
+
}
|
278 |
+
*/
|
279 |
+
$context["user_prev_{$one_diff_key}"] = $one_diff_vals["old"];
|
280 |
+
$context["user_new_{$one_diff_key}"] = $one_diff_vals["new"];
|
281 |
+
}
|
282 |
|
283 |
+
}
|
284 |
+
|
285 |
+
|
286 |
+
$this->infoMessage("user_updated_profile", $context);
|
287 |
+
|
288 |
+
return $meta;
|
289 |
+
|
290 |
+
}
|
291 |
+
|
292 |
+
/**
|
293 |
+
*
|
294 |
+
* user requests a reset password link
|
295 |
+
*
|
296 |
+
*/
|
297 |
function on_retrieve_password_message( $message, $key, $user_login, $user_data ) {
|
298 |
|
299 |
if ( isset( $_GET["action"] ) && ( "lostpassword" == $_GET["action"] ) ) {
|
303 |
"message" => $message,
|
304 |
"key" => $key,
|
305 |
"user_login" => $user_login,
|
|
|
|
|
|
|
306 |
);
|
307 |
|
308 |
if ( is_a( $user_data, "WP_User" ) ) {
|
454 |
}
|
455 |
|
456 |
/**
|
457 |
+
* Modify plain text row output
|
458 |
+
* - adds link to user profil
|
459 |
+
* - change to "your profile" if you're looking at your own edit
|
460 |
*/
|
461 |
public function getLogRowPlainTextOutput($row) {
|
462 |
|
475 |
|
476 |
if ( $wp_user ) {
|
477 |
|
478 |
+
$context["edit_profile_link"] = get_edit_user_link( $wp_user->ID );
|
479 |
|
480 |
$use_you = apply_filters("simple_history/user_logger/plain_text_output_use_you", true);
|
481 |
+
|
482 |
+
//error_log( serialize( $current_user_id) ); // int 1
|
483 |
+
//error_log( serialize( $context["_user_id"]) ); // string 1
|
484 |
|
485 |
// User still exist, so link to their profile
|
486 |
+
if ( (int) $current_user_id === (int) $context["_user_id"] && $use_you ) {
|
487 |
|
488 |
// User that is viewing the log is the same as the edited user
|
489 |
$msg = __('Edited <a href="{edit_profile_link}">your profile</a>', "simple-history");
|
506 |
} else {
|
507 |
|
508 |
// User edited another users profile
|
509 |
+
if ( $wp_user ) {
|
510 |
|
511 |
// Edited user still exist, so link to their profile
|
512 |
$context["edit_profile_link"] = get_edit_user_link($wp_user->ID);
|
521 |
|
522 |
}
|
523 |
|
524 |
+
// if user_updated_profile
|
525 |
+
|
526 |
+
} else if ( "user_created" == $context["_message_key"] ) {
|
527 |
+
|
528 |
+
// A user was created. Create link of username that goes to user profile.
|
529 |
+
$wp_user = get_user_by( "id", $context["created_user_id"] );
|
530 |
+
|
531 |
+
// If edited_user_id and _user_id is the same then a user edited their own profile
|
532 |
+
// Note: it's not the same thing as the currently logged in user (but.. it can be!)
|
533 |
+
|
534 |
+
if ( $wp_user ) {
|
535 |
+
|
536 |
+
$context["edit_profile_link"] = get_edit_user_link( $wp_user->ID );
|
537 |
+
|
538 |
+
// User that is viewing the log is the same as the edited user
|
539 |
+
$msg = __('Created user <a href="{edit_profile_link}">{created_user_login} ({created_user_email})</a> with role {created_user_role}', "simple-history");
|
540 |
+
|
541 |
+
$output = $this->interpolate(
|
542 |
+
$msg,
|
543 |
+
$context,
|
544 |
+
$row
|
545 |
+
);
|
546 |
+
|
547 |
+
} else {
|
548 |
+
|
549 |
+
// User does not exist any longer, keep original message
|
550 |
+
|
551 |
+
|
552 |
+
}
|
553 |
+
|
554 |
+
}
|
555 |
+
|
556 |
|
557 |
return $output;
|
558 |
}
|
617 |
|
618 |
/**
|
619 |
* User is edited
|
620 |
+
*
|
621 |
+
* Called immediately after an existing user is updated.
|
622 |
+
* @param int $user_id User ID.
|
623 |
+
* @param object $old_user_data Object containing user's data prior to update.
|
624 |
*/
|
625 |
+
function on_profile_update( $user_id, $old_user_data ) {
|
626 |
|
627 |
+
/*
|
628 |
if (!$user_id || !is_numeric($user_id)) {
|
629 |
return;
|
630 |
}
|
635 |
"edited_user_id" => $wp_user_edited->ID,
|
636 |
"edited_user_email" => $wp_user_edited->user_email,
|
637 |
"edited_user_login" => $wp_user_edited->user_login,
|
638 |
+
"server_http_user_agent" => isset( $_SERVER["HTTP_USER_AGENT"] ) ? $_SERVER["HTTP_USER_AGENT"] : null,
|
639 |
+
"old_user_data" => $old_user_data
|
640 |
);
|
641 |
|
642 |
+
|
643 |
$this->infoMessage("user_updated_profile", $context);
|
644 |
+
*/
|
645 |
|
646 |
}
|
647 |
|
648 |
/**
|
649 |
* User is created
|
650 |
+
*
|
651 |
+
* "This action hook allows you to access data for a new user immediately after they are added to the database.
|
652 |
+
* The user id is passed to hook as an argument."
|
653 |
+
*
|
654 |
*/
|
655 |
+
function on_user_register( $user_id ) {
|
656 |
|
657 |
+
if ( ! $user_id || ! is_numeric( $user_id )) {
|
658 |
return;
|
659 |
}
|
660 |
|
662 |
|
663 |
// wp_user->roles (array) - the roles the user is part of.
|
664 |
$role = null;
|
665 |
+
if ( is_array( $wp_user_added->roles ) && ! empty( $wp_user_added->roles[0]) ) {
|
666 |
$role = $wp_user_added->roles[0];
|
667 |
}
|
668 |
|
669 |
+
$send_user_notification = (int) ( isset( $_POST["send_user_notification"] ) && $_POST["send_user_notification"] );
|
670 |
+
|
671 |
$context = array(
|
672 |
"created_user_id" => $wp_user_added->ID,
|
673 |
"created_user_email" => $wp_user_added->user_email,
|
674 |
+
"created_user_login" => $wp_user_added->user_login, // username
|
675 |
"created_user_role" => $role,
|
676 |
+
"created_user_first_name" => $wp_user_added->first_name,
|
677 |
+
"created_user_last_name" => $wp_user_added->last_name,
|
678 |
+
"created_user_url" => $wp_user_added->user_url,
|
679 |
+
"send_user_notification" => $send_user_notification,
|
680 |
"server_http_user_agent" => isset( $_SERVER["HTTP_USER_AGENT"] ) ? $_SERVER["HTTP_USER_AGENT"] : null
|
681 |
);
|
682 |
|
791 |
return $user;
|
792 |
|
793 |
}
|
794 |
+
|
795 |
+
/**
|
796 |
+
* Add diff to array if old and new values are different
|
797 |
+
*
|
798 |
+
* Since 2.0.29
|
799 |
+
*/
|
800 |
+
function add_diff($post_data_diff, $key, $old_value, $new_value) {
|
801 |
+
|
802 |
+
if ( $old_value != $new_value ) {
|
803 |
+
|
804 |
+
$post_data_diff[$key] = array(
|
805 |
+
"old" => $old_value,
|
806 |
+
"new" => $new_value
|
807 |
+
);
|
808 |
+
|
809 |
+
}
|
810 |
+
|
811 |
+
return $post_data_diff;
|
812 |
+
|
813 |
+
}
|
814 |
+
|
815 |
+
/**
|
816 |
+
* Return more info about an logged event
|
817 |
+
* Supports so far:
|
818 |
+
*/
|
819 |
+
function getLogRowDetailsOutput( $row ) {
|
820 |
+
|
821 |
+
$context = $row->context;
|
822 |
+
$message_key = $context["_message_key"];
|
823 |
+
|
824 |
+
$out = "";
|
825 |
+
|
826 |
+
if ( "user_updated_profile" == $message_key ) {
|
827 |
+
|
828 |
+
// Find all user_prev_ and user_new_ values and show them
|
829 |
+
$arr_user_keys_to_show_diff_for = array(
|
830 |
+
"first_name" => array(
|
831 |
+
"title" => _x("First name", "User logger", "simple-history")
|
832 |
+
),
|
833 |
+
"last_name" => array(
|
834 |
+
"title" => _x("Last name", "User logger", "simple-history")
|
835 |
+
),
|
836 |
+
"nickname" => array(
|
837 |
+
"title" => _x("Nickname", "User logger", "simple-history")
|
838 |
+
),
|
839 |
+
"description" => array(
|
840 |
+
"title" => _x("Description", "User logger", "simple-history"),
|
841 |
+
),
|
842 |
+
"rich_editing" => array(
|
843 |
+
"title" => _x("Visual editor", "User logger", "simple-history") // Disable visual editor
|
844 |
+
),
|
845 |
+
"comment_shortcuts" => array(
|
846 |
+
"title" => _x("Keyboard shortcuts", "User logger", "simple-history") // Enable keyboard shortcuts for comment moderation
|
847 |
+
),
|
848 |
+
"show_admin_bar_front" => array(
|
849 |
+
"title" => _x("Show Toolbar", "User logger", "simple-history") // Show Toolbar when viewing site
|
850 |
+
),
|
851 |
+
"admin_color" => array(
|
852 |
+
"title" => _x("Colour Scheme", "User logger", "simple-history") // Admin Colour Scheme
|
853 |
+
),
|
854 |
+
"aim" => array(
|
855 |
+
"title" => _x("AIM", "User logger", "simple-history")
|
856 |
+
),
|
857 |
+
"yim" => array(
|
858 |
+
"title" => _x("Yahoo IM", "User logger", "simple-history")
|
859 |
+
),
|
860 |
+
"jabber" => array(
|
861 |
+
"title" => _x("Jabber / Google Talk ", "User logger", "simple-history")
|
862 |
+
),
|
863 |
+
/*"user_nicename" => array(
|
864 |
+
"title" => _x("Nicename", "User logger", "simple-history")
|
865 |
+
),*/
|
866 |
+
"user_email" => array(
|
867 |
+
"title" => _x("Email", "User logger", "simple-history")
|
868 |
+
),
|
869 |
+
"display_name" => array(
|
870 |
+
//"title" => _x("Display name publicly as", "User logger", "simple-history")
|
871 |
+
"title" => _x("Display name", "User logger", "simple-history")
|
872 |
+
),
|
873 |
+
"user_url" => array(
|
874 |
+
"title" => _x("Website", "User logger", "simple-history")
|
875 |
+
),
|
876 |
+
"role" => array(
|
877 |
+
//"title" => _x("Display name publicly as", "User logger", "simple-history")
|
878 |
+
"title" => _x("Role", "User logger", "simple-history")
|
879 |
+
)
|
880 |
+
);
|
881 |
+
|
882 |
+
$diff_table_output = "";
|
883 |
+
|
884 |
+
foreach ( $arr_user_keys_to_show_diff_for as $key => $val ) {
|
885 |
+
|
886 |
+
if ( isset( $context["user_prev_{$key}"] ) && isset( $context["user_new_{$key}"] ) ) {
|
887 |
+
|
888 |
+
$user_old_value = $context["user_prev_{$key}"];
|
889 |
+
$user_new_value = $context["user_new_{$key}"];
|
890 |
+
|
891 |
+
$diff_table_output .= sprintf(
|
892 |
+
'<tr>
|
893 |
+
<td>%1$s</td>
|
894 |
+
<td>%2$s</td>
|
895 |
+
</tr>',
|
896 |
+
$val["title"],
|
897 |
+
sprintf(
|
898 |
+
'<ins class="SimpleHistoryLogitem__keyValueTable__addedThing">%1$s</ins> <del class="SimpleHistoryLogitem__keyValueTable__removedThing">%2$s</del>',
|
899 |
+
esc_html( $user_new_value ), // 1
|
900 |
+
esc_html( $user_old_value ) // 2
|
901 |
+
)
|
902 |
+
);
|
903 |
+
|
904 |
+
}
|
905 |
+
|
906 |
+
}
|
907 |
+
|
908 |
+
// check if password was changed
|
909 |
+
if ( isset( $context["edited_user_password_changed"] ) ) {
|
910 |
+
|
911 |
+
$diff_table_output .= sprintf(
|
912 |
+
'<tr>
|
913 |
+
<td>%1$s</td>
|
914 |
+
<td>%2$s</td>
|
915 |
+
</tr>',
|
916 |
+
_x("Password", "User logger", "simple-history"),
|
917 |
+
_x("Changed", "User logger", "simple-history")
|
918 |
+
);
|
919 |
+
|
920 |
+
}
|
921 |
+
|
922 |
+
if ( $diff_table_output ) {
|
923 |
+
$diff_table_output = '<table class="SimpleHistoryLogitem__keyValueTable">' . $diff_table_output . '</table>';
|
924 |
+
}
|
925 |
+
|
926 |
+
$out .= $diff_table_output;
|
927 |
+
|
928 |
+
} else if ( "user_created" == $message_key ) {
|
929 |
+
|
930 |
+
// Show fields for created users
|
931 |
+
$arr_user_keys_to_show_diff_for = array(
|
932 |
+
"created_user_first_name" => array(
|
933 |
+
"title" => _x("First name", "User logger", "simple-history")
|
934 |
+
),
|
935 |
+
"created_user_last_name" => array(
|
936 |
+
"title" => _x("Last name", "User logger", "simple-history")
|
937 |
+
),
|
938 |
+
"created_user_url" => array(
|
939 |
+
"title" => _x("Website", "User logger", "simple-history")
|
940 |
+
),
|
941 |
+
"send_user_notification" => array(
|
942 |
+
"title" => _x("User notification email sent", "User logger", "simple-history")
|
943 |
+
)
|
944 |
+
);
|
945 |
+
|
946 |
+
foreach ( $arr_user_keys_to_show_diff_for as $key => $val ) {
|
947 |
+
|
948 |
+
if ( isset( $context[ $key ] ) && trim( $context[ $key ] ) ) {
|
949 |
+
|
950 |
+
if ( "send_user_notification" == $key ) {
|
951 |
+
|
952 |
+
if ( intval( $context[ $key ] ) == 1 ) {
|
953 |
+
$sent_status = _x("Yes, email with account details was sent", "User logger", "simple-history");
|
954 |
+
} else {
|
955 |
+
// $sent_status = _x("No, no email with account details was sent", "User logger", "simple-history");
|
956 |
+
$sent_status = "";
|
957 |
+
}
|
958 |
+
|
959 |
+
if ( $sent_status ) {
|
960 |
+
|
961 |
+
$diff_table_output .= sprintf(
|
962 |
+
'<tr>
|
963 |
+
<td>%1$s</td>
|
964 |
+
<td>%2$s</td>
|
965 |
+
</tr>',
|
966 |
+
_x("Notification", "User logger", "simple-history"),
|
967 |
+
sprintf(
|
968 |
+
'<ins class="SimpleHistoryLogitem__keyValueTable__addedThing">%1$s</ins>',
|
969 |
+
esc_html( $sent_status ) // 1
|
970 |
+
)
|
971 |
+
);
|
972 |
+
|
973 |
+
}
|
974 |
+
|
975 |
+
} else {
|
976 |
+
|
977 |
+
$diff_table_output .= sprintf(
|
978 |
+
'<tr>
|
979 |
+
<td>%1$s</td>
|
980 |
+
<td>%2$s</td>
|
981 |
+
</tr>',
|
982 |
+
$val["title"],
|
983 |
+
sprintf(
|
984 |
+
'<ins class="SimpleHistoryLogitem__keyValueTable__addedThing">%1$s</ins>',
|
985 |
+
esc_html( $context[ $key ] ) // 1
|
986 |
+
)
|
987 |
+
);
|
988 |
+
|
989 |
+
}
|
990 |
+
|
991 |
+
}
|
992 |
+
|
993 |
+
}
|
994 |
+
|
995 |
+
if ( $diff_table_output ) {
|
996 |
+
$diff_table_output = '<table class="SimpleHistoryLogitem__keyValueTable">' . $diff_table_output . '</table>';
|
997 |
+
}
|
998 |
+
|
999 |
+
$out .= $diff_table_output;
|
1000 |
+
|
1001 |
+
} // message key
|
1002 |
+
|
1003 |
+
return $out;
|
1004 |
+
|
1005 |
+
|
1006 |
+
}
|
1007 |
|
1008 |
}
|
readme.txt
CHANGED
@@ -1,10 +1,10 @@
|
|
1 |
-
|
2 |
Contributors: eskapism
|
3 |
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.
|
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,14 +140,25 @@ 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 |
|
144 |
== Changelog ==
|
145 |
|
146 |
## Changelog
|
147 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
= 2.6 (May 2016) =
|
149 |
|
150 |
-
- Added: A nice little graph in the sidebar that displays the number of logged events per day the last 28 days. Graph is powered by [
|
151 |
- Added: Function `get_num_events_last_n_days()`
|
152 |
- Added: Function `get_num_events_per_day_last_n_days()`
|
153 |
- Changed: Switched to transients from cache at some places, because more people will benefit from transients instead of cache (that requires object cache to be installed).
|
1 |
+
=== Simple History ===
|
2 |
Contributors: eskapism
|
3 |
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 |
|
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.
|
147 |
|
148 |
== Changelog ==
|
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!
|
155 |
+
- Fixed: If you edited your own profile the log would say that you edited "their profile". Now it says that you edited "your profile" instead.
|
156 |
+
- Changed: Post diffs could get very tall. Now they are max approx 8 rows by default, but if you hover the diff (or give it focus with your keyboard) you get a scrollbar and can scroll the contents. Fixes https://wordpress.org/support/topic/dashboard-max-length-of-content and https://wordpress.org/support/topic/feature-request-make-content-diff-report-expandable-and-closed-by-default.
|
157 |
+
- Fixed: Maybe fix a notice varning if a transient was missing a name or value.
|
158 |
+
|
159 |
= 2.6 (May 2016) =
|
160 |
|
161 |
+
- Added: A nice little graph in the sidebar that displays the number of logged events per day the last 28 days. Graph is powered by [Chart.js](http://www.chartjs.org/).
|
162 |
- Added: Function `get_num_events_last_n_days()`
|
163 |
- Added: Function `get_num_events_per_day_last_n_days()`
|
164 |
- Changed: Switched to transients from cache at some places, because more people will benefit from transients instead of cache (that requires object cache to be installed).
|