Heartbeat API Utilizarea Heartbeat într-un plug-in

În acest tutorial vom crea un plugin simplu care utilizează API-ul Heartbeat. Pluginul nostru va avertiza utilizatorii conectați, printr-o notificare asemănătoare, de fiecare dată când un alt utilizator se conectează sau iese din site.

Din moment ce acest tutorial se concentrează pe API-ul Heartbeat, voi lăsa detalii despre crearea antetului plugin-ului sau a structurii fișierului: plugin-ul este foarte simplu și puteți examina codul sursă în întregime la acest depozit GitHub.

Un utilizator va fi considerat "conectat" când se loghează și a fost activ în ultimele 24 de ore. Dacă un utilizator se deconectează sau nu este activ timp de 24 de ore, acestea vor fi considerate offline. Vom păstra fișierele cu privire la starea "online" a utilizatorului și a "ultimului activ" pentru a stabili cine este online în prezent.


Înregistrarea și deconectarea

Mai intai vom crea cateva functii atasate wp_login și wp_logout cârlige. Acestea sunt declanșate atunci când un utilizator loghează / iese din WordPress. Când un utilizator se conectează, vom actualiza starea lor de conectare (stocată ca meta utilizator) la "true" și vom actualiza ultimul timbru activ.

 funcția whoisonline_logged_in ($ username, $ user) update_user_meta ($ user-> ID, 'whoisonline_is_online', true); update_user_meta ($ user-> ID, 'whoisonline_last_active', ora ());  add_action ('wp_login', 'whoisonline_logged_in', 10, 2);

În mod similar, atunci când un utilizator se deconectează, vom actualiza starea lor online la false:

 funcția 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');

cine e online?

Acum, să creăm o funcție care returnează o serie de nume de utilizator ale utilizatorilor activi, indexată după ID-ul utilizatorului. Vom folosi get_users () funcția de a interoga toți utilizatorii care au fost activi în ultimele 24 de ore (utilizând whoisonline_last_active tasta meta).

Apoi vom renunța la orice utilizatori care s-au deconectat verificând whoisonline_is_online utilizator / meta date.

 ($ args, array ('meta_key' => 'whoisonline_last_active', 'meta_value' => timp () - 24 * 60 * 60, 'meta_compare' => '>', 'count_total' => false,)); $ users = get_users ($ args); // inițiază array $ online_users = array (); foreach ($ utilizatori ca $ user) if (! get_user_meta ($ user-> ID, 'whoisonline_is_online', true)) continuați; $ online_users [$ user-> ID] = $ user-> user_login;  return $ online_users; 

Pregătiți pentru API-ul Heartbeat

Înainte de a ne ocupa de partea clientului din API-ul Heaertbeat, să abordăm răspunsul serverului la o solicitare pentru "cine este online". Așa cum a fost acoperit în partea a 1-a a acestei serii, vom cârna pe filtru heartbeat_received (nu avem nevoie să declanșăm acest lucru pentru utilizatorii deconectați, astfel încât nu vom folosi heartbeat_nopriv_received filtru).

În primul rând, vom actualiza marca curentă a activității utilizatorului actual și vom asigura că statutul lor este setat la "online". Apoi vom verifica dacă o solicitare pentru datele "cine este online" a fost făcută prin căutarea cine este online cheie (pe care îl vom folosi ulterior) în mesajul primit $ date.

Dacă este cazul, vom răspunde cu o serie de utilizatori conectați la formular:

 array ([User ID] => [Log in utilizator])

După cum sa întors cine este online().

 funcția whoisonline_check_who_is_online ($ răspuns, $ date, $ screen_id) // Actualizează activitatea utilizatorului $ user_id = get_current_user_id (); update_user_meta ($ user_id, 'whoisonline_last_active', ora ()); update_user_meta ($ user_id, 'whoisonline_is_online', true); // Verificați dacă "cine este online?" a fost solicitat dacă ! empty ($ data ['who-is-online'])) // Atașați datele care trebuie trimise $ answer ['whoisonline'] = who_is_online ();  retur $ răspuns;  add_filter ('heartbeat_received', 'whoisonline_check_who_is_online', 10, 3); add_filter ('heartbeat_received', 'whoisonline_check_who_is_online', 10, 3);

Heartbeat API

Acum creați fișierul JavaScript care-este-online.js fișier în rădăcina folderului pluginului. Mai jos este prezentarea fișierului.

Mai întâi, inițiazăm variabila globală cine este online. whoisonline.online și whoisonline.onlinePrev sunt ambele "matrice asociative" (strict vorbind, în termeni de JavaScript, ele sunt obiecte) de logare a utilizatorilor, indexate prin ID-ul utilizatorului - corespunzător acelor utilizatori care sunt "on-line" la bataie curentă / anterioară. Aceasta este utilizată pentru a determina când un utilizator sa logat sau ieșit.

