Lista de usuarios conectados actualmente (wordpress)

5 minutos de lectura

avatar de usuario
Usuario_FTW

¿Hay alguna manera de mostrar una lista de los usuarios actualmente conectados?

Idealmente, solo mostraría su nombre y gravatar.

avatar de usuario
Jozze

Personalmente, usaría la meta clave session_tokens para determinar si un usuario está en línea (o tiene una sesión en ejecución) o no.

$aUsers = get_users([
    'meta_key' => 'session_tokens',
    'meta_compare' => 'EXISTS'
]);

Obtendrá una lista de usuarios con sesiones en ejecución. Entonces puedes usar eso para tu salida.

echo sprintf(
    'Users online: %s',
    implode(', ', array_map(function($oUser){
        return get_avatar( $oUser->ID, 96 ) . '<span class="username">'$oUser->display_name.'</span>';
    }, $aUsers))
);

Incluso podría mostrar las direcciones IP de la sesión si modifica el último bit de código.

echo sprintf(
    'Users online: %s',
    implode(', ', array_map(function($oUser){
        $aCurrentSessions = get_user_meta($oUser->ID, 'session_tokens', true);
        return get_avatar( $oUser->ID, 96 ) . '<span class="username">'$oUser->display_name.'</span> (' .
            implode('; ', array_map(function($aSession) {
                return $aSession['ip']; // only return the session ips
            }, $aCurrentSessions)) . ')';
    }, $aUsers))
);

  • La primera línea devuelve incluso a los usuarios desconectados, así que supongo que lo que sugieres no es suficiente

    – La vida después del invitado

    2 de septiembre de 2020 a las 7:27

  • @Jozze, gracias por tu respuesta. ¿Le importaría señalar (a un programador veterano pero principiante de WP) cómo aplicar esta solución (por ejemplo, en un complemento)? Si es posible, un archivo de muestra (PHP) sería de mucha ayuda (git/mail/other).

    – Dicha

    3 de mayo de 2021 a las 9:33


WordPress no tiene una función integrada para esto, pero usted mismo puede agregar una fácilmente. Por ejemplo, puede usar el enlace wp_login para almacenar la última hora de inicio de sesión de cada usuario. Luego puede enumerar los usuarios que iniciaron sesión en los últimos 30 minutos más o menos como en línea.

add_action('wp_login', 'store_last_login', 10, 2);

function store_last_login($current_user) {
    global $current_user;
    get_currentuserinfo();
    $user = $current_user->user_login;
    update_user_meta($current_user->ID, 'last_login', current_time('mysql', 1));
}

Luego, puede hacer eco de los usuarios que iniciaron sesión en los últimos veinte minutos (o el período de tiempo que elija) con algo como:

function list_online_users() {
$users = get_users( 'blog_id=1' );
foreach ($users as $online) {

    $getLastLogin = (get_user_meta($online->ID, 'last_login', true));
    $lastLogin = new DateTime($getLastLogin);
    $since_start = $lastLogin->diff(new DateTime(current_time('mysql', 1)));

    $minutesSinceLogin = $since_start->i;

    // this will list every user and whether they logged in within the last 30 minutes
    if ($minutesSinceLogin > 30 ) {
        echo '<li>'.$online->user_login . ' is offline </li>';
    } else { 
        echo '<li>'.$online->user_login . ' is online </li>'; 
    }

    }

}

avatar de usuario
rafa226

Si no desea utilizar un complemento, puede hacerlo fácilmente:

1/ Agregue esto a su archivo functions.php para agregar o eliminar un usermeta cuando el usuario se conecta o desconecta:

    function add_user_logged_meta(){
        $user = wp_get_current_user();
        update_user_meta($user->ID, 'asdb-loggedin', true);
    }
    // user connects
    add_action('init','add_user_logged_meta');

    function delete_user_logged_meta() {
        $user = wp_get_current_user();
        update_user_meta($user->ID, 'asdb-loggedin', false);
    }
    // user disconnects
    add_action('clear_auth_cookie', 'delete_user_logged_meta');

2/ En sus plantillas (también puede crear una función en functions.php), para mostrar a todos los usuarios que han iniciado sesión, simplemente use el get_users() incorporado de wordpress con algunos parámetros de metaconsulta:

$loggedin_users = get_users([
    'meta_key' => 'asdb-loggedin',
    'meta_value' => '1',
    'meta_compare' => '='
]);
foreach( $loggedin_users as $loggedin_user ){
    echo $loggedin_user->user_login;

}

  • wp_logout devuelve nulo. Es mejor reemplazarlo con ‘clear_auth_cookie’. Eso hace que este código funcione como se esperaba.

    – DavidA26

    16 de marzo de 2020 a las 16:12


  • Gracias por la retroalimentación ! yo hice la modificacion

    – rafa226

    23 de marzo de 2020 a las 10:03

1) Cree en un campo adicional llamado ‘estado’ con enumeración (‘1’, ‘0’) en la tabla wp_users 2) después en functions.php coloque el siguiente código

<?php
function add_session_mitesh()
{
    global $wpdb;
    if(is_user_logged_in())
    {
        $user_id = get_current_user_id();
        $wpdb->query("UPDATE wp_users SET `status` = '1' WHERE `wp_users`.`ID` = $user_id;");
    }
     $user_id;
}
add_action('init','add_session_mitesh');


function delete_session_mitesh() {
global $wpdb;
    if(is_user_logged_in())
    {
        $user_id = get_current_user_id();
        $wpdb->query("UPDATE wp_users SET `status` = '0' WHERE `wp_users`.`ID` = $user_id;");
    }
 $user_id;
}
add_action('wp_logout', 'delete_session_mitesh');
?>

ahora para enumerar el usuario de inicio de sesión actual que puede usar

<?php  $users=$wpdb->get_results( 'SELECT * FROM wp_users where status="1"', 'ARRAY_A'); 
<table width="100%" border="2px" style="text-align: center;">
    <?php
    foreach( $users as $g )
    {   
    ?>
        <tr><td style="text-align: center;"> <center> <?php echo $g['user_login'] ?> </center></td>
        </tr>
    <?php } ?>
    </p>
    </table>    

Puede obtener el usuario conectado actual de la siguiente manera

$current_user = wp_get_current_user();
echo 'Username: ' . $current_user->user_login . '<br />';
echo 'User email: ' . $current_user->user_email . '<br />';
echo 'User first name: ' . $current_user->user_firstname . '<br />';
echo 'User last name: ' . $current_user->user_lastname . '<br />';
echo 'User display name: ' . $current_user->display_name . '<br />';
echo 'User ID: ' . $current_user->ID . '<br />'; ?>

identifique esta variable $ current_user, puede encontrar todos los detalles del usuario en la matriz y el objeto que puede tomar de esta variable

  • No pidió la información de un solo usuario; pidió una lista de todos los usuarios registrados en este momento.

    – trenoasis

    23 de noviembre de 2015 a las 13:59

  • No pidió la información de un solo usuario; pidió una lista de todos los usuarios registrados en este momento.

    – trenoasis

    23 de noviembre de 2015 a las 13:59

¿Ha sido útil esta solución?