Obtenha várias funções com get_users

11

Eu tenho um código como este:

$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;

Eu quero obter mais funções e também incluir contributor , author e algumas funções personalizadas que criei com o plug-in Role Scoper, por exemplo. Manager , etc. Alguma idéia de como posso fazer isso com get_users ?

Obrigado

    
por blogjunkie 18.01.2012 / 13:09

8 respostas

18

Você também pode fazer isso por meio de uma única chamada para get_users ou usando um único WP_User_Query fazendo uso do argumento 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'
        )
    )
) );

O meta_query é extraído de como WP_User_Query manipula o parâmetro role , se você estiver interessado.

    
por Andy Adams 24.02.2013 / 04:21
16

Fastforward para o WordPress 4.4 - ele suportará o atributo role__in !

Parece que o WordPress 4.4 é nosso número da versão da sorte , porque ele suportará os atributos role__in e role__not_in da classe WP_User_Query .

Para incluir as funções assinante , colaborador e autor , podemos simplesmente usar:

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

Confira o tíquete # 22212 para toda a história!

    
por birgire 23.11.2015 / 16:50
13

Consegui resolver isso usando essa função:

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;
}

Então, no meu tema, posso fazer isso:

$users_array = get_clients();
    
por blogjunkie 21.01.2012 / 17:40
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Como get_users() retorna uma matriz de usuários que correspondem à string de consulta fornecida como um parâmetro. Basta executar a consulta get_users() para cada função que você deseja separadamente e mesclar os resultados. Você pode então fazer um loop através de $users da mesma forma que você teria de outra forma.

    
por ksloan 29.08.2013 / 19:42
3

O problema com o uso de array_merge é que você não pode usar paginação. Eu realmente gosto da solução do @Andy Adams, mas se você estiver pesquisando em muitos papéis, usar a meta-consulta dele resultará em uma consulta muito lenta (internamente ele faz um novo INNER JOIN para cada meta consulta) .

Minha solução é usar uma meta consulta de expressão regular:

<?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)
));

?>

Isso gera uma consulta parecida com:

array(
    'meta_query' => array(
        array(
            'key' => 'wp_capabilities'
            'value' => '"(editor|administrator)"'
            'compare' => 'REGEXP'
        )
    )
);
    
por inxilpro 06.03.2014 / 22:25
1

Você pode simplesmente mesclar mais resultados de consulta do usuário. Digamos que você queira incluir as funções Author e Editor . Defina a consulta para cada caso e, em seguida, use array_merge para consolidar em uma única matriz.

$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";
    
por pax 31.01.2014 / 19:04
0

Todos os parâmetros da função get_users são opcionais. Se você não especificar nada, obterá uma matriz que contém objetos correspondentes a cada usuário do blog atual, incluindo aqueles com funções personalizadas.

    
por Tomas Buteler 18.01.2012 / 23:32
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";
}
?>
    
por Charan Dass 06.02.2017 / 06:20

Tags