¿Cómo verificar si un usuario (no el usuario actual) ha iniciado sesión?

20

Necesito mostrar el estado en línea (en línea / fuera de línea) para cada página de autor (plantilla de página de autor personalizada).

is_user_logged_in () solo se aplica al usuario actual y no puedo encontrar un enfoque relevante orientado al autor actual, p. ej. is_author_logged_in ()

¿Alguna idea?

Respuesta

One Trick Pony tuvo la amabilidad de preparar la codificación para dos o tres funciones usando transitorios, algo que no había usado antes.

enlace

Agregue esto a functions.php:

add_action('wp', 'update_online_users_status');
function update_online_users_status(){

  if(is_user_logged_in()){

    // get the online users list
    if(($logged_in_users = get_transient('users_online')) === false) $logged_in_users = array();

    $current_user = wp_get_current_user();
    $current_user = $current_user->ID;  
    $current_time = current_time('timestamp');

    if(!isset($logged_in_users[$current_user]) || ($logged_in_users[$current_user] < ($current_time - (15 * 60)))){
      $logged_in_users[$current_user] = $current_time;
      set_transient('users_online', $logged_in_users, 30 * 60);
    }

  }
}

Agregue esto a author.php (u otra plantilla de página):

function is_user_online($user_id) {

  // get the online users list
  $logged_in_users = get_transient('users_online');

  // online, if (s)he is in the list and last activity was less than 15 minutes ago
  return isset($logged_in_users[$user_id]) && ($logged_in_users[$user_id] > (current_time('timestamp') - (15 * 60)));
}

$passthis_id = $curauth->ID;
if(is_user_online($passthis_id)){
echo 'User is online.';}
else {
echo'User is not online.';}

Segunda respuesta (no usar)

Esta respuesta se incluye como referencia. Como lo señala One Trick Pony, este enfoque no es deseable porque la base de datos se actualiza en cada carga de página. Después de un examen más detenido, el código solo parecía estar detectando el estado de inicio de sesión del usuario actual en lugar de hacerlo coincidir con el autor actual.

1) Instale este complemento: enlace

2) Agregue lo siguiente a su plantilla de página:

//Set the $curauth variable
if(isset($_GET['author_name'])) :
$curauth = get_userdatabylogin($author_name);
else :
$curauth = get_userdata(intval($author));
endif;

// Define the ID of whatever authors page is being viewed.
$authortemplate_id = $curauth->ID;

// Connect to database.
global $wpdb;
// Define table as variable.
$who_is_online_table = $wpdb->prefix . 'who_is_online';
// Query: Count the number of user_id's (plugin) that match the author id (author template page).
$onlinestatus_check = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(*) FROM ".$who_is_online_table." WHERE user_id = '".$authortemplate_id."';" ) );

// If a match is found...
if ($onlinestatus_check == "1"){
echo "<p>User is <strong>online</strong> now!</p>";
}
else{
echo "<p>User is currently <strong>offline</strong>.</p>";
}
    
pregunta Dominor Novus 21.11.2011 - 23:28

2 respuestas

15

Usaría transients para hacer esto:

  • cree una función de actualización en línea para el usuario que enganche en init ; se vería algo como esto:

    // get the user activity the list
    $logged_in_users = get_transient('online_status');
    
    // get current user ID
    $user = wp_get_current_user();
    
    // check if the current user needs to update his online status;
    // he does if he doesn't exist in the list
    $no_need_to_update = isset($logged_in_users[$user->ID])
    
        // and if his "last activity" was less than let's say ...15 minutes ago          
        && $logged_in_users[$user->ID] >  (time() - (15 * 60));
    
    // update the list if needed
    if(!$no_need_to_update){
      $logged_in_users[$user->ID] = time();
      set_transient('online_status', $logged_in_users, $expire_in = (30*60)); // 30 mins 
    }
    

    Por lo tanto, esto debería ejecutarse en cada carga de página, pero el transitorio se actualizará solo si es necesario. Si tiene una gran cantidad de usuarios en línea, es posible que desee aumentar el marco de tiempo de la "última actividad" para reducir las escrituras de db, pero 15 minutos es más que suficiente para la mayoría de los sitios ...

  • ahora para verificar si el usuario está en línea, simplemente mire dentro de ese transitorio para ver si un determinado usuario está en línea, como lo hizo anteriormente:

    // get the user activity the list
    $logged_in_users = get_transient('online_status');
    
    // for eg. on author page
    $user_to_check = get_query_var('author'); 
    
    $online = isset($logged_in_users[$user_to_check])
       && ($logged_in_users[$user_to_check] >  (time() - (15 * 60)));
    

El transitorio expira en 30 minutos si no hay ninguna actividad. Pero en caso de que tenga usuarios en línea todo el tiempo, no caducará, por lo que es posible que desee limpiar ese transitorio periódicamente conectando otra función en un evento dos veces al día o algo así. Esta función eliminaría las entradas antiguas de $logged_in_users ...

    
respondido por el onetrickpony 22.11.2011 - 01:52
1

Que yo sepa, no hay una manera de hacer esto utilizando las funciones de WordPress integradas , pero no permita que desanimarte escribe un plugin!

Una forma en que podría hacer esto es creando una nueva tabla en la base de datos que simplemente rastree la última vez que el usuario estuvo activo en el sitio. También podría tener una página de configuración para su complemento que determinó durante cuánto tiempo consideraría que un usuario registrado está "Conectado".

Lo implementarías usando un gancho de WordPress . Comenzaría conectándome al inicio de sesión, de modo que una vez que un usuario inicie sesión, su complemento registre la hora en la base de datos. Luego, puede explorar otras cosas, como establecer su estado en 'ausente' si hacen clic en cerrar sesión, o 'inactivo' si su tiempo de inicio de sesión fue hace más de dos horas.

Se encontraría con un problema si estuviera conectado y activo en el sitio, pero pasara esta ventana de dos horas. En este caso, deberías estar conectado a la sección wp-admin para que cada vez que hagan algo en wp-admin actualice tu base de datos hasta la hora actual.

Luego, en las publicaciones, deberías hacer dos cosas: obtener el autor de la publicación actual:

<?php $user_login = the_author_meta( $user_login ); ?>

luego consulte su base de datos para determinar si están conectados:

<?php if your_plugin_function($user_login)... ?>
...display something...
    
respondido por el brock 22.11.2011 - 00:21

Lea otras preguntas en las etiquetas