Make WordPress Core

Changeset 46086


Ignore:
Timestamp:
09/10/2019 06:41:03 PM (5 years ago)
Author:
adamsilverstein
Message:

Comments: add a new comments_pre_query filter to short circuit WP_Comment_Query 'get_comments' queries.

Return a non-null value to bypass WordPress's default comment queries.

Props felipeelia, spacedmonkey.
Fixes #45800.

Location:
trunk
Files:
2 edited

Legend:

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

    r45603 r46086  
    380380        }
    381381
     382        $comment_data = null;
     383
     384        /**
     385         * Filter the comments data before the query takes place.
     386         *
     387         * Return a non-null value to bypass WordPress's default comment queries.
     388         *
     389         * The expected return type from this filter depends on the value passed in the request query_vars:
     390         * When $this->query_vars['count'] is set, the filter should return the comment count as an int.
     391         * When `'ids' == $this->query_vars['fields']`, the filter should return an array of comment ids.
     392         * Otherwise the filter should return an array of WP_Comment objects.
     393         *
     394         * @since 5.3.0
     395         *
     396         * @param array|int|null   $comment_data Return an array of comment data to short-circuit WP's comment query,
     397         *                                       or null to allow WP to run its normal queries.
     398         * @param WP_Comment_Query $this         The WP_Comment_Query instance, passed by reference.
     399         */
     400        $comment_data = apply_filters_ref_array( 'comments_pre_query', array( $comment_data, &$this ) );
     401
     402        if ( null !== $comment_data ) {
     403            return $comment_data;
     404        }
     405
    382406        /*
    383407         * Only use the args defined in the query_var_defaults to compute the key,
  • trunk/tests/phpunit/tests/comment/query.php

    r45424 r46086  
    48834883        $this->assertEqualSets( $c1, $found );
    48844884    }
     4885
     4886    /**
     4887     * @ticket 45800
     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( array() );
     4898
     4899        remove_filter( 'comments_pre_query', array( __CLASS__, 'filter_comments_pre_query' ), 10, 2 );
     4900
     4901        // Make sure no queries were executed.
     4902        $this->assertSame( $num_queries, $wpdb->num_queries );
     4903
     4904        // We manually inserted a non-existing site and overrode the results with it.
     4905        $this->assertSame( array( 555 ), $results );
     4906
     4907        // Make sure manually setting total_users doesn't get overwritten.
     4908        $this->assertEquals( 1, $q->found_comments );
     4909    }
     4910
     4911    public static function filter_comments_pre_query( $comments, $query ) {
     4912        $query->found_comments = 1;
     4913
     4914        return array( 555 );
     4915    }
    48854916}
Note: See TracChangeset for help on using the changeset viewer.