__construct();}
/**
* PHP 5 Constructor
*/
function __construct(){
$this->adminOptions = $this->get_admin_options();
if ( !defined('WP_CONTENT_URL') )
define( 'WP_CONTENT_URL', get_option('siteurl') . '/wp-content');
if ( !defined('WP_CONTENT_DIR'))
define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
$this->pluginDir = WP_CONTENT_URL . '/plugins/wp-ajax-edit-comments';
$this->initialize_errors();
$this->skip = false;
//css
add_action("wp_head", array(&$this,"add_css"));
add_action('admin_head', array(&$this,"add_css"));
//JavaScript
add_action('admin_print_scripts', array(&$this,'add_post_scripts'),1000);
add_action('wp_print_scripts', array(&$this,'add_post_scripts'),1000);
add_action('wp_head', array(&$this, 'add_script_vars'), 1001);
add_action('admin_head', array(&$this,"add_script_vars"), 1001);
//Custom actions for other plugin authors
add_action('add_wp_ajax_comments_js_post', array(&$this,'add_post_scripts'));
add_action('add_wp_ajax_comments_js_admin', array(&$this,'add_post_scripts'));
add_action('wp_ajax_comments_comment_edited', array(&$this, 'edit_notification'),1,2);
add_action('wp_ajax_comments_comment_edited', array(&$this, 'comment_edited'),2,2);
add_action('wp_ajax_comments_remove_content_filter', array(&$this, 'comment_filter'));
//Initialization stuff
add_action('init', array(&$this, 'init'));
//Admin options
add_action('admin_menu', array(&$this,'add_admin_pages'));
//When a comment is posted
add_action('comment_post', array(&$this, 'comment_posted'),100,1);
//Yay, filters.
add_filter('comment_excerpt', array(&$this, 'add_edit_links'), '1000');
add_filter('get_comment_date', array(&$this, 'add_date_spans'), '1000');
add_filter('get_comment_time', array(&$this, 'add_time_spans'), '1000');
add_filter('comment_text', array(&$this, 'add_edit_links'), '1000'); //Low priority so other HTML can be added first
add_filter('get_comment_author_link', array(&$this, 'add_author_spans'), '1000'); //Low priority so other HTML can be added first
}
/* add_author_spans - Adds spans to author links */
function add_author_spans($content) {
global $comment;
if (empty($comment)) { return $content; }
if ($this->can_edit_quickcheck($comment) != 1) { return $content; } //--ag
if ($this->can_edit($comment->comment_ID, $comment->comment_post_ID) != 1) { return $content; }
$content = "";
return $content;
}
/* add_date_spans - Adds spans to date links */
function add_date_spans($content) {
global $comment;
if (empty($comment)) { return $content; }
if ($this->can_edit_quickcheck($comment) != 1) { return $content; } //--ag
if ($this->can_edit($comment->comment_ID, $comment->comment_post_ID) != 1) { return $content; }
$content = "";
return $content;
}
/* add_edit_links - Adds edit links to post and admin panels */
function add_edit_links($content) {
global $comment;
if ($this->skip) { $this->skip = false; return $content; }
if (empty($comment)) { return $content; }
if (is_page() && $this->adminOptions['show_pages'] != 'true') {
return $content;
}
if ($this->can_edit_quickcheck($comment) != 1) { return $content; } //--ag
if ($this->can_edit($comment->comment_ID, $comment->comment_post_ID) != 1) { return $content; }
if ($this->adminOptions['comment_display_top'] == 'true') {
$aec_top = true;
}
$tempContent = $content; //temporary variable to store content
$edit_admin = "edit-comment-admin-links";
$beginning=$seperator=$end=$clearfix=$timer_class='';
if ($this->adminOptions['icon_display'] != 'classic' && $this->adminOptions['icon_display'] != 'dropdown') {
$edit_admin = "edit-comment-admin-links-no-icon";
$timer_class = "ajax-edit-time-left-no-icon";
$beginning = "[ ";
$seperator = " | ";
$end = " ]";
}
/*If you're wondering why the JS is inline, it's because people with 500+ comments were having their browsers lock up. With inline, the JS is run as needed. Not elegant, but the best solution.*/
if (!isset($aec_top)) { //Test to see if user wants interface on top or bottom
$content = '
';
$content .= "";
} else {
$content = '';
}
if (!$this->is_comment_owner($comment->comment_post_ID)) {
//For anonymous users
$content .= "";
//End for anonymous users
} else {
$options = $this->get_user_options();
if (is_admin() && $options['admin_editing'] == "false") {
//We're in the admin panel
$content .= '";
//End in the admin panel
} elseif ($options['comment_editing'] == "true") {
//We're in a post
$content .= '";
}
}
if (isset($aec_top)) { //Test to see if user wants interface on top or bottom
$content .= "";
$content .= '';
}
return $content;
} //end function add_edit_links
/* add_date_spans - Adds spans to date links */
function add_time_spans($content) {
global $comment;
if (empty($comment)) { return $content; }
if ($this->can_edit_quickcheck($comment) != 1) { return $content; } //--ag
if ($this->can_edit($comment->comment_ID, $comment->comment_post_ID) != 1) { return $content; }
$content = "";
return $content;
}
/* approve_comment - Marks a comment as approved
Parameters - $commentID, $postID
Returns - 1 if successful, a string error message if not */
function approve_comment($commentID=0, $postID = 0) {
if ($this->is_comment_owner($postID)) {
$status = wp_set_comment_status($commentID, 'approve')? "1" : 'approve_failed';
return $status;
} else {
return 'approve_failed_permission';
}
}
function build_admin_links($commentID, $postID, $content = '') {
$comment = get_comment($commentID);
if (empty($comment->comment_author_url) || $comment->comment_author_url == "http://") {
$delink = false;
}
$ajax_url = $this->pluginDir . "/php/AjaxEditComments.php";
if (!$this->is_comment_owner($postID) || $this->adminOptions['show_advanced'] == "false") {
$edit_url = clean_url(wp_nonce_url($this->pluginDir . "/php/comment-editor.php" . "?action=editcomment&p=$postID&c=$commentID", "editcomment_$commentID")."&height=445&width=560");
} else {
$edit_url = clean_url(wp_nonce_url($this->pluginDir . "/php/comment-editor.php" . "?action=editcomment&p=$postID&c=$commentID", "editcomment_$commentID")."&height=560&width=620");
}
$move_comment_url = clean_url(wp_nonce_url($this->pluginDir . "/php/move-comment.php" . "?action=movecomment&p=$postID&c=$commentID", "movecomment_$commentID")."&height=500&width=560");
$request_deletion_url = clean_url(wp_nonce_url($this->pluginDir . "/php/request-deletion.php" . "?action=requestdeletion&p=$postID&c=$commentID", "requestdeletion_$commentID")."&height=425&width=560");
$spam_url = clean_url( wp_nonce_url( $ajax_url . "?action=spamcomment&p=$postID&c=$commentID", "spamcomment_$commentID" ) );
$blacklist_url = clean_url(wp_nonce_url($this->pluginDir . "/php/blacklist-comment.php" . "?action=blacklist&p=$postID&c=$commentID", "blacklist_$commentID")."&height=550&width=600");
$delete_url = clean_url( wp_nonce_url( $ajax_url . "?action=deletecomment&p=$postID&c=$commentID", "deletecomment_$commentID" ) );
$moderate_url = clean_url( wp_nonce_url( $ajax_url . "?action=unapprovecomment&p=$postID&c=$commentID", "unapprovecomment_$commentID" ) );
$approve_url = clean_url( wp_nonce_url( $ajax_url . "?action=approvecomment&p=$postID&c=$commentID", "approvecomment_$commentID" ) );
$delink_url = clean_url( wp_nonce_url( $ajax_url . "?action=delinkcomment&p=$postID&c=$commentID", "delinkcomment_$commentID" ) );
//Icon Classes
$spam_class=$moderate_class=$edit_class=$approve_class=$delete_class=$beginning=$seperator=$end=$clearfix=$timer_class='';
$edit_admin = "edit-comment-admin-links";
if ($this->adminOptions['icon_display'] == 'classic' || $this->adminOptions['icon_display'] == 'dropdown') {
$spam_class = 'spam-comment';
$moderate_class = 'moderate-comment';
$edit_class = 'edit-comment';
$request_deletion_class = "request-deletion-comment";
$approve_class = 'approve-comment';
$delete_class = 'delete-comment';
$delink_class = 'delink-comment';
$move_class = "move-comment";
$blacklist_class = "blacklist-comment";
} else {
$edit_admin = "edit-comment-admin-links-no-icon";
$timer_class = "ajax-edit-time-left-no-icon";
$beginning = "[ ";
$seperator = " | ";
$end = " ]";
}
if ($this->adminOptions['clear_after'] == 'true') {
$clearfix = "clearfix";
}
//For anonymous users
if (!$this->is_comment_owner($postID)) {
$content .= "localizationName)."' class='$edit_class' href='$edit_url' onclick='return jQuery.ajaxeditcomments.edit(this);' id='edit-$commentID'>";
$content .= __("Click to Edit",$this->localizationName);
$content .= "";
//check if deletion option is on
if ($this->adminOptions['allow_deletion'] == "true") {
$content .= "localizationName)."' class='$request_deletion_class' href='$request_deletion_url' onclick='return jQuery.ajaxeditcomments.request_deletion(this);' id='request-deletion-$commentID'>";
$content .= __("Request Deletion",$this->localizationName);
$content .= "";
}
//Check to see if timer is on
if ($this->adminOptions['show_timer'] == 'true') {
//Check to see if user is logged in and admin can indefinitely edit
if (!$this->can_indefinitely_edit($comment->user_id)) {
$content .= " ";
}
}
return $content;
}
$options = $this->get_user_options();
if (is_admin() && $options['admin_editing'] == "false") {
//Spans are used here instead of LIs because of style conflicts in the admin panel
$content .= "";
if ($this->adminOptions['icon_display'] == "dropdown") {
//begin dropdown
$content .= ""; //end more options
}
return $content;
} elseif ($options['comment_editing'] == "true") {
//Spans are used here instead of LIs because of style conflicts in the admin panel
$content .= "$beginninglocalizationName)."' class='$edit_class' href='$edit_url' onclick='return jQuery.ajaxeditcomments.edit(this);' id='edit-$commentID'>";
$content .= __('Edit', $this->localizationName);
$content .= "";
if ($this->adminOptions['icon_display'] == "dropdown") {
//begin dropdown
$content .= "";
$content .= "" /* end Dropdown span */;
}
return $content;
}
return $content;
} //end build admin links
//Builds an undo message
function build_undo_url($action,$commentID,$postID, $message) {
$undo_url = clean_url(wp_nonce_url($this->pluginDir . "/php/AjaxEditComments.php" . "?action=$action&p=$postID&c=$commentID", $action . "_" . $commentID));
$undo = "$message";
return $undo;
}
/*
can_edit - Determines if a user can edit a particular comment on a particular post
Parameters - commentID, postID
Returns - Enumeration (0=unsuccessful,1=successful,or string error code)
*/
function can_edit($commentID = 0, $postID = 0) {
global $wpdb;
//Check if admin/editor/post author
if ($this->is_comment_owner($postID)) {
return 1;
}
//Check to see if admin allows comment editing
if ($this->adminOptions['allow_editing'] == "false") {
return 'no_user_editing';
}
//Get the current comment, if necessary
$comment = $this->get_edit_comment($commentID);
if (!$comment) { return 'get_comment_failed'; }
//Check to see if the comment is spam
if ($comment['comment_approved'] === 'spam') {
return 'comment_spam';
}
//Check to see if the comment is spam
/*if ($comment['comment_approved'] === '0') {
return 'comment_moderated';
}
*/
//Check to see if the user is logged in and can indefinitely edit
if ($this->can_indefinitely_edit($comment['user_id'])) {
return 1;
}
//Now we check to see if there is any time remaining for comments
$timestamp = $comment['time'];
$time = current_time('timestamp',1)-$timestamp;
$minutesPassed = round(((($time%604800)%86400)%3600)/60);
//Get the time the admin has set for minutes
$minutes = $this->adminOptions['minutes'];
if (!is_numeric($minutes)) {
$minutes = $this->minutes; //failsafe
}
if ($minutes < 1) {
$minutes = $this->minutes;
}
if (($minutesPassed - $minutes) > 0) {
return 'comment_time_elapsed';
}
//Now check if options allow editing after an additional comment has been made
if ($this->adminOptions['allow_editing_after_comment'] == "false") {
//Admin doesn't want users to edit - so now check if any other comments have been left
$query = "SELECT comment_ID from $wpdb->comments where comment_post_ID = $postID and comment_type <> 'pingback' and comment_type <> 'trackback' order by comment_ID DESC limit 1";
$newComment = $wpdb->get_row($query, ARRAY_A);
if (!$newComment) { return 'new_comment_posted'; }
//Check to see if there is a higher comment ID
if ($commentID != $newComment['comment_ID']) { return 'new_comment_posted'; }
}
//Get post security key
$postContent = $wpdb->get_row("SELECT meta_value FROM $wpdb->postmeta WHERE post_id = " . $comment['comment_post_ID'] . " and meta_key = '_" . $comment['comment_ID'] . "'", ARRAY_A);//$wpdb->get_row("SELECT post_content from $wpdb->posts WHERE post_type = 'ajax_edit_comments' and guid = $commentID order by ID desc limit 1", ARRAY_A);
if (!$postContent) { return 'comment_edit_denied'; }
$hash = md5($comment['comment_author_IP'] . $comment['comment_date_gmt']);
//Now check to see if there's a valid cookie
if ($GLOBALS[$this->cookieName . $commentID . $hash]=='' ){ //For compatability with CFORMS
if (isset($_COOKIE[$this->cookieName . $commentID . $hash])) {
if ($_COOKIE[$this->cookieName . $commentID . $hash] != $postContent['meta_value']) { return 'comment_edit_denied'; }
} else {
return 'comment_edit_denied';
}
} else {
if ($GLOBALS[$this->cookieName . $commentID . $hash] != $postContent['meta_value']) { return 'comment_edit_denied'; }
}
return 1; //Yay, user can edit
} //End function can_edit
/*
can_edit_quickckech - Quick check without DB access before can_edit() --ag
Parameters - comment
Returns - Enumeration (0=unsuccessful,1=successful,or string error code)
*/
function can_edit_quickcheck($comment) {
//Check if admin/editor/post author
if ($this->is_comment_owner($comment->comment_post_ID)) {
return 1;
}
//Check to see if the user is logged in and can indefinitely edit
if ($this->can_indefinitely_edit($comment->user_id)) {
return 1;
}
//Now we check to see if there is any time remaining for comments
$timestamp = strtotime($comment->comment_date);
$time = current_time('timestamp',get_option('gmt_offset'))-$timestamp;
$minutesPassed = round(((($time%604800)%86400)%3600)/60);
//Get the time the admin has set for minutes
$minutes = $this->adminOptions['minutes'];
if (!is_numeric($minutes)) {
$minutes = $this->minutes; //failsafe
}
if ($minutes < 1) {
$minutes = $this->minutes;
}
if (($minutesPassed - $minutes) > 0) {
return 'comment_time_elapsed';
} else {
return 1; //Yay, user can edit
}
} //End function can_edit_quickcheck
/* can_edit_name - Checks to see if a user can edit a name
Parameters - $commentID, $postID
Returns true if one can, false if not */
function can_edit_name($commentID, $postID) {
if ($this->is_comment_owner($postID)) { return true; }
$comment = get_comment($commentID, ARRAY_A);
if ($this->is_logged_in($comment['user_id'])) { //logged in
if ($this->adminOptions['registered_users_name_edit'] == "true") { return true;}
} else { //not logged in
if ($this->adminOptions['allow_name_editing'] == "true") { return true;}
}
return false;
}
/* can_edit_email - Checks to see if a user can edit an e-mail address
Parameters - $commentID, $postID
Returns true if one can, false if not */
function can_edit_email($commentID, $postID) {
$comment = get_comment($commentID, ARRAY_A);
//Return false if comment is pingback or trackback
if ($comment['comment_type'] == "pingback" || $comment['comment_type'] == 'trackback') { return false; }
if ($this->is_comment_owner($postID)) { return true; }
if ($this->is_logged_in($comment['user_id'])) { //logged in
if ($this->adminOptions['registered_users_email_edit'] == "true") { return true;}
} else { //not logged in
if ($this->adminOptions['allow_email_editing'] == "true") { return true;}
}
return false;
}
/* can_edit_url - Checks to see if a user can edit a url
Parameters - $commentID, $postID
Returns true if one can, false if not */
function can_edit_url($commentID, $postID) {
if ($this->is_comment_owner($postID)) { return true; }
$comment = get_comment($commentID, ARRAY_A);
if ($this->is_logged_in($comment['user_id'])) { //logged in
if ($this->adminOptions['registered_users_url_edit'] == "true") { return true;}
} else { //not logged in
if ($this->adminOptions['allow_url_editing'] == "true") { return true;}
}
return false;
}
/* can_edit_options - Checks to see if a non-admin user can edit various options
Parameters - $commentID, $postID
Returns true if one can, false if not */
function can_edit_options($commentID, $postID) {
if ($this->is_comment_owner($postID)) { return true; }
$comment = get_comment($commentID, ARRAY_A);
if ($this->is_logged_in($comment['user_id'])) { //logged in
if ($this->adminOptions['registered_users_url_edit'] == "true" || $this->adminOptions['registered_users_email_edit'] == "true" || $this->adminOptions['registered_users_name_edit'] == "true" ) { return true;}
} else { //not logged in
if ($this->adminOptions['allow_url_editing'] == "true" || $this->adminOptions['allow_email_editing'] == "true" || $this->adminOptions['allow_name_editing'] == "true") { return true;}
}
return false;
}
/* can_indefinitely_edit
Parameters - $userID
Returns - true if can, false if not */
function can_indefinitely_edit($userID = 0) {
if ($this->is_logged_in($userID)) {
//User is logged in and this is the user's comment - Does admin allow indefinite editing?
if ($this->adminOptions['registered_users_edit'] == "true") {
return true; //Logged in user can indefinitely edit
}
}
return false;
}
/* can_scroll
Checks to see if an admin can scroll to the comment or not
Returns - true if can, false if not*/
function can_scroll() {
if ($this->is_comment_owner()) {
if ($this->adminOptions['javascript_scrolling'] == "true") {
return "1";
}
}
return "0";
}
/* check_spam - Checks an edited comment for spam
Parameters - $commentID, $postID
Returns - True if spam, false if not */
function check_spam($commentID = 0, $postID = 0) {
$options = $this->adminOptions;
//Check to see if spam protection is enabled
if ($options['spam_protection'] == "none") { return false;}
//Return if user is post author or can edit posts
if ($this->is_comment_owner($postID)) { return false; }
if (function_exists("akismet_check_db_comment") && $options['spam_protection'] == 'akismet') { //Akismet
//Check to see if there is a valid API key
if (akismet_verify_key(get_option('wordpress_api_key')) != "failed") { //Akismet
$response = akismet_check_db_comment($commentID);
if ($response == "true") { //You have spam
wp_set_comment_status($commentID, 'spam');
return true;
}
}
} elseif ($options['spam_protection'] == "defensio" && function_exists('defensio_post') ) { //Defensio
global $defensio_conf, $wpdb;
$comment = get_comment($commentID, ARRAY_A);
if (!$comment) { return true; }
$comment['owner-url'] = $defensio_conf['blog'];
$comment['user-ip'] = $comment['comment_author_IP'];
$comment['article-date'] = strftime("%Y/%m/%d", strtotime($wpdb->get_var("SELECT post_date FROM $wpdb->posts WHERE ID=" . $comment['comment_post_ID'])));
$comment['comment-author'] = $comment['comment_author'];
$comment['comment-author-email'] = $comment['comment_author_email'];
$comment['comment-author-url'] = $comment['comment_author_url'];
$comment['comment-content'] = defensio_unescape_string($comment['comment_content']);
if (!isset($comment['comment_type']) or empty($comment['comment_type'])) {
$comment['comment-type'] = 'comment';
} else {
$comment['comment-type'] = $comment['comment_type'];
}
if (defensio_reapply_wp_comment_preferences($comment) === "spam") {
return true;
}
$results = defensio_post('audit-comment',$comment);
$ar = Spyc :: YAMLLoad($results);
if (isset($ar['defensio-result'])) {
if ($ar['defensio-result']['spam']) {
wp_set_comment_status($commentID, 'spam');
return true;
}
}
}
return false;
} //end function check_spam
/* - comment_edited - Run after a comment has successfully been edited
Parameters - $commentID, $postID*/
function comment_edited($commentID = 0, $postID = 0) {
//Clear the comment cache
if (function_exists('clean_comment_cache')) { clean_comment_cache($commentID); }
//For WP Cache and WP Super Cache
if (function_exists('wp_cache_post_change')) {
@wp_cache_post_change($postID);
}
//Get out if user is admin or post owner
if ($this->is_comment_owner($postID)) { return; }
//Increment the number of edited comments
$this->increment_edit_count();
} //end function comment_edited
/* comment_posted - This function is run whenever a comment is posted -
Adds a cookie and security key for future editing
Parameters - $commentID (the comment's ID)
*/
function comment_posted($commentID=0) {
global $wpdb;
//Get comment
$comment = get_comment($commentID, ARRAY_A);
//Some sanity checks
if (!$comment) { return;}
//if ($comment['comment_approved'] == "1") { return; }
if ($comment['comment_approved'] == "spam") { return; }
//If admin, exit since we don't want to add anything
if ($this->is_comment_owner($comment['comment_post_ID'])) {
return $commentID;
}
//Don't save data if user can indefinitely edit
if ($this->can_indefinitely_edit($comment['user_id'])) { return; }
//Check to see if admin allows comment editing
if ($this->adminOptions['allow_editing'] == "false") { return;}
//Get hash and random security key
$hash = md5($comment['comment_author_IP'] . $comment['comment_date_gmt']);
$rand = 'wpAjax' . $hash . md5($this->random()) . md5($this->random());
//Get the minutes allowed to edit
$minutes = $this->adminOptions['minutes'];
if (!is_numeric($minutes)) {
$minutes = $this->minutes;
}
if ($minutes < 1) {
$minutes = $this->minutes;
}
//Insert the random key into the database
$query = "INSERT INTO " . $wpdb->postmeta .
"(post_id, meta_key, meta_value) " .
"VALUES (" . $comment['comment_post_ID'] . ",'_" . $comment['comment_ID'] . "','" . $rand . "')";
@$wpdb->query($query);
//Set the cookie
$cookieName = $this->cookieName . $commentID . $hash;
$value = $rand;
$expire = time()+60*$minutes;
if (!isset($_COOKIE[$cookieName])) {
setcookie($cookieName, $value, $expire, COOKIEPATH,COOKIE_DOMAIN);
//setcookie($cookieName, $value, $expire, SITECOOKIEPATH,COOKIE_DOMAIN);
$GLOBALS[$cookieName] = $value; //For compatability with CFORMS
}
//Read in security key count, delete keys if over 100
$securityCount = get_option('ajax-edit-comments_security_key_count');
if (!securityCount) {
$securityCount = 1; update_option('ajax-edit-comments_security_key_count', $securityCount);
} else {
$securityCount = (int)$securityCount;
}
//Delete keys if over a 100
if ($securityCount >= 100) {
$metakey = "_" . $comment['comment_ID'];
@$wpdb->query("delete from $wpdb->postmeta where left(meta_value, 6) = 'wpAjax' and meta_key <> '$metakey'");
$securityCount = 0;
}
$securityCount += 1;
update_option('ajax-edit-comments_security_key_count', $securityCount);
return $commentID;
}//End function comment_posted
/* delete_comment */
function delete_comment($commentID = 0, $postID = 0) {
if ($this->is_comment_owner($postID)) {
$status = wp_delete_comment($commentID)? "1" : 'delete_failed';
return $status;
} else {
return 'delete_failed_permission';
}
}
/*Delinks a comment */
function delink_comment($commentID = 0, $postID = 0, $comment = '') {
if ($this->is_comment_owner($postID)) {
wp_update_comment($comment);
return "1";
} else {
return 'delink_failed_permission';
}
}
//When a comment is edited, an e-mail notification is sent out
//Parameters - $commentID (a comment ID) and $postID (a post ID)
//Returns false if e-mail failed
function edit_notification($commentID = 0, $postID = 0) {
global $wpdb;
$options = $this->adminOptions;
//Check admin options and also if user editing is post author
if ($options['email_edits'] == "false") { return false; }
//Get the comment and post
$comment = get_comment($commentID, ARRAY_A);
if (empty($comment)) { return false; }
$query = "SELECT * FROM $wpdb->posts WHERE ID=$postID";
$post = $wpdb->get_row("SELECT * FROM $wpdb->posts WHERE ID=$postID", ARRAY_A);
if (!$post) { return false; }
if ($this->is_comment_owner($postID)) { return false; }
//Make sure the comment is approved and not a trackback/pingback
if ( $comment['comment_approved'] == '1' && ($comment['comment_type'] != 'pingback' || $comment['comment_type'] != 'trackback')) {
//Put together the e-mail message
$message = sprintf(__("A comment has been edited on post %s", $this->localizationName) . ": \n%s\n\n", stripslashes($post['post_title']), get_permalink($comment['comment_post_ID']));
$message .= sprintf(__("Author: %s\n", $this->localizationName), $comment['comment_author']);
$message .= sprintf(__("Author URL: %s\n", $this->localizationName), stripslashes($comment['comment_author_url']));
$message .= sprintf(__("Author E-mail: %s\n", $this->localizationName), stripslashes($comment['comment_author_email']));
$message .= __("Comment:\n", $this->localizationName) . stripslashes($comment['comment_content']) . "\n\n";
$message .= __("See all comments on this post here:\n", $this->localizationName);
$message .= get_permalink($comment['comment_post_ID']) . "#comments\n\n";
$subject = sprintf(__('New Edited Comment On: %s', $this->localizationName), stripslashes($post['post_title']));
$subject = '[' . get_bloginfo('name') . '] ' . $subject;
$email = get_bloginfo('admin_email');
$site_name = str_replace('"', "'", get_bloginfo('name'));
$charset = get_settings('blog_charset');
$headers = "From: \"{$site_name}\" <{$email}>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/plain; charset=\"{$charset}\"\n";
//Send the e-mail
return wp_mail($email, $subject, $message, $headers);
}
return false;
} //End function edit_notification
/* encode - Encodes comment content to various charsets
Parameters - $content - The comment content
Returns the encoded content */
function encode($content) {
if ($this->adminOptions['use_mb_convert'] == "false" || !function_exists("mb_convert_encoding")) { return $content; }
return mb_convert_encoding($content, ''.get_option('blog_charset').'', mb_detect_encoding($content, "UTF-8, ISO-8859-1, ISO-8859-15", true));
}
/* get_comment - Returns a comment ready for editing
parameters - $commentID
returns - a response object (WP_Ajax_Response) */
function get_comment($commentID = 0) {
$comment = get_comment($commentID);
$response = new WP_Ajax_Response();
if (!$comment) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('get_comment_failed')
));
$response->send(); return;
}
//Check to see if the comment is spam if the user isn't admin or comment owner
if (!$this->is_comment_owner($comment->comment_post_ID)) {
if ($comment->comment_approved === 'spam') {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('comment_spam')
));
$response->send(); return;
}
}
//Check to see if user can edit and return any appropriate error messages
$message = $this->can_edit($commentID, $comment->comment_post_ID);
if (is_string($message)) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error($message)
));
$response->send(); return;
}
//Okay, user can edit - Let's prepare the comment for editing
$comment->comment_content = format_to_edit( $comment->comment_content ,1);
$comment->comment_content = apply_filters( 'comment_edit_pre', $comment->comment_content);
$comment->comment_author = format_to_edit( $comment->comment_author );
$comment->comment_author_email = format_to_edit( $comment->comment_author_email );
$comment->comment_author_url = clean_url($comment->comment_author_url);
$comment->comment_author_url = format_to_edit( $comment->comment_author_url );
//Prepare the response
$response->add( array(
'what' => 'comment_content',
'id' => $commentID,
'data' => $comment->comment_content
));
$response->add( array(
'what' => 'comment_author',
'id' => $commentID,
'data' => $comment->comment_author
));
$response->add( array(
'what' => 'comment_author_email',
'id' => $commentID,
'data' => $comment->comment_author_email
));
$response->add( array(
'what' => 'comment_author_url',
'id' => $commentID,
'data' => $comment->comment_author_url
));
if ($this->adminOptions['show_gravatar'] == "true") {
$gravatar = get_avatar($comment, '40');
if (!empty($gravatar)) {
$response->add( array(
'what' => 'gravatar',
'id' => $commentID,
'data' => $gravatar
));
}
}
$response = apply_filters('wp_ajax_comments_get_comment', $response, $comment);
$response->send();
}//End function get_comment
/* get_comment_id - Returns an ID based on an incoming string */
function get_comment_id($string) {
preg_match('/([0-9]+)$/i', $string, $matches);
if (is_numeric($matches[1])) {
return $matches[1];
}
return 0;
}
/*
get_can_comment - Get comment values, if necessary
Parameters - commentID
Returns - Array of values for comment if successfull
*/
function get_edit_comment($commentID) {
global $comment, $wpdb;
if ($comment->comment_ID == $commentID) {
$c = get_object_vars($comment);
$c['time'] = mysql2date('U', $c['comment_date']);
return $c;
}
$query = "SELECT UNIX_TIMESTAMP(comment_date) time, comment_author_email, comment_author_IP, comment_date_gmt, comment_post_ID, comment_approved, comment_ID, user_id FROM $wpdb->comments where comment_ID = $commentID";
return($wpdb->get_row($query, ARRAY_A));
}
/* get_error - Returns an error message based on the passed code
Parameters - $code (the error code as a string)
Returns an error message */
function get_error($code = '') {
$errorMessage = $this->errors->get_error_message($code);
if ($errorMessage == null) {
return __("Unknown error.", $this->localizationName);
}
return __($errorMessage, $this->localizationName);
}
/* get_time_left - Returns time remaining in seconds
parameters - $commentID
Returns 1 if no time is necessary. -1 if time is unavailable. Time if available.
*/
function get_time_left($commentID = 0) {
global $wpdb;
$adminMinutes = (int)$this->adminOptions['minutes'];
$query = "SELECT ($adminMinutes * 60 - (UNIX_TIMESTAMP('" . current_time('mysql') . "') - UNIX_TIMESTAMP(comment_date))) time, comment_author_email, user_id FROM $wpdb->comments where comment_ID = $commentID";
//Get the Timestamp
$comment = $wpdb->get_row($query, ARRAY_A);
if (!$comment) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => "-1"
));
$response->send();
}
if ($this->can_indefinitely_edit($comment['user_id'])) {
$response->add( array(
'what' => 'success',
'id' => $commentID,
'data' => "1"
));
}
//Get the time elapsed since making the comment
if ((int)$comment['time'] <= 0) { return "-1"; }
$timeleft = (int)$comment['time'];
$minutes = floor($timeleft/60);
$seconds = $timeleft - ($minutes*60);
$response = new WP_Ajax_Response();
$response->add( array(
'what' => 'minutes',
'id' => $commentID,
'data' => $minutes
));
$response->add( array(
'what' => 'seconds',
'id' => $commentID,
'data' => $seconds
));
$response->send();
}//end function get_time_left
/* get_posts - Returns five posts with an offset
parameters - $offset
Returns five posts with an offset
*/
function get_posts($offset = 0) {
global $wpdb;
$response = new WP_Ajax_Response();
$results = $wpdb->get_results("select ID, post_title from $wpdb->posts where post_type = 'post' and post_status = 'publish' order by ID desc limit $offset,5", ARRAY_A);
foreach ($results as $r) {
$response->add(array(
'what' => 'title',
'id' => $r['ID'],
'data' => $r['post_title']
));
}
return $response;
}
/* get_posts_by_title - Returns five posts with an offset
parameters - $title
Returns five posts by title
*/
function get_posts_by_title($title) {
global $wpdb;
$response = new WP_Ajax_Response();
$results = $wpdb->get_results("select ID, post_title from $wpdb->posts where post_type = 'post' and post_status = 'publish' and post_title like '%$title%' limit 6", ARRAY_A);
foreach ($results as $r) {
$response->add(array(
'what' => 'title',
'id' => $r['ID'],
'data' => $r['post_title']
));
}
return $response;
}
/* get_posts_by_id - Returns five posts with an offset
parameters - $id
Returns five posts by id
*/
function get_posts_by_id($id) {
global $wpdb;
$response = new WP_Ajax_Response();
$results = $wpdb->get_row("select * from $wpdb->posts where post_type = 'post' and post_status = 'publish' and ID = $id", ARRAY_A);
if ($results) {
$response->add(array(
'what' => 'title',
'id' => $results['ID'],
'data' => $results['post_title']
));
}
return $response;
}
/* increment_edit_count - Increments the number of edits */
function increment_edit_count() {
$numEdits = intval($this->adminOptions['number_edits']);
$numEdits = number_format(intval($this->adminOptions['number_edits']));
$numEdits += 1;
//Sends out a reminder e-mail every 100 edited comments (not very often)
if ((intval($numEdits)%100) == 0) {
$this->send_annoying_email($numEdits);
}
$this->adminOptions['number_edits'] = $numEdits;
$this->save_admin_options();
}
/* Initializes all the error messages */
function initialize_errors() {
$this->errors = new WP_Error();
$this->errors->add('new_comment_posted', __('You cannot edit a comment after other comments have been posted.', $this->localizationName));
$this->errors->add('comment_time_elapsed', __('The time to edit your comment has elapsed.',$this->localizationName));
$this->errors->add('comment_edit_denied',__('You do not have permission to edit this comment.',$this->localizationName) );
$this->errors->add('comment_marked_spam',$this->adminOptions['spam_text']);
$this->errors->add('comment_spam',__('This comment cannot be edited because it is marked as spam.',$this->localizationName) );
$this->errors->add('get_comment_failed',__('Comment loading failed.',$this->localizationName) );
$this->errors->add('no_user_editing',__('Comment editing has been disabled.',$this->localizationName) );
$this->errors->add('comment_spam_failed', __('Could not mark as spam.',$this->localizationName));
$this->errors->add('comment_spam_failed_permission', __('You do not have permission to mark this comment as Spam.',$this->localizationName));
$this->errors->add('delete_failed',__('Could not delete comment.',$this->localizationName) );
$this->errors->add('delete_failed_permission',__('You do not have permission to delete this comment.',$this->localizationName) );
$this->errors->add('approve_failed_permission', __('You do not have permission to approve this comment.',$this->localizationName));
$this->errors->add('approve_failed', __('Could not approve comment.',$this->localizationName));
$this->errors->add('moderate_failed', __('Could not mark this comment for moderation.',$this->localizationName));
$this->errors->add('moderate_failed_permission', __('You do not have permission to mark this comment for moderation.',$this->localizationName));
$this->errors->add('invalid_email', __('Please enter a valid email address.',$this->localizationName));
$this->errors->add('required_fields', __('Please fill in the required fields (Name, E-mail)',$this->localizationName));
$this->errors->add('content_empty',__('You cannot have an empty comment.',$this->localizationName) );
$this->errors->add('delink_failed_permission',__('You do not have permission to delink this comment.',$this->localizationName) );
$this->errors->add('comment_marked_moderated',__('Your comment was marked for moderation',$this->localizationName) );
$this->errors->add('comment_moderated',__('This comment cannot be edited because it is marked for moderation.',$this->localizationName) );
$this->errors->add('request_deletion_failed',__('Request failed.',$this->localizationName) );
$this->errors->add('blacklist_empty',__('You have not selected anything to blacklist.',$this->localizationName) );
} //end function initialize_errors
/* init - Run upon WordPress initialization */
function init() {
//* Begin Localization Code */
$wp_ajax_edit_comments_locale = get_locale();
$wp_ajax_edit_comments_mofile = WP_CONTENT_DIR . "/plugins/wp-ajax-edit-comments/languages/" . $this->localizationName . "-". $wp_ajax_edit_comments_locale.".mo";
load_textdomain($this->localizationName, $wp_ajax_edit_comments_mofile);
//* End Localization Code */
}//end function init
/* is_comment_owner - Checks to see if a user can edit a comment */
/* Parameters - postID */
/* Returns - true if user is comment owner, false if not*/
function is_comment_owner($postID = 0) {
if (!isset($this->admin)) { $this->admin = false; }
if ($this->admin) { return true; }
//Check to see if user is admin of the blog
if (current_user_can('edit_users')) {
$this->admin = true;
return true;
} elseif( current_user_can( 'edit_page', $postID) || current_user_can( 'edit_post', $postID)) {
$this->admin = false;
return true;
}
return false;
}
/* is_logged_in - Checks to see if the user (non-admin) is logged in
Parameters - $userID
Returns true if logged in, false if not */
function is_logged_in($userID = 0) {
if ($this->get_user_id() == $userID) {
return true;
} else {
return false;
}
}
/* moderate_comment - Marks a comment as unapproved
Parameters - $commentID, $postID
Returns - 1 if successful, a string error message if not */
function moderate_comment($commentID=0, $postID = 0) {
if ($this->is_comment_owner($postID)) {
$status = wp_set_comment_status($commentID, 'hold')? "1" : 'moderate_failed';
return $status;
} else {
return 'moderate_failed_permission';
}
}
/* move_comment - Moves a comment from an old post to a new post
Parameters - $commentID, $oldPostID, $newPostID
Returns nothing */
function move_comment($commentID=0, $oldPostID=0, $newPostID=0) {
global $wpdb, $post;
$response = new WP_Ajax_Response();
//Return if not comment owner and if posts are the same
if ($oldPostID == $newPostID || !$this->is_comment_owner($newPostID)) {
$response->add(array(
'what' => 'nochange',
'data' => "nochange"
));
$response->send();
return;
}
//Update the comment with the new post number
$wpdb->update($wpdb->comments, array('comment_post_ID' => intval($newPostID)), array('comment_ID' => intval($commentID)));
//Update the posts' comment count
@wp_update_comment_count_now(intval($newPostID));
@wp_update_comment_count_now(intval($oldPostID));
$posts = get_posts("include=$oldPostID,$newPostID");
foreach ($posts as $post) {
if ($post->ID == $oldPostID) {
$response->add(array(
'what' => 'old_id',
'id' => $newPostID,
'old_id' => $oldPostID,
'supplemental' => array(
'title' => the_title('','',false),
'permalink' => apply_filters('the_permalink', get_permalink()),
'comments' => $post->comment_count
)
));
} else {
$response->add(array(
'what' => 'new_id',
'id' => $oldPostID,
'old_id' => $newPostID,
'supplemental' => array(
'title' => the_title('','',false),
'permalink' => apply_filters('the_permalink', get_permalink()),
'comments' => $post->comment_count
)
));
}
}
return $response;
}
/* request_Deletion - Sends a request to admin for comment removal
Parameters - $commentID, $postID
Returns error or response */
function request_deletion($commentID = 0, $postID = 0, $message) {
$canedit = $this->can_edit($commentID, $postID);
if (is_string($canedit)) {
return 'request_deletion_failed';
}
if (wp_set_comment_status($commentID, 'hold') || wp_get_comment_status($commentID) == "unapproved") {
$this->request_deletion_message($commentID, $message);
//Get the comment and remove the cookie
$comment = get_comment($commentID);
$hash = md5($comment->comment_author_IP . $comment->comment_date_gmt);
$GLOBALS[$this->cookieName . $commentID . $hash] = ''; //for CFORMS compatibility
setcookie($this->cookieName . $commentID . $hash, '', time() - 3600, COOKIEPATH,COOKIE_DOMAIN); //removes the cookie
return 1;
} else {
return 'request_deletion_failed';
}
}
function request_deletion_message($commentID = 0, $message) {
$comment = get_comment($commentID);
$post = get_post($comment->comment_post_ID);
$user = get_userdata( $post->post_author );
$notify_message = sprintf( __('A commenter requests deletion of a comment on your post #%1$s "%2$s". The comment has been moved to the moderation queue.', $this->localizationName), $comment->comment_post_ID, $post->post_title ) . "\r\n";
$notify_message .= sprintf( __('The reason given is: ' . $message, $this->localizationName), $comment->comment_post_ID, $post->post_title ) . "\r\n\r\n";
$notify_message .= sprintf( __('E-mail : %s', $this->localizationName), $comment->comment_author_email ) . "\r\n";
$notify_message .= sprintf( __('URL : %s', $this->localizationName), $comment->comment_author_url ) . "\r\n";
$notify_message .= sprintf( __('Whois : http://ws.arin.net/cgi-bin/whois.pl?queryinput=%s', $this->localizationName), $comment->comment_author_IP ) . "\r\n";
$notify_message .= get_permalink($comment->comment_post_ID) . "#comments\r\n\r\n";
$notify_message .= sprintf( __('Delete it: %s', $this->localizationName), admin_url("comment.php?action=cdc&c=$commentID") ) . "\r\n";
$notify_message .= sprintf( __('Approve it: %s', $this->localizationName), admin_url("comment.php?action=mac&c=$commentID") ) . "\r\n";
$notify_message .= sprintf( __('Spam it: %s', $this->localizationName), admin_url("comment.php?action=cdc&dt=spam&c=$commentID") ) . "\r\n";
$wp_email = 'wordpress@' . preg_replace('#^www\.#', '', strtolower($_SERVER['SERVER_NAME']));
if ( '' == $comment->comment_author ) {
$from = "From: \"$blogname\" <$wp_email>";
if ( '' != $comment->comment_author_email )
$reply_to = "Reply-To: $comment->comment_author_email";
} else {
$from = "From: \"$comment->comment_author\" <$wp_email>";
if ( '' != $comment->comment_author_email )
$reply_to = "Reply-To: \"$comment->comment_author_email\" <$comment->comment_author_email>";
}
$message_headers = "$from\n"
. "Content-Type: text/plain; charset=\"" . get_option('blog_charset') . "\"\n";
if ( isset($reply_to) )
$message_headers .= $reply_to . "\n";
$subject = sprintf( __('Request for Comment Deletion: "%2$s"',$this->localizationName), $blogname, $post->post_title );
@wp_mail($user->user_email, $subject, $notify_message, $message_headers);
}
/* save_comment - Saves a new comment
Parameters - $commentID, $postID, $commentarr (comment array)
Returns errors or response*/
function save_comment($commentID, $postID, $commentarr) {
global $wpdb;
$response = new WP_Ajax_Response();
//Save the old comment and build an undo spot
$undoComment = get_comment($commentID, ARRAY_A);
//Make sure the comment has something in it
if ('' == $commentarr['comment_content'] || $commentarr['comment_content'] == "undefined") {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('content_empty')
));
$response->send(); return;
}
//Check to see if user can edit
$message = $this->can_edit($commentID, $postID);
if (is_string($message)) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error($message)
));
$response->send(); return;
}
//Sanity checks
if (!$this->is_comment_owner($postID)) {
//Make sure required fields are filled out
if ( get_option('require_name_email') && ((6 > strlen($commentarr['comment_author_email']) && $this->can_edit_email($commentID, $postID)) || ('' == $commentarr['comment_author'] && $this->can_edit_name($commentID, $postID)))) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('required_fields')
));
$response->send(); return;
}
}// end comment_owner check
//Make sure the e-mail is valid - Skip if pingback or trackback
if (!($this->admin && empty($commentarr['comment_author_email']))) {
if (!is_email($commentarr['comment_author_email']) && $commentarr['comment_type'] != "pingback" && $commentarr['comment_type'] != "trackback") {
if ($this->can_edit_email($commentID, $postID)) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('invalid_email')
));
$response->send(); return;
}
}
}
if (strtolower(get_option('blog_charset')) != 'utf-8') { @$wpdb->query("SET names 'utf8'");} //comment out if getting char errors
//Save the comment
$commentarr['comment_ID'] = (int)$commentID;
$commentapproved = $commentarr['comment_approved'];
//Do some comment checks before updating
if (!$this->is_comment_owner($postID)) {
//Preserve moderation/spam setting. Only check approved comments
if ($commentarr['comment_approved'] == 1) {
// Everyone else's comments will be checked.
if ( check_comment($commentarr['comment_author'], $commentarr['comment_author_email'], $commentarr['comment_author_url'], $commentarr['comment_content'], $commentarr['comment_author_IP'], $commentarr['comment_agent'], $commentarr['comment_type']))
$commentarr['comment_approved'] = 1;
else
$commentarr['comment_approved'] = 0;
}
if ( wp_blacklist_check($commentarr['comment_author'], $commentarr['comment_author_email'], $commentarr['comment_author_url'], $commentarr['comment_content'], $commentarr['comment_author_IP'], $commentarr['comment_agent']) )
$commentarr['comment_approved'] = 'spam';
}
//Update the comment
wp_update_comment($commentarr);
//If spammed, return error
if (!$this->admin && $commentarr['comment_approved'] === 'spam') {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('comment_marked_spam')
));
$response->send(); return;
}
//If moderated, return error
if ($commentarr['comment_approved'] == 0 && $commentapproved != 0) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('comment_marked_moderated')
));
$response->send(); return;
}
//For security, get the new comment
global $comment;
$comment = get_comment($commentID);
//Check for spam
if (!$this->is_comment_owner($postID)) {
if($this->check_spam($commentID, $postID)) {
$response->add( array(
'what' => 'error',
'id' => $commentID,
'data' => $this->get_error('comment_marked_spam')
));
$response->send(); return;
};
}
//Do actions after a comment has successfully been edited
do_action_ref_array('wp_ajax_comments_comment_edited', array(&$commentID, &$postID));
//Condition the data for returning
do_action('wp_ajax_comments_remove_content_filter');
//Get undo data
if ($this->admin) {
$oldComment = $this->adminOptions['undo'];
$undo = $this->build_undo_url("undoedit", $commentID, $postID, __('Comment successfully saved',$this->localizationName));
} else {
$undo = '';
}
$approve_count = get_comment_count($postID);
$comment_count = get_comment_count();
$response->add(array(
'what' => 'content',
'id' => $commentID,
'supplemental' => array(
'content' => stripslashes(apply_filters('comment_text',apply_filters('get_comment_text',$this->encode($comment->comment_content)))),
'comment_author' => stripslashes(apply_filters('comment_author', apply_filters('get_comment_author', $this->encode($comment->comment_author)))),
'comment_author_url' => stripslashes(apply_filters('comment_url', apply_filters('get_comment_author_url', $comment->comment_author_url))),
'comment_date' => get_comment_date('F jS, Y'),
'comment_time' => get_comment_time(),
'comment_approved' => $comment->comment_approved,
'old_comment_approved' => $oldComment['comment_approved'],
'undo_comment_approved' => $undoComment['comment_approved'],
'approve_count' => $approve_count['approved'],
'moderation_count' => $comment_count['awaiting_moderation'],
'spam_count' => $comment_count['spam'],
'comment_links' => $this->build_admin_links($commentID, $postID),
'undo' => $undo
)
));
return $response;
} //save_comment
//When a editing count is divisible by 100, we send out an e-mail asking for a donation
function send_annoying_email($edits = 0) {
global $wpdb;
$options = $this->adminOptions;
//Check admin options and also if user editing is post author
if ($options['annoying_email'] == "false") { return; }
//Put together the e-mail message
$message = sprintf(__("Your readers have edited their comments ", $this->localizationName));
$message .= $edits . sprintf(__(" times.\n\n", $this->localizationName));
$message .= sprintf(__("The Ajax Edit Comments plugin has saved you and your readers a ton of time. Please consider a small donation for our hard work and time spent on the plugin.\n\n", $this->localizationName));
$message .= sprintf(__("Donate: %s", $this->localizationName),"https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=9335607\n\n");
$message .= sprintf(__("If you do not wish to receive these e-mails anymore, please unsubscribe in the WordPress settings page for Ajax Edit Comments.\n\n", $this->localizationName));
$subject = '[' . get_bloginfo('name') . '] ' . $subject;
$email = get_bloginfo('admin_email');
$site_name = str_replace('"', "'", get_bloginfo('name'));
$charset = get_settings('blog_charset');
$headers = "From: \"{$site_name}\" <{$email}>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/plain; charset=\"{$charset}\"\n";
//Send the e-mail
return wp_mail($email, $subject, $message, $headers);
} //End function send annoying email
/* spam_comment - Marks a comment as spam or de-spams a comment
Parameters - $commentID, $postID
Returns - 1 if successful, a string error message if not */
function spam_comment($commentID = 0, $postID = 0) {
if ($this->is_comment_owner($postID)) {
$status = wp_set_comment_status($commentID, 'spam')? "1" : 'comment_spam_failed';
return $status;
} else {
return 'comment_spam_failed_permission';
}
}
/*BEGIN UTILITY FUNCTIONS - Grouped by function and not by name */
function add_admin_pages(){
add_options_page('Ajax Edit Comments', 'Ajax Edit Comments', 9, basename(__FILE__), array(&$this, 'print_admin_page'));
}
//Removes the div and various links from a comment
function comment_filter() {
$this->skip = true;
}
//Provides the interface for the admin pages
function print_admin_page() {
include dirname(__FILE__) . '/php/admin-panel.php';
}
//Returns an array of admin options
function get_admin_options() {
//todo - possibly an array_merge here
if (empty($this->adminOptions)) {
$adminOptions = array(
'allow_editing' => 'true',
'allow_editing_after_comment' => 'true',
'minutes' => '5',
'edit_text' => '',
'show_timer' => 'true',
'show_pages' => 'true',
'spam_text' => __('Your edited comment was marked as spam. If this is in error, please contact the admin.', $this->localizationName),
'email_edits' => 'false',
'number_edits' => '0',
'spam_protection' => 'akismet',
'registered_users_edit' => 'false',
'registered_users_name_edit' => 'true',
'registered_users_email_edit' => 'false',
'registered_users_url_edit' => 'true',
'use_mb_convert' => 'true',
'allow_name_editing' => 'true',
'allow_email_editing' => 'false',
'allow_url_editing' => 'true',
'allow_css' => 'true',
'allow_css_editor' => 'true',
'show_options' => 'true',
'clear_after' => 'true',
'javascript_scrolling' => 'true',
'post_style_url' => '',
'editor_style_url' => '',
'comment_display_top' => 'false',
'allow_deletion' => 'true',
'show_advanced' => 'true',
'undo' => '',
'icon_display' => 'dropdown',
'icon_set' => 'circular',
'use_rtl' => 'false',
'annoying_email' => 'true',
);
$options = get_option($this->adminOptionsName);
if (!empty($options)) {
foreach ($options as $key => $option)
if (array_key_exists($key, $adminOptions)) {
$adminOptions[$key] = $option;
}
}
$this->adminOptions = $adminOptions;
$this->save_admin_options();
}
return $this->adminOptions;
}
//Returns an array of "all" user options
function get_all_user_options() {
if (!function_exists("get_currentuserinfo")) { return; }
if (empty($this->userOptions)) {
$user_email = $this->get_user_email();
$defaults = array(
'comment_editing' => 'true',
'admin_editing' => 'false'
);
$this->userOptions = get_option($this->userOptionsName);
if (!isset($this->userOptions)) {
$this->userOptions = array();
}
//See if an older version doesn't match the new defaults
if (empty($this->userOptions[$user_email])) {
$this->userOptions[$user_email] = $defaults;
} elseif(!is_array($this->userOptions[$user_email])) {
$this->userOptions[$user_email] = $defaults;
} else {
foreach ($this->userOptions[$user_email] as $key => $option) {
$defaults[$key] = $option;
}
$this->userOptions[$user_email] = $defaults;
}
$this->save_admin_options();
}
return $this->userOptions;
}
//Returns a logged-in user's e-mail address
function get_user_email() {
global $user_email;
if (!function_exists("get_currentuserinfo")) { return ''; }
if (empty($user_email)) {get_currentuserinfo();} //try to get user info
if (empty($user_email)) { return '0'; } //Can't get user info, so return empty string
return $user_email;
}
// Returns a logged-in user's ID
function get_user_id() {
global $user_ID;
if (!function_exists("get_currentuserinfo")) { return "-1"; }
if (empty($user_ID)) {get_currentuserinfo();} //try to get user info
if (empty($user_ID)) { return '-1'; } //Can't get user info, so return empty string
return $user_ID;
}
//Returns an array of an individual's options
function get_user_options() {
if (empty($this->userOptions)) { $this->userOptions = $this->get_all_user_options(); }
return $this->userOptions[$this->get_user_email()];
}
//Saves Ajax Edit Comments settings for admin and admin users
function save_admin_options(){
if (!empty($this->adminOptions)) {
update_option($this->adminOptionsName, $this->adminOptions);
}
if (!empty($this->userOptions)) {
update_option($this->userOptionsName, $this->userOptions);
}
}
//Checks for script addition on single or page posts
function add_post_scripts() {
if (is_single()) {
$this->add_scripts();
} elseif (is_page() && $this->adminOptions['show_pages'] == 'true') {
$this->add_scripts();
} elseif (is_admin()) {
$this->add_admin_scripts();
}
}
/* Private - Adds JavaScript in the admin panel if admin has enabled the option */
function add_admin_scripts() {
//Page detection for other plugin authors
switch (basename($_SERVER['SCRIPT_FILENAME'])) {
case "edit-comments.php";
break;
case "edit.php";
if (isset($_GET['p'])) { break; }
default:
if (preg_match( '/wp-admin\/index\.php$/',$_SERVER['PHP_SELF'] )) {
break;
}
return;
}
$options = $this->get_user_options();
if ($options['admin_editing'] == 'true') { return; }
$this->add_scripts();
}
//Adds the appropriate scripts to WordPress
function add_scripts(){
if (get_bloginfo('version') < "2.8") {
wp_deregister_script(array('jquery'));
wp_enqueue_script('jquery', $this->pluginDir . '/js/jquery-1.3.2.min.js');
} else {
wp_enqueue_script('jquery');
}
wp_enqueue_script("wp-ajax-response");
wp_enqueue_script('colorbox', $this->pluginDir . '/js/jquery.colorbox-min.js', array("jquery"));
wp_enqueue_script('wp_ajax_edit_comments_script', $this->pluginDir . '/js/wp-ajax-edit-comments.js', array("jquery", "wp-ajax-response", "colorbox") , 2.3);
wp_localize_script( 'wp_ajax_edit_comments_script', 'wpajaxeditcomments', $this->get_js_vars());
}
//Prints out various JavaScript variables that are needed in the script files
//Vars need to be loaded after wp_print_scripts so the thickbox paths are correct
function add_script_vars() {
if (!is_single() && !is_page() && !is_admin() && basename($_SERVER['SCRIPT_FILENAME']) != "comment-editor.php") {
return;
}
if (is_page() && $this->adminOptions['show_pages'] != 'true') {
return;
}
if (is_admin()) {
//Page detection for other plugin authors
switch (basename($_SERVER['SCRIPT_FILENAME'])) {
case "edit-comments.php";
break;
case "edit.php";
if (isset($_GET['p'])) { break; }
default:
return;
}
}
?>
$this->pluginDir,
'AEC_CanScroll' => $this->can_scroll(),
'AEC_Minutes' => __('minutes', $this->localizationName),
'AEC_Minute' => __('minute', $this->localizationName),
'AEC_And' => __('and', $this->localizationName),
'AEC_Seconds' => __('seconds', $this->localizationName),
'AEC_Second' => __('second', $this->localizationName),
'AEC_Moderation' => __('Mark for Moderation?', $this->localizationName),
'AEC_Approve' => __('Approve Comment?', $this->localizationName),
'AEC_Spam' => __('Mark as Spam?', $this->localizationName),
'AEC_Delete' => __('Delete this comment?', $this->localizationName),
'AEC_Anon' => __('Anonymous', $this->localizationName),
'AEC_Loading' => __('Loading...', $this->localizationName),
'AEC_Ready' => __('Ready', $this->localizationName),
'AEC_Sending' => __('Sending...', $this->localizationName),
'AEC_Sent' => __('Message Sent', $this->localizationName),
'AEC_LoadSuccessful' => __('Comment Loaded Successfully', $this->localizationName),
'AEC_Saving' => __('Saving...', $this->localizationName),
'AEC_Blacklisting' => __('Blacklisting...', $this->localizationName),
'AEC_Saved' => __('Comment Successfully Saved', $this->localizationName),
'AEC_Delink' => __('De-link Successful', $this->localizationName),
'AEC_MoreOptions' => __('More Options', $this->localizationName),
'AEC_LessOptions' => __('Less Options', $this->localizationName),
'AEC_UseRTL' => $this->adminOptions['use_rtl'],
'AEC_RequestDeletionSuccess' => __('Request has been sent successfully', $this->localizationName),
'AEC_RequestError' => __('Error sending request', $this->localizationName)
);
} //end get_js_vars
/**
* Adds a link to the stylesheet to the header
*/
function add_css(){
if (is_single() || is_page() || is_admin()) {
if (is_page() && $this->adminOptions['show_pages'] != 'true') {
return;
}
if (empty($this->adminOptions['post_style_url'])) {
if ($this->adminOptions['use_rtl'] == "true") {
echo '';
} else {
echo '';
}
/* From http://blue-anvil.com/archives/experiments-with-floats-whats-the-best-method-of-clearance */
if ($this->adminOptions['clear_after'] == "true") {
?>
adminOptions['post_style_url'].'" type="text/css" media="screen" />';
}
echo '';
}
}
//Returns a random security key
function random() {
$chars = "%CDEF#cGHIJ\:ab!@defg9ABhijklmn<>;opqrstuvwxyz10234/+_-=5678MKL^&*NOP";
$pass = '';
for ($i = 0; $i < 50; $i++) {
$pass .= $chars{rand(0, strlen($chars)-1)};
}
return $pass;
}
/*END UTILITY FUNCTIONS*/
}
}
//instantiate the class
if (class_exists('WPrapAjaxEditComments')) {
if (get_bloginfo('version') >= "2.5") {
$WPrapAjaxEditComments = new WPrapAjaxEditComments();
}
}
?>