array(), 'counts' => array(), 'total' => 0, 'sessions' => 0, 'eligible' => 0, 'page' => max( 1, absint( $page ) ) ); if ( ! $roles ) { return $result; } $per_page = min( 100, max( 1, absint( $per_page ) ) ); $start = ( $result['page'] - 1 ) * $per_page; $offset = 0; do { $ids = get_users( array( 'role__in' => array_values( $roles ), 'fields' => 'ID', 'number' => 100, 'offset' => $offset, 'orderby' => array( 'display_name' => 'ASC', 'ID' => 'ASC' ), 'search' => $search ? '*' . $search . '*' : '', 'search_columns' => array( 'display_name', 'user_login', 'user_email' ), ) ); $result['eligible'] += count( $ids ); $counts = $this->counts_for_users( $ids ); foreach ( $ids as $id ) { if ( empty( $counts[ $id ] ) ) { continue; } if ( $result['total'] >= $start && count( $result['counts'] ) < $per_page ) { $result['counts'][ $id ] = $counts[ $id ]; } ++$result['total']; $result['sessions'] += $counts[ $id ]; } $offset += 100; } while ( 100 === count( $ids ) ); $last_page = max( 1, (int) ceil( $result['total'] / $per_page ) ); if ( $result['page'] > $last_page ) { return $this->page( $roles, $search, $last_page, $per_page ); } if ( $result['counts'] ) { $result['users'] = get_users( array( 'include' => array_keys( $result['counts'] ), 'number' => $per_page, 'orderby' => array( 'display_name' => 'ASC', 'ID' => 'ASC' ) ) ); } return $result; } /** * Return valid-session counts keyed by user ID. * * WP_Session_Tokens::get_all() delegates validity to the configured core * session manager. AdminWatch Central intentionally reads only the count; token * verifiers and session metadata are never retained or exposed. * * @param array $user_ids User IDs in AdminWatch Central's access scope. * @return array */ public function counts_for_users( $user_ids ) { $counts = array(); foreach ( array_unique( array_map( 'absint', (array) $user_ids ) ) as $user_id ) { if ( ! $user_id ) { continue; } $sessions = WP_Session_Tokens::get_instance( $user_id )->get_all(); $count = is_array( $sessions ) ? count( $sessions ) : 0; if ( $count ) { $counts[ $user_id ] = $count; } } return $counts; } }