Obter várias funções com get_users

10

Eu tenho um código como este:

$ query_args = array ();
$ query_args ['fields'] = array ('ID', 'display_name');
$ query_args ['role'] = 'assinante';
$ users = get_users ($ query_args);
foreach ($ usuários como $ usuário) $ users_array [$ user-> ID] = $ user-> display_name;

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

obrigado

blogjunkie
fonte

Respostas:

20

Rápido para o WordPress 4.4 - ele suporta o role__inatributo!

Parece que o WordPress 4.4 é o número da nossa versão da sorte , porque ele suporta os atributos role__ine role__not_inda WP_User_Queryclasse.

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

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

Confira o ticket # 22212 para toda a história!

Birgire
fonte
1
Você foi oficialmente apelidado birgireV4.4, a nova e melhorada versão ;-)
Pieter Goosen
1
hehe legal, que soa também como uma marca premium vodka ( wiki ) ;-) @PieterGoosen
birgire
18

Você também pode fazer isso por meio de uma única chamada get_usersou usando uma única WP_User_Query, usando o meta_queryargumento:

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é retirado de como WP_User_Querylida com o roleparâmetro, se você estiver interessado.

Andy Adams
fonte
@ Andy-Adams Obrigado por compartilhar. Isso apenas parece mostrar todos os papéis para mim. Isso ainda está funcionando para você?
helgatheviking
@helgatheviking Que papéis você está comparando, especificamente? Pode depender de quais são os nomes das funções.
Andy Adams
@AndyAdams Estou tentando trabalhar isso no meu plug-in de Lista de Usuários Simples, então estou tentando fazê-lo funcionar para qualquer combinação de funções. No meu site local, tentei administrador e editor, mas, repetindo os resultados, todas as outras funções ainda estão incluídas.
helgatheviking
Eu recomendo usar o plug-in Debug Queries para ver qual consulta SQL está sendo gerada. Muitas vezes isso me ajuda a descobrir por que estou obtendo resultados inesperados. wordpress.org/plugins/debug-queries
Andy Adams:
12

Eu consegui resolver isso usando esta 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, eu posso fazer isso:

$users_array = get_clients();
blogjunkie
fonte
1
Esta é a melhor opção que me deparei. Obrigado.
Jake12
@blogjunkie Curioso, mas até que ponto isso funciona?
helgatheviking
4
$users = array_merge( get_users('role=subscriber'), get_users('role=contributor') );

Desde get_users()retorna uma matriz de usuários que correspondem à string de consulta fornecida como um parâmetro. Basta executar a get_users()consulta para todas as funções que você deseja separadamente e mesclar os resultados. Você pode fazer o loop $usersda mesma maneira que faria de outra maneira.

ksloan
fonte
1
Você pode fornecer mais informações explicando por que isso resolve o problema?
GhostToast
Editei a resposta original para explicar melhor por que ela funciona.
precisa saber é
Eu usei isso como $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));, e deu certo. Obrigado!
Guit4eva
3

O problema com o uso array_mergeé que você não pode usar a paginação. Eu realmente gosto da solução de @Andy Adams, mas se você estiver pesquisando várias funções, o uso da meta consulta resultará em uma consulta muito lenta (internamente, ele faz um novo INNER JOINpara 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 que se parece com:

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

Você pode simplesmente mesclar mais resultados de consulta do usuário. Digamos que você queira incluir ambos Authore Editorpapéis. Defina a consulta para cada caso e 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";
pax
fonte
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 todos os usuários do blog atual, incluindo aqueles com funções personalizadas.

Tomas Buteler
fonte
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";
}
?>
Charan Dass
fonte