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

Pregunta:

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?

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.

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 hacerlo coincidir 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>";
}

Respuesta:

Usaría transitorios para hacer esto:

  • cree una función de actualización de usuario en línea que se 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 período de tiempo de la "última actividad" para reducir las escrituras en la base de datos, 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, 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 expira 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 entradas antiguas de $logged_in_users

Leave a Comment

Your email address will not be published.

Scroll to Top

istanbul avukat

-

web tasarım