Отримайте кілька ролей за допомогою get_users


10

У мене такий код:

$ query_args = array ();
$ query_args ['field'] = масив ('ID', 'display_name');
$ query_args ['role'] = 'Підписник';
$ users = get_users ($ query_args);
foreach ($ користувачів як $ user) $ users_array [$ user-> ID] = $ user-> display_name;

Я хочу , щоб отримати більше ролей , а також включати в себе contributor, authorі деякі призначені для користувача ролі , які я створив з роллю Scoper плагін , наприклад Manager, і т.д. Будь-які ідеї , як я можу зробити це з get_users?

Спасибі

Відповіді:


20

Перехід до 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
hehe cool, це також звучить як преміальний горілочний бренд ( wiki ) ;-) @ 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 List, тому я намагаюся змусити його працювати для будь-якої комбінації ролей. На своєму локальному сайті я спробував адміністратора та редактора, але переглядаючи результати, усі інші ролі все ще включаються.
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') );

Оскільки get_users()повертає масив користувачів, який відповідає рядку запиту, заданому як парам. Просто запустіть 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.