diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php index d4aea45cb8..e48197c39a 100644 --- a/src/wp-includes/comment.php +++ b/src/wp-includes/comment.php @@ -1377,13 +1377,16 @@ function wp_throttle_comment_flood($block, $time_lastcomment, $time_newcomment) * See {@link http://core.trac.wordpress.org/ticket/9235} * * @since 1.5.0 - * @uses apply_filters() Calls 'preprocess_comment' hook on $commentdata parameter array before processing - * @uses do_action() Calls 'comment_post' hook on $comment_ID returned from adding the comment and if the comment was approved. - * @uses wp_filter_comment() Used to filter comment before adding comment. - * @uses wp_allow_comment() checks to see if comment is approved. - * @uses wp_insert_comment() Does the actual comment insertion to the database. - * * @param array $commentdata Contains information on the comment. + * @uses apply_filters() + * @uses wp_get_comment_status() + * @uses wp_filter_comment() + * @uses wp_allow_comment() + * @uses wp_insert_comment() + * @uses do_action() + * @uses wp_notify_moderator() + * @uses get_option() + * @uses wp_notify_postauthor() * @return int The ID of the comment after adding. */ function wp_new_comment( $commentdata ) { @@ -1418,12 +1421,10 @@ function wp_new_comment( $commentdata ) { wp_notify_moderator( $comment_ID ); } - if ( get_option('comments_notify') && $commentdata['comment_approved'] ) { - $post = get_post( $commentdata['comment_post_ID'] ); - // Don't notify if it's your own comment - if ( ! isset( $commentdata['user_id'] ) || $post->post_author != $commentdata['user_id'] ) { - wp_notify_postauthor( $comment_ID ); - } + // wp_notify_postauthor() checks if notifying the author of their own comment. + // By default, it won't, but filters can override this. + if ( get_option( 'comments_notify' ) && $commentdata['comment_approved'] ) { + wp_notify_postauthor( $comment_ID ); } } @@ -1457,7 +1458,7 @@ function wp_set_comment_status($comment_id, $comment_status, $wp_error = false) case '1': $status = '1'; if ( get_option('comments_notify') ) { - wp_notify_postauthor( $comment_id ); + wp_notify_postauthor( $comment_id ); } break; case 'spam': diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index a083079045..5028f5deb7 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -1000,13 +1000,23 @@ endif; if ( ! function_exists('wp_notify_postauthor') ) : /** - * Notify an author of a comment/trackback/pingback to one of their posts. + * Notify an author (and/or others) of a comment/trackback/pingback on a post. * * @since 1.0.0 * * @param int $comment_id Comment ID * @param string $deprecated Not used - * @return bool False if user email does not exist. True on completion. + * @uses get_comment() + * @uses get_post() + * @uses get_userdata() + * @uses apply_filters() + * @uses wp_specialchars_decode() + * @uses get_option() + * @uses __() + * @uses get_permalink() + * @uses admin_url() + * @uses wp_mail() + * @return bool True on completion. False if no email addresses were specified. */ function wp_notify_postauthor( $comment_id, $deprecated = null ) { if ( null !== $deprecated ) { @@ -1020,21 +1030,43 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { $post = get_post( $comment->comment_post_ID ); $author = get_userdata( $post->post_author ); - // The comment was left by the author - if ( $comment->user_id == $post->post_author ) - return false; + // Who to notify? By default, just the post author, but others can be added. + $emails = array( $author->user_email ); + $emails = apply_filters( 'comment_notification_recipients', $emails, $comment_id ); + $emails = array_filter( $emails ); - // The author moderated a comment on his own post - if ( $post->post_author == get_current_user_id() ) + // If there are no addresses to send the comment to, bail. + if ( ! count( $emails ) ) { return false; + } + + // Facilitate unsetting below without knowing the keys. + $emails = array_flip( $emails ); + + // Post author may want to receive notifications for their own comments + $notify_author = apply_filters( 'comment_notification_notify_author', false, $comment_id ); + + // The comment was left by the author + if ( ! $notify_author && $comment->user_id == $post->post_author ) { + unset( $emails[ $author->user_email ] ); + } + + // The author moderated a comment on their own post + if ( ! $notify_author && $post->post_author == get_current_user_id() ) { + unset( $emails[ $author->user_email ] ); + } // The post author is no longer a member of the blog - if ( ! user_can( $post->post_author, 'read_post', $post->ID ) ) - return false; + if ( ! $notify_author && ! user_can( $post->post_author, 'read_post', $post->ID ) ) { + unset( $emails[ $author->user_email ] ); + } - // If there's no email to send the comment to - if ( '' == $author->user_email ) + // If there's no email to send the comment to, bail, otherwise flip array back around for use below + if ( ! count( $emails ) ) { return false; + } else { + $emails = array_flip( $emails ); + } $comment_author_domain = @gethostbyaddr($comment->comment_author_IP); @@ -1042,9 +1074,7 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { // we want to reverse this for the plain text arena of emails. $blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES); - $comment_type = $comment->comment_type ? $comment->comment_type : 'comment'; - - switch ( $comment_type ) { + switch ( $comment->comment_type ) { case 'trackback': $notify_message = sprintf( __( 'New trackback on your post "%s"' ), $post->post_title ) . "\r\n"; /* translators: 1: website name, 2: author IP, 3: author domain */ @@ -1107,9 +1137,6 @@ function wp_notify_postauthor( $comment_id, $deprecated = null ) { if ( isset($reply_to) ) $message_headers .= $reply_to . "\n"; - $emails = array( $author->user_email ); - - $emails = apply_filters( 'comment_notification_recipients', $emails, $comment_id ); $notify_message = apply_filters( 'comment_notification_text', $notify_message, $comment_id ); $subject = apply_filters( 'comment_notification_subject', $subject, $comment_id ); $message_headers = apply_filters( 'comment_notification_headers', $message_headers, $comment_id );