Make WordPress Core

Ticket #761: 761.6.diff

File 761.6.diff, 9.8 KB (added by adamsilverstein, 9 years ago)
  • src/wp-includes/comment-functions.php

     
    16241624         *
    16251625         * @since 1.2.0
    16261626         *
     1627         * Calls {@see 'wp_notify_post_author'} to determine if the post author should be
     1628         * notified. Calls {@see 'wp_notify_moderator'} to determine if the site moderator
     1629         * should be notified.
     1630         *
    16271631         * @param int $comment_ID       The comment ID.
    16281632         * @param int $comment_approved 1 (true) if the comment is approved, 0 (false) if not.
    16291633         */
     
    16311635
    16321636        if ( 'spam' !== $commentdata['comment_approved'] ) { // If it's spam save it silently for later crunching
    16331637                if ( '0' == $commentdata['comment_approved'] ) {
    1634                         wp_notify_moderator( $comment_ID );
     1638                        $maybe_notify = get_option( 'moderation_notify' );
     1639
     1640                        /**
     1641                         * Filter the blog moderator email notification setting.
     1642                         *
     1643                         * @since 4.4.0
     1644                         *
     1645                         * @param bool $maybe_notify Whether to notify blog moderator.
     1646                         * @param int  $comment_ID   The id of the comment for the notification.
     1647                         */
     1648                        if ( apply_filters( 'wp_notify_moderator', $maybe_notify, $comment_ID ) ) {
     1649                                wp_notify_moderator( $comment_ID );
     1650                        }
    16351651                }
    16361652
     1653                $maybe_notify = get_option( 'comments_notify' ) && $commentdata['comment_approved'];
     1654
     1655                /**
     1656                 * Filter the post author email notification setting.
     1657                 *
     1658                 * @since 4.4.0
     1659                 *
     1660                 * @param bool $maybe_notify Whether to notify post author.
     1661                 * @param int  $comment_ID   The id of the comment for the notification.
     1662                 */
     1663                $maybe_notify = apply_filters( 'wp_notify_post_author', $maybe_notify, $comment_ID );
    16371664                // wp_notify_postauthor() checks if notifying the author of their own comment.
    16381665                // By default, it won't, but filters can override this.
    1639                 if ( get_option( 'comments_notify' ) && $commentdata['comment_approved'] ) {
     1666                if ( $maybe_notify ) {
    16401667                        wp_notify_postauthor( $comment_ID );
    16411668                }
    16421669        }
     
    16521679 *
    16531680 * @since 1.0.0
    16541681 *
     1682 * Calls {@see 'wp_notify_post_author'} to determine if the post author should be
     1683 * notified.
     1684 *
    16551685 * global wpdb $wpdb
    16561686 *
    16571687 * @param int $comment_id Comment ID.
     
    16701700                case 'approve':
    16711701                case '1':
    16721702                        $status = '1';
    1673                         if ( get_option('comments_notify') ) {
     1703                        $maybe_notify = get_option( 'comments_notify' );
     1704
     1705                        /** This filter is documented in wp-includes/comment-functions.php */
     1706                        $maybe_notify = apply_filters( 'wp_notify_post_author', $maybe_notify, $comment_id );
     1707                        if ( $maybe_notify ) {
    16741708                                wp_notify_postauthor( $comment_id );
    16751709                        }
    16761710                        break;
  • src/wp-includes/pluggable.php

     
    15461546 *
    15471547 * @global wpdb $wpdb WordPress database abstraction object.
    15481548 *
     1549 *
     1550 * @uses apply_filters() Calls 'wp_notify_moderator' to determine if blog moderator
     1551 *                       should be notified.
     1552 *
    15491553 * @param int $comment_id Comment ID
    15501554 * @return true Always returns true
    15511555 */
     
    15521556function wp_notify_moderator($comment_id) {
    15531557        global $wpdb;
    15541558
    1555         if ( 0 == get_option( 'moderation_notify' ) )
     1559        $maybe_notify = get_option( 'moderation_notify' );
     1560
     1561        /** This filter is documented in wp-includes/comment-functions.php */
     1562        if ( ! apply_filters( 'wp_notify_moderator', $maybe_notify, $comment_id ) ) {
    15561563                return true;
     1564        }
    15571565
    15581566        $comment = get_comment($comment_id);
    15591567        $post = get_post($comment->comment_post_ID);
  • tests/phpunit/tests/comment.php

     
    287287
    288288                $this->assertTrue( wp_notify_moderator( $c ) );
    289289        }
     290
     291
     292        /**
     293         * Helper function to set up comment for 761 tests
     294         */
     295        public function setup_notify_comment(){
     296                /**
     297                 * Mock some server variables.
     298                 */
     299                $_SERVER['SERVER_NAME'] = 'phpunit.wordpress.dev';
     300                $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
     301
     302                /**
     303                 * Prevent flood alert from firing.
     304                 */
     305                add_filter( 'comment_flood_filter', '__return_false' );
     306
     307                /**
     308                 * Set up the post author to test notifying.
     309                 */
     310                $user = $this->factory->user->create(
     311                                array(
     312                                                'role'       => 'author',
     313                                                'user_login' => 'test_wp_user_get',
     314                                                'user_pass'  => 'password',
     315                                                'user_email' => 'test@test.com',
     316                                )
     317                );
     318
     319                /**
     320                 * Set up a comment for testing.
     321                 */
     322                $post = $this->factory->post->create(
     323                                array(
     324                                                'post_author' => $user,
     325                                )
     326                );
     327
     328                $comment = $this->factory->comment->create(
     329                                array(
     330                                                'comment_post_ID' => $post,
     331                                )
     332                );
     333
     334                return array(
     335                                'post'    => $post,
     336                                'comment' => $comment,
     337                );
     338        }
     339
     340        /**
     341         * @ticket 761
     342         */
     343        public function test_wp_notify_moderator_filter() {
     344
     345                $comment_data = $this->setup_notify_comment();
     346
     347                /**
     348                 * Test with moderator notification setting on, filter set to off.
     349                 * Should not send a notification.
     350                 */
     351                update_option( 'moderation_notify', 1 );
     352                add_filter( 'wp_notify_moderator', '__return_false' );
     353                $notification_sent = $this->try_sending_moderator_notification( $comment_data['comment'], $comment_data['post'] );
     354                $this->assertFalse( $notification_sent, 'Moderator notification setting on, filter set to off' );
     355                remove_filter( 'wp_notify_moderator', '__return_false' );
     356
     357                /**
     358                 * Test with moderator notification setting off, filter set to on.
     359                 * Should send a notification.
     360                 */
     361                update_option( 'moderation_notify', 0 );
     362                add_filter( 'wp_notify_moderator', '__return_true' );
     363                $notification_sent = $this->try_sending_moderator_notification( $comment_data['comment'], $comment_data['post'] );
     364                $this->assertTrue( $notification_sent, 'Moderator notification setting off, filter set to on' );
     365                remove_filter( 'wp_notify_moderator', '__return_true' );
     366
     367        }
     368
     369        /**
     370         * @ticket 761
     371         */
     372        public function test_wp_notify_post_author_filter() {
     373
     374                $comment_data = $this->setup_notify_comment();
     375
     376                /**
     377                 * Test with author notification setting on, filter set to off.
     378                 * Should not send a notification.
     379                 */
     380                update_option( 'comments_notify', 1 );
     381                add_filter( 'wp_notify_post_author', '__return_false' );
     382                $notification_sent = $this->try_sending_author_notification( $comment_data['comment'], $comment_data['post'] );
     383                $this->assertFalse( $notification_sent, 'Test with author notification setting on, filter set to off' );
     384                remove_filter( 'wp_notify_post_author', '__return_false' );
     385
     386                /**
     387                 * Test with author notification setting off, filter set to on.
     388                 * Should sent a notification.
     389                 */
     390                update_option( 'comments_notify', 0 );
     391                add_filter( 'wp_notify_post_author', '__return_true' );
     392                $notification_sent = $this->try_sending_author_notification( $comment_data['comment'], $comment_data['post'] );
     393                $this->assertTrue( $notification_sent, 'Test with author notification setting off, filter set to on' );
     394                remove_filter( 'wp_notify_post_author', '__return_true' );
     395
     396        }
     397
     398        /**
     399         * Helper function to test moderator notifications.
     400         */
     401        public function try_sending_moderator_notification( $comment, $post ) {
     402
     403                /**
     404                 * Don't approve comments, triggering notifications.
     405                 */
     406                add_filter( 'pre_comment_approved', '__return_false' );
     407
     408                /**
     409                 * Moderators are notified when a new comment is added.
     410                 */
     411                $data = array(
     412                                'comment_post_ID'      => $post,
     413                                'comment_author'       => rand_str(),
     414                                'comment_author_url'   => '',
     415                                'comment_author_email' => '',
     416                                'comment_type'         => '',
     417                                'comment_content'      => rand_str(),
     418                );
     419                wp_new_comment( $data );
     420
     421                /**
     422                 * Check to see if a notification email was sent to the moderator `admin@example.org`.
     423                 */
     424                if ( isset( $GLOBALS['phpmailer']->mock_sent ) &&
     425                     ! empty( $GLOBALS['phpmailer']->mock_sent ) &&
     426                     'admin@example.org' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] ) {
     427                        $email_sent_when_comment_added = true;
     428                        unset( $GLOBALS['phpmailer']->mock_sent );
     429                } else {
     430                        $email_sent_when_comment_added = false;
     431                }
     432
     433                return $email_sent_when_comment_added;
     434        }
     435
     436        /**
     437         * Helper function to test sending author notifications.
     438         */
     439        public function try_sending_author_notification( $comment, $post ) {
     440
     441                /**
     442                 * Approve comments, triggering notifications.
     443                 */
     444                add_filter( 'pre_comment_approved', '__return_true' );
     445
     446                /**
     447                 * Post authors possibly notified when a comment is approved on their post.
     448                 */
     449                wp_set_comment_status( $comment, 'approve' );
     450
     451                /**
     452                 * Check to see if a notification email was sent to the post author `test@test.com`.
     453                 */
     454                if ( isset( $GLOBALS['phpmailer']->mock_sent ) &&
     455                     ! empty( $GLOBALS['phpmailer']->mock_sent ) &&
     456                     'test@test.com' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] ) {
     457                        $email_sent_when_comment_approved = true;
     458                } else {
     459                        $email_sent_when_comment_approved = false;
     460                }
     461                unset( $GLOBALS['phpmailer']->mock_sent );
     462
     463                /**
     464                 * Post authors are notified when a new comment is added to their post.
     465                 */
     466                $data = array(
     467                                'comment_post_ID'      => $post,
     468                                'comment_author'       => rand_str(),
     469                                'comment_author_url'   => '',
     470                                'comment_author_email' => '',
     471                                'comment_type'         => '',
     472                                'comment_content'      => rand_str(),
     473                );
     474                wp_new_comment( $data );
     475
     476                /**
     477                 * Check to see if a notification email was sent to the post author `test@test.com`.
     478                 */
     479                if ( isset( $GLOBALS['phpmailer']->mock_sent ) &&
     480                     ! empty( $GLOBALS['phpmailer']->mock_sent ) &&
     481                     'test@test.com' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] ) {
     482                        $email_sent_when_comment_added = true;
     483                        unset( $GLOBALS['phpmailer']->mock_sent );
     484                } else {
     485                        $email_sent_when_comment_added = false;
     486                }
     487
     488                return $email_sent_when_comment_approved && $email_sent_when_comment_added;
     489        }
    290490}