Make WordPress Core

Changeset 47888


Ignore:
Timestamp:
06/02/2020 08:24:59 PM (5 years ago)
Author:
whyisjake
Message:

Comments: Ensure that unmoderated comments won't be search indexed.

After a comment is submitted, only allow a brief window where the comment is live on the site.

This brings the changes from [47887] to the 5.4 branch.

Fixes #49956.
Props: jonkolbert, ayeshrajans, Asif2BD, peterwilsoncc, imath, audrasjb, jonoaldersonwp, whyisjake.

Location:
branches/5.4
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • branches/5.4/src/wp-comments-post.php

    r47198 r47888  
    5757$location = empty( $_POST['redirect_to'] ) ? get_comment_link( $comment ) : $_POST['redirect_to'] . '#comment-' . $comment->comment_ID;
    5858
    59 // Add specific query arguments to display the awaiting moderation message.
    60 if ( 'unapproved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_author_email ) ) {
     59// If user didn't consent to cookies, add specific query arguments to display the awaiting moderation message.
     60if ( ! $cookies_consent && 'unapproved' === wp_get_comment_status( $comment ) && ! empty( $comment->comment_author_email ) ) {
    6161    $location = add_query_arg(
    6262        array(
  • branches/5.4/src/wp-includes/class-walker-comment.php

    r46391 r47888  
    180180            $output .= ob_get_clean();
    181181            return;
     182        }
     183
     184        if ( 'comment' === $comment->comment_type ) {
     185            add_filter( 'comment_text', array( $this, 'comment_text' ), 40, 2 );
    182186        }
    183187
     
    195199            $output .= ob_get_clean();
    196200        }
     201
     202        if ( 'comment' === $comment->comment_type ) {
     203            remove_filter( 'comment_text', array( $this, 'comment_text' ), 40, 2 );
     204        }
    197205    }
    198206
     
    246254
    247255    /**
     256     * Remove links from the pending comment's text if the commenter has not consent to the comment cookie.
     257     *
     258     * @since 5.4.2
     259     *
     260     * @param string          $comment_text Text of the current comment.
     261     * @param WP_Comment|null $comment      The comment object.
     262     * @return string                       Text of the current comment.
     263     */
     264    function comment_text( $comment_text, $comment ) {
     265        $commenter          = wp_get_current_commenter();
     266        $show_pending_links = ! empty( $commenter['comment_author'] );
     267
     268        if ( '0' == $comment->comment_approved && ! $show_pending_links ) {
     269            return wp_kses( $comment_text, array() );
     270        }
     271
     272        return $comment_text;
     273    }
     274
     275    /**
    248276     * Outputs a single comment.
    249277     *
     
    265293        }
    266294
    267         $commenter = wp_get_current_commenter();
     295        $commenter          = wp_get_current_commenter();
     296        $show_pending_links = isset( $commenter['comment_author'] ) && $commenter['comment_author'];
    268297        if ( $commenter['comment_author_email'] ) {
    269298            $moderation_note = __( 'Your comment is awaiting moderation.' );
     
    280309            <?php
    281310            if ( 0 != $args['avatar_size'] ) {
    282                 echo get_avatar( $comment, $args['avatar_size'] );}
     311                echo get_avatar( $comment, $args['avatar_size'] );
     312            }
    283313            ?>
    284314            <?php
    285                 printf(
    286                     /* translators: %s: Comment author link. */
    287                     __( '%s <span class="says">says:</span>' ),
    288                     sprintf( '<cite class="fn">%s</cite>', get_comment_author_link( $comment ) )
    289                 );
     315            $comment_author = get_comment_author_link( $comment );
     316            if ( '0' == $comment->comment_approved && ! $show_pending_links ) {
     317                $comment_author = get_comment_author( $comment );
     318            }
     319            printf(
     320                /* translators: %s: Comment author link. */
     321                __( '%s <span class="says">says:</span>' ),
     322                sprintf( '<cite class="fn">%s</cite>', $comment_author )
     323            );
    290324            ?>
    291325        </div>
     
    355389        $tag = ( 'div' === $args['style'] ) ? 'div' : 'li';
    356390
    357         $commenter = wp_get_current_commenter();
     391        $commenter          = wp_get_current_commenter();
     392        $show_pending_links = ! empty( $commenter['comment_author'] );
    358393        if ( $commenter['comment_author_email'] ) {
    359394            $moderation_note = __( 'Your comment is awaiting moderation.' );
     
    373408                        ?>
    374409                        <?php
    375                             printf(
    376                                 /* translators: %s: Comment author link. */
    377                                 __( '%s <span class="says">says:</span>' ),
    378                                 sprintf( '<b class="fn">%s</b>', get_comment_author_link( $comment ) )
    379                             );
     410                        $comment_author = get_comment_author_link( $comment );
     411                        if ( '0' == $comment->comment_approved && ! $show_pending_links ) {
     412                            $comment_author = get_comment_author( $comment );
     413                        }
     414                        printf(
     415                            /* translators: %s: Comment author link. */
     416                            __( '%s <span class="says">says:</span>' ),
     417                            sprintf( '<b class="fn">%s</b>', $comment_author )
     418                        );
    380419                        ?>
    381420                    </div><!-- .comment-author -->
     
    403442
    404443                <?php
    405                 comment_reply_link(
    406                     array_merge(
    407                         $args,
    408                         array(
    409                             'add_below' => 'div-comment',
    410                             'depth'     => $depth,
    411                             'max_depth' => $args['max_depth'],
    412                             'before'    => '<div class="reply">',
    413                             'after'     => '</div>',
     444                if ( '1' == $comment->comment_approved || $show_pending_links ) {
     445                    comment_reply_link(
     446                        array_merge(
     447                            $args,
     448                            array(
     449                                'add_below' => 'div-comment',
     450                                'depth'     => $depth,
     451                                'max_depth' => $args['max_depth'],
     452                                'before'    => '<div class="reply">',
     453                                'after'     => '</div>',
     454                            )
    414455                        )
    415                     )
    416                 );
     456                    );
     457                }
    417458                ?>
    418459            </article><!-- .comment-body -->
  • branches/5.4/src/wp-includes/class-wp-comment-query.php

    r47219 r47888  
    554554                if ( is_numeric( $unapproved_identifier ) ) {
    555555                    $approved_clauses[] = $wpdb->prepare( "( user_id = %d AND comment_approved = '0' )", $unapproved_identifier );
    556 
     556                } else {
    557557                    // Otherwise we match against email addresses.
    558                 } else {
    559                     $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' )", $unapproved_identifier );
     558                    if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) {
     559                        // Only include requested comment.
     560                        $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] );
     561                    } else {
     562                        // Include all of the author's unapproved comments.
     563                        $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' )", $unapproved_identifier );
     564                    }
    560565                }
    561566            }
  • branches/5.4/src/wp-includes/class-wp.php

    r47122 r47888  
    405405        if ( is_user_logged_in() ) {
    406406            $headers = array_merge( $headers, wp_get_nocache_headers() );
     407        } elseif ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) {
     408            // Unmoderated comments are only visible for one minute via the moderation hash.
     409            $headers['Expires']       = gmdate( 'D, d M Y H:i:s', time() + MINUTE_IN_SECONDS );
     410            $headers['Cache-Control'] = 'max-age=60, must-revalidate';
    407411        }
    408412        if ( ! empty( $this->query_vars['error'] ) ) {
  • branches/5.4/src/wp-includes/comment.php

    r47397 r47888  
    18381838
    18391839        if ( $comment && hash_equals( $_GET['moderation-hash'], wp_hash( $comment->comment_date_gmt ) ) ) {
    1840             $commenter_email = $comment->comment_author_email;
     1840            // The comment will only be viewable by the comment author for 1 minute.
     1841            $comment_preview_expires = strtotime( $comment->comment_date_gmt . '+1 minute' );
     1842
     1843            if ( time() < $comment_preview_expires ) {
     1844                $commenter_email = $comment->comment_author_email;
     1845            }
    18411846        }
    18421847    }
  • branches/5.4/tests/qunit/fixtures/wp-api-generated.js

    r47822 r47888  
    7979                    "args": {
    8080                        "url": {
    81                             "required": true,
    82                             "description": "The URL of the resource for which to fetch oEmbed data.",
    83                             "type": "string"
     81                            "required": true
    8482                        },
    8583                        "format": {
     
    43984396            "namespace": "wp/v2",
    43994397            "methods": [
    4400                 "GET",
    4401                 "POST"
     4398                "GET"
    44024399            ],
    44034400            "endpoints": [
    44044401                {
    44054402                    "methods": [
    4406                         "GET",
    4407                         "POST"
     4403                        "GET"
    44084404                    ],
    44094405                    "args": {
     
    44404436            "namespace": "wp/v2",
    44414437            "methods": [
    4442                 "GET",
    4443                 "POST"
     4438                "GET"
    44444439            ],
    44454440            "endpoints": [
    44464441                {
    44474442                    "methods": [
    4448                         "GET",
    4449                         "POST"
     4443                        "GET"
    44504444                    ],
    44514445                    "args": {
     
    44824476            "namespace": "wp/v2",
    44834477            "methods": [
    4484                 "GET",
    4485                 "POST"
     4478                "GET"
    44864479            ],
    44874480            "endpoints": [
    44884481                {
    44894482                    "methods": [
    4490                         "GET",
    4491                         "POST"
     4483                        "GET"
    44924484                    ],
    44934485                    "args": {
     
    45244516            "namespace": "wp/v2",
    45254517            "methods": [
    4526                 "GET",
    4527                 "POST"
     4518                "GET"
    45284519            ],
    45294520            "endpoints": [
    45304521                {
    45314522                    "methods": [
    4532                         "GET",
    4533                         "POST"
     4523                        "GET"
    45344524                    ],
    45354525                    "args": {
     
    45664556            "namespace": "wp/v2",
    45674557            "methods": [
    4568                 "GET",
    4569                 "POST"
     4558                "GET"
    45704559            ],
    45714560            "endpoints": [
    45724561                {
    45734562                    "methods": [
    4574                         "GET",
    4575                         "POST"
     4563                        "GET"
    45764564                    ],
    45774565                    "args": {
     
    46084596            "namespace": "wp/v2",
    46094597            "methods": [
    4610                 "GET",
    4611                 "POST"
     4598                "GET"
    46124599            ],
    46134600            "endpoints": [
    46144601                {
    46154602                    "methods": [
    4616                         "GET",
    4617                         "POST"
     4603                        "GET"
    46184604                    ],
    46194605                    "args": {
     
    46504636            "namespace": "wp/v2",
    46514637            "methods": [
    4652                 "GET",
    4653                 "POST"
     4638                "GET"
    46544639            ],
    46554640            "endpoints": [
    46564641                {
    46574642                    "methods": [
    4658                         "GET",
    4659                         "POST"
     4643                        "GET"
    46604644                    ],
    46614645                    "args": {
     
    46924676            "namespace": "wp/v2",
    46934677            "methods": [
    4694                 "GET",
    4695                 "POST"
     4678                "GET"
    46964679            ],
    46974680            "endpoints": [
    46984681                {
    46994682                    "methods": [
    4700                         "GET",
    4701                         "POST"
     4683                        "GET"
    47024684                    ],
    47034685                    "args": {
     
    47344716            "namespace": "wp/v2",
    47354717            "methods": [
    4736                 "GET",
    4737                 "POST"
     4718                "GET"
    47384719            ],
    47394720            "endpoints": [
    47404721                {
    47414722                    "methods": [
    4742                         "GET",
    4743                         "POST"
     4723                        "GET"
    47444724                    ],
    47454725                    "args": {
     
    47764756            "namespace": "wp/v2",
    47774757            "methods": [
    4778                 "GET",
    4779                 "POST"
     4758                "GET"
    47804759            ],
    47814760            "endpoints": [
    47824761                {
    47834762                    "methods": [
    4784                         "GET",
    4785                         "POST"
     4763                        "GET"
    47864764                    ],
    47874765                    "args": {
     
    48184796            "namespace": "wp/v2",
    48194797            "methods": [
    4820                 "GET",
    4821                 "POST"
     4798                "GET"
    48224799            ],
    48234800            "endpoints": [
    48244801                {
    48254802                    "methods": [
    4826                         "GET",
    4827                         "POST"
     4803                        "GET"
    48284804                    ],
    48294805                    "args": {
     
    50645040                    "args": {
    50655041                        "url": {
    5066                             "required": true,
    5067                             "description": "The URL of the resource for which to fetch oEmbed data.",
    5068                             "type": "string"
     5042                            "required": true
    50695043                        },
    50705044                        "format": {
Note: See TracChangeset for help on using the changeset viewer.