Make WordPress Core

Ticket #761: 761.11.diff

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

     
    17521752        $comment = get_comment( $comment_ID );
    17531753
    17541754        // Only send notifications for pending comments.
    1755         if ( '0' != $comment->comment_approved ) {
     1755        $maybe_notify = ( '0' == $comment->comment_approved );
     1756
     1757        /** This filter is documented in wp-includes/comment-functions.php */
     1758        $maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_ID );
     1759
     1760        if ( ! $maybe_notify ) {
    17561761                return false;
    17571762        }
    17581763
     
    17641769 *
    17651770 * @since 4.4.0
    17661771 *
    1767  * @param int $comment_ID ID of the comment.
     1772 * Uses the {@see 'notify_post_author'} filter to determine whether the post author
     1773 * should be notified when a new comment is added, overriding site setting.
     1774 *
     1775 * @param int $comment_ID Comment ID.
    17681776 * @return bool True on success, false on failure.
    17691777 */
    17701778function wp_new_comment_notify_postauthor( $comment_ID ) {
    17711779        $comment = get_comment( $comment_ID );
    17721780
     1781        $maybe_notify = get_option( 'comments_notify' );
     1782
     1783        /**
     1784         * Filter whether to send the post author new comment notification emails,
     1785         * overriding the site setting.
     1786         *
     1787         * @since 4.4.0
     1788         *
     1789         * @param bool $maybe_notify Whether to notify the post author about the new comment.
     1790         * @param int  $comment_ID   The id of the comment for the notification.
     1791         */
     1792        $maybe_notify = apply_filters( 'notify_post_author', $maybe_notify, $comment_ID );
     1793
    17731794        /*
    1774          * `wp_notify_postauthor()` checks if notifying the author of their own comment.
     1795         * wp_notify_postauthor() checks if notifying the author of their own comment.
    17751796         * By default, it won't, but filters can override this.
    17761797         */
    1777         if ( ! get_option( 'comments_notify' ) ) {
     1798        if ( ! $maybe_notify ) {
    17781799                return false;
    17791800        }
    17801801
     
    17941815 *
    17951816 * @since 1.0.0
    17961817 *
    1797  * global wpdb $wpdb
     1818 * @global wpdb $wpdb WordPress database abstraction object.
    17981819 *
    17991820 * @param int|WP_Comment $comment_id     Comment ID or WP_Comment object.
    18001821 * @param string         $comment_status New comment status, either 'hold', 'approve', 'spam', or 'trash'.
  • src/wp-includes/pluggable.php

     
    15611561
    15621562if ( !function_exists('wp_notify_moderator') ) :
    15631563/**
    1564  * Notifies the moderator of the blog about a new comment that is awaiting approval.
     1564 * Notifies the moderator of the site about a new comment that is awaiting approval.
    15651565 *
    15661566 * @since 1.0.0
    15671567 *
    15681568 * @global wpdb $wpdb WordPress database abstraction object.
    15691569 *
    1570  * @param int $comment_id Comment ID
    1571  * @return true Always returns true
     1570 * Uses the {@see 'notify_moderator'} filter to determine whether the site moderator
     1571 * should be notified, overriding the site setting.
     1572 *
     1573 * @param int $comment_id Comment ID.
     1574 * @return true Always returns true.
    15721575 */
    15731576function wp_notify_moderator($comment_id) {
    15741577        global $wpdb;
    15751578
    1576         if ( 0 == get_option( 'moderation_notify' ) )
     1579        $maybe_notify = get_option( 'moderation_notify' );
     1580
     1581        /**
     1582         * Filter whether to send the site moderator email notifications, overriding the site setting.
     1583         *
     1584         * @since 4.4.0
     1585         *
     1586         * @param bool $maybe_notify Whether to notify blog moderator.
     1587         * @param int  $comment_ID   The id of the comment for the notification.
     1588         */
     1589        $maybe_notify = apply_filters( 'notify_moderator', $maybe_notify, $comment_id );
     1590
     1591        if ( ! $maybe_notify ) {
    15771592                return true;
     1593        }
    15781594
    15791595        $comment = get_comment($comment_id);
    15801596        $post = get_post($comment->comment_post_ID);
     
    21722188                        } else {
    21732189                                $use_random_int_functionality = false;
    21742190                        }
    2175                 } catch ( Throwable $t ) { 
     2191                } catch ( Throwable $t ) {
    21762192                        $use_random_int_functionality = false;
    21772193                } catch ( Exception $e ) {
    21782194                        $use_random_int_functionality = false;
  • tests/phpunit/tests/comment.php

     
    359359                        $this->assertSame( $post->$pf, $comment->$pf, $pf );
    360360                }
    361361        }
     362
     363
     364        /**
     365         * Helper function to set up comment for 761 tests
     366         */
     367        public function setup_notify_comment(){
     368                /**
     369                 * Mock some server variables.
     370                 */
     371                $_SERVER['SERVER_NAME'] = 'phpunit.wordpress.dev';
     372                $_SERVER['REMOTE_ADDR'] = '127.0.0.1';
     373
     374                /**
     375                 * Prevent flood alert from firing.
     376                 */
     377                add_filter( 'comment_flood_filter', '__return_false' );
     378
     379                /**
     380                 * Set up the post author to test notifying.
     381                 */
     382                $user = $this->factory->user->create( array(
     383                        'role'       => 'author',
     384                        'user_login' => 'test_wp_user_get',
     385                        'user_pass'  => 'password',
     386                        'user_email' => 'test@test.com',
     387                ) );
     388
     389                /**
     390                 * Set up a comment for testing.
     391                 */
     392                $post = $this->factory->post->create( array(
     393                        'post_author' => $user,
     394                ) );
     395
     396                $comment = $this->factory->comment->create( array(
     397                        'comment_post_ID' => $post,
     398                ) );
     399
     400                return array(
     401                        'post'    => $post,
     402                        'comment' => $comment,
     403                );
     404        }
     405
     406        /**
     407         * @ticket 761
     408         */
     409        public function test_wp_notify_moderator_filter_moderation_notify_option_true_filter_false() {
     410                $comment_data = $this->setup_notify_comment();
     411
     412                /**
     413                 * Test with moderator notification setting on, filter set to off.
     414                 * Should not send a notification.
     415                 */
     416                update_option( 'moderation_notify', 1 );
     417                add_filter( 'notify_moderator', '__return_false' );
     418
     419                $notification_sent = $this->try_sending_moderator_notification( $comment_data['comment'], $comment_data['post'] );
     420
     421                $this->assertFalse( $notification_sent, 'Moderator notification setting on, filter set to off' );
     422
     423                remove_filter( 'notify_moderator', '__return_false' );
     424        }
     425
     426        /**
     427         * @ticket 761
     428         */
     429        public function test_wp_notify_moderator_filter_moderation_notify_option_false_filter_true() {
     430                $comment_data = $this->setup_notify_comment();
     431
     432                /**
     433                 * Test with moderator notification setting off, filter set to on.
     434                 * Should send a notification.
     435                 */
     436                update_option( 'moderation_notify', 0 );
     437                add_filter( 'notify_moderator', '__return_true' );
     438
     439                $notification_sent = $this->try_sending_moderator_notification( $comment_data['comment'], $comment_data['post'] );
     440
     441                $this->assertTrue( $notification_sent, 'Moderator notification setting off, filter set to on' );
     442
     443                remove_filter( 'notify_moderator', '__return_true' );
     444        }
     445
     446        /**
     447         * @ticket 761
     448         */
     449        public function test_wp_notify_post_author_filter_comments_notify_option_true_filter_false() {
     450
     451                $comment_data = $this->setup_notify_comment();
     452
     453                /**
     454                 * Test with author notification setting on, filter set to off.
     455                 * Should not send a notification.
     456                 */
     457                update_option( 'comments_notify', 1 );
     458                add_filter( 'notify_post_author', '__return_false' );
     459
     460                $notification_sent = $this->try_sending_author_notification( $comment_data['comment'], $comment_data['post'] );
     461
     462                $this->assertFalse( $notification_sent, 'Test with author notification setting on, filter set to off' );
     463
     464                remove_filter( 'notify_post_author', '__return_false' );
     465        }
     466
     467        /**
     468         * @ticket 761
     469         */
     470        public function test_wp_notify_post_author_filter_comments_notify_option_false_filter_true() {
     471                $comment_data = $this->setup_notify_comment();
     472
     473                /**
     474                 * Test with author notification setting off, filter set to on.
     475                 * Should send a notification.
     476                 */
     477                update_option( 'comments_notify', 0 );
     478                add_filter( 'notify_post_author', '__return_true' );
     479
     480                $notification_sent = $this->try_sending_author_notification( $comment_data['comment'], $comment_data['post'] );
     481
     482                $this->assertTrue( $notification_sent, 'Test with author notification setting off, filter set to on' );
     483
     484                remove_filter( 'notify_post_author', '__return_true' );
     485        }
     486
     487        /**
     488         * Helper function to test moderator notifications.
     489         *
     490         * @since 4.4.0
     491         * @access public
     492         */
     493        public function try_sending_moderator_notification( $comment, $post ) {
     494
     495                // Don't approve comments, triggering notifications.
     496                add_filter( 'pre_comment_approved', '__return_false' );
     497
     498                // Moderators are notified when a new comment is added.
     499                $data = array(
     500                        'comment_post_ID'      => $post,
     501                        'comment_author'       => rand_str(),
     502                        'comment_author_url'   => '',
     503                        'comment_author_email' => '',
     504                        'comment_type'         => '',
     505                        'comment_content'      => rand_str(),
     506                );
     507                wp_new_comment( $data );
     508
     509                // Check to see if a notification email was sent to the moderator `admin@example.org`.
     510                if ( isset( $GLOBALS['phpmailer']->mock_sent )
     511                        && ! empty( $GLOBALS['phpmailer']->mock_sent )
     512                        && 'admin@example.org' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0]
     513                ) {
     514                        $email_sent_when_comment_added = true;
     515                        unset( $GLOBALS['phpmailer']->mock_sent );
     516                } else {
     517                        $email_sent_when_comment_added = false;
     518                }
     519
     520                return $email_sent_when_comment_added;
     521        }
     522
     523        /**
     524         * Helper function to test sending author notifications.
     525         *
     526         * @since 4.4.0
     527         * @access public
     528         */
     529        public function try_sending_author_notification( $comment, $post ) {
     530
     531                // Approve comments, triggering notifications.
     532                add_filter( 'pre_comment_approved', '__return_true' );
     533
     534                // Post authors possibly notified when a comment is approved on their post.
     535                wp_set_comment_status( $comment, 'approve' );
     536
     537                // Check to see if a notification email was sent to the post author `test@test.com`.
     538                if ( isset( $GLOBALS['phpmailer']->mock_sent )
     539                        && ! empty( $GLOBALS['phpmailer']->mock_sent )
     540                        && 'test@test.com' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0]
     541                ) {
     542                        $email_sent_when_comment_approved = true;
     543                } else {
     544                        $email_sent_when_comment_approved = false;
     545                }
     546                unset( $GLOBALS['phpmailer']->mock_sent );
     547
     548                // Post authors are notified when a new comment is added to their post.
     549                $data = array(
     550                        'comment_post_ID'      => $post,
     551                        'comment_author'       => rand_str(),
     552                        'comment_author_url'   => '',
     553                        'comment_author_email' => '',
     554                        'comment_type'         => '',
     555                        'comment_content'      => rand_str(),
     556                );
     557                wp_new_comment( $data );
     558
     559                // Check to see if a notification email was sent to the post author `test@test.com`.
     560                if ( isset( $GLOBALS['phpmailer']->mock_sent ) &&
     561                     ! empty( $GLOBALS['phpmailer']->mock_sent ) &&
     562                     'test@test.com' == $GLOBALS['phpmailer']->mock_sent[0]['to'][0][0] ) {
     563                        $email_sent_when_comment_added = true;
     564                        unset( $GLOBALS['phpmailer']->mock_sent );
     565                } else {
     566                        $email_sent_when_comment_added = false;
     567                }
     568
     569                return $email_sent_when_comment_approved || $email_sent_when_comment_added;
     570        }
    362571}