Make WordPress Core

Changeset 58762 for branches/6.6


Ignore:
Timestamp:
07/18/2024 05:56:35 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].

Reviewed by SergeyBiryukov, jorbin.
Merges [58755,58756] to the 6.6 branch.

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

Location:
branches/6.6
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/6.6

  • branches/6.6/src/wp-includes/comment-template.php

    r58335 r58762  
    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 ) ) {
  • branches/6.6/tests/phpunit/tests/comment/getCommentAuthor.php

    r58335 r58762  
    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.