Community Documentation

Custom "Who's Online," "Most Users Online" and "IP of Guest" blocks

Last updated March 22, 2009. Created by sungkhum on June 1, 2006.
Edited by bryan kennedy, Sloane DellOrto, add1sun. Log in to edit this page.

This is a customization of the "Who's Online" block (it should help you to change whatever else you would like to change as well). This one just adds the total number of registered users in addition to telling who is online.

Drupal 5

<?php
$number
= db_result(db_query('SELECT COUNT(uid) AS number FROM {users} WHERE status=1'));
if (
user_access('access content')) {
 
// Count users with activity in the past defined period.
 
$time_period = variable_get('user_block_seconds_online', 900);

 
// Perform database queries to gather online user lists.
 
$guests = db_fetch_object(db_query('SELECT COUNT(sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
 
$users = db_query('SELECT uid, name, access FROM {users} WHERE access >= %d AND uid != 0 ORDER BY access DESC', time() - $time_period);
 
$total_users = db_num_rows($users);

 
// Format the output with proper grammar.
 
echo "Out of $number registered users ";
  if (
$total_users == 1 && $guests->count == 1) {
   
$output = t('%members and %visitors online.', array('%members' => format_plural($total_users, 'there is currently 1 user', 'there are currently @count users'), '%visitors' => format_plural($guests->count, '1 guest', '@count guests')));
  }
  else {
   
$output = t('there are currently %members and %visitors online.', array('%members' => format_plural($total_users, '1 user', '@count users'), '%visitors' => format_plural($guests->count, '1 guest', '@count guests')));
  }

 
// Display a list of currently online users.
 
$max_users = variable_get('user_block_max_list_count', 10);
  if (
$total_users && $max_users) {
   
$items = array();

    while (
$max_users-- && $account = db_fetch_object($users)) {
     
$items[] = $account;
    }

   
$output .= theme('user_list', $items, t('Online users'));
  }
}
return
$output;
?>

Drupal 4.7

<?php
$number
= db_result(db_query('SELECT COUNT(uid) AS number FROM {users} WHERE status=1'));
if (
user_access('access content')) {
 
// Count users with activity in the past defined period.
 
$time_period = variable_get('user_block_seconds_online', 900);

 
// Perform database queries to gather online user lists.
 
$guests = db_fetch_object(db_query('SELECT COUNT(sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
 
$users = db_query('SELECT uid, name, access FROM {users} WHERE access >= %d AND uid != 0 ORDER BY access DESC', time() - $time_period);
 
$total_users = db_num_rows($users);

 
// Format the output with proper grammar.
 
echo "Out of $number registered users ";
  if (
$total_users == 1 && $guests->count == 1) {
   
$output = t('%members and %visitors online.', array('%members' => format_plural($total_users, 'there is currently 1 user', 'there are currently %count users'), '%visitors' => format_plural($guests->count, '1 guest', '%count guests')));
  }
  else {
   
$output = t('there are currently %members and %visitors online.', array('%members' => format_plural($total_users, '1 user', '%count users'), '%visitors' => format_plural($guests->count, '1 guest', '%count guests')));
  }

 
// Display a list of currently online users.
 
$max_users = variable_get('user_block_max_list_count', 10);
  if (
$total_users && $max_users) {
   
$items = array();

    while (
$max_users-- && $account = db_fetch_object($users)) {
     
$items[] = $account;
    }

   
$output .= theme('user_list', $items, t('Online users'));
  }
}
return
$output;
?>

>Variation: Most Users Ever Online

Right before

<?php
 
}
  return
$output;
?>

add:
<?php
  $total_users_online
= $total_users + $guests->count;
  if (
variable_get('most_users_online_ever', '') < $total_users_online)  {
   
variable_set('most_users_online_ever', $total_users_online);
   
variable_set('most_users_online_ever_time', time());
  }
 
$output .=  "Most users ever online was " . variable_get('most_users_online_ever', '');
 
$output .=  " on " . format_date(variable_get('most_users_online_ever_time', ''), 'medium', '');
?>

It will print something like:

Most users ever online was 66 on 01/24/2008 - 02:00

Tested in Drupal 5.6.

You can change "<" to "<=" if you'd like to show the most recent date.

Variation - showing IP and domain of guest

This doesn't call on the theming functions, so it includes some html formatting that might need to be change.

<?php
$number
= db_result(db_query('SELECT COUNT(uid) AS number FROM {users} WHERE status=1'));
if (
user_access('access content')) {
 
// Count users with activity in the past defined period.
 
$time_period = variable_get('user_block_seconds_online', 900);

 
// Perform database queries to gather online user lists.
 
$guests = db_fetch_object(db_query('SELECT COUNT(sid) AS count FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period));
 
$guests_hostname = db_query('SELECT hostname FROM {sessions} WHERE timestamp >= %d AND uid = 0', time() - $time_period);
 
$total_guests = db_num_rows($guests_hostname);

 
$users = db_query('SELECT uid, name, access FROM {users} WHERE access >= %d AND uid != 0 ORDER BY access DESC', time() - $time_period);
 
$total_users = db_num_rows($users);

 
// Display a list of currently online users.
 
$max_users = variable_get('user_block_max_list_count', 10);
  if (
$total_users && $max_users) {
   
$items = array();
    while (
$max_users-- && $account = db_fetch_object($users)) {
     
$items[] = $account;
    }
   
$output.="<h7>Users</h7>";
   
$output .= theme('user_list', $items, NULL);
  }

 
// Display a list of currently online guests.
 
if ($total_guests) {
   
$output.="<div class=\"item-list\"><h7>Guests</h7><ul><fine>";
   
$guestitems = array();

    while (
$guests-- && $account = db_fetch_object($guests_hostname)) {
     
$guestitems[] = $account->hostname;
     
$output.="<li><a title=\"Go to address\" href=\"http://$account->hostname\">$account->hostname</a>
      <a title=\"Go to address\" href=\"http://"
.gethostbyaddr($account->hostname)."\">".gethostbyaddr($account->hostname)."</a>       ";
    }
  
$output.="</fine></ul></div>";
  }
}
return
$output;
?>

which gives as result:

Who is online
Users
* administrator
Guests
* 192.168.0.50 Saturnus

of course the 192.. Ip will change to any guests IP looking at your site.

About this page

Drupal version
Drupal 4.7.x, Drupal 5.x
Audience
Developers and coders, Site administrators, Themers

Reference

Drupal’s online documentation is © 2000-2012 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License. Comments on documentation pages are used to improve content and then deleted.