Make WordPress Core


Ignore:
Timestamp:
07/18/2024 03:08:01 PM (3 months 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.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • 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.