API Heartbeat utilizzo dell'heartbeat in un plug-in

In questo tutorial creeremo un semplice plug-in che utilizza l'API Heartbeat. Il nostro plugin avviserà gli utenti che hanno effettuato l'accesso, tramite una notifica simile a un ringhio, ogni volta che un altro utente accede o esce dal sito.

Dato che questo tutorial è focalizzato sull'API Heartbeat, tralascio i dettagli sulla creazione dell'intestazione del plugin o della struttura del file: il plugin è molto semplice ed è possibile esaminare il codice sorgente per intero in questo repository GitHub.

Un utente verrà considerato "connesso" quando si collegherà e sarà attivo nelle ultime 24 ore. Se un utente si disconnette o non è attivo per 24 ore, verrà considerato offline. Terremo sotto controllo lo stato "online" dell'utente e il timestamp "ultimo attivo" per determinare chi è attualmente online.


Accesso e disconnessione

Per prima cosa creeremo un paio di funzioni collegate wp_login e wp_logout ganci. Questi vengono attivati ​​quando un utente accede / esce da WordPress. Quando un utente effettua l'accesso, aggiorneremo lo stato di accesso (memorizzato come meta utente) a "true" e aggiorneremo il loro ultimo timestamp attivo.

 function whoisonline_logged_in ($ username, $ user) update_user_meta ($ user-> ID, 'whoisonline_is_online', true); update_user_meta ($ user-> ID, 'whoisonline_last_active', time ());  add_action ('wp_login', 'whoisonline_logged_in', 10, 2);

Allo stesso modo, quando un utente si disconnette, aggiorneremo il suo stato online a falso:

 function whoisonline_logged_out () $ user_id = get_current_user_id (); update_user_meta ($ user_id, 'whoisonline_is_online', false);  add_action ('wp_logout', 'whoisonline_logged_out');

chi è online?

Ora creiamo una funzione che restituisce una matrice di nomi utente di utenti attivi, indicizzati dall'ID utente. Useremo il get_users () funzione per interrogare tutti gli utenti che sono stati attivi nelle ultime 24 ore (usando il whoisonline_last_active meta chiave).

Quindi scarteremo tutti gli utenti che si sono disconnessi controllando il file whoisonline_is_online utente / metadati.

 function who_is_online ($ args = array ()) // Ottieni utenti attivi nelle ultime 24 ore $ args = wp_parse_args ($ args, array ('meta_key' => 'whoisonline_last_active', 'meta_value' => time () - 24 * 60 * 60, 'meta_compare' => '>', 'count_total' => falso,)); $ users = get_users ($ args); // Inizia matrice $ online_users = array (); foreach ($ users as $ user) if (! get_user_meta ($ user-> ID, 'whoisonline_is_online', true)) continua; $ online_users [$ user-> ID] = $ user-> user_login;  return $ online_users; 

Preparazione per l'API Heartbeat

Prima di occuparci della parte lato client dell'API di Heaertbeat, affrontiamo la risposta del server a una richiesta di "chi è in linea". Come è stato trattato nella parte 1 di questa serie, ci collegheremo al filtro heartbeat_received (non è necessario attivarlo per gli utenti che hanno effettuato il logout, quindi non utilizzerà il file heartbeat_nopriv_received filtro).

Innanzitutto, aggiorneremo la data / ora dell'attività dell'utente corrente e assicuriamo che il loro stato sia impostato su "online". Successivamente verificheremo che è stata effettuata una richiesta di dati "chi è online" cercando il file chi è online chiave (che useremo in seguito) nella ricevuta $ data.

In caso affermativo, risponderemo con una serie di utenti registrati nel modulo:

 array ([ID utente] => [Accesso utente])

Come restituito da chi è online().

 function whoisonline_check_who_is_online ($ response, $ data, $ screen_id) // Aggiorna l'attività dell'utente $ user_id = get_current_user_id (); update_user_meta ($ user_id, 'whoisonline_last_active', time ()); update_user_meta ($ user_id, 'whoisonline_is_online', true); // Controlla se "chi è online?" è stato richiesto se (! empty ($ data ['who-is-online'])) // Allega dati da inviare $ response ['whoisonline'] = who_is_online ();  return $ response;  add_filter ('heartbeat_received', 'whoisonline_check_who_is_online', 10, 3); add_filter ('heartbeat_received', 'whoisonline_check_who_is_online', 10, 3);

API Heartbeat

Ora crea il file JavaScript che-è-online.js file nella root della cartella dei plugin. Di seguito è la struttura del file.

Innanzitutto, iniziamo la nostra variabile globale chi è online. whoisonline.online e whoisonline.onlinePrev sono entrambi 'array associativi' (in senso stretto, in termini di JavaScript, sono oggetti) degli accessi degli utenti, indicizzati dall'ID utente - corrispondenti a quegli utenti che sono 'online' al beat corrente / precedente. Questo è usato per determinare quando un utente ha effettuato il login o l'uscita.

