diff --git src/wp-includes/class-wp-comment-query.php src/wp-includes/class-wp-comment-query.php
index eba9ddf54e..0a594a87ff 100644
|
|
class WP_Comment_Query { |
379 | 379 | $this->meta_query_clauses = $this->meta_query->get_sql( 'comment', $wpdb->comments, 'comment_ID', $this ); |
380 | 380 | } |
381 | 381 | |
| 382 | $comment_ids = 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|null $comment_ids 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_ids = apply_filters_ref_array( 'comments_pre_query', array( $comment_ids, &$this ) ); |
| 401 | |
| 402 | if ( null !== $comment_ids ) { |
| 403 | $this->comments = $comment_ids; |
| 404 | return $this->comments; |
| 405 | } |
| 406 | |
382 | 407 | /* |
383 | 408 | * Only use the args defined in the query_var_defaults to compute the key, |
384 | 409 | * but ignore 'fields', which does not affect query results. |
diff --git tests/phpunit/tests/comment/query.php tests/phpunit/tests/comment/query.php
index 9966f2d1bd..6f89668951 100644
|
|
class Tests_Comment_Query extends WP_UnitTestCase { |
4882 | 4882 | |
4883 | 4883 | $this->assertEqualSets( $c1, $found ); |
4884 | 4884 | } |
| 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( |
| 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 site and overrode the results with it. |
| 4909 | $this->assertSame( array( 555 ), $q->comments ); |
| 4910 | |
| 4911 | // Make sure manually setting total_users doesn't get overwritten. |
| 4912 | $this->assertEquals( 1, $q->found_comments ); |
| 4913 | } |
| 4914 | |
| 4915 | public static function filter_comments_pre_query( $comments, $query ) { |
| 4916 | $query->found_comments = 1; |
| 4917 | |
| 4918 | return array( 555 ); |
| 4919 | } |
4885 | 4920 | } |