Unlike the get_posts()
and get_pages()
functions within WordPress, get_users()
doesn’t provide a way to return a random selection of users (the results can only be sorted by ‘nicename’, ’email’, ‘url’, ‘registered’, ‘display_name’, or ‘post_count’). For several projects, usually for sidebar widgets, theres been a need to return a randomly sorted sub-set of users, so I wrote the following custom function:
if ( !function_exists( 'get_random_users' ) ) { function get_random_users( $args = array() ) { $random_users = array(); $number = 10; $defaults = array( 'number' => $number, 'exclude_administrators' => FALSE ); $args = wp_parse_args( $args, $defaults ); $number = $args['number']; unset( $args['number'] ); if ( $args['exclude_administrators'] == TRUE ) { $administrators = get_users( array( 'role' => 'administrator' ) ); if ( $administrators && !is_wp_error( $administrators ) ) { $exclude = array(); foreach( $administrators as $user ) { $exclude[] = $user->ID; } $args['exclude'] = $exclude; } } $users = get_users( $args ); if ( $users && !is_wp_error( $users ) ) { $total_users = count( $users ); $number = ( $total_users > $number ) ? $number: $total_users; if ( $total_users == 1 ) { $random_users = $users; } elseif ( $total_users > 1 ) { shuffle( $users ); $random_users = array_slice( $users, 0, $number ); } } return $random_users; } }
Essentially it works and accepts the same parameters as get_users()
, but I have included an option that allows you to exclude Administrators from the returned array. I’m sure the code can be improved – and I probably will do when I get the chance, but for now it does the job.
Alternatively, the following two lines of code, added into the wp-includes/user.php file at line 446, would remove the need for the above function and allow ‘rand’ to be a valid value for the ‘orderby’ parameter.
} elseif ( 'rand' == $qv['orderby'] ) { $orderby = 'RAND()';
But I would never condone editing the core WordPress files.