Version Description
- Added: history events can store text description with a more detailed explanation of the history item
- Added: now logs failed login attempts for existing username. Uses the new text description to store more info, for example user agent and remote ip address (REMOTE_ADDR)
- Fixed: box did not change height when clicking on occasions
- Fixed: use on() instead of live() in JavaScript
Download this release
Release Info
| Developer | eskapism |
| Plugin | |
| Version | 1.3 |
| Comparing to | |
| See all releases | |
Code changes from version 1.2 to 1.3
- index.php +116 -25
- readme.txt +39 -16
- screenshot-1.png +0 -0
- screenshot-2.png +0 -0
- screenshot-3.png +0 -0
- scripts.js +38 -7
- styles.css +82 -15
index.php
CHANGED
|
@@ -3,7 +3,7 @@
|
|
| 3 |
Plugin Name: Simple History
|
| 4 |
Plugin URI: http://eskapism.se/code-playground/simple-history/
|
| 5 |
Description: Get a log/history/audit log/version history of the changes made by users in WordPress.
|
| 6 |
-
Version: 1.
|
| 7 |
Author: Pär Thernström
|
| 8 |
Author URI: http://eskapism.se/
|
| 9 |
License: GPL2
|
|
@@ -27,8 +27,8 @@ License: GPL2
|
|
| 27 |
|
| 28 |
load_plugin_textdomain('simple-history', false, "/simple-history/languages");
|
| 29 |
|
| 30 |
-
define( "SIMPLE_HISTORY_VERSION", "1.
|
| 31 |
-
define( "SIMPLE_HISTORY_NAME", "Simple History");
|
| 32 |
|
| 33 |
// Find the plugin directory URL
|
| 34 |
$aa = __FILE__;
|
|
@@ -249,10 +249,13 @@ define("SIMPLE_HISTORY_URL", $plugin_dir_url);
|
|
| 249 |
|
| 250 |
// DB version is 1, upgrade to 2
|
| 251 |
if ( 1 == intval($db_version) ) {
|
| 252 |
-
|
| 253 |
-
// Add column for free text
|
| 254 |
-
|
| 255 |
-
|
|
|
|
|
|
|
|
|
|
| 256 |
|
| 257 |
}
|
| 258 |
|
|
@@ -301,11 +304,51 @@ define("SIMPLE_HISTORY_URL", $plugin_dir_url);
|
|
| 301 |
|
| 302 |
}
|
| 303 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 304 |
function init() {
|
| 305 |
|
| 306 |
-
//
|
| 307 |
add_action("wp_login", "simple_history_wp_login");
|
| 308 |
add_action("wp_logout", "simple_history_wp_logout");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
add_action("delete_user", "simple_history_delete_user");
|
| 310 |
add_action("user_register", "simple_history_user_register");
|
| 311 |
add_action("profile_update", "simple_history_profile_update");
|
|
@@ -440,7 +483,7 @@ define("SIMPLE_HISTORY_URL", $plugin_dir_url);
|
|
| 440 |
if ( ! $user_obj->exists() ) exit;
|
| 441 |
$user = $user_obj->user_login;
|
| 442 |
};
|
| 443 |
-
|
| 444 |
// page to show. 1 = first page.
|
| 445 |
$page = 0;
|
| 446 |
if (isset($_POST["page"])) {
|
|
@@ -946,16 +989,18 @@ function simple_history_add($args) {
|
|
| 946 |
"object_id" => null,
|
| 947 |
"object_name" => null,
|
| 948 |
"user_id" => null,
|
|
|
|
| 949 |
);
|
| 950 |
|
| 951 |
$args = wp_parse_args( $args, $defaults );
|
| 952 |
|
| 953 |
$action = mysql_real_escape_string($args["action"]);
|
| 954 |
-
$object_type = $args["object_type"];
|
| 955 |
-
$object_subtype = $args["object_subtype"];
|
| 956 |
-
$object_id = $args["object_id"];
|
| 957 |
$object_name = mysql_real_escape_string($args["object_name"]);
|
| 958 |
$user_id = $args["user_id"];
|
|
|
|
| 959 |
|
| 960 |
global $wpdb;
|
| 961 |
$tableprefix = $wpdb->prefix;
|
|
@@ -965,14 +1010,25 @@ function simple_history_add($args) {
|
|
| 965 |
$current_user = wp_get_current_user();
|
| 966 |
$current_user_id = (int) $current_user->ID;
|
| 967 |
}
|
| 968 |
-
|
| 969 |
// date, store at utc or local time
|
| 970 |
// anything is better than now() anyway!
|
| 971 |
// WP seems to use the local time, so I will go with that too I think
|
| 972 |
// GMT/UTC-time is: date_i18n($timezone_format, false, 'gmt'));
|
| 973 |
// local time is: date_i18n($timezone_format));
|
| 974 |
$localtime = current_time("mysql");
|
| 975 |
-
$sql = "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 976 |
$wpdb->query($sql);
|
| 977 |
}
|
| 978 |
|
|
@@ -1514,6 +1570,8 @@ function simple_history_get_items_array($args = "") {
|
|
| 1514 |
$do_add = TRUE;
|
| 1515 |
} else if (strpos(strtolower($one_row->action), $search) !== FALSE) {
|
| 1516 |
$do_add = TRUE;
|
|
|
|
|
|
|
| 1517 |
}
|
| 1518 |
} else {
|
| 1519 |
$do_add = TRUE;
|
|
@@ -1578,6 +1636,7 @@ function simple_history_print_history($args = null) {
|
|
| 1578 |
global $simple_history;
|
| 1579 |
|
| 1580 |
$arr_events = simple_history_get_items_array($args);
|
|
|
|
| 1581 |
#sf_d($args);sf_d($arr_events);
|
| 1582 |
$defaults = array(
|
| 1583 |
"page" => 0,
|
|
@@ -1608,6 +1667,7 @@ function simple_history_print_history($args = null) {
|
|
| 1608 |
$object_name = $one_row->object_name;
|
| 1609 |
$user_id = $one_row->user_id;
|
| 1610 |
$action = $one_row->action;
|
|
|
|
| 1611 |
$occasions = $one_row->occasions;
|
| 1612 |
$num_occasions = sizeof($occasions);
|
| 1613 |
$object_image_out = "";
|
|
@@ -1814,15 +1874,6 @@ function simple_history_print_history($args = null) {
|
|
| 1814 |
$user_out .= " \"" . esc_html($object_name) . "\"";
|
| 1815 |
}
|
| 1816 |
|
| 1817 |
-
/*
|
| 1818 |
-
$user_avatar = get_avatar($user->user_email, "50");
|
| 1819 |
-
if ($user_link) {
|
| 1820 |
-
$user_out .= "<a class='simple-history-attachment-thumbnail' href='$user_link'>$user_avatar</a>";
|
| 1821 |
-
} else {
|
| 1822 |
-
$user_out .= "<span class='simple-history-attachment-thumbnail' href='$user_link'>$user_avatar</span>";
|
| 1823 |
-
}
|
| 1824 |
-
*/
|
| 1825 |
-
|
| 1826 |
$user_out .= " " . esc_html__($action, "simple-history");
|
| 1827 |
|
| 1828 |
$user_out = ucfirst($user_out);
|
|
@@ -1868,6 +1919,20 @@ function simple_history_print_history($args = null) {
|
|
| 1868 |
$diff_str = sprintf( __('<span class="when">%1$s ago</span> by %2$s', "simple-history"), human_time_diff(strtotime($one_row->date), $now), $who );
|
| 1869 |
$output .= $diff_str;
|
| 1870 |
$output .= "<span class='when_detail'>".sprintf(__('%s at %s', 'simple-history'), $date_i18n_date, $date_i18n_time)."</span>";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1871 |
|
| 1872 |
$output .= "</div>";
|
| 1873 |
|
|
@@ -1895,16 +1960,42 @@ function simple_history_print_history($args = null) {
|
|
| 1895 |
$many_occasion = sprintf(__("+ %d occasions", 'simple-history'), $num_occasions);
|
| 1896 |
$output .= "<a class='simple-history-occasion-show' href='#'>$many_occasion</a>";
|
| 1897 |
}
|
|
|
|
| 1898 |
$output .= "<ul class='simple-history-occasions hidden'>";
|
| 1899 |
foreach ($occasions as $one_occasion) {
|
|
|
|
| 1900 |
$output .= "<li>";
|
|
|
|
| 1901 |
$date_i18n_date = date_i18n(get_option('date_format'), strtotime($one_occasion->date), $gmt=false);
|
| 1902 |
$date_i18n_time = date_i18n(get_option('time_format'), strtotime($one_occasion->date), $gmt=false);
|
| 1903 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1904 |
|
| 1905 |
$output .= "</li>";
|
| 1906 |
}
|
|
|
|
| 1907 |
$output .= "</ul>";
|
|
|
|
| 1908 |
$output .= "</div>";
|
| 1909 |
}
|
| 1910 |
|
|
@@ -1945,7 +2036,7 @@ function simple_history_print_history($args = null) {
|
|
| 1945 |
$output .= "</div>";
|
| 1946 |
|
| 1947 |
$output .= "
|
| 1948 |
-
<p class='
|
| 1949 |
<p class='simple-history-rss-feed-dashboard'><a title='$view_rss' href='$view_rss_link'>$view_rss</a></p>
|
| 1950 |
<p class='simple-history-rss-feed-page'><a title='$view_rss' href='$view_rss_link'><span></span>$view_rss</a></p>
|
| 1951 |
";
|
| 3 |
Plugin Name: Simple History
|
| 4 |
Plugin URI: http://eskapism.se/code-playground/simple-history/
|
| 5 |
Description: Get a log/history/audit log/version history of the changes made by users in WordPress.
|
| 6 |
+
Version: 1.3
|
| 7 |
Author: Pär Thernström
|
| 8 |
Author URI: http://eskapism.se/
|
| 9 |
License: GPL2
|
| 27 |
|
| 28 |
load_plugin_textdomain('simple-history', false, "/simple-history/languages");
|
| 29 |
|
| 30 |
+
define( "SIMPLE_HISTORY_VERSION", "1.3");
|
| 31 |
+
define( "SIMPLE_HISTORY_NAME", "Simple History");
|
| 32 |
|
| 33 |
// Find the plugin directory URL
|
| 34 |
$aa = __FILE__;
|
| 249 |
|
| 250 |
// DB version is 1, upgrade to 2
|
| 251 |
if ( 1 == intval($db_version) ) {
|
| 252 |
+
|
| 253 |
+
// Add column for action description in non-translateable free text
|
| 254 |
+
$sql = "ALTER TABLE {$table_name} ADD COLUMN action_description longtext";
|
| 255 |
+
mysql_query($sql);
|
| 256 |
+
|
| 257 |
+
simple_history_add("action=" . 'upgraded it\'s database' . "&object_type=plugin&object_name=" . SIMPLE_HISTORY_NAME . "&description=Database version is now version 2");
|
| 258 |
+
update_option("simple_history_db_version", 2);
|
| 259 |
|
| 260 |
}
|
| 261 |
|
| 304 |
|
| 305 |
}
|
| 306 |
|
| 307 |
+
/**
|
| 308 |
+
* Log failed login attempt to username that exists
|
| 309 |
+
*/
|
| 310 |
+
function log_wp_authenticate_user($user, $password) {
|
| 311 |
+
|
| 312 |
+
if ( ! wp_check_password($password, $user->user_pass, $user->ID) ) {
|
| 313 |
+
|
| 314 |
+
// call __() to make translation exist
|
| 315 |
+
__("failed to log in because they entered the wrong password", "simple-history");
|
| 316 |
+
|
| 317 |
+
$description = "";
|
| 318 |
+
$description .= "HTTP_USER_AGENT: " . $_SERVER["HTTP_USER_AGENT"];
|
| 319 |
+
$description .= "\nHTTP_REFERER: " . $_SERVER["HTTP_REFERER"];
|
| 320 |
+
$description .= "\nREMOTE_ADDR: " . $_SERVER["REMOTE_ADDR"];
|
| 321 |
+
|
| 322 |
+
$args = array(
|
| 323 |
+
"object_type" => "user",
|
| 324 |
+
"object_name" => $user->user_login,
|
| 325 |
+
"action" => "failed to log in because they entered the wrong password",
|
| 326 |
+
"object_id" => $user->ID,
|
| 327 |
+
"description" => $description
|
| 328 |
+
);
|
| 329 |
+
|
| 330 |
+
simple_history_add($args);
|
| 331 |
+
|
| 332 |
+
}
|
| 333 |
+
|
| 334 |
+
return $user;
|
| 335 |
+
|
| 336 |
+
}
|
| 337 |
+
|
| 338 |
+
/**
|
| 339 |
+
* Init for both public and admin
|
| 340 |
+
*/
|
| 341 |
function init() {
|
| 342 |
|
| 343 |
+
// user login and logout
|
| 344 |
add_action("wp_login", "simple_history_wp_login");
|
| 345 |
add_action("wp_logout", "simple_history_wp_logout");
|
| 346 |
+
|
| 347 |
+
// user failed login attempt to username that exists
|
| 348 |
+
#$user = apply_filters('wp_authenticate_user', $user, $password);
|
| 349 |
+
add_action("wp_authenticate_user", array($this, "log_wp_authenticate_user"), 10, 2);
|
| 350 |
+
|
| 351 |
+
// user profile page modifications
|
| 352 |
add_action("delete_user", "simple_history_delete_user");
|
| 353 |
add_action("user_register", "simple_history_user_register");
|
| 354 |
add_action("profile_update", "simple_history_profile_update");
|
| 483 |
if ( ! $user_obj->exists() ) exit;
|
| 484 |
$user = $user_obj->user_login;
|
| 485 |
};
|
| 486 |
+
|
| 487 |
// page to show. 1 = first page.
|
| 488 |
$page = 0;
|
| 489 |
if (isset($_POST["page"])) {
|
| 989 |
"object_id" => null,
|
| 990 |
"object_name" => null,
|
| 991 |
"user_id" => null,
|
| 992 |
+
"description" => null
|
| 993 |
);
|
| 994 |
|
| 995 |
$args = wp_parse_args( $args, $defaults );
|
| 996 |
|
| 997 |
$action = mysql_real_escape_string($args["action"]);
|
| 998 |
+
$object_type = mysql_real_escape_string($args["object_type"]);
|
| 999 |
+
$object_subtype = mysql_real_escape_string($args["object_subtype"]);
|
| 1000 |
+
$object_id = mysql_real_escape_string($args["object_id"]);
|
| 1001 |
$object_name = mysql_real_escape_string($args["object_name"]);
|
| 1002 |
$user_id = $args["user_id"];
|
| 1003 |
+
$description = mysql_real_escape_string($args["description"]);
|
| 1004 |
|
| 1005 |
global $wpdb;
|
| 1006 |
$tableprefix = $wpdb->prefix;
|
| 1010 |
$current_user = wp_get_current_user();
|
| 1011 |
$current_user_id = (int) $current_user->ID;
|
| 1012 |
}
|
| 1013 |
+
|
| 1014 |
// date, store at utc or local time
|
| 1015 |
// anything is better than now() anyway!
|
| 1016 |
// WP seems to use the local time, so I will go with that too I think
|
| 1017 |
// GMT/UTC-time is: date_i18n($timezone_format, false, 'gmt'));
|
| 1018 |
// local time is: date_i18n($timezone_format));
|
| 1019 |
$localtime = current_time("mysql");
|
| 1020 |
+
$sql = "
|
| 1021 |
+
INSERT INTO {$tableprefix}simple_history
|
| 1022 |
+
SET
|
| 1023 |
+
date = '$localtime',
|
| 1024 |
+
action = '$action',
|
| 1025 |
+
object_type = '$object_type',
|
| 1026 |
+
object_subtype = '$object_subtype',
|
| 1027 |
+
user_id = '$current_user_id',
|
| 1028 |
+
object_id = '$object_id',
|
| 1029 |
+
object_name = '$object_name',
|
| 1030 |
+
action_description = '$description'
|
| 1031 |
+
";
|
| 1032 |
$wpdb->query($sql);
|
| 1033 |
}
|
| 1034 |
|
| 1570 |
$do_add = TRUE;
|
| 1571 |
} else if (strpos(strtolower($one_row->action), $search) !== FALSE) {
|
| 1572 |
$do_add = TRUE;
|
| 1573 |
+
} else if (strpos(strtolower($one_row->action_description), $search) !== FALSE) {
|
| 1574 |
+
$do_add = TRUE;
|
| 1575 |
}
|
| 1576 |
} else {
|
| 1577 |
$do_add = TRUE;
|
| 1636 |
global $simple_history;
|
| 1637 |
|
| 1638 |
$arr_events = simple_history_get_items_array($args);
|
| 1639 |
+
#sf_d($arr_events);
|
| 1640 |
#sf_d($args);sf_d($arr_events);
|
| 1641 |
$defaults = array(
|
| 1642 |
"page" => 0,
|
| 1667 |
$object_name = $one_row->object_name;
|
| 1668 |
$user_id = $one_row->user_id;
|
| 1669 |
$action = $one_row->action;
|
| 1670 |
+
$action_description = $one_row->action_description;
|
| 1671 |
$occasions = $one_row->occasions;
|
| 1672 |
$num_occasions = sizeof($occasions);
|
| 1673 |
$object_image_out = "";
|
| 1874 |
$user_out .= " \"" . esc_html($object_name) . "\"";
|
| 1875 |
}
|
| 1876 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1877 |
$user_out .= " " . esc_html__($action, "simple-history");
|
| 1878 |
|
| 1879 |
$user_out = ucfirst($user_out);
|
| 1919 |
$diff_str = sprintf( __('<span class="when">%1$s ago</span> by %2$s', "simple-history"), human_time_diff(strtotime($one_row->date), $now), $who );
|
| 1920 |
$output .= $diff_str;
|
| 1921 |
$output .= "<span class='when_detail'>".sprintf(__('%s at %s', 'simple-history'), $date_i18n_date, $date_i18n_time)."</span>";
|
| 1922 |
+
|
| 1923 |
+
// action description
|
| 1924 |
+
if ( trim( $action_description ) ) {
|
| 1925 |
+
$output .= sprintf(
|
| 1926 |
+
'
|
| 1927 |
+
<a href="#" class="simple-history-item-description-toggler">%2$s</a>
|
| 1928 |
+
<div class="simple-history-item-description-wrap">
|
| 1929 |
+
<div class="simple-history-action-description">%1$s</div>
|
| 1930 |
+
</div>
|
| 1931 |
+
',
|
| 1932 |
+
nl2br( esc_attr( $action_description ) ), // 2
|
| 1933 |
+
__("Details", "simple-history") // 2
|
| 1934 |
+
);
|
| 1935 |
+
}
|
| 1936 |
|
| 1937 |
$output .= "</div>";
|
| 1938 |
|
| 1960 |
$many_occasion = sprintf(__("+ %d occasions", 'simple-history'), $num_occasions);
|
| 1961 |
$output .= "<a class='simple-history-occasion-show' href='#'>$many_occasion</a>";
|
| 1962 |
}
|
| 1963 |
+
|
| 1964 |
$output .= "<ul class='simple-history-occasions hidden'>";
|
| 1965 |
foreach ($occasions as $one_occasion) {
|
| 1966 |
+
|
| 1967 |
$output .= "<li>";
|
| 1968 |
+
|
| 1969 |
$date_i18n_date = date_i18n(get_option('date_format'), strtotime($one_occasion->date), $gmt=false);
|
| 1970 |
$date_i18n_time = date_i18n(get_option('time_format'), strtotime($one_occasion->date), $gmt=false);
|
| 1971 |
+
|
| 1972 |
+
$output .= "<div class='simple-history-occasions-one-when'>";
|
| 1973 |
+
$output .= sprintf(
|
| 1974 |
+
__('%s ago (%s at %s)', "simple-history"),
|
| 1975 |
+
human_time_diff(strtotime($one_occasion->date), $now),
|
| 1976 |
+
$date_i18n_date,
|
| 1977 |
+
$date_i18n_time
|
| 1978 |
+
);
|
| 1979 |
+
|
| 1980 |
+
if ( trim( $one_occasion->action_description ) ) {
|
| 1981 |
+
$output .= "<a href='#' class='simple-history-occasions-details-toggle'>" . __("Details", "simple-history") . "</a>";
|
| 1982 |
+
}
|
| 1983 |
+
|
| 1984 |
+
$output .= "</div>";
|
| 1985 |
+
|
| 1986 |
+
if ( trim( $one_occasion->action_description ) ) {
|
| 1987 |
+
$output .= sprintf(
|
| 1988 |
+
'<div class="simple-history-occasions-one-action-description">%1$s</div>',
|
| 1989 |
+
nl2br( esc_attr( $one_occasion->action_description ) )
|
| 1990 |
+
);
|
| 1991 |
+
}
|
| 1992 |
+
|
| 1993 |
|
| 1994 |
$output .= "</li>";
|
| 1995 |
}
|
| 1996 |
+
|
| 1997 |
$output .= "</ul>";
|
| 1998 |
+
|
| 1999 |
$output .= "</div>";
|
| 2000 |
}
|
| 2001 |
|
| 2036 |
$output .= "</div>";
|
| 2037 |
|
| 2038 |
$output .= "
|
| 2039 |
+
<p class='simple-history-no-more-items'>$no_found</p>
|
| 2040 |
<p class='simple-history-rss-feed-dashboard'><a title='$view_rss' href='$view_rss_link'>$view_rss</a></p>
|
| 2041 |
<p class='simple-history-rss-feed-page'><a title='$view_rss' href='$view_rss_link'><span></span>$view_rss</a></p>
|
| 2042 |
";
|
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
|
| 5 |
Requires at least: 3.5.1
|
| 6 |
Tested up to: 3.5.1
|
| 7 |
-
Stable tag: 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 |
|
|
@@ -16,15 +16,26 @@ The plugin works as a log/history/audit log/version history of the most importan
|
|
| 16 |
|
| 17 |
Out of the box Simple History has support for:
|
| 18 |
|
| 19 |
-
* **Posts and pages
|
| 20 |
-
|
| 21 |
-
* **
|
| 22 |
-
|
| 23 |
-
* **
|
| 24 |
-
|
| 25 |
-
* **
|
| 26 |
-
|
| 27 |
-
* **
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
|
| 29 |
With it's easy to use Extender system, developers can add their own settings and items to track.
|
| 30 |
|
|
@@ -62,8 +73,8 @@ if (function_exists("simple_history_add")) {
|
|
| 62 |
# Log that an email has been sent
|
| 63 |
simple_history_add(array(
|
| 64 |
"object_type" => "Email",
|
| 65 |
-
"
|
| 66 |
-
"
|
| 67 |
));
|
| 68 |
|
| 69 |
# Will show “Plugin your_plugin_name Edited” in the history log
|
|
@@ -71,7 +82,15 @@ if (function_exists("simple_history_add")) {
|
|
| 71 |
|
| 72 |
# Will show the history item "Starship USS Enterprise repaired"
|
| 73 |
simple_history_add("action=repaired&object_type=Starship&object_name=USS Enterprise");
|
| 74 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
?>
|
| 76 |
`
|
| 77 |
|
|
@@ -146,18 +165,22 @@ I can do something about it.
|
|
| 146 |
|
| 147 |
== Screenshots ==
|
| 148 |
|
| 149 |
-
1. Simple History showing som recent changes to my posts, users and attachments.
|
| 150 |
|
| 151 |
2. Simple History settings. Choose to show the plugin on your dashboard, or as a separately page. Or both. Or none, since you can choose
|
| 152 |
to only use the secret RSS feed to keep track of the changes on you web site/WordPress installation.
|
| 153 |
|
| 154 |
3. The RSS feed with changes, as shown in Firefox.
|
| 155 |
|
| 156 |
-
4. Widgets can be tracked too!
|
| 157 |
-
|
| 158 |
|
| 159 |
== Changelog ==
|
| 160 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 161 |
= 1.2 =
|
| 162 |
- Fixed: Plugin name is included when plugins is activated or deactivated. Previosuly only folder name and name of php file was included.
|
| 163 |
- Added: Attachment thumbnails are now visible if history item is an attachment. Also includes some metadata.
|
| 4 |
Tags: history, log, changes, changelog, audit, trail, pages, attachments, users, cms, dashboard, admin, syslog
|
| 5 |
Requires at least: 3.5.1
|
| 6 |
Tested up to: 3.5.1
|
| 7 |
+
Stable tag: 1.3
|
| 8 |
|
| 9 |
View changes made by users within WordPress. See who created a page, uploaded an attachment or approved an comment, and more.
|
| 10 |
|
| 16 |
|
| 17 |
Out of the box Simple History has support for:
|
| 18 |
|
| 19 |
+
* **Posts and pages**<br>
|
| 20 |
+
see who added, updated or deleted a post or page
|
| 21 |
+
* **Attachments**<br>
|
| 22 |
+
see who added, updated or deleted an attachment
|
| 23 |
+
* **Comments**<br>
|
| 24 |
+
see who edited, approved or removed a comment
|
| 25 |
+
* **Widgets**<br>
|
| 26 |
+
get info when someone adds, updates or removes a widget in a sidebar
|
| 27 |
+
* **Plugins**<br>
|
| 28 |
+
activation and deactivation
|
| 29 |
+
* **User profiles**<br>
|
| 30 |
+
info about added, updated or removed users
|
| 31 |
+
* **User logins**<br>
|
| 32 |
+
see when a user login & logut
|
| 33 |
+
* **Failed user logins**<br>
|
| 34 |
+
see when someone has tried to log in, but failed. The log will then include ip address of the possible hacker.
|
| 35 |
+
* **bbPress**<br>
|
| 36 |
+
view changes to forums and topics and view user changes
|
| 37 |
+
* **Gravity Forms**<br>
|
| 38 |
+
see who created, edited or deleted a form, field, or entry
|
| 39 |
|
| 40 |
With it's easy to use Extender system, developers can add their own settings and items to track.
|
| 41 |
|
| 73 |
# Log that an email has been sent
|
| 74 |
simple_history_add(array(
|
| 75 |
"object_type" => "Email",
|
| 76 |
+
"object_name" => "Hi there",
|
| 77 |
+
"action" => "was sent"
|
| 78 |
));
|
| 79 |
|
| 80 |
# Will show “Plugin your_plugin_name Edited” in the history log
|
| 82 |
|
| 83 |
# Will show the history item "Starship USS Enterprise repaired"
|
| 84 |
simple_history_add("action=repaired&object_type=Starship&object_name=USS Enterprise");
|
| 85 |
+
|
| 86 |
+
# Log with some extra details about the email
|
| 87 |
+
simple_history_add(array(
|
| 88 |
+
"object_type" => "Email",
|
| 89 |
+
"object_name" => "Hi there",
|
| 90 |
+
"action" => "was sent",
|
| 91 |
+
"description" => "The database query to generate the email took .3 seconds. This is email number 4 that is sent to this user"
|
| 92 |
+
));
|
| 93 |
+
|
| 94 |
?>
|
| 95 |
`
|
| 96 |
|
| 165 |
|
| 166 |
== Screenshots ==
|
| 167 |
|
| 168 |
+
1. Simple History showing som recent changes to my posts, users and attachments. Also showing several failed login attempts to one of my users.
|
| 169 |
|
| 170 |
2. Simple History settings. Choose to show the plugin on your dashboard, or as a separately page. Or both. Or none, since you can choose
|
| 171 |
to only use the secret RSS feed to keep track of the changes on you web site/WordPress installation.
|
| 172 |
|
| 173 |
3. The RSS feed with changes, as shown in Firefox.
|
| 174 |
|
|
|
|
|
|
|
| 175 |
|
| 176 |
== Changelog ==
|
| 177 |
|
| 178 |
+
= 1.3 =
|
| 179 |
+
- Added: history events can store text description with a more detailed explanation of the history item
|
| 180 |
+
- Added: now logs failed login attempts for existing username. Uses the new text description to store more info, for example user agent and remote ip address (REMOTE_ADDR)
|
| 181 |
+
- Fixed: box did not change height when clicking on occasions
|
| 182 |
+
- Fixed: use on() instead of live() in JavaScript
|
| 183 |
+
|
| 184 |
= 1.2 =
|
| 185 |
- Fixed: Plugin name is included when plugins is activated or deactivated. Previosuly only folder name and name of php file was included.
|
| 186 |
- Added: Attachment thumbnails are now visible if history item is an attachment. Also includes some metadata.
|
screenshot-1.png
CHANGED
|
Binary file
|
screenshot-2.png
CHANGED
|
Binary file
|
screenshot-3.png
CHANGED
|
Binary file
|
scripts.js
CHANGED
|
@@ -18,11 +18,17 @@ var simple_history = (function($) {
|
|
| 18 |
elms.ol_wrapper = elms.wrap.find(".simple-history-ol-wrapper");
|
| 19 |
|
| 20 |
// so wrapper does not collapse when loading new items
|
| 21 |
-
elms.ol_wrapper.height( elms.ol_wrapper.height() );
|
|
|
|
| 22 |
|
| 23 |
addListeners();
|
| 24 |
|
| 25 |
elms.wrap.addClass("simple-history-is-ready simple-history-has-items");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
}
|
| 27 |
|
| 28 |
function addListeners() {
|
|
@@ -57,9 +63,30 @@ var simple_history = (function($) {
|
|
| 57 |
}
|
| 58 |
|
| 59 |
// show occasions
|
| 60 |
-
$("a.simple-history-occasion-show"
|
| 61 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
e.preventDefault();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
});
|
| 64 |
|
| 65 |
|
|
@@ -115,7 +142,8 @@ jQuery(document).on("keyup", ".simple-history-filter-search input[type='text'],
|
|
| 115 |
|
| 116 |
// click on filter-link/change value is filter dropdowns = load new via ajax
|
| 117 |
// begin at position 0 unless click on pagination then check pagination page
|
| 118 |
-
jQuery("select.simple-history-filter, .simple-history-filter a, .simple-history-filter input[type='button'], .simple-history-tablenav a").live("click change", function(e, extraParams) {
|
|
|
|
| 119 |
|
| 120 |
var $t = jQuery(this),
|
| 121 |
$ol = jQuery("ol.simple-history"),
|
|
@@ -190,12 +218,13 @@ jQuery("select.simple-history-filter, .simple-history-filter a, .simple-history-
|
|
| 190 |
}
|
| 191 |
|
| 192 |
simple_history_jqXHR = jQuery.post(ajaxurl, data, function(data, textStatus, XMLHttpRequest){
|
| 193 |
-
|
| 194 |
// If no more can be loaded show message about that
|
| 195 |
if (data.error == "noMoreItems") {
|
| 196 |
-
|
| 197 |
jQuery(".simple-history-ol-wrapper").height("auto");
|
| 198 |
$simple_history_wrap.removeClass("simple-history-has-items simple-history-is-loading");
|
|
|
|
| 199 |
|
| 200 |
$displaying_num.html(0);
|
| 201 |
$total_pages.text(1);
|
|
@@ -203,6 +232,7 @@ jQuery("select.simple-history-filter, .simple-history-filter a, .simple-history-
|
|
| 203 |
} else {
|
| 204 |
|
| 205 |
// Items found, add and show
|
|
|
|
| 206 |
|
| 207 |
// update number of existing items and total pages
|
| 208 |
$displaying_num.html(data.filtered_items_total_count_string);
|
|
@@ -211,7 +241,8 @@ jQuery("select.simple-history-filter, .simple-history-filter a, .simple-history-
|
|
| 211 |
$ol.html(data.items_li);
|
| 212 |
|
| 213 |
// set wrapper to the height required to show items
|
| 214 |
-
|
|
|
|
| 215 |
$simple_history_wrap.removeClass("simple-history-is-loading");
|
| 216 |
|
| 217 |
}
|
| 18 |
elms.ol_wrapper = elms.wrap.find(".simple-history-ol-wrapper");
|
| 19 |
|
| 20 |
// so wrapper does not collapse when loading new items
|
| 21 |
+
//elms.ol_wrapper.height( elms.ol_wrapper.height() );
|
| 22 |
+
elms.ol_wrapper.css("max-height", elms.ol_wrapper.height() );
|
| 23 |
|
| 24 |
addListeners();
|
| 25 |
|
| 26 |
elms.wrap.addClass("simple-history-is-ready simple-history-has-items");
|
| 27 |
+
|
| 28 |
+
}
|
| 29 |
+
|
| 30 |
+
function make_wrapper_expandable() {
|
| 31 |
+
elms.ol_wrapper.css("max-height", "1000px");
|
| 32 |
}
|
| 33 |
|
| 34 |
function addListeners() {
|
| 63 |
}
|
| 64 |
|
| 65 |
// show occasions
|
| 66 |
+
$(document).on("click", "a.simple-history-occasion-show", function(e) {
|
| 67 |
+
|
| 68 |
+
$(this).closest("li").find("ul.simple-history-occasions").toggle();
|
| 69 |
+
|
| 70 |
+
make_wrapper_expandable();
|
| 71 |
+
|
| 72 |
e.preventDefault();
|
| 73 |
+
|
| 74 |
+
});
|
| 75 |
+
|
| 76 |
+
// show details for main entry
|
| 77 |
+
$(document).on("click", ".simple-history-item-description-toggler", function(e) {
|
| 78 |
+
e.preventDefault();
|
| 79 |
+
var self = $(this);
|
| 80 |
+
make_wrapper_expandable();
|
| 81 |
+
self.closest("li").toggleClass("simple-history-item-description-wrap-is-open");
|
| 82 |
+
});
|
| 83 |
+
|
| 84 |
+
// show details for occasions
|
| 85 |
+
$(document).on("click", ".simple-history-occasions-details-toggle", function(e) {
|
| 86 |
+
e.preventDefault();
|
| 87 |
+
var self = $(this);
|
| 88 |
+
make_wrapper_expandable();
|
| 89 |
+
self.closest("li").toggleClass("simple-history-occasions-one-description-is-open");
|
| 90 |
});
|
| 91 |
|
| 92 |
|
| 142 |
|
| 143 |
// click on filter-link/change value is filter dropdowns = load new via ajax
|
| 144 |
// begin at position 0 unless click on pagination then check pagination page
|
| 145 |
+
//jQuery("select.simple-history-filter, .simple-history-filter a, .simple-history-filter input[type='button'], .simple-history-tablenav a").live("click change", function(e, extraParams) {
|
| 146 |
+
jQuery(document).on("click change", "select.simple-history-filter, .simple-history-filter a, .simple-history-filter input[type='button'], .simple-history-tablenav a", function(e, extraParams) {
|
| 147 |
|
| 148 |
var $t = jQuery(this),
|
| 149 |
$ol = jQuery("ol.simple-history"),
|
| 218 |
}
|
| 219 |
|
| 220 |
simple_history_jqXHR = jQuery.post(ajaxurl, data, function(data, textStatus, XMLHttpRequest){
|
| 221 |
+
|
| 222 |
// If no more can be loaded show message about that
|
| 223 |
if (data.error == "noMoreItems") {
|
| 224 |
+
|
| 225 |
jQuery(".simple-history-ol-wrapper").height("auto");
|
| 226 |
$simple_history_wrap.removeClass("simple-history-has-items simple-history-is-loading");
|
| 227 |
+
$simple_history_wrap.addClass("simple-history-no-items-found");
|
| 228 |
|
| 229 |
$displaying_num.html(0);
|
| 230 |
$total_pages.text(1);
|
| 232 |
} else {
|
| 233 |
|
| 234 |
// Items found, add and show
|
| 235 |
+
$simple_history_wrap.removeClass("simple-history-is-loading simple-history-no-items-found");
|
| 236 |
|
| 237 |
// update number of existing items and total pages
|
| 238 |
$displaying_num.html(data.filtered_items_total_count_string);
|
| 241 |
$ol.html(data.items_li);
|
| 242 |
|
| 243 |
// set wrapper to the height required to show items
|
| 244 |
+
//$wrapper.height( $ol.height() );
|
| 245 |
+
$wrapper.css( "max-height", $ol.height() );
|
| 246 |
$simple_history_wrap.removeClass("simple-history-is-loading");
|
| 247 |
|
| 248 |
}
|
styles.css
CHANGED
|
@@ -54,15 +54,16 @@ ol.simple-history .first {
|
|
| 54 |
|
| 55 |
ol.simple-history .second {
|
| 56 |
color: #999;
|
|
|
|
| 57 |
}
|
| 58 |
|
| 59 |
ol.simple-history .third {
|
| 60 |
margin-top: .5em;
|
| 61 |
}
|
| 62 |
-
ol.simple-history .third ul {
|
| 63 |
margin-top: .5em;
|
| 64 |
}
|
| 65 |
-
|
| 66 |
.simple-history-who-avatar {
|
| 67 |
position: absolute;
|
| 68 |
top: 10px;
|
|
@@ -123,6 +124,57 @@ ol.simple-history .simple-history-has-attachment-thumnbail .third
|
|
| 123 |
margin: 0 0 .5em 0;
|
| 124 |
}
|
| 125 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
.simple-history-title {
|
| 128 |
font-weight: bold;
|
|
@@ -138,24 +190,17 @@ ol.simple-history .simple-history-has-attachment-thumnbail .third
|
|
| 138 |
}
|
| 139 |
|
| 140 |
ul.simple-history-occasions {
|
| 141 |
-
margin:
|
| 142 |
padding: 0;
|
| 143 |
list-style-type: none;
|
| 144 |
-
color: #
|
| 145 |
}
|
| 146 |
ul.simple-history-occasions li {
|
| 147 |
-
margin: 0;
|
| 148 |
padding: 0;
|
| 149 |
line-height: 1.5;
|
| 150 |
}
|
| 151 |
|
| 152 |
-
.simple-history-no-more-items {
|
| 153 |
-
padding: .5em;
|
| 154 |
-
background-color: #FFFFE0;
|
| 155 |
-
border: 1px solid #E6DB55;
|
| 156 |
-
font-weight: bold;
|
| 157 |
-
}
|
| 158 |
-
|
| 159 |
.simple-history-rss-feed-dashboard {
|
| 160 |
display: none;
|
| 161 |
}
|
|
@@ -221,6 +266,22 @@ ul.simple-history-occasions li {
|
|
| 221 |
visibility: visible;
|
| 222 |
}
|
| 223 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 224 |
.simple-history-tablenav .tablenav-pages {
|
| 225 |
float: none;
|
| 226 |
}
|
|
@@ -289,19 +350,25 @@ ul.simple-history-occasions li {
|
|
| 289 |
opacity: .75;
|
| 290 |
}
|
| 291 |
|
| 292 |
-
|
| 293 |
.simple-history-ol-wrapper {
|
| 294 |
overflow: hidden;
|
| 295 |
}
|
| 296 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
.simple-history-wrap,
|
| 298 |
.simple-history-ol-wrapper,
|
| 299 |
ol.simple-history,
|
| 300 |
-
.simple-history-tablenav
|
| 301 |
-
{
|
| 302 |
transition: all .15s ease-out;
|
| 303 |
}
|
| 304 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 305 |
.simple-history-is-loading ol.simple-history {
|
| 306 |
opacity: 0;
|
| 307 |
}
|
| 54 |
|
| 55 |
ol.simple-history .second {
|
| 56 |
color: #999;
|
| 57 |
+
margin-top: .5em;
|
| 58 |
}
|
| 59 |
|
| 60 |
ol.simple-history .third {
|
| 61 |
margin-top: .5em;
|
| 62 |
}
|
| 63 |
+
/*ol.simple-history .third ul {
|
| 64 |
margin-top: .5em;
|
| 65 |
}
|
| 66 |
+
*/
|
| 67 |
.simple-history-who-avatar {
|
| 68 |
position: absolute;
|
| 69 |
top: 10px;
|
| 124 |
margin: 0 0 .5em 0;
|
| 125 |
}
|
| 126 |
|
| 127 |
+
.simple-history-item-description-wrap {
|
| 128 |
+
margin: 0.5em 0;
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
|
| 132 |
+
.simple-history-item-description-toggler {
|
| 133 |
+
border-left: 1px solid #bbb;
|
| 134 |
+
padding-left: .75em;
|
| 135 |
+
margin-left: .75em;
|
| 136 |
+
line-height: 1;
|
| 137 |
+
}
|
| 138 |
+
|
| 139 |
+
.simple-history-item-description-toggler:before {
|
| 140 |
+
/*content: "+ ";*/
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
.simple-history-action-description,
|
| 144 |
+
.simple-history-occasions-one-action-description {
|
| 145 |
+
margin: .75em 0 .75em .5ex;
|
| 146 |
+
line-height: 1.4;
|
| 147 |
+
display: none;
|
| 148 |
+
background-color: #ddd;
|
| 149 |
+
padding: .5em;
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
.simple-history-item-description-wrap-is-open .simple-history-item-description-toggler:before {
|
| 153 |
+
/*content: "- ";*/
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
.simple-history-item-description-wrap-is-open .simple-history-action-description{
|
| 157 |
+
display: block;
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
.simple-history-occasions-details-toggle {
|
| 161 |
+
margin-left: .75em;
|
| 162 |
+
padding-left: .75em;
|
| 163 |
+
border-left: 1px solid #bbb;
|
| 164 |
+
}
|
| 165 |
+
|
| 166 |
+
|
| 167 |
+
.simple-history-occasions-one-description-is-open .simple-history-occasions-one-action-description {
|
| 168 |
+
display: block;
|
| 169 |
+
margin-left: 2em;
|
| 170 |
+
}
|
| 171 |
+
|
| 172 |
+
|
| 173 |
+
.simple-history-occasions-one-action-description {
|
| 174 |
+
display: none;
|
| 175 |
+
}
|
| 176 |
+
|
| 177 |
+
.simple-history-occasions-details-toggle
|
| 178 |
|
| 179 |
.simple-history-title {
|
| 180 |
font-weight: bold;
|
| 190 |
}
|
| 191 |
|
| 192 |
ul.simple-history-occasions {
|
| 193 |
+
margin: 1em 0 0 1em;
|
| 194 |
padding: 0;
|
| 195 |
list-style-type: none;
|
| 196 |
+
color: #999;
|
| 197 |
}
|
| 198 |
ul.simple-history-occasions li {
|
| 199 |
+
margin: .5em 0;
|
| 200 |
padding: 0;
|
| 201 |
line-height: 1.5;
|
| 202 |
}
|
| 203 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 204 |
.simple-history-rss-feed-dashboard {
|
| 205 |
display: none;
|
| 206 |
}
|
| 266 |
visibility: visible;
|
| 267 |
}
|
| 268 |
|
| 269 |
+
.simple-history-no-more-items {
|
| 270 |
+
padding: .5em;
|
| 271 |
+
background-color: #FFFFE0;
|
| 272 |
+
border: 1px solid #E6DB55;
|
| 273 |
+
font-weight: bold;
|
| 274 |
+
display: none;
|
| 275 |
+
}
|
| 276 |
+
|
| 277 |
+
.simple-history-no-items-found .simple-history-no-more-items {
|
| 278 |
+
display: block;
|
| 279 |
+
}
|
| 280 |
+
|
| 281 |
+
.simple-history-no-items-found .simple-history-ol-wrapper {
|
| 282 |
+
display: none;
|
| 283 |
+
}
|
| 284 |
+
|
| 285 |
.simple-history-tablenav .tablenav-pages {
|
| 286 |
float: none;
|
| 287 |
}
|
| 350 |
opacity: .75;
|
| 351 |
}
|
| 352 |
|
|
|
|
| 353 |
.simple-history-ol-wrapper {
|
| 354 |
overflow: hidden;
|
| 355 |
}
|
| 356 |
|
| 357 |
+
.simple-history-ol-wrapper {
|
| 358 |
+
/*overflow: visible;*/
|
| 359 |
+
}
|
| 360 |
+
|
| 361 |
.simple-history-wrap,
|
| 362 |
.simple-history-ol-wrapper,
|
| 363 |
ol.simple-history,
|
| 364 |
+
.simple-history-tablenav {
|
|
|
|
| 365 |
transition: all .15s ease-out;
|
| 366 |
}
|
| 367 |
|
| 368 |
+
.simple-history-ol-wrapper {
|
| 369 |
+
xtransition: max-height .15s ease-out;
|
| 370 |
+
}
|
| 371 |
+
|
| 372 |
.simple-history-is-loading ol.simple-history {
|
| 373 |
opacity: 0;
|
| 374 |
}
|
