diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php index ef9e0668a1..1c89b8630f 100644 --- a/src/wp-includes/class-wp-query.php +++ b/src/wp-includes/class-wp-query.php @@ -2754,8 +2754,6 @@ class WP_Query { } } - $clauses = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); - /* * Apply post-paging filters on where and join. Only plugins that * manipulate paging queries should use these hooks. @@ -2835,6 +2833,8 @@ class WP_Query { */ $fields = apply_filters_ref_array( 'posts_fields', array( $fields, &$this ) ); + $clauses = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); + /** * Filters all query clauses at once, for convenience. * @@ -2967,6 +2967,8 @@ class WP_Query { */ $limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) ); + $clauses = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' ); + /** * Filters all query clauses at once, for convenience. * @@ -2990,7 +2992,7 @@ class WP_Query { * } * @param WP_Query $query The WP_Query instance (passed by reference). */ - $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( $clauses, &$this ) ); + $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $clauses ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; diff --git a/tests/phpunit/tests/query.php b/tests/phpunit/tests/query.php index c0ce7357a4..9a8a9b3ffd 100644 --- a/tests/phpunit/tests/query.php +++ b/tests/phpunit/tests/query.php @@ -719,4 +719,54 @@ class Tests_Query extends WP_UnitTestCase { $this->assertInstanceOf( 'WP_User', get_queried_object() ); $this->assertSame( get_queried_object_id(), $user_id ); } + + /** + * Tests that the `posts_clauses` filter receives an array of clauses + * with the other `posts_*` filters applied, e.g. `posts_join_paged`. + * + * @ticket 55699 + * @covers WP_Query::get_posts + */ + public function test_posts_clauses_filter_should_receive_filtered_clauses() { + add_filter( + 'posts_join_paged', + static function() { + return '/* posts_join_paged */'; + } + ); + + $filter = new MockAction(); + add_filter( 'posts_clauses', array( $filter, 'filter' ), 10, 2 ); + $this->go_to( '/' ); + $filter_args = $filter->get_args(); + $posts_clauses = $filter_args[0][0]; + + $this->assertArrayHasKey( 'join', $posts_clauses ); + $this->assertSame( '/* posts_join_paged */', $posts_clauses['join'] ); + } + + /** + * Tests that the `posts_clauses_request` filter receives an array of clauses + * with the other `posts_*_request` filters applied, e.g. `posts_join_request`. + * + * @ticket 55699 + * @covers WP_Query::get_posts + */ + public function test_posts_clauses_request_filter_should_receive_filtered_clauses() { + add_filter( + 'posts_join_request', + static function() { + return '/* posts_join_request */'; + } + ); + + $filter = new MockAction(); + add_filter( 'posts_clauses_request', array( $filter, 'filter' ), 10, 2 ); + $this->go_to( '/' ); + $filter_args = $filter->get_args(); + $posts_clauses_request = $filter_args[0][0]; + + $this->assertArrayHasKey( 'join', $posts_clauses_request ); + $this->assertSame( '/* posts_join_request */', $posts_clauses_request['join'] ); + } }