2014-08-31 4 views
2

Я разрабатываю плагин для wordpress, и я хочу получить список пользователей с role1 или role2 или role3 или role4. Я использую код ниже, чтобы получить пользователей с ролью1, но я не знаю, как мне его изменить, чтобы получить более 1 роли.получить пользователей со специальными ролями в wordpress плагин

$jobholders = get_users('orderby=nicename&role=jobholder'); 

ответ

2

Я думал, что с помощью 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, и искать, как мы будем использовать этот вызов, с inexistant роль, но с строкой, в которой содержатся (без подстановочных знаков): get_users(array('role' => 'job');. Это делает 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 между групповыми символами.