Opened 7 months ago
Last modified 2 months ago
#22212 reopened enhancement
WP_User_Query( array('role' => $role) ) should accept array or not return anything if array
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Priority: | normal | Milestone: | Awaiting Review |
| Component: | Users | Version: | |
| Severity: | normal | Keywords: | has-patch needs-unit-tests needs-testing |
| Cc: | knut@…, justin@…, r_a_m_i@…, wpcore@… |
Description
I got a small problem with WP_User_Query - i wanted to find users from more then one roles to send them e-mail, so i did
$role = array('role-1','role-2);
$wp_user_search = WP_User_Query( array('role' => $role) );
$users = $wp_user_search->get_results()
foreach ($user) ... send wp_mail
problem is, that role param accepts only string. It would not be a problem if it would return nothing, problem was, that it actually returns ALL users, so i have send my author-only emails to all thousands users in database :-(
I know that it is my fault, that i have to read documentation, but i thought, that it works as other wp queries, so if the parame do not fit, it throws error, but it does not.
Attachments (3)
Change History (19)
- Cc knut@… added
- Keywords needs-patch added
- Type changed from defect (bug) to enhancement
comment:3
greenshady — 7 months ago
- Cc justin@… added
+1 to allowing an array of roles. I have to run multiple user queries and merge the arrays on a regular basis.
comment:5
SergeyBiryukov — 4 months ago
#23258 was marked as a duplicate.
comment:6
SergeyBiryukov — 4 months ago
Related: #23045
comment:7
helgatheviking — 4 months ago
+1 From me. Needs to accept an array of roles.
Of course, I'd also like to see a default template for a list of all users. The archive for an individual author exists, but I think there should also be an archive of all the authors, but I guess that should be a new ticket.
comment:8
barrykooij — 2 months ago
- Cc wpcore@… added
- Keywords has-patch added; needs-patch removed
- Resolution set to fixed
- Status changed from new to closed
Please see attached patch for fix. I've set the default value of 'role' to array with backwards support for give a String as argument.
comment:9
barrykooij — 2 months ago
- Keywords needs-testing added
comment:10
follow-up:
↓ 11
ocean90 — 2 months ago
- Resolution fixed deleted
- Status changed from closed to reopened
Tickets are marked as fixed when a changeset is commited to trunk which fixes the issue.
comment:11
in reply to:
↑ 10
barrykooij — 2 months ago
Replying to ocean90:
Tickets are marked as fixed when a changeset is commited to trunk which fixes the issue.
I'm sorry!
comment:12
markoheijnen — 2 months ago
- Keywords dev-feedback added; needs-testing removed
barrykooij — 2 months ago
comment:13
scribu — 2 months ago
- Keywords dev-feedback removed
$qv['meta_query']['relation'] = 'OR';
So, this won't work as expected:
$users = get_users( array(
'role' => array( 'foo', 'bar' ),
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'some_other_key',
'compare' => 'EXISTS'
),
array(
'key' => 'another_key',
'compare' => 'EXISTS'
)
)
) );
OTOH, 'relation' => 'OR' already doesn't work as expected when you pass any value to 'role'.
Maybe use a separate WP_Meta_Query instance for querying the roles and definitely add tests for both of these corner cases.
barrykooij — 2 months ago
comment:14
barrykooij — 2 months ago
- Keywords needs-unit-tests needs-testing added
Thanks for your feedback. I've tried to setup a separate instance of WP_Meta_Query but this resulted in a database error because the same meta table was joined without an alias multiple times (WP_Meta_Query.get_sql). As far as I could see it's not possible to use WP_Meta_Query to do multiple meta queries from separate WP_Meta_Query objects on the same meta table.
I did not want to change or extends the WP_Meta_Query class so I've extended the WP_User_Query.prepare_query function to let it create the SQL statements required to do a proper user fetch.
Attached patch (user.php.2.patch) solves more then reported bug/enhancement, it also solves:
- using the 'meta_query' in combination with the 'OR' relation returns all users (with all roles)
- using the 'meta_query' in combination with the 'OR' relation in multisite returns all users (of all blogs)
I will add Unit Tests tomorrow.
comment:15
alex-ye — 2 months ago
I think it should be work like this
WP_User_Query( array('role__in' => array( 'role-1', 'role-2' ) ) )
And when array is used in 'role' arg , it should return null .
comment:16
markoheijnen — 2 months ago
Alex, I disagree with that kind of markup since you have two ways to select role. So what happens when you pass the rolein and role arguments? That can trow confusion.

+1. I use array_merge on two or more queries. It would be nice to pass an array, as long as the result is one effective query.