Получить несколько ролей с get_users


10

У меня есть такой код:

$ query_args = array ();
$ query_args ['fields'] = array ('ID', 'display_name');
$ query_args ['role'] = 'subscriber';
$ users = get_users ($ query_args);
foreach ($ users as $ user) $ users_array [$ user-> ID] = $ user-> display_name;

Я хочу , чтобы получить больше ролей , а также включать в себя contributor, authorи некоторые пользовательские роли , которые я создал с ролью Scoper плагин , например Manager, и т.д. Любые идеи , как я могу сделать это с get_users?

Спасибо

Ответы:


20

Fastforward к WordPress 4.4 - он будет поддерживать role__inатрибут!

Похоже , WordPress 4.4 это наш счастливый номер версии , потому что он будет поддерживать как role__inи role__not_inатрибуты WP_User_Queryкласса.

Таким образом, чтобы включить роли подписчика , участника и автора , мы можем просто использовать:

$users = get_users( [ 'role__in' => [ 'subscriber', 'subscriber', 'author' ] ] );

Проверьте билет # 22212 для всей истории!


1
Вы были официально названы birgireV4.4, новая и улучшенная версия ;-)
Pieter Goosen

1
хе-хе, круто, это звучит также как водка премиум-класса ( вики ) ;-) @PieterGoosen
birgire

18

Вы также можете сделать это с помощью одного вызова get_usersили с помощью одного WP_User_Queryпути использования meta_queryаргумента:

global $wpdb;
$blog_id = get_current_blog_id();

$user_query = new WP_User_Query( array(
    'meta_query' => array(
        'relation' => 'OR',
        array(
            'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
            'value' => 'role_one',
            'compare' => 'like'
        ),
        array(
            'key' => $wpdb->get_blog_prefix( $blog_id ) . 'capabilities',
            'value' => 'role_two',
            'compare' => 'like'
        )
    )
) );

Это meta_queryизвлекается из того, как WP_User_Queryобрабатывает roleпараметр, если вам интересно.


@ Andy-Adams Спасибо, что поделились. Это только кажется, чтобы показать все роли для меня. Это все еще работает для вас?
helgatheviking

@helgatheviking Какие роли вы сравниваете, в частности? Это может зависеть от того, какие имена ролей.
Энди Адамс

@AndyAdams Я пытаюсь внедрить это в свой плагин Simple User Listing, поэтому я пытаюсь заставить его работать для любой комбинации ролей. На моем локальном сайте я пробовал администратора и редактора, но, просматривая результаты, все остальные роли все еще включены.
helgatheviking

Я мог бы рекомендовать использовать плагин Debug Queries, чтобы увидеть, какой SQL-запрос генерируется. Часто это помогает мне понять, почему я получаю неожиданные результаты. wordpress.org/plugins/debug-queries
Энди Адамс

12

Мне удалось решить эту проблему с помощью этой функции:

function get_clients() { 

    $users = array();
    $roles = array('subscriber', 'custom_role1', 'custom_role2');

    foreach ($roles as $role) :
        $users_query = new WP_User_Query( array( 
            'fields' => 'all_with_meta', 
            'role' => $role, 
            'orderby' => 'display_name'
            ) );
        $results = $users_query->get_results();
        if ($results) $users = array_merge($users, $results);
    endforeach;

    return $users;
}

Тогда в моей теме я могу сделать это:

$users_array = get_clients();

1
Это лучший вариант, который мне попадался. Спасибо.
Джейк

@blogjunkie Любопытно, но насколько хорошо это сортировать?
helgatheviking

4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Since get_users()возвращает массив пользователей, которые соответствуют строке запроса, заданной как param. Просто запустите get_users()запрос для каждой роли, которую вы хотите отдельно, и объедините результаты. Затем вы можете выполнить цикл так $usersже, как в противном случае.


1
Можете ли вы предоставить больше информации, объясняющей, почему это решает проблему?
GhostToast

Я отредактировал оригинальный ответ, чтобы лучше объяснить, почему он работает.
ksloan

Я использовал это как $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, и это сработало. Спасибо!
Guit4eva

3

Проблема с использованием array_mergeзаключается в том, что вы не можете использовать нумерацию страниц. Мне очень нравится решение @Andy Adams, но если вы выполняете поиск по многим ролям, использование его мета-запроса приведет к очень медленному запросу (внутренне он выполняет новый INNER JOINдля каждого мета-запроса).

Мое решение состоит в том, чтобы использовать мета-запрос регулярного выражения:

<?php

global $wpdb;
$blog_id = get_current_blog_id();

$roles = array('editor', 'administrator');
$meta_query = array(
    'key' => $wpdb->get_blog_prefix($blog_id) . 'capabilities',
    'value' => '"(' . implode('|', array_map('preg_quote', $roles)) . ')"',
    'compare' => 'REGEXP'
);
$user_query = new WP_User_Query(array(
    'meta_query' = array($meta_query)
));

?>

Это создает запрос, который выглядит примерно так:

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);

1

Вы можете просто объединить больше результатов пользовательских запросов. Допустим, вы хотите включить как Authorи Editorроли. Определите запрос для каждого случая, затем используйте array_merge для объединения в один массив.

$xuser_query = new WP_user_query(array( 'role' => 'Author'));    
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));
$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles->results ) ) {
 foreach ( $mergedRoles->results as $user ) { 
        echo $user->display_name;
      }
 else echo "nada, no users found";

0

Все параметры из функции get_users являются необязательными. Если вы ничего не укажете, вы получите массив, содержащий объекты, соответствующие каждому пользователю текущего блога, в том числе с пользовательскими ролями.


0
<?php 
$xuser_query = new WP_user_query(array( 'role' => 'Author'));    
$yuser_query = new WP_user_query(array( 'role' => 'Editor'));

$mergedRoles=array_merge($xuser_query->results,$xuser_query->results);

// further on you might want to do some sorting 
// of the resulting array of objects before looping through it:

if (!empty( $mergedRoles) ) {

    foreach ( $mergedRoles as $user ) { 
        echo $user->display_name;
    }

} else {
    echo "nada, no users found";
}
?>
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.