Make WordPress Core

Changeset 58755


Ignore:
Timestamp:
07/18/2024 03:08:01 PM (2 years ago)
Author:
hellofromTonya
Message:

Comments: Fix fatal error when get_comment_author() receives an object with no comment_id.

[58335] introduced (string) type casting of the passed in $comment_id value. If $comment_id is a scalar, it works as expected. But if it's an object, the following fatal error is thrown:

Object of class WP_Comment could not be converted to string

This fatal error happens when the incoming $comment_id is an instance of WP_Comment (or any object) without a comment_ID (empty).

This changeset adds tests to demonstrate the fatal error and validate the fix.

It fixes the fatal error by restructuring the ternary checks into an if/elseif/else structure for the 3 paths:

  • When $comment->comment_ID is not empty, then it uses the property.
  • When $comment_id is scalar, then it type casts it to a string.
  • Else, the default is an empty string.

Follow-up to [58335], [41127], [52818].

Props ambrosiawt, hellofromTonya, jorbin, mukesh27, SergeyBiryukov.
Fixes #61681.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/comment-template.php

    r58335 r58755  
    2525        $comment = get_comment( $comment_id );
    2626
    27         $comment_id = ! empty( $comment->comment_ID ) ? $comment->comment_ID : (string) $comment_id;
     27        if ( ! empty( $comment->comment_ID ) ) {
     28                $comment_id = $comment->comment_ID;
     29        } elseif ( is_scalar( $comment_id ) ) {
     30                $comment_id = (string) $comment_id;
     31        } else {
     32                $comment_id = '';
     33        }
    2834
    2935        if ( empty( $comment->comment_author ) ) {
  • trunk/tests/phpunit/tests/comment/getCommentAuthor.php

    r58335 r58755  
    5757                get_comment_author( self::$non_existent_comment_id ); // Non-existent comment ID.
    5858        }
     59
     60        /**
     61         * @ticket 61681
     62         *
     63         * @dataProvider data_should_return_author_when_given_object_without_comment_id
     64         *
     65         * @param stdClass $comment_props Comment properties test data.
     66         * @param string   $expected      The expected result.
     67         * @param array    $user_data     Optional. User data for creating an author. Default empty array.
     68         */
     69        public function test_should_return_author_when_given_object_without_comment_id( $comment_props, $expected, $user_data = array() ) {
     70                if ( ! empty( $comment_props->user_id ) ) {
     71                        $user                   = self::factory()->user->create_and_get( $user_data );
     72                        $comment_props->user_id = $user->ID;
     73                }
     74                $comment = new WP_Comment( $comment_props );
     75                $this->assertSame( $expected, get_comment_author( $comment ) );
     76        }
     77
     78        /**
     79         * Data provider.
     80         *
     81         * @return array
     82         */
     83        public function data_should_return_author_when_given_object_without_comment_id() {
     84                return array(
     85                        'with no author'             => array(
     86                                'comment_props' => new stdClass(),
     87                                'expected'      => 'Anonymous',
     88                        ),
     89                        'with author name'           => array(
     90                                'comment_props' => (object) array(
     91                                        'comment_author' => 'tester1',
     92                                ),
     93                                'expected'      => 'tester1',
     94                        ),
     95                        'with author name, empty ID' => array(
     96                                'comment_props' => (object) array(
     97                                        'comment_author' => 'tester2',
     98                                        'comment_ID'     => '',
     99                                ),
     100                                'expected'      => 'tester2',
     101                        ),
     102                        'with author ID'             => array(
     103                                'comment_props' => (object) array(
     104                                        'user_id' => 1, // populates in the test with an actual user ID.
     105                                ),
     106                                'expected'      => 'Tester3',
     107                                'user_data'     => array(
     108                                        'display_name' => 'Tester3',
     109                                ),
     110                        ),
     111                );
     112        }
    59113}
Note: See TracChangeset for help on using the changeset viewer.