¿Cómo verificar si un usuario (no el usuario actual) está conectado?

22

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 dirigido al autor actual, por ejemplo, is_author_logged_in ()

¿Algunas ideas?

Responder

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.

http://codex.wordpress.org/Transients_API

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 señaló One Trick Pony, este es un enfoque indeseable porque la base de datos se actualiza en cada carga de página. Después de un mayor escrutinio, el código solo parecía detectar el estado de inicio de sesión del usuario actual en lugar de emparejarlo adicionalmente con el autor actual.

1) Instale este complemento: http://wordpress.org/extend/plugins/who-is-online/

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>";
}
Dominor Novus
fuente
Esa es una de las peores soluciones que podrías encontrar. Ese complemento está actualizando la base de datos en cada carga de página ...
onetrickpony
Gracias por revisarlo. Me mantendré alejado. He respondido a tu respuesta (abajo). Estoy atrapado en la creación de la función.
Dominor Novus

Respuestas:

15

Usaría transitorios para hacer esto:

  • cree una función de actualización en línea del usuario que conecte init; se vería algo así:

    // 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 período 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 cierto usuario está en línea, tal 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 caduca en 30 minutos si no hay actividad en absoluto. 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 $logged_in_usersentradas antiguas ...

Pony de un solo truco
fuente
Los transitorios son nuevos para mí. Gracias por el codigo. No puedo implementar el primer paso. Copié su primer bloque de código y lo pegué en function user_online_update() {[SU CÓDIGO] }add_action('init', 'user_online_update');en mi archivo functions.php. Recibo un error del servidor que sugiere que algo no se está analizando correctamente o he malinterpretado sus instrucciones.
Dominor Novus
1
+1 por sugerir el uso de transitorios. No mucha gente sabe sobre ellos.
Dwayne Charrington el
@Dominor: el código completo .
onetrickpony
@OneTrickPony: agregué la acción a functions.php. ¿Dónde agrego la segunda función (vea la línea 27 de su código completo)? Intenté autores.php y luego funciones.php pero fue en vano. Intenté usar la condición en la línea 25 de su código completo. Cada vez, la página devuelve un error del servidor o no analiza nada en mi página más allá de su código. Eliminé mi código original y desactivé "¿Quién está en línea?" enchufar. ¿Qué estoy pasando por alto?
Dominor Novus
sustituir $time_limitcon 15y hacer etiquetas php seguro de que se han abierto / cerrado correctamente ...
onetrickpony
1

Que yo sepa, no hay una manera de hacer esto usando las funciones integradas de WordPress , pero no dejes que eso te desanime; escribe un complemento!

Una forma de hacerlo 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 puede tener una página de configuración para su complemento que determine cuánto tiempo consideraría que un usuario registrado está "conectado".

Implementarías esto usando un enlace de WordPress . Comenzaría por conectarme al inicio de sesión, de modo que una vez que un usuario inicie sesión, su complemento registre el tiempo en la base de datos. Luego, podría explorar otras cosas, como configurar su estado como '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.

Te encontrarás con un problema si están conectados y activos en el sitio, pero después de esta ventana de dos horas. En este caso, necesitaría estar conectado a la sección wp-admin para que cada vez que hagan algo en wp-admin actualice su base de datos a la hora actual.

Luego, en las publicaciones, debe 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...
brock
fuente
Según su solución, he encontrado un complemento que crea la tabla y permite definir el tiempo transcurrido a través de la configuración. Después de revisar los archivos del complemento, no estoy seguro de cómo manipular el código para que salga en línea / fuera de línea en mi página de plantilla de autor. Si pudiera echar un vistazo a los archivos de complementos y señalarme en la dirección correcta, lo agradecería: wordpress.org/extend/plugins/who-is-online (Usando sus instrucciones, iré tan lejos como pueda mientras tanto usando un gancho en mi archivo functions.php)
Dominor Novus
¡Éxito! Le pregunté a la base de datos del complemento la identificación de usuario y las coincidencias de identificación de autor. He pegado el código en mi pregunta (arriba).
Dominor Novus