WordPress.org

Make WordPress Core

Changeset 31793


Ignore:
Timestamp:
03/16/2015 02:23:33 PM (5 years ago)
Author:
boonebgorges
Message:

Improve method consistency in WP_Comment_Query.

  • Introduce a __construct() method, which can accept an array of query vars.
  • Move query logic out of query() method and into a new get_comments() method.
  • Ensure that $this->comments is set whenever get_comments() returns a value.
  • Introduce a parse_query() method, where query vars are parsed with default values and the 'parse_comment_query' action is fired.

These changes bring WP_Comment_Query syntax closer to that of WP_Query.

Props westonruter, morganestes, boonebgorges.
Fixes #24826.

Location:
trunk
Files:
2 edited

Legend:

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

    r31615 r31793  
    221221 * @global wpdb $wpdb WordPress database abstraction object.
    222222 *
    223  * @param string|array $args Optional. Array or string of arguments. See {@see WP_Comment_Query::query()}
     223 * @param string|array $args Optional. Array or string of arguments. See {@see WP_Comment_Query::parse_query()}
    224224 *                           for information on accepted arguments. Default empty.
    225225 * @return int|array List of comments or number of found comments if `$count` argument is true.
     
    266266
    267267    /**
     268     * Query vars set by the user.
     269     *
     270     * @since 3.1.0
     271     * @access public
    268272     * @var array
    269273     */
     
    271275
    272276    /**
     277     * Default values for query vars.
     278     *
     279     * @since 4.2.0
     280     * @access public
     281     * @var array
     282     */
     283    public $query_var_defaults;
     284
     285    /**
     286     * List of comments located by the query.
     287     *
     288     * @since 4.0.0
     289     * @access public
    273290     * @var array
    274291     */
     
    293310
    294311    /**
    295      * Execute the query
    296      *
    297      * @since 3.1.0
    298      * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', 'post_author__in',
    299      *              'post_author__not_in', 'author__in', 'author__not_in', 'post__in',
    300      *              'post__not_in', 'include_unapproved', 'type__in', and 'type__not_in'
    301      *              arguments to $query_vars.
    302      *
    303      * @param string|array $query_vars {
     312     * Constructor.
     313     *
     314     * Sets up the comment query, based on the query vars passed.
     315     *
     316     * @since  4.2.0
     317     * @access public
     318     *
     319     * @param string $query URL query string.
     320     * @return WP_Comment_Query
     321     */
     322    public function __construct( $query = '' ) {
     323        $this->query_var_defaults = array(
     324            'author_email' => '',
     325            'author__in' => '',
     326            'author__not_in' => '',
     327            'include_unapproved' => '',
     328            'fields' => '',
     329            'ID' => '',
     330            'comment__in' => '',
     331            'comment__not_in' => '',
     332            'karma' => '',
     333            'number' => '',
     334            'offset' => '',
     335            'orderby' => '',
     336            'order' => 'DESC',
     337            'parent' => '',
     338            'post_author__in' => '',
     339            'post_author__not_in' => '',
     340            'post_ID' => '',
     341            'post_id' => 0,
     342            'post__in' => '',
     343            'post__not_in' => '',
     344            'post_author' => '',
     345            'post_name' => '',
     346            'post_parent' => '',
     347            'post_status' => '',
     348            'post_type' => '',
     349            'status' => 'all',
     350            'type' => '',
     351            'type__in' => '',
     352            'type__not_in' => '',
     353            'user_id' => '',
     354            'search' => '',
     355            'count' => false,
     356            'meta_key' => '',
     357            'meta_value' => '',
     358            'meta_query' => '',
     359            'date_query' => null, // See WP_Date_Query
     360        );
     361
     362        if ( ! empty( $query ) ) {
     363            $this->query( $query );
     364        }
     365    }
     366
     367    /**
     368     * Parse arguments passed to the comment query with default query parameters.
     369     *
     370     * @since  4.2.0 Extracted from {@link WP_Comment_Query::query()}.
     371     * @access public
     372     *
     373     * @param string|array $query {
    304374     *     Optional. Array or query string of comment query parameters.
    305375     *
     
    364434     *     @type int          $user_id             Include comments for a specific user ID. Default empty.
    365435     * }
    366      * @return int|array Array of comments or number of found comments if `$count` is set to true.
    367      */
    368     public function query( $query_vars ) {
     436     */
     437    public function parse_query( $query = '' ) {
     438        if ( empty( $query ) ) {
     439            $query = $this->query_vars;
     440        }
     441
     442        $this->query_vars = wp_parse_args( $query, $this->query_var_defaults );
     443        do_action_ref_array( 'parse_comment_query', array( &$this ) );
     444    }
     445
     446    /**
     447     * Sets up the WordPress query for retrieving comments.
     448     *
     449     * @since 3.1.0
     450     * @since 4.1.0 Introduced 'comment__in', 'comment__not_in', 'post_author__in',
     451     *              'post_author__not_in', 'author__in', 'author__not_in', 'post__in',
     452     *              'post__not_in', 'include_unapproved', 'type__in', and 'type__not_in'
     453     *              arguments to $query_vars.
     454     * @since 4.2.0 Moved parsing to {@link WP_Comment_Query::parse_query()}.
     455     * @access public
     456     *
     457     * @param string|array $query Array or URL query string of parameters.
     458     * @return array List of comments.
     459     */
     460    public function query( $query ) {
     461        $this->query_vars = wp_parse_args( $query );
     462        return $this->get_comments();
     463    }
     464
     465    /**
     466     * Get a list of comments matching the query vars.
     467     *
     468     * @since 4.2.0
     469     * @access public
     470     *
     471     * @return array The list of comments.
     472     */
     473    public function get_comments() {
    369474        global $wpdb;
    370475
    371         $defaults = array(
    372             'author_email' => '',
    373             'author__in' => '',
    374             'author__not_in' => '',
    375             'include_unapproved' => '',
    376             'fields' => '',
    377             'ID' => '',
    378             'comment__in' => '',
    379             'comment__not_in' => '',
    380             'karma' => '',
    381             'number' => '',
    382             'offset' => '',
    383             'orderby' => '',
    384             'order' => 'DESC',
    385             'parent' => '',
    386             'post_author__in' => '',
    387             'post_author__not_in' => '',
    388             'post_ID' => '',
    389             'post_id' => 0,
    390             'post__in' => '',
    391             'post__not_in' => '',
    392             'post_author' => '',
    393             'post_name' => '',
    394             'post_parent' => '',
    395             'post_status' => '',
    396             'post_type' => '',
    397             'status' => 'all',
    398             'type' => '',
    399             'type__in' => '',
    400             'type__not_in' => '',
    401             'user_id' => '',
    402             'search' => '',
    403             'count' => false,
    404             'meta_key' => '',
    405             'meta_value' => '',
    406             'meta_query' => '',
    407             'date_query' => null, // See WP_Date_Query
    408         );
    409 
    410476        $groupby = '';
    411477
    412         $this->query_vars = wp_parse_args( $query_vars, $defaults );
     478        $this->parse_query();
    413479
    414480        // Parse meta query
     
    429495        do_action_ref_array( 'pre_get_comments', array( &$this ) );
    430496
    431         // $args can be whatever, only use the args defined in defaults to compute the key
    432         $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $defaults ) ) ) );
     497        // $args can include anything. Only use the args defined in the query_var_defaults to compute the key.
     498        $key = md5( serialize( wp_array_slice_assoc( $this->query_vars, array_keys( $this->query_var_defaults ) ) ) );
    433499        $last_changed = wp_cache_get( 'last_changed', 'comment' );
    434500        if ( ! $last_changed ) {
     
    439505
    440506        if ( $cache = wp_cache_get( $cache_key, 'comment' ) ) {
    441             return $cache;
     507            $this->comments = $cache;
     508            return $this->comments;
    442509        }
    443510
     
    827894        wp_cache_add( $cache_key, $comments, 'comment' );
    828895
    829         return $comments;
     896        $this->comments = $comments;
     897        return $this->comments;
    830898    }
    831899
  • trunk/tests/phpunit/tests/comment/query.php

    r31666 r31793  
    15881588        $this->assertEqualSets( array_merge( $c1, $c3 ), $found );
    15891589    }
     1590
     1591    /**
     1592     * @ticket 24826
     1593     */
     1594    public function test_comment_query_object() {
     1595        $comment_id = $this->factory->comment->create();
     1596
     1597        $query1 = new WP_Comment_Query();
     1598        $this->assertNull( $query1->query_vars );
     1599        $this->assertEmpty( $query1->comments );
     1600        $comments = $query1->query( array( 'status' => 'all' ) );
     1601        $this->assertInternalType( 'array', $query1->query_vars );
     1602        $this->assertNotEmpty( $query1->comments );
     1603        $this->assertInternalType( 'array', $query1->comments );
     1604
     1605        $query2 = new WP_Comment_Query( array( 'status' => 'all' ) );
     1606        $this->assertNotEmpty( $query2->query_vars );
     1607        $this->assertNotEmpty( $query2->comments );
     1608        $this->assertEquals( $query2->comments, $query1->get_comments() );
     1609    }
     1610
     1611    /**
     1612     * @ticket 22400
     1613     */
     1614    public function test_comment_cache_key_should_ignore_custom_params() {
     1615        global $wpdb;
     1616
     1617        $p = $this->factory->post->create();
     1618        $c = $this->factory->comment->create( array( 'comment_post_ID' => $p ) );
     1619
     1620        $q1 = new WP_Comment_Query();
     1621        $q1->query( array(
     1622            'post_id' => $p,
     1623        ) );
     1624
     1625        $num_queries = $wpdb->num_queries;
     1626
     1627        $q2 = new WP_Comment_Query();
     1628        $q2->query( array(
     1629            'post_id' => $p,
     1630            'foo' => 'bar',
     1631        ) );
     1632
     1633        $this->assertSame( $num_queries, $wpdb->num_queries );
     1634    }
    15901635}
Note: See TracChangeset for help on using the changeset viewer.