diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index 9db85211b5..e602a3ece8 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -626,15 +626,22 @@ class WP_User_Query { $include = false; } - // Meta query. - $this->meta_query = new WP_Meta_Query(); - $this->meta_query->parse_query_vars( $qv ); - $blog_id = 0; if ( isset( $qv['blog_id'] ) ) { $blog_id = absint( $qv['blog_id'] ); } + if ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) { + $qv['meta_key'] = $wpdb->get_blog_prefix( $blog_id ) . 'user_level'; + $qv['meta_value'] = 0; + $qv['meta_compare'] = '!='; + $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query + } + + // Meta query. + $this->meta_query = new WP_Meta_Query(); + $this->meta_query->parse_query_vars( $qv ); + $role = ''; if ( isset( $qv['role'] ) ) { $role = trim( $qv['role'] ); @@ -775,13 +782,6 @@ class WP_User_Query { $this->query_where .= $this->get_search_sql( $search, $search_columns, $wild ); } - if ( isset( $qv['who'] ) && 'authors' == $qv['who'] && $blog_id ) { - $qv['meta_key'] = $wpdb->get_blog_prefix( $blog_id ) . 'user_level'; - $qv['meta_value'] = 0; - $qv['meta_compare'] = '!='; - $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query - } - if ( ! empty( $include ) ) { // Sanitized earlier. $ids = implode( ',', $include ); diff --git a/tests/phpunit/tests/user/query.php b/tests/phpunit/tests/user/query.php index f208f5609a..9abf99da2f 100644 --- a/tests/phpunit/tests/user/query.php +++ b/tests/phpunit/tests/user/query.php @@ -625,4 +625,65 @@ class Tests_User_Query extends WP_UnitTestCase { $this->assertSame( array( 'author' ), $user->roles ); $this->assertSame( array( 'author' => true ), $user->caps ); } + + /** + * @ticket 32019 + */ + public function test_who_authors() { + if ( ! is_multisite() ) { + $this->markTestSkipped( __METHOD__ . ' requires multisite.' ); + } + + $b = $this->factory->blog->create(); + $users = $this->factory->user->create_many( 3 ); + + add_user_to_blog( $b, $users[0], 'subscriber' ); + add_user_to_blog( $b, $users[1], 'author' ); + add_user_to_blog( $b, $users[2], 'editor' ); + + $q = new WP_User_Query( array( + 'who' => 'authors', + 'blog_id' => $b, + ) ); + + $found = wp_list_pluck( $q->get_results(), 'ID' ); + + $this->assertNotContains( $users[0], $found ); + $this->assertContains( $users[1], $found ); + $this->assertContains( $users[2], $found ); + } + + /** + * @ticket 32019 + */ + public function test_who_authors_should_work_alongside_meta_query() { + if ( ! is_multisite() ) { + $this->markTestSkipped( __METHOD__ . ' requires multisite.' ); + } + + $b = $this->factory->blog->create(); + $users = $this->factory->user->create_many( 3 ); + + add_user_to_blog( $b, $users[0], 'subscriber' ); + add_user_to_blog( $b, $users[1], 'author' ); + add_user_to_blog( $b, $users[2], 'editor' ); + + add_user_meta( $users[1], 'foo', 'bar' ); + add_user_meta( $users[2], 'foo', 'baz' ); + + $q = new WP_User_Query( array( + 'who' => 'authors', + 'blog_id' => $b, + 'meta_query' => array( + 'key' => 'foo', + 'value' => 'bar', + ), + ) ); + + $found = wp_list_pluck( $q->get_results(), 'ID' ); + + $this->assertNotContains( $users[0], $found ); + $this->assertContains( $users[1], $found ); + $this->assertNotContains( $users[2], $found ); + } }