";
}
}
if (isset($aec_top)) { //Test to see if user wants interface on top or bottom
$content .= '
' . $tempContent . '
';
}
return $content;
} //end function add_edit_links
/* 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';
}
}
/*
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;
//todo - do a check if update failed
} 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,6", 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 5", 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 += 1;
$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('', );
//$this->errors->add('', );
//$this->errors->add('', );
} //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;
if ($oldPostID == $newPostID) { return; }
if (!$this->is_comment_owner($postID)) { return; }
//Update the old post's info
$oldPost = $wpdb->get_row("select * from $wpdb->posts where ID = $oldPostID", ARRAY_A);
$old_comment_count = $oldPost['comment_count'] - 1;
$wpdb->update($wpdb->posts, array('comment_count' => $old_comment_count), array('ID' => $oldPostID));
//Update the new post's info
$newPost = $wpdb->get_row("select * from $wpdb->posts where ID = $newPostID", ARRAY_A);
$new_comment_count = $newPost['comment_count'] + 1;
$wpdb->update($wpdb->posts, array('comment_count' => $new_comment_count), array('ID' => $newPostID));
//Update the comment
$comment = get_comment($commentID, ARRAY_A);
$comment['comment_post_ID'] = $newPostID;
$wpdb->update($wpdb->comments, array('comment_post_ID' => $newPostID), array('comment_ID' => $commentID));
return;
}
/* 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) {
if (wp_set_comment_status($commentID, 'hold')) {
$this->request_deletion_message($commentID, $message);
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();
//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 ($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
$comment = get_comment($commentID, ARRAY_A);
//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');
$response->add( array(
'what' => 'comment_content',
'id' => $commentID,
'data' => stripslashes(apply_filters('comment_text',apply_filters('get_comment_text',$this->encode($comment['comment_content']))))
));
$response->add( array(
'what' => 'comment_author',
'id' => $commentID,
'data' => stripslashes(apply_filters('comment_author', apply_filters('get_comment_author', $this->encode($comment['comment_author']))))
));
$response->add( array(
'what' => 'comment_author_url',
'id' => $commentID,
'data' => stripslashes(apply_filters('comment_url', apply_filters('get_comment_author_url', $comment['comment_author_url'])))
));
return $response;
} //save_comment
/* 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' => '5',
'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_gravatar' => 'true',
'allow_icons' => 'true',
'show_options' => 'true',
'clear_after' => 'true',
'editor_title' => 'WP Ajax Edit Comments',
'editor_url' => 'http://ajaydsouza.com/wordpress/plugins/wp-ajax-edit-comments/',
'javascript_scrolling' => 'true',
'post_style_url' => '',
'editor_style_url' => '',
'comment_display_top' => 'false',
'allow_deletion' => 'true',
'show_advanced' => 'true'
);
$options = get_option($this->adminOptionsName);
if (!empty($options)) {
foreach ($options as $key => $option)
$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:
return;
}
$options = $this->get_user_options();
if ($options['admin_editing'] == 'true') { return; }
$this->add_scripts();
}
//Adds the appropriate scripts to WordPress
function add_scripts(){
$dep = "thickbox";
//Check to make sure other thickbox scripts haven't been added
wp_enqueue_script("wp-ajax-response");
global $wp_scripts;
//NextGen Gallery Compatibility
if ($wp_scripts->query('ngg-thickbox', 'queue')) {
wp_deregister_script(array('thickbox'));
$dep = "ngg-thickbox";
wp_enqueue_script('ngg-thickbox-aec', $this->pluginDir . '/js/nextgen-thickbox.js', array('ngg-thickbox'), '3.1.1');
} else {
wp_enqueue_script('thickbox');
}
wp_enqueue_script('jquery');
wp_enqueue_script('wp_ajax_edit_comments_script', $this->pluginDir . '/js/wp-ajax-edit-comments.js', array("jquery", "wp-ajax-response", $dep) , 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_Saved' => __('Comment Successfully Saved', $this->localizationName),
'AEC_Delink' => __('De-link Successful', $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'])) {
//For RTL readers
$locale = get_locale();
if ($locale == "ar") {
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();
}
}
?>