【发布时间】:2014-08-31 17:36:36
【问题描述】:
我正在为 wordpress 开发一个插件,我想获取具有角色 1 或角色 2 或角色 3 或角色 4 的用户列表。我使用下面的代码来获取具有角色 1 的用户,但我不知道应该如何更改它以获取具有 1 个以上角色的用户。
$jobholders = get_users( 'orderby=nicename&role=jobholder' );
【问题讨论】:
我正在为 wordpress 开发一个插件,我想获取具有角色 1 或角色 2 或角色 3 或角色 4 的用户列表。我使用下面的代码来获取具有角色 1 的用户,但我不知道应该如何更改它以获取具有 1 个以上角色的用户。
$jobholders = get_users( 'orderby=nicename&role=jobholder' );
【问题讨论】:
我认为使用 MySQL wildcard 会起作用,因为 WP_User_Query 类中的查询是用 LIKE 构建的,但它不是:get_users(array('role' => 'job%'))。
解决方案必须使用动作挂钩pre_user_query:
/**
* Filter the mysql query for get_users when searching for the role "job" to search for "%job%"
*/
add_action( 'pre_user_query', 'so_25594548' );
function so_25594548( $user_search )
{
$search_str = '%\"job\"%';
# Quotes around $search_str so we don't need to escape the backslashes
if( false === strpos( $user_search->query_where, "$search_str" ) )
return;
# Simplify the LIKE to do a loose search
$user_search->query_where = str_replace(
"$search_str",
'%job%',
$user_search->query_where
);
}
它认为我们有两个角色,jobseeker 和 jobholder,为了搜索这两个角色,我们将使用这个调用,一个不存在的角色,但一个字符串都包含(没有通配符):@ 987654329@。这使得query_where 变成这样:
WHERE 1=1 AND ( (wp_usermeta.meta_key = 'wp_capabilities' AND CAST(wp_usermeta.meta_value AS CHAR) LIKE '%\"job\"%') )
wp_capabilities 是一个序列化数组,因此它会在通配符之间寻找job 的完美匹配。
【讨论】: