[wp-trac] [WordPress Trac] #23373: Limiting get_users() results by meta value with LIKE wildcards
WordPress Trac
noreply at wordpress.org
Sun Feb 3 06:56:27 UTC 2013
#23373: Limiting get_users() results by meta value with LIKE wildcards
-------------------------+------------------------------
Reporter: mpwalsh8 | Owner:
Type: enhancement | Status: new
Priority: normal | Milestone: Awaiting Review
Component: Users | Version: 3.5
Severity: normal | Resolution:
Keywords: has-patch |
-------------------------+------------------------------
Changes (by SergeyBiryukov):
* version: trunk => 3.5
Old description:
> I want to limit the results returned by get_users() to a subset of the
> users based on some criteria that will be stored in the User Meta table
> (e.g. all users whose first name begins with M).
>
> Here arr the args I am passing to get_users():
> (
> [include] =>
> [exclude] =>
> [fields] => all_with_meta
> [meta_key] => last_name
> [meta_value] => M%
> [meta_compare] => LIKE
> )
>
> This is the query the WordPress constructs for me:
>
> [01-Feb-2013 16:01:08 UTC] WP_User_Query Object
> (
> [query_vars] => Array
> (
> [blog_id] => 1
> [role] =>
> [meta_key] => last_name
> [meta_value] => M%
> [meta_compare] => LIKE
> [include] =>
> [exclude] =>
> [search] =>
> [search_columns] => Array
> (
> )
>
> [orderby] => login
> [order] => ASC
> [offset] =>
> [number] =>
> [count_total] =>
> [fields] => all_with_meta
> [who] =>
> )
>
> [results] => Array
> (
> )
>
> [total_users] => 0
> [query_fields] => wp_users.ID
> [query_from] => FROM wp_users INNER JOIN wp_usermeta ON (wp_users.ID
> = wp_usermeta.user_id)
> [query_where] => WHERE 1=1 AND ( (wp_usermeta.meta_key = 'last_name'
> AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%M\\%%') )
> [query_orderby] => ORDER BY user_login ASC
> [query_limit] =>
>
> ----
>
> As you can see, the LIKE clause is escaped and wrapped with SQL wildcard
> operators. I can't figure out how to prevent this from happening as what
> I want is "LIKE 'M%'" to be my actually query.
>
> ''
> Andrew Nacin wp at andrewnacin.com via lists.automattic.com
> 11:24 am (1 day ago) to wp-hackers
>
> Currently, "LIKE" prepends and appends wildcards, as in %term%. We could
> add "%LIKE" and "LIKE%", though that would not help with the situation
> where you want LIKE taken literally, potentially without % wildcards at
> all. (Such as using _ as a single-character wildcard, or looking for case
> insensitive matching.) Probably the best way to add to this API would be
> to allow for a 'like_escape' => false; that would accept your value as
> provided. If you'd like to submit a ticket (and patch), this can
> definitely find its way into 3.6.
>
> Nacin''
>
> ----
>
> I have prepared a patch to meta.php which allows escaped LIKE and NOT
> LIKE meta compares to work properly.
New description:
I want to limit the results returned by get_users() to a subset of the
users based on some criteria that will be stored in the User Meta table
(e.g. all users whose first name begins with M).
Here arr the args I am passing to get_users():
{{{
(
[include] =>
[exclude] =>
[fields] => all_with_meta
[meta_key] => last_name
[meta_value] => M%
[meta_compare] => LIKE
)
}}}
This is the query the WordPress constructs for me:
{{{
[01-Feb-2013 16:01:08 UTC] WP_User_Query Object
(
[query_vars] => Array
(
[blog_id] => 1
[role] =>
[meta_key] => last_name
[meta_value] => M%
[meta_compare] => LIKE
[include] =>
[exclude] =>
[search] =>
[search_columns] => Array
(
)
[orderby] => login
[order] => ASC
[offset] =>
[number] =>
[count_total] =>
[fields] => all_with_meta
[who] =>
)
[results] => Array
(
)
[total_users] => 0
[query_fields] => wp_users.ID
[query_from] => FROM wp_users INNER JOIN wp_usermeta ON (wp_users.ID =
wp_usermeta.user_id)
[query_where] => WHERE 1=1 AND ( (wp_usermeta.meta_key = 'last_name'
AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%M\\%%') )
[query_orderby] => ORDER BY user_login ASC
[query_limit] =>
}}}
----
As you can see, the LIKE clause is escaped and wrapped with SQL wildcard
operators. I can't figure out how to prevent this from happening as what
I want is "LIKE 'M%'" to be my actually query.
Andrew Nacin wp at andrewnacin.com via lists.automattic.com
11:24 am (1 day ago) to wp-hackers
Currently, "LIKE" prepends and appends wildcards, as in %term%. We could
add "%LIKE" and "LIKE%", though that would not help with the situation
where you want LIKE taken literally, potentially without % wildcards at
all. (Such as using _ as a single-character wildcard, or looking for case
insensitive matching.) Probably the best way to add to this API would be
to allow for a 'like_escape' => false; that would accept your value as
provided. If you'd like to submit a ticket (and patch), this can
definitely find its way into 3.6.
Nacin
----
I have prepared a patch to meta.php which allows escaped LIKE and NOT LIKE
meta compares to work properly.
--
--
Ticket URL: <http://core.trac.wordpress.org/ticket/23373#comment:1>
WordPress Trac <http://core.trac.wordpress.org/>
WordPress blogging software
More information about the wp-trac
mailing list