I’m trying to get all users assigned to a custom usermeta. I know that get_users()
is supposed to work; however, it doesn’t seem to be working. What I have is a usermeta storing a category ID and I’m trying to use 'meta_value' => $cat_id
to query the database. So this is the code I have:
$args = array(
'meta_key' => 'custom-usermeta',
'meta_value' => $cat_id
);
$users = get_users( $args );
and here is how I’m saving it:
update_user_meta( $user_id,'custom-usermeta',$cat_id);
$cat_id
is an array.
But this isn’t working. What I’ve figured out so far is that the meta_value
expects an unserialized value. How can I get that to work? I tried the 'meta_compare' => 'LIKE'
but then that just about grabs everything (because of the way WordPress serializes the values). Is there anything else I can do to fix this?
In your original code, you’re not passing an operator to
meta_compare
. Note thatget_users()
does not define a default operator. Try using'='
:As a diagnostic, you might make sure that the problem isn’t the saving/querying by your custom user metadata. Replace the meta_key and meta_value with one of the default WP user meta keys, just to see if anything is returned. (Easiest might be the user role?)
And this one is a long-shot, but: even though the
get_users()
Codex documentation says otherwise, from what I can gather from source, themeta_query
forWP_user_query
should be the same as themeta_query
forWP_query
– in which case, have you tried putting your meta query in an array? e.g.:Cf.
WP_Query
usage ofmeta_query
.You could try to user a “direct”
WP_User_Query
.Not tested, but it should work.
Update
As far as I can see, the
$meta_value
insideupdate_metadata()
(the function that gets wrapped byupdate_user_meta()
), takes a single value. The only way it can get serialized ismaybe_serialize();
, which only serializes on demand. So the problem must be on your side and the$cat_ID
meta value.You can recheck close before the
maybe_serialize()
with the following filter:{$meta_type}
would beuser
in this case. Just drop your$cat_ID
inside some test function to see what’s happening.