Iniziamo quindi la nostra richiesta di dati su chi è online con wp.heartbeat.enqueue e ascoltare la risposta legando una richiamata all'evento battito cardiaco-tick.whoisonline. In tale callback controlliamo i dati restituiti dal server, eseguiamo tutte le azioni necessarie e quindi assicuriamo che la nostra richiesta di dati sia accodata per il prossimo battito.

 // Inizia variabili var whoisonline = online: false, onlinePrev: false; jQuery (document) .ready (function () // Imposta il beat iniziale su fast - solo a scopo dimostrativo! wp.heartbeat.interval ('fast'); // Enqueue sono dati wp.heartbeat.enqueue ('who-is -online ',' whoisonline ', false); jQuery (document) .on (' heartbeat-tick.whoisonline ', funzione (evento, dati, textStatus, jqXHR) if (data.hasOwnProperty (' whoisonline ')) / / Esegui azioni con i dati restituiti // Nel nostro esempio, vogliamo allegare i dati per il prossimo battito // Questo potrebbe non essere il caso in tutte le applicazioni: solo i dati delle code quando necessario. Wp.heartbeat.enqueue ( 'who-is-online', 'whoisonline', false);););

Ora, inseriamo i dettagli della logica all'interno del nostro battito cardiaco-tick.whoisonline richiama. Ogni volta che i dati vengono ricevuti dal server, per prima cosa controlliamo che contenga un array di utenti registrati (che verrebbe fornito dalla chiave "whoisonline"), controllando data.hasOwnProperty ('whoisonline'). Se è così…

  • Aggiornare whoisonline.onlinePrev per riflettere chi era online all'ultimo beat, e whoisonline.online per riflettere chi è online al ritmo attuale.
  • Controlla gli ID utente che appaiono in whoisonline.online, ma non ci sono whoisonline.onlinePrev. Questi utenti hanno appena effettuato l'accesso.
  • Controlla gli ID utente che appaiono in whoisonline.onlinePrev, ma non ci sono whoisonline.online. Questi utenti sono appena usciti.

Il file JavaScript finito è quindi simile a:

 var whoisonline = online: false, onlinePrev: false; jQuery (document) .ready (function () // Imposta il beat iniziale su fast wp.heartbeat.interval ('fast'); // Enqueue sono dati wp.heartbeat.enqueue ('who-is-online', 'whoisonline ', false); jQuery (document) .on (' heartbeat-tick.whoisonline ', function (event, data, textStatus, jqXHR) if (data.hasOwnProperty (' whoisonline ')) if (whoisonline.online == = false) // Se è appena caricato, non dire nulla ... whoisonline.online = data.whoisonline; whoisonline.onlinePrev = whoisonline.online || ; per (var id in whoisonline.onlinePrev) if (! whoisonline.online.hasOwnProperty (id)) jQuery.noticeAdd (text: whoisonline.onlinePrev [id] + "è ora offline"); per (var id in whoisonline.online) if (! whoisonline.onlinePrev .hasOwnProperty (id)) jQuery.noticeAdd (text: whoisonline.online [id] + "è ora online"); wp.heartbeat.enqueue ('who-is-online', 'whoisonline', falso);););

Caricamento dei nostri script e stili

Questo plug-in farà uso del componente aggiuntivo jQuery Notice di Tim Benniks, un leggero plugin di notifica simile a un ringhio per jQuery. Scaricalo semplicemente ed estrai nella root del tuo plugin (dovrebbe consistere di soli due file: jquery.notice.js e jquery.notice.css)

Ora che il plugin jQuery è stato aggiunto, l'ultimo pezzo del puzzle è di accodare gli script e gli stili necessari. Vogliamo che questo plugin funzioni sia sul front-end che sul lato admin, quindi useremo entrambi admin_enqueue_scripts e wp_enqueue_scripts hook, ma vogliamo solo caricare lo script per gli utenti loggati.

 function whoisonline_load_scripts () / * Ony carica gli script quando è necessario - in questo caso, ovunque se l'utente è loggato * / if (is_user_logged_in ()) wp_enqueue_script ('whoisonline-jquery-notice', plugin_dir_url (__FILE__). 'jquery.notice.js', array ('jquery')); wp_enqueue_style ('whoisonline-jquery-notice', plugin_dir_url (__FILE__). 'jquery.notice.css'); wp_enqueue_script ('whoisonline', plugin_dir_url (__FILE__). 'who-is-online.js', array ('heartbeat', 'whoisonline-jquery-notice'));  add_action ('admin_enqueue_scripts', 'whoisonline_load_scripts'); add_action ('wp_enqueue_scripts', 'whoisonline_load_scripts');

E questo è il plugin finito.

Puoi vedere il codice per intero in questo repository GitHub. C'è molto spazio per migliorare qui (per esempio visualizzare un elenco di utenti e quando erano attivi l'ultima volta), ma si spera che questo plugin relativamente semplice abbia dimostrato come funziona l'API Heartbeat.