Make WordPress Core

Changeset 53291


Ignore:
Timestamp:
04/27/2022 04:08:16 AM (2 years ago)
Author:
peterwilsoncc
Message:

Comments: Avoid DB error in comment meta queries.

In WP_Comment_Query always include the table name when referencing wp_comments.comment_ID. This avoids ambiguity in when making meta queries as wp_commentmeta includes a column of the same name.

Follow up to [47887].

Props genosseeinhorn, azouamauriac, audrasjb, peterwilsoncc.
Fixes #55218.

Location:
trunk
Files:
2 edited

Legend:

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

    r53280 r53291  
    596596                    if ( ! empty( $_GET['unapproved'] ) && ! empty( $_GET['moderation-hash'] ) ) {
    597597                        // Only include requested comment.
    598                         $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] );
     598                        $approved_clauses[] = $wpdb->prepare( "( comment_author_email = %s AND comment_approved = '0' AND {$wpdb->comments}.comment_ID = %d )", $unapproved_identifier, (int) $_GET['unapproved'] );
    599599                    } else {
    600600                        // Include all of the author's unapproved comments.
  • trunk/tests/phpunit/tests/comment/query.php

    r53169 r53291  
    49694969        $this->assertSame( $num_queries_all_args, get_num_queries() );
    49704970    }
     4971
     4972    /**
     4973     * @ticket 55218
     4974     */
     4975    public function test_unapproved_comment_with_meta_query_does_not_trigger_ambiguous_identifier_error() {
     4976        $p       = self::$post_id;
     4977        $c       = self::factory()->comment->create(
     4978            array(
     4979                'comment_post_ID'      => $p,
     4980                'comment_content'      => '1',
     4981                'comment_approved'     => '0',
     4982                'comment_date_gmt'     => gmdate( 'Y-m-d H:i:s', time() ),
     4983                'comment_author_email' => 'foo@bar.mail',
     4984                'comment_meta'         => array( 'foo' => 'bar' ),
     4985            )
     4986        );
     4987        $comment = get_comment( $c );
     4988
     4989        /*
     4990         * This is used to get a bunch of globals set up prior to making the
     4991         * database query. This helps with prepping for the moderation hash.
     4992         */
     4993        $this->go_to(
     4994            add_query_arg(
     4995                array(
     4996                    'unapproved'      => $comment->comment_ID,
     4997                    'moderation-hash' => wp_hash( $comment->comment_date_gmt ),
     4998                ),
     4999                get_comment_link( $comment )
     5000            )
     5001        );
     5002
     5003        /*
     5004         * The result of the query is not needed so it's not assigned to variable.
     5005         *
     5006         * Returning the ID only limits the database query to only the one that was
     5007         * causing the error reported in ticket 55218.
     5008         */
     5009        new WP_Comment_Query(
     5010            array(
     5011                'include_unapproved' => array( 'foo@bar.mail' ),
     5012                'meta_query'         => array( array( 'key' => 'foo' ) ),
     5013                'post_id'            => $p,
     5014                'fields'             => 'ids',
     5015            )
     5016        );
     5017
     5018        global $wpdb;
     5019        $this->assertNotSame( "Column 'comment_ID' in where clause is ambiguous", $wpdb->last_error );
     5020        $this->assertStringNotContainsString( ' comment_ID ', $wpdb->last_query );
     5021    }
    49715022}
Note: See TracChangeset for help on using the changeset viewer.