WordPress.org

Make WordPress Core

Ticket #47168: 47168.patch

File 47168.patch, 4.3 KB (added by imath, 2 months ago)
  • src/wp-includes/class-wp-comment-query.php

    diff --git src/wp-includes/class-wp-comment-query.php src/wp-includes/class-wp-comment-query.php
    index dbf005c8fa..b819b73e2c 100644
    class WP_Comment_Query { 
    379379                        $this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this );
    380380                }
    381381
    382                 /*
    383                  * Only use the args defined in the query_var_defaults to compute the key,
    384                  * but ignore 'fields', which does not affect query results.
    385                  */
    386                 $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
    387                 unset( $_args['fields'] );
     382                $comment_ids = null;
    388383
    389                 $key          = md5( serialize( $_args ) );
    390                 $last_changed = wp_cache_get_last_changed( 'comment' );
     384                /**
     385                 * Filter the comments array before the query takes place.
     386                 *
     387                 * Return a non-null value to bypass WordPress's default comment queries.
     388                 *
     389                 *
     390                 * @since 5.3.0
     391                 *
     392                 * @param array|null       $comment_ids Return an array of comment data to short-circuit WP's comment query,
     393                 *                                      or null to allow WP to run its normal queries.
     394                 * @param WP_Comment_Query $this The WP_Comment_Query instance, passed by reference.
     395                 */
     396                $comment_ids = apply_filters_ref_array( 'comments_pre_query', array( $comment_ids, &$this ) );
     397
     398                if ( null === $comment_ids ) {
     399                        /*
     400                        * Only use the args defined in the query_var_defaults to compute the key,
     401                        * but ignore 'fields', which does not affect query results.
     402                        */
     403                        $_args = wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) );
     404                        unset( $_args['fields'] );
     405
     406                        $key          = md5( serialize( $_args ) );
     407                        $last_changed = wp_cache_get_last_changed( 'comment' );
     408
     409                        $cache_key   = "get_comments:$key:$last_changed";
     410                        $cache_value = wp_cache_get( $cache_key, 'comment' );
     411                        if ( false === $cache_value ) {
     412                                $comment_ids = $this->get_comment_ids();
     413                                if ( $comment_ids ) {
     414                                        $this->set_found_comments();
     415                                }
    391416
    392                 $cache_key   = "get_comments:$key:$last_changed";
    393                 $cache_value = wp_cache_get( $cache_key, 'comment' );
    394                 if ( false === $cache_value ) {
    395                         $comment_ids = $this->get_comment_ids();
    396                         if ( $comment_ids ) {
    397                                 $this->set_found_comments();
     417                                $cache_value = array(
     418                                        'comment_ids'    => $comment_ids,
     419                                        'found_comments' => $this->found_comments,
     420                                );
     421                                wp_cache_add( $cache_key, $cache_value, 'comment' );
     422                        } else {
     423                                $comment_ids          = $cache_value['comment_ids'];
     424                                $this->found_comments = $cache_value['found_comments'];
    398425                        }
    399 
    400                         $cache_value = array(
    401                                 'comment_ids'    => $comment_ids,
    402                                 'found_comments' => $this->found_comments,
    403                         );
    404                         wp_cache_add( $cache_key, $cache_value, 'comment' );
    405                 } else {
    406                         $comment_ids          = $cache_value['comment_ids'];
    407                         $this->found_comments = $cache_value['found_comments'];
    408426                }
    409427
    410428                if ( $this->found_comments && $this->query_vars['number'] ) {
  • tests/phpunit/tests/comment/query.php

    diff --git tests/phpunit/tests/comment/query.php tests/phpunit/tests/comment/query.php
    index 211415214b..9e29bab838 100644
    class Tests_Comment_Query extends WP_UnitTestCase { 
    48824882
    48834883                $this->assertEqualSets( $c1, $found );
    48844884        }
     4885
     4886        /**
     4887         * @ticket 47168
     4888         */
     4889        public function test_comments_pre_query_filter_should_bypass_database_query() {
     4890                global $wpdb;
     4891
     4892                add_filter( 'comments_pre_query', array( __CLASS__, 'filter_comments_pre_query' ), 10, 2 );
     4893
     4894                $num_queries = $wpdb->num_queries;
     4895
     4896                $q       = new WP_Comment_Query();
     4897                $results = $q->query(
     4898                        array(
     4899                                'fields' => 'ids',
     4900                        )
     4901                );
     4902
     4903                remove_filter( 'comments_pre_query', array( __CLASS__, 'filter_comments_pre_query' ), 10, 2 );
     4904
     4905                // Make sure no queries were executed.
     4906                $this->assertSame( $num_queries, $wpdb->num_queries );
     4907
     4908                // We manually inserted a non-existing comment and overrode the results with it.
     4909                $this->assertSame( array( 9555 ), $q->comments );
     4910
     4911                // Make sure manually setting total_comments doesn't get overwritten.
     4912                $this->assertEquals( 1, $q->found_comments );
     4913        }
     4914
     4915        public static function filter_comments_pre_query( $comment_ids, $query ) {
     4916                $query->found_comments = 1;
     4917
     4918                return array( 9555 );
     4919        }
    48854920}