"Options Logger",
"description" => "Logs updates to WordPress settings",
"capability" => "manage_options",
"messages" => array(
//'option_updated' => __('Updated option "{option}" on settings page "{option_page}"', "simple-history"),
'option_updated' => __('Updated option "{option}"', "simple-history"),
/*
Updated option "default_comment_status" on settings page "discussion"
Edited option "default_comment_status" on settings page "discussion"
Modified option "default_comment_status" on settings page "discussion"
Edited settings page "discussion" and the "default_comment_status" options
*/
),
"labels" => array(
"search" => array(
"label" => _x("Options", "Options logger: search", "simple-history"),
"options" => array(
_x("Changed options", "Options logger: search", "simple-history") => array(
"option_updated"
),
)
) // end search array
) // end labels
);
return $arr_info;
}
function loaded() {
add_action( 'updated_option', array($this, "on_updated_option"), 10, 3 );
}
function on_updated_option( $option, $old_value, $new_value ) {
if ( empty( $_SERVER["REQUEST_URI"] ) ) {
return;
}
$arr_option_pages = array(
0 => "options.php",
1 => "options-permalink.php"
);
// We only want to log options being added via pages in $arr_option_pages
if ( ! in_array( basename( $_SERVER["REQUEST_URI"] ), $arr_option_pages ) || basename( dirname( $_SERVER["REQUEST_URI"] ) ) !== "wp-admin" ) {
return;
}
// Also only if "option_page" is set to one of these "built in" ones
// We don't wanna start loging things from other plugins, like EDD
$option_page = isset( $_REQUEST["option_page"] ) ? $_REQUEST["option_page"] : ""; // general | discussion | ...
$arr_valid_option_pages = array(
'general',
'discussion',
'media',
'reading',
'writing',
);
$is_valid_options_page = $option_page && in_array( $option_page, $arr_valid_option_pages );
// Permalink settings page does not post any "option_page", so use http referer instead
if ( strpos( $_SERVER["REQUEST_URI"], "options-permalink.php" ) !== false ) {
$is_valid_options_page = true;
$options_page = "permalink";
}
if ( ! $is_valid_options_page ) {
return;
}
// Check if option name is ok
// For example if you change front page displays setting the "rewrite_rules" options gets updated too
$arr_invalid_option_names = array(
"rewrite_rules"
);
if ( in_array( $option, $arr_invalid_option_names ) ) {
return;
}
$context = array(
'option' => $option,
'old_value' => $old_value,
'new_value' => $new_value,
'option_page' => $option_page,
#'referer' => wp_get_referer(),
#'REQUEST_URI' => $_SERVER['REQUEST_URI'],
#'$_REQUEST' => print_r($_REQUEST, true),
);
// Store a bit more about some options
// Like "page_on_front" we also store post title
// Check for a method for current option in this class and calls it automagically
$methodname = "add_context_for_option_{$option}";
if ( method_exists( $this, $methodname ) ) {
$context = $this->$methodname( $context, $old_value, $new_value, $option, $option_page );
}
$this->infoMessage( 'option_updated', $context );
}
/**
* Give some options better plain text output
*
* Not doing anything at the moment, because it was really difficaly to give them meaningful text values
*/
public function getLogRowPlainTextOutput( $row ) {
$message = $row->message;
$context = $row->context;
$message_key = $context["_message_key"];
$return_message = "";
// Only link to attachment if it is still available
if ( "option_updated" == $message_key ) {
/*
$option = isset( $context["option"] ) ? $context["option"] : null;
$option_page = isset( $context["option_page"] ) ? $context["option_page"] : null;
$new_value = isset( $context["new_value"] ) ? $context["new_value"] : null;
$old_value = isset( $context["old_value"] ) ? $context["old_value"] : null;
# $return_message = "";
$arr_options_to_translate = array(
"$option_page/blog_public" => array(
"text" => "Updated setting Search Engine Visibility"
),
"$option_page/rss_use_excerpt" => array(
"text" => "Updated setting For each article in a feed, show"
),
"$option_page/posts_per_rss" => array(
"text" => "Updated setting for Syndication feeds show the most recent"
),
"$option_page/posts_per_page" => array(
"text" => "Updated setting for Blog pages show at most"
)
);
if ( isset( $arr_options_to_translate[ "{$option_page}/{$option}" ] ) ) {
$return_message = $arr_options_to_translate[ "{$option_page}/{$option}" ]["text"];
}
*/
}
if ( empty( $return_message ) ) {
// No specific text to output, fallback to default
$return_message = parent::getLogRowPlainTextOutput( $row );
}
return $return_message;
}
/**
* Get detailed output
*/
function getLogRowDetailsOutput($row) {
$context = $row->context;
$message_key = $context["_message_key"];
$output = "";
$option = isset( $context["option"] ) ? $context["option"] : null;
$option_page = isset( $context["option_page"] ) ? $context["option_page"] : null;
$new_value = isset( $context["new_value"] ) ? $context["new_value"] : null;
$old_value = isset( $context["old_value"] ) ? $context["old_value"] : null;
$tmpl_row = '
%1$s |
%2$s |
';
if ( "option_updated" == $message_key ) {
//$message = 'Old value was {old_value} and new value is {new_value}';
$output .= "";
// Output old and new values
if ( $context["new_value"] || $context["old_value"] ) {
$option_custom_output = "";
$methodname = "get_details_output_for_option_{$option}";
if ( method_exists( $this, $methodname ) ) {
$option_custom_output = $this->$methodname( $context, $old_value, $new_value, $option, $option_page, $tmpl_row );
}
if ( empty( $option_custom_output ) ) {
// all other options or fallback if custom output did not find all it's stuff
$more = __( '…' );
$trim_length = 250;
$trimmed_new_value = substr( $new_value, 0, $trim_length );
$trimmed_old_value = substr( $old_value, 0, $trim_length );
if ( strlen( $new_value ) > $trim_length ) {
$trimmed_new_value .= $more;
}
if ( strlen( $old_value ) > $trim_length ) {
$trimmed_old_value .= $more;
}
$output .= sprintf(
$tmpl_row,
__("New value", "simple-history"),
esc_html( $trimmed_new_value )
);
$output .= sprintf(
$tmpl_row,
__("Old value", "simple-history"),
esc_html( $trimmed_old_value )
);
} else {
$output .= $option_custom_output;
} // if option output
} // if new or old val
// If key option_page this was saved from regular settings pages
if ( ! empty( $option_page ) ) {
$output .= sprintf(
'
%1$s |
%2$s |
',
__("Settings page", "simple-history"),
esc_html( $context["option_page"] ),
admin_url("options-{$option_page}.php")
);
}
// If option = permalink_structure then we did it from permalink page
if ( ! empty( $option ) && ( "permalink_structure" == $option || "tag_base" == $option || "category_base" == $option ) ) {
$output .= sprintf(
'
%1$s |
%2$s |
',
__("Settings page", "simple-history"),
"permalink",
admin_url("options-permalink.php")
);
}
$output .= "
";
}
return $output;
}
/**
* Page on front = "Front page displays" -> Your latest posts / A static page
* value 0 = Your latest post
* value int n = A static page
*/
function add_context_for_option_page_on_front( $context, $old_value, $new_value, $option, $option_page ) {
if ( ! empty( $old_value ) && is_numeric( $old_value ) ) {
$old_post = get_post( $old_value );
if ( $old_post ) {
$context["old_post_title"] = $old_post->post_title;
}
}
if ( ! empty( $new_value ) && is_numeric( $new_value ) ) {
$new_post = get_post( $new_value );
if ( $new_post ) {
$context["new_post_title"] = $new_post->post_title;
}
}
return $context;
}
function add_context_for_option_page_for_posts( $context, $old_value, $new_value, $option, $option_page ) {
// Get same info as for page_on_front
$context = call_user_func_array( array( $this, "add_context_for_option_page_on_front"), func_get_args() );
return $context;
}
function get_details_output_for_option_page_for_posts( $context, $old_value, $new_value, $option, $option_page ) {
$output = call_user_func_array( array( $this, "get_details_output_for_option_page_on_front"), func_get_args() );
return $output;
}
/**
* Add detailed putput for page_on_front
*
* @return string output
*/
function get_details_output_for_option_page_on_front( $context, $old_value, $new_value, $option, $option_page, $tmpl_row ) {
$output = "";
if ( $new_value && ! empty( $context["new_post_title"] ) ) {
$post_title_with_link = "";
if ( get_post_status( $new_value ) ) {
$post_title_with_link = sprintf('%2$s', get_edit_post_link( $new_value ), esc_html( $context["new_post_title"] ) );
} else {
$post_title_with_link = esc_html( $context["new_post_title"] );
}
$output .= sprintf(
$tmpl_row,
__("New value", "simple-history"),
sprintf( __('Page %1$s', "simple-history" ), $post_title_with_link)
);
}
if ( intval( $new_value ) == 0 ) {
$output .= sprintf(
$tmpl_row,
__("New value", "simple-history"),
__("Your latests posts", "simple-history")
);
}
if ( $old_value && ! empty( $context["old_post_title"] ) ) {
$post_title_with_link = "";
if ( get_post_status( $old_value ) ) {
$post_title_with_link = sprintf('%2$s', get_edit_post_link( $old_value ), esc_html( $context["old_post_title"] ) );
} else {
$post_title_with_link = esc_html( $context["old_post_title"] );
}
$output .= sprintf(
$tmpl_row,
__("Old value", "simple-history"),
sprintf( __('Page %1$s', "simple-history" ), $post_title_with_link)
);
}
if ( intval( $old_value ) == 0 ) {
$output .= sprintf(
$tmpl_row,
__("Old value", "simple-history"),
__("Your latests posts", "simple-history")
);
}
return $output;
} // custom output page_on_front
/**
* "default_category" = Writing Settings ยป Default Post Category
*/
function add_context_for_option_default_category( $context, $old_value, $new_value, $option, $option_page ) {
if ( ! empty( $old_value ) && is_numeric( $old_value ) ) {
$old_category_name = get_the_category_by_ID( $old_value );
if ( ! is_wp_error( $old_category_name) ) {
$context["old_category_name"] = $old_category_name;
}
}
if ( ! empty( $new_value ) && is_numeric( $new_value ) ) {
$new_category_name = get_the_category_by_ID( $new_value );
if ( ! is_wp_error( $new_category_name) ) {
$context["new_category_name"] = $new_category_name;
}
}
return $context;
}
function add_context_for_option_default_email_category( $context, $old_value, $new_value, $option, $option_page ) {
$context = call_user_func_array( array( $this, "add_context_for_option_default_category"), func_get_args() );
return $context;
}
/**
* Add detailed putput for default_category
*
* @return string output
*/
function get_details_output_for_option_default_category( $context, $old_value, $new_value, $option, $option_page, $tmpl_row ) {
$old_category_name = isset( $context["old_category_name"] ) ? $context["old_category_name"] : null;
$new_category_name = isset( $context["new_category_name"] ) ? $context["new_category_name"] : null;
if ( $old_category_name ) {
$output .= sprintf(
$tmpl_row,
__("Old value", "simple-history"),
esc_html( $old_category_name )
);
}
if ( $new_category_name ) {
$output .= sprintf(
$tmpl_row,
__("New value", "simple-history"),
esc_html( $new_category_name )
);
}
return $output;
}
function get_details_output_for_option_default_email_category( $context, $old_value, $new_value, $option, $option_page, $tmpl_row ) {
$output = call_user_func_array( array( $this, "get_details_output_for_option_default_category"), func_get_args() );
return $output;
}
}