Get_users ile birden fazla rol alın


10

Ben böyle bir kod var:

$ query_args = dizi ();
$ query_args ['fields'] = dizi ('ID', 'görünen_adı');
$ query_args ['role'] = 'abone';
$ users = get_users ($ query_args);
foreach ($ kullanıcı $ kullanıcı olarak) $ users_array [$ user-> ID] = $ user-> display_name;

Ben daha fazla rol almak istiyor ve ayrıca içerir contributor, authorve bazı özel roller ben Role Scoper ile oluşturulan eklentisi örneğin Manager, vb Birlikte bunu nasıl herhangi bir fikir get_users?

Teşekkürler

Yanıtlar:


20

WordPress 4.4'e hızlı - bu role__inözelliği destekleyecektir !

Görünüşe göre WordPress 4.4 bizim şanslı sürüm numaramızdır , çünkü sınıfın hem role__inve role__not_inniteliklerini destekleyecektir WP_User_Query.

Aboneyi , katkıda bulunanı ve yazar rollerini dahil etmek için şunları kullanabiliriz:

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

Bilet kontrol edin # 22212 tüm hikaye için!


1
Resmen yeni ve geliştirilmiş bir versiyon olan-) adlı birgireV4.4 olarak adlandırıldınız
Pieter Goosen

1
hehe cool, bu aynı zamanda premium bir votka markası ( wiki ) gibi geliyor ;-) @PieterGoosen
birgire

18

Bunu , bağımsız değişkeni get_userskullanarak tek bir çağrı veya tek bir çağrı ile de yapabilirsiniz :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_queryNasıl çekilir WP_User_Querykulpları roleeğer ediyoruz ilgilenen, parametre.


@ Andy-Adams Paylaştığınız için teşekkürler. Bu sadece benim için tüm rolleri gösteriyor gibi görünüyor . Bu hala senin için çalışıyor mu?
helgatheviking

@helgatheviking Özellikle hangi rolleri karşılaştırıyorsunuz? Rol adlarının ne olduğuna bağlı olabilir.
Andy Adams

@AndyAdams Basit Kullanıcı Listeleme eklentimde bunu yapmaya çalışıyorum, bu yüzden rollerin herhangi bir kombinasyonu için çalışmasını sağlamaya çalışıyorum. Yerel sitemde yönetici ve editör denedim, ancak sonuçlarda döngü yaparak diğer tüm roller hala dahil.
helgatheviking

Hangi SQL sorgusunun üretildiğini görmek için Debug Queries eklentisini kullanmanızı tavsiye edebilirim. Çoğu zaman bu neden beklenmedik sonuçlar elde ettiğimi anlamama yardımcı oluyor. wordpress.org/plugins/debug-queries
Andy Adams

12

Ben bu işlevi kullanarak çözmek başardı:

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

Sonra benim tema bunu yapabilirim:

$users_array = get_clients();

1
Bu, karşılaştığım en iyi seçenektir. Teşekkürler.
Jake

@blogjunkie Meraklı, ama bu ne kadar iyi?
helgatheviking

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

Çünkü get_users()bir parametre olarak verilen sorgu dizesiyle eşleşen bir kullanıcı dizisi döndürür. get_users()İstediğiniz her rol için ayrı ayrı sorguyu çalıştırın ve sonuçları birleştirin. Daha sonra $users, aksi takdirde yapacağınız şekilde döngü yapabilirsiniz .


1
Bunun neden sorunu çözdüğünü açıklayan daha fazla bilgi verebilir misiniz?
GhostToast

Neden çalıştığını daha iyi açıklamak için orijinal cevabı düzenledim.
ksloan

Ben bunu olarak kullandım $users = array_merge( get_users( array('role' => 'RoleOne' ,'fields' => 'ID') ), get_users( array('role' => 'RoleTwo' ,'fields' => 'ID') ));ve bir tedavi çalıştı. Teşekkürler!
Guit4eva

3

Kullanmayla ilgili sorun, array_mergesayfalandırmayı kullanamamanızdır. @Andy Adams'ın çözümünü gerçekten seviyorum, ancak birçok rol üzerinde arama yapıyorsanız, meta sorgusunu kullanmak çok yavaş bir sorguya neden olacaktır (dahili INNER JOINolarak her meta sorgusu için yeni bir şey yapar ).

Benim çözüm normal ifade meta sorgusu kullanmaktır:

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

?>

Bu, şuna benzer bir sorgu oluşturur:

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

1

Daha fazla kullanıcı sorgusu sonucu birleştirebilirsiniz. Let Diyelim ki her iki dahil etmek istediğinizi varsayalım Authorve Editorrolleri. Her vaka için sorguyu tanımlayın, ardından tek bir dizide birleştirmek için array_merge komutunu kullanın.

$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 işlevindeki tüm parametreler isteğe bağlıdır. Hiçbir şey belirtmezseniz, özel rolleri olanlar da dahil olmak üzere geçerli blogun her bir kullanıcısına karşılık gelen nesneler içeren bir dizi alırsınız.


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";
}
?>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.