0

Something I've needed and think a fair few people might need as well is: getting users from all or a specific blog based on the user_role's of the accounts they wish to see, while also differentiating between the request coming from a super-admin or blog-administrator.

How do you go about this?

1 Answer 1

0

I've been struggling to get this working properly for a few days but finally got it so I thought to share it so others might profit from it as well.

Create a file in you theme named user-list.php with a Template Name.

<?php
/**
 * Template Name: List Users
 */

Now create a page via the Admin Dashboard called user-list and select the page-template List Users.

Now that's sorted, let's make it interesting.

First, let's determine if our current_user is allowed to retrieve this information. For this we need a few global variables WordPress has available to us. At the same time, we'll also setup the first few statements and call a function that isn't part of WordPress.

(user-list.php)
/* Get user info. */
global $current_user, $wpdb;
get_currentuserinfo();

/* Load the user file. */
require_once( ABSPATH . WPINC . '/user.php' );
$error = array();

/* Check if user is super-admin or a customer */
/* Values stored in variables for later use to limit DB requests */
$super_admin = is_super_admin();
$editor = check_user_role( 'editor' );
if( $super_admin || $editor ){

As you can see above, we're setting up global variables for current_user(info) and wpdb(info). We'll be needing those for this. Also, we're calling a function called check_user_role(). I can't take credit for the function, I found it. But add the function below to your functions.php file to be able to use it, it is very handy to have.

(functions.php)
/**
 * Checks if a particular user has a role.
 * Returns true if a match was found.
 *
 * @param string $role - Role name.
 * @param int $user_id - (Optional) The ID of a user. Defaults to the current user.
 * @return bool        - returns true/false
 */
function check_user_role( $role, $user_id = null ){
    if( is_numeric( $user_id ))
        $user = get_userdata( $user_id );
    else
        $user = wp_get_current_user();
    if( empty( $user ))
        return false;
    return in_array( $role, (array)$user->roles );
}

Now that we can check if a user, whom might be created with a custom user_role (info here and here).

If the user requesting this page gets through the first if statement, he's either a super-admin or an editor. For the purpose of this example we're working under the assumption an editor should be allowed to do this.

Let's continue with our user-list.php file. We'll be re-using the $super_admin and $editor variables here, which is why we created them as variables and not as part of the if-statement. This saves a few queries to the database. Next we need to setup the variables to use in the query so we get the users returned. Obviously an editor user_role shouldn't get to see all of the same users and/or have the same options later on with the data. So let's split that up before it we query for the data. Also, a super-admin has access to the data of the entire Multi-site, where as an editor shouldn't.

I've added comments into the code as it's really 1 part.

    (user-list.php continued)
    /* Setup variables to use in query to get users */
    $blog_id = '';
    $roles = array();

    /* Depending on logged in user, setup query vars differently */
    if( $super_admin ){
        $blog_id = '*';
        $roles = array();
    }
    elseif( $editor ){
        $blog_id = get_current_blog_id(); // In case of user on sub-domain

        // Select which user_roles the logged in user is allowed to see 
        $user_roles = array( 'subscriber', 'author', 'contributor' );
        // If more than 1 add to array 1 at a time
        if( $user_roles > 1 ){
            $roles[ 'relation' ] = 'OR' ;
            foreach( $user_roles as $role ){
                $roles[] = array(
                'key'       => 'wp_capabilities',
                'value'     => serialize(array($role=>true)), /* This value gets stored as: serialize(array(1){[$key]=>bool(true)) when it's created */
                'compare'   => '='
                );
            }
        } else {
            /* NOTE!: set $user_roles NOT as an array if only 1 role!!! Just: $user_roles = 'contributor'; */
            $roles[] = array(
                'key'       => 'wp_capabilities',
                'value'     => serialize(array($user_roles=>true)), /* This value gets stored as: serialize(array(1){[$key]=>bool(true)) when it's created */
                'compare'   => '='
            );
        }
    }
    /* Use the setup variables to query users to display */
    $args = array(
        'blog_id'           => $blog_id,
        'meta_query'        => $roles,
        'fields'            => 'all_with_meta'
    );

    $all_users = new WP_User_Query( $args );
    echo '<pre>';
    print_r( $all_users );
    echo '</pre>';
}

Source for 'value'.

Now all of the relevant users are stored in $all_users and you can do with them as you please. Hopefully someone will find this useful.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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