Apoi, inițiază cererea noastră de date privind cine este online wp.heartbeat.enqueue și ascultați răspunsul prin legarea unui apel invers la eveniment batai de inima-tick.whoisonline. În apelul respectiv, verificăm datele returnate de server, efectuăm toate acțiunile necesare și apoi asigurăm că cererea noastră de date este în așteptare pentru următoarea batere.

 // variabile inițiale var whoisonline = online: false, onlineAvertizare: false; jQuery (document) .ready (function () // Setați ritmul inițial pentru a repeta - doar pentru scopuri demonstrative! wp.heartbeat.interval ('fast'); // Enqueue sunt datele wp.heartbeat.enqueue (ifon), () () () () () () () () / Efectuați acțiuni cu date returnate // În exemplul nostru, dorim să atașăm date pentru următoarea bataie. // Aceasta poate să nu fie cazul în toate aplicațiile: numai date de coadă atunci când este nevoie.wp.heartbeat.enqueue ( "cine-este-online", "whoisonline", fals);););

Acum, să completăm detaliile logicii din interiorul nostru batai de inima-tick.whoisonline suna inapoi. Ori de câte ori se primesc date de la server, verificăm mai întâi dacă acesta conține o serie de utilizatori conectați (care ar fi dat de cheia "whoisonline"), verificând data.hasOwnProperty ("whoisonline"). Dacă da ...

  • Actualizați whoisonline.onlinePrev pentru a reflecta cine a fost online la ultimul bate, și whoisonline.online pentru a reflecta cine este online la bataie curentă.
  • Verificați codurile de utilizator care apar în whoisonline.online, dar nu sunt în whoisonline.onlinePrev. Acești utilizatori tocmai s-au logat.
  • Verificați codurile de utilizator care apar în whoisonline.onlinePrev, dar nu sunt în whoisonline.online. Acești utilizatori tocmai au ieșit.

Fișierul JavaScript finit arată apoi după cum urmează:

 var whoisonline = online: false, onlineAvertizare: falsă; jQuery (document) .ready (functie () // Setarea batei initiale pentru a rapida wp.heartbeat.interval ('fast'); // Enqueue sunt datele wp.heartbeat.enqueue ('who-is-online', 'whoisonline ', () () () () () () (if.com) if (whoisonline.online == = false) // Dacă tocmai încărcat, nu spune nimic ... whoisonline.online = data.whoisonline; whoisonline.onlinePrev = whoisonline.online || ; pentru (var id in whoisonline.onlinePrev) if (! whoisonline.online.hasOwnProperty (id)) jQuery.noticeAdd (text: whoisonline.onlinePrev [id] + "este acum offline"); pentru (var id in whoisonline.online) if (! whoisonline.onlinePrev .hasOwnProperty (id)) jQuery.noticeAdd (text: whoisonline.online [id] + "este acum online"); wp.heartbeat.enqueue ("cine-este-online" fals ); ); );

Încărcați scripturile și stilurile noastre

Acest plugin va face uz de add-on-ul jQuery Notice de Tim Benniks - un plug-in de notificare de tip jarit pentru jQuery. Pur și simplu descărcați-l și extrageți-l în rădăcina plugin-ului dvs. (ar trebui să fie format numai din două fișiere: jquery.notice.js și jquery.notice.css)

Acum, când plugin-ul jQuery a fost adăugat, ultima piesă a puzzle-ului este să enqueue script-urile și stilurile necesare. Vrem ca acest plugin să funcționeze atât pe partea front-end, cât și pe partea de administrare, așa că vom folosi ambele admin_enqueue_scripts și wp_enqueue_scripts cârlig, dar vrem doar să încărcăm scriptul pentru utilizatorii conectați.

 funcția whoisonline_load_scripts () / * Ony grafice de încărcare când trebuie - în acest caz, peste tot în cazul în care utilizatorul este conectat * / if (is_user_logged_in ()) wp_enqueue_script ('whoisonline-jquery-notice', plugin_dir_url (__FILE__). "jquery.notice.js", array ("jquery")); wp_enqueue_style ('cineisonline-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');

Și acesta este pluginul finalizat.

Puteți vedea codul integral în acest depozit GitHub. Există destul spațiu pentru îmbunătățire aici (de exemplu, afișați o listă de utilizatori și când au fost activi ultima dată), dar sperăm că acest plugin relativ simplu a demonstrat cum funcționează API-ul Heartbeat.

Cod