From 6debe759a678076d68944f546c854ab5a3cfcf23 Mon Sep 17 00:00:00 2001 From: Konstantin Kovshenin Date: Wed, 29 Oct 2014 21:40:04 +0000 Subject: [PATCH] Use a nested meta query when querying by role in `WP_User_Query`. If a user query includes a meta query together with a role argument, nest the original meta query and append the role meta query with an AND relationship. fixes #23849, #27026. git-svn-id: https://develop.svn.wordpress.org/trunk@30094 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/user.php | 18 +++++++++++++----- tests/phpunit/tests/user/query.php | 29 +++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index 15523ec80e..1b2a692bed 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -715,6 +715,9 @@ class WP_User_Query { $qv['blog_id'] = $blog_id = 0; // Prevent extra meta query } + $meta_query = new WP_Meta_Query(); + $meta_query->parse_query_vars( $qv ); + $role = ''; if ( isset( $qv['role'] ) ) $role = trim( $qv['role'] ); @@ -728,13 +731,18 @@ class WP_User_Query { $cap_meta_query['compare'] = 'like'; } - if ( empty( $qv['meta_query'] ) || ! in_array( $cap_meta_query, $qv['meta_query'], true ) ) { - $qv['meta_query'][] = $cap_meta_query; + if ( empty( $meta_query->queries ) ) { + $meta_query->queries = array( $cap_meta_query ); + } elseif ( ! in_array( $cap_meta_query, $meta_query->queries, true ) ) { + // Append the cap query to the original queries and reparse the query. + $meta_query->queries = array( + 'relation' => 'AND', + array( $meta_query->queries, $cap_meta_query ), + ); } - } - $meta_query = new WP_Meta_Query(); - $meta_query->parse_query_vars( $qv ); + $meta_query->parse_query_vars( $meta_query->queries ); + } if ( !empty( $meta_query->queries ) ) { $clauses = $meta_query->get_sql( 'user', $wpdb->users, 'ID', $this ); diff --git a/tests/phpunit/tests/user/query.php b/tests/phpunit/tests/user/query.php index de8c439db2..4ed7319e6a 100644 --- a/tests/phpunit/tests/user/query.php +++ b/tests/phpunit/tests/user/query.php @@ -221,4 +221,33 @@ class Tests_User_Query extends WP_UnitTestCase { $query->prepare_query(); $this->assertEquals( $_query_vars, $query->query_vars ); } + + /** + * @ticket 23849 + */ + function test_meta_query_with_role() { + $author_ids = $this->factory->user->create_many( 4, array( 'role' => 'author' ) ); + + add_user_meta( $author_ids[0], 'foo', 'bar' ); + add_user_meta( $author_ids[1], 'foo', 'baz' ); + + // Users with foo = bar or baz restricted to the author role. + $query = new WP_User_Query( array( + 'fields' => '', + 'role' => 'author', + 'meta_query' => array( + 'relation' => 'OR', + array( + 'key' => 'foo', + 'value' => 'bar', + ), + array( + 'key' => 'foo', + 'value' => 'baz', + ), + ), + ) ); + + $this->assertEquals( array( $author_ids[0], $author_ids[1] ), $query->get_results() ); + } }