Come verificare se un utente (non utente corrente) ha effettuato l'accesso?


22

Devo visualizzare lo stato online (online / offline) per ciascuna pagina dell'autore (modello di pagina dell'autore personalizzato).

is_user_logged_in () si applica solo all'utente corrente e non riesco a trovare un approccio pertinente indirizzato all'autore corrente, ad esempio is_author_logged_in ()

Qualche idea?

Risposta

One Trick Pony è stato così gentile da preparare la codifica per due o tre funzioni usando i transienti, qualcosa che non avevo mai usato prima.

http://codex.wordpress.org/Transients_API

Aggiungi questo 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);
    }

  }
}

Aggiungi questo a author.php (o un altro modello di pagina):

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.';}

Seconda risposta (non usare)

Questa risposta è inclusa come riferimento. Come sottolineato da One Trick Pony, questo è un approccio indesiderabile perché il database viene aggiornato ad ogni caricamento della pagina. Dopo un ulteriore esame, il codice sembrava rilevare solo lo stato di accesso dell'utente corrente anziché abbinarlo ulteriormente all'autore corrente.

1) Installa questo plugin: http://wordpress.org/extend/plugins/who-is-online/

2) Aggiungi quanto segue al tuo modello di pagina:

//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>";
}

Questa è una delle peggiori soluzioni che potresti trovare. Quel plugin aggiorna il db ad ogni caricamento della pagina ...
onetrickpony,

Grazie per averlo recensito. Starò alla larga. Ho risposto alla tua risposta (sotto). Sono bloccato nel creare la funzione.
Dominor Novus,

Risposte:


15

Vorrei usare i transitori per fare questo:

  • creare una funzione di aggiornamento online dell'utente a cui si è collegati init; sarebbe simile a questo:

    // 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 
    }
    

    Quindi, questo dovrebbe essere eseguito ad ogni caricamento della pagina, ma il transitorio verrà aggiornato solo se necessario. Se hai un gran numero di utenti online potresti voler aumentare il periodo di "ultima attività" per ridurre le scritture di db, ma 15 minuti sono più che sufficienti per la maggior parte dei siti ...

  • ora per verificare se l'utente è online, basta guardare all'interno di quel transitorio per vedere se un determinato utente è online, proprio come hai fatto sopra:

    // 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)));
    

Il transitorio scade dopo 30 minuti se non c'è alcuna attività. Ma nel caso in cui tu abbia utenti online per tutto il tempo non scadrà, quindi potresti voler ripulire periodicamente quel transitorio agganciando un'altra funzione su un evento due volte al giorno o qualcosa del genere. Questa funzione rimuove le vecchie $logged_in_usersvoci ...


I transitori sono nuovi per me. Grazie per il codice Non riesco ad attuare il primo passo. Ho copiato il tuo primo blocco di codice e l'ho incollato in function user_online_update() {[IL TUO CODICE] }add_action('init', 'user_online_update');nel mio file Functions.php - sto ricevendo un errore del server che suggerisce che qualcosa non sta analizzando correttamente o ho frainteso le tue istruzioni.
Dominor Novus,

1
+1 per aver suggerito di usare i transitori. Non molte persone sanno di loro.
Dwayne Charrington,


@OneTrickPony: ho aggiunto l'azione a Functions.php. Dove posso aggiungere la seconda funzione (vedere la riga 27 del codice completo)? Ho provato autori.php e quindi funzioni.php ma senza risultati. Ho provato a utilizzare la condizione sulla riga 25 del tuo codice completo. Ogni volta, la pagina restituisce un errore del server altrimenti non analizza nulla nella mia pagina oltre il tuo codice. Ho rimosso il mio codice originale e disattivato "Chi è online?" collegare. Cosa sto trascurando?
Dominor Novus,

sostituiscilo $time_limitcon 15e assicurati di aver aperto / chiuso correttamente i tag php ...
onetrickpony,

1

Per quanto ne sappia, non c'è modo di farlo usando le funzioni integrate di WordPress , ma non lasciarti scoraggiare; scrivi un plugin!

Un modo per farlo è creare una nuova tabella nel database che tenga semplicemente traccia dell'ultima volta che l'utente è stato attivo sul sito. Potresti anche avere una pagina delle impostazioni per il tuo plug-in che determina per quanto tempo consideri un utente registrato "Accesso".

Lo implementeresti usando un hook di WordPress . Vorrei iniziare collegandomi al login, in modo che una volta che un utente accede, il plug-in registra l'ora nel database. Potresti quindi esplorare altre cose come impostare il loro stato su "assente" se fanno clic sul logout o su "inattivo" se il loro tempo di accesso era più di due ore fa.

Potresti riscontrare un problema se sono connessi e attivi sul sito, ma oltre questa finestra di due ore. In questo caso, dovresti essere agganciato alla sezione wp-admin in modo che ogni volta che fanno qualcosa in wp-admin aggiorna il tuo database all'ora corrente.

Quindi, sui post, dovresti fare due cose: ottenere l'autore del post corrente:

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

quindi interrogare il database per determinare se sono connessi:

<?php if your_plugin_function($user_login)... ?>
...display something...

Sulla base della tua soluzione ho trovato un plug-in che crea la tabella e consente di definire il tempo trascorso tramite le impostazioni. Dopo aver esaminato i file del plug-in, non sono sicuro di come manipolare il codice per l'output online / offline nella pagina del mio modello di autore. Se potessi dare un'occhiata ai file del plugin e indicarmi la giusta direzione, lo apprezzerei: wordpress.org/extend/plugins/who-is-online (Usando le tue istruzioni, andrò il più lontano possibile nel frattempo usando un hook nel mio file
Functions.php

Successo! Ho interrogato il database dei plugin per le corrispondenze di ID utente e ID autore. Ho incollato il codice nella mia domanda (sopra).
Dominor Novus,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.