function get_group_members($group_id, $cols = COLS_ALL_RS, $maybe_metagroup = false, $args = array())
 {
     global $wpdb;
     // If $group_id is an array of group objects, extract IDs into a separate array
     if (is_array($group_id)) {
         $first = current($group_id);
         if (is_object($first)) {
             $actual_ids = array();
             foreach ($group_id as $group) {
                 $actual_ids[] = $group->ID;
             }
             $group_id = $actual_ids;
         }
     }
     if (empty($args['status'])) {
         $status = 'active';
     } elseif ('any' == $args['status']) {
         $args['no_cache'] = true;
         $status = '';
     } else {
         $args['no_cache'] = true;
         $status = $args['status'];
     }
     if (!is_array($group_id) && empty($args['no_cache'])) {
         $cache_flag = 'group_members';
         $cache_id = $group_id;
         $cache = wpp_cache_get($cache_id, $cache_flag);
         $ckey = md5(serialize($cols) . $maybe_metagroup);
         if (isset($cache[$ckey])) {
             return $cache[$ckey];
         }
     }
     $group_in = "'" . implode("', '", (array) $group_id) . "'";
     $status_clause = $status ? "AND status = '{$status}'" : '';
     if (COL_ID_RS == $cols) {
         $query = "SELECT gu.{$wpdb->user2group_uid_col} \r\n\t              FROM {$wpdb->user2group_rs} gu\r\n\t              WHERE gu.{$wpdb->user2group_gid_col} IN ({$group_in}) {$status_clause}";
         if (!($results = scoper_get_col($query))) {
             $results = array();
         }
     } else {
         switch ($cols) {
             case COLS_ID_DISPLAYNAME_RS:
                 $qcols = "u.ID, u.display_name";
                 break;
             case COLS_ID_NAME_RS:
                 $qcols = "u.ID, u.user_login AS display_name";
                 // calling code assumes display_name property for user or group object
                 break;
             default:
                 $qcols = "u.*";
         }
         $query = "SELECT {$qcols} FROM {$wpdb->users} AS u" . " INNER JOIN {$wpdb->user2group_rs} AS gu ON gu.{$wpdb->user2group_uid_col} = u.ID {$status_clause} " . " AND gu.{$wpdb->user2group_gid_col} IN ({$group_in}) ORDER BY u.display_name";
         $results = scoper_get_results($query);
     }
     if ($maybe_metagroup && (is_array($group_id) || !$results)) {
         $meta_ids = scoper_get_col("SELECT group_meta_id FROM {$wpdb->groups_rs} WHERE {$wpdb->groups_id_col} IN ({$group_in})");
         foreach ($meta_ids as $meta_id) {
             if (0 === strpos($meta_id, 'wp_role_')) {
                 $role_name = substr($meta_id, 8);
                 if ($_results = ScoperAdminLib::get_blogrole_users($role_name, 'wp', $cols)) {
                     $results = array_merge($results, $_results);
                 }
             }
         }
     }
     if (!is_array($group_id) && empty($args['no_cache'])) {
         $cache[$ckey] = $results;
         wpp_cache_set($cache_id, $cache, $cache_flag);
     }
     return $results;
 }