I want to exclude Subscribers from a user list. My code is:

$users = $wpdb->get_results( "SELECT display_name FROM $wpdb->users ORDER BY display_name ASC" );

How can I change that so subscribers are excluded from the list?

I also looked at the get_users function in codex but it did not have an exclude by role parameter. 

Edit: Or another way would be to get the results filtered by capability (one that subscribers doesn't have).

3 Answers 3

$args = array(
    'role__not_in' => 'subscriber'

// The Query
$user_query = new WP_User_Query( $args );

// User Loop
if ( ! empty( $user_query->results ) ) {
    foreach ( $user_query->results as $user ) {
        echo '<p>' . $user->display_name . '</p>';
} else {
    echo 'No users found.';

How about WP_User_Query with the role__not_in argument.

  • Note: the role__not_in argument was added in WP 4.7. See Trac issue #38135. Commented Mar 10, 2017 at 13:57

This new method should work. It looks at all the capability values to find "subscriber", and hides it.

Try this query

    "SELECT display_name 
    FROM $wpdb->users WHERE 1=1 AND {$wpdb->users}.ID IN (
        SELECT {$wpdb->usermeta}.user_id FROM $wpdb->usermeta 
        WHERE {$wpdb->usermeta}.meta_key = '{$wpdb->prefix}capabilities'
        AND {$wpdb->usermeta}.meta_value NOT LIKE '%subscriber%') ORDER BY display_name ASC" 
  • 1
    Thank you but I'm looking for a safe solution. This is for a plugin development.
    – Mark
    Commented Nov 14, 2013 at 16:08
  • Try that query instead. It should be safe to use unless Wordpress removes capabilities (which probably won't happen lol)
    – Howdy_McGee
    Commented Nov 14, 2013 at 17:26
  • interesting! I do not want it in a function. If you look at my own code, I need the results in one line for the $users variable. Can you plz update your question with this?
    – Mark
    Commented Nov 14, 2013 at 17:36
  • My mistake, when I read "User List" i thought user list from admin panel. I updated my answer, hopefully this works.
    – Howdy_McGee
    Commented Nov 14, 2013 at 17:41
  • 1
    I'm sorry but I really can't say. I'm glad it worked and maybe if left open somebody else will come with a better query than mine.
    – Howdy_McGee
    Commented Nov 14, 2013 at 18:07

You can use the get_users() function twice to exclude the subscribers.

You can do something like this

// Gets all the subscribers
$user_query = get_users( array( 'role' => 'subscriber' ) );
// This gets the array of ids of the subscribers
$subscribers_id = wp_list_pluck( $user_query, 'ID' );
// Now use the exclude parameter to exclude the subscribers
$non_subscribers = get_users( array( 'exclude' => $subscribers_id ) );

$non_subscribers contains the non subscribers.

You can fetch the display_name by doing something like this

foreach( $non_subscribers as $non_subscriber ) {
    echo $non_subscriber->display_name;
  • isnt running get_users twice bad for performance? Which way is better for performance, yours or the query posted in the other answer?
    – Mark
    Commented Nov 14, 2013 at 23:19
  • get_users internally runs the query, so i guess if you can get something out with running the query once is better than getting it from two queries. But i am not sure if the other query is better than using get_users twice. Lets see if someone enlightens us regarding this :) Commented Nov 15, 2013 at 6:04

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.