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;

私はより多くの役割を取得したいとも含まれcontributorauthorおよびいくつかのカスタムの役割は、私は役割Scoperで作成したプラグインなどManager、など私がこれを行うことができますどのように任意のアイデアget_users

ありがとう

回答:


19

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
かっこいい、これもプレミアムウォッカブランドのように聞こえますwiki);-) @PieterGoosen
バージレ

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 2013

@helgatheviking具体的にどのような役割を比較していますか?それは、ロール名が何であるかによって異なります。
アンディアダムス

@AndyAdamsこれを私のシンプルユーザーリストプラグインに組み込もうとしているので、任意の役割の組み合わせで機能するようにしています。私のローカルサイトでは、管理者と編集者を試しましたが、結果をループしても他のすべての役割はまだ含まれています。
helgatheviking 2013

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好奇心旺盛ですが、これはどれほどうまくいくのでしょうか
13

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

以降get_users()PARAMとして与えられたクエリ文字列と一致するユーザのアレイ戻ります。get_users()必要なすべてのロールに対して個別にクエリを実行し、結果をマージするだけです。その後$users、他の方法と同じようにループできます。


1
これにより問題が解決される理由を説明する詳細情報を提供できますか?
GhostToast 2013

元の回答を編集して、なぜそれが機能するのかを詳しく説明しました。
ksloan 2013

私はこれをとして使用$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.