get_users로 여러 역할 가져 오기


10

다음과 같은 코드가 있습니다.

$ query_args = 배열 ​​();
$ query_args [ 'fields'] = 배열 ​​( 'ID', 'display_name');
$ query_args [ 'role'] = '구독자';
$ users = get_users ($ query_args);
foreach ($ users로서 $ users) $ users_array [$ user-> ID] = $ user-> display_name;

나는 더 많은 역할을하고 싶지도 포함 contributor, author일부 사용자 지정 역할 나는 역할 Scoper로 만든 플러그인 예를 들어 Manager, 등 내가 함께 할 수있는 방법 어떤 아이디어 get_users?

감사

답변:


20

WordPress 4.4로 빨리 가기- role__in속성 을 지원 합니다!

클래스의 속성 과 속성을 모두 지원하기 때문에 WordPress 4.4는 운이 좋은 버전 번호 인 것 같습니다 .role__inrole__not_inWP_User_Query

따라서 subscriber , 기고자작성자 역할 을 포함시키기 위해 간단히 다음을 사용할 수 있습니다.

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

전체 이야기 는 티켓 # 22212 를 확인하십시오 !


1
당신은 공식적으로 birgireV4.4, 새롭고 개선 된 버전이라고 불렀습니다 ;-)
Pieter Goosen

1
그는 멋진 보드카 브랜드 ( wiki ) 와 비슷합니다. ;-) @PieterGoosen
birgire

18

인수 를 사용 get_users하여 단일 호출 또는 단일 호출을 통해이를 수행 할 수도 있습니다 .WP_User_Querymeta_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 나는 이것을 간단한 사용자 목록 플러그인으로 만들려고 노력하고 있으므로 모든 역할 조합에서 작동하도록 노력하고 있습니다. 내 로컬 사이트에서 관리자와 편집자를 시도했지만 결과를 반복하면서 다른 모든 역할이 계속 포함됩니다.
helgatheviking

디버그 쿼리 플러그인을 사용하여 생성되는 SQL 쿼리를 확인하는 것이 좋습니다. 이로 인해 예기치 않은 결과가 발생하는 이유를 파악할 수 있습니다. wordpress.org/plugins/debug-queries
Andy Adams

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
이것이 내가 만난 최고의 옵션입니다. 감사.
Jake

@blogjunkie 호기심이긴하지만이 정도는 어떻습니까?
helgatheviking

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

이후 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

더 많은 사용자 쿼리 결과를 병합 할 수 있습니다. 역할 AuthorEditor역할을 모두 포함한다고 가정 해 보겠습니다 . 각 사례에 대한 쿼리를 정의한 다음 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";
}
?>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.