Heartbeat API uso de Heartbeat en un complemento

En este tutorial vamos a crear un complemento simple que utiliza la API de Heartbeat. Nuestro complemento alertará a los usuarios registrados, a través de una notificación similar a un gruñido, cada vez que otro usuario inicie sesión o salga del sitio..

Dado que este tutorial está enfocado en la API de Heartbeat, omitiré los detalles sobre la creación del encabezado del complemento o la estructura del archivo: el complemento es muy simple, y puede examinar el código fuente completo en este repositorio de GitHub.

Un usuario se considerará "conectado" cuando inicie sesión y haya estado activo en las últimas 24 horas. Si un usuario cierra la sesión o no está activo durante 24 horas, se considerará que está desconectado. Nos mantendremos al tanto del estado "en línea" del usuario y la última marca de tiempo activa para ayudar a determinar quién está en línea actualmente.


Inicio y cierre de sesión

Primero vamos a crear un par de funciones enganchadas en wp_login y wp_logout manos. Estos se activan cuando un usuario inicia / cierra sesión en WordPress. Cuando un usuario inicia sesión, actualizaremos su estado de inicio de sesión (almacenado como meta del usuario) a "verdadero" y actualizaremos su última marca de tiempo activa.

 función whoisonline_logged_in ($ nombre de usuario, $ usuario) update_user_meta ($ usuario-> ID, 'whoisonline_is_online', verdadero); update_user_meta ($ user-> ID, 'whoisonline_last_active', time ());  add_action ('wp_login', 'whoisonline_logged_in', 10, 2);

De manera similar, cuando un usuario cierra la sesión, actualizaremos su estado en línea a falso:

 función whoisonline_logged_out () $ user_id = get_current_user_id (); update_user_meta ($ user_id, 'whoisonline_is_online', falso);  add_action ('wp_logout', 'whoisonline_logged_out');

quién está en línea?

Ahora vamos a crear una función que devuelva un conjunto de nombres de usuarios activos indexados por ID de usuario. Usaremos el get_users () función para consultar a todos los usuarios que han estado activos en las últimas 24 horas (utilizando el whoisonline_last_active clave meta).

Luego descartaremos a cualquier usuario que haya cerrado sesión whoisonline_is_online usuario / metadatos.

 función who_is_online ($ args = array ()) // Mantener a los usuarios activos en las últimas 24 horas $ args = wp_parse_args ($ args, array ('meta_key' => 'whoisonline_last_active', 'meta_value' => time () - 24 * 60 * 60, 'meta_compare' => '>', 'count_total' => false,)); $ users = get_users ($ args); // Iniciar array $ online_users = array (); foreach ($ users como $ user) if (! get_user_meta ($ user-> ID, 'whoisonline_is_online', true)) continúa; $ online_users [$ user-> ID] = $ user-> user_login;  devolver $ online_users; 

Preparándose para la API de Heartbeat

Antes de que tratemos la parte del lado del cliente de la API de Heaertbeat, tratemos la respuesta del servidor a una solicitud de "quién está en línea". Como se trató en la parte 1 de esta serie, nos engancharemos al filtro. heartbeat_received (No necesitamos activar esto para los usuarios que han cerrado la sesión, por lo que no usaremos el heartbeat_nopriv_received filtrar).

Primero, actualizaremos la marca de tiempo de la actividad del usuario actual y nos aseguraremos de que su estado esté configurado como "en línea". A continuación, comprobaremos que se ha realizado una solicitud de datos de 'quién está en línea' buscando el Quién está conectado Tecla (que utilizaremos más adelante) en el recibido. $ datos.

Si es así, responderemos con una serie de usuarios registrados del formulario:

 array ([ID de usuario] => [Inicio de sesión de usuario])

Según lo devuelto por Quién está conectado().

 función whoisonline_check_who_is_online ($ response, $ data, $ screen_id) // Actualizar la actividad del usuario $ user_id = get_current_user_id (); update_user_meta ($ user_id, 'whoisonline_last_active', time ()); update_user_meta ($ user_id, 'whoisonline_is_online', true); // Compruebe si "¿quién está en línea?" se ha solicitado si (! empty ($ data ['who-is-online'])) // Adjunte los datos que se enviarán $ response ['whoisonline'] = who_is_online ();  devolver $ respuesta;  add_filter ('heartbeat_received', 'whoisonline_check_who_is_online', 10, 3); add_filter ('heartbeat_received', 'whoisonline_check_who_is_online', 10, 3);

API de Heartbeat

Ahora crea el archivo JavaScript quien-es-online.js archivo en la raíz de su carpeta de plugin. A continuación se muestra el esquema del archivo..

Primero, iniciamos nuestra variable global. Quién está conectado. whoisonline.online y whoisonline.onlinePrev son ambas 'matrices asociativas' (estrictamente hablando, en términos de JavaScript, son objetos) de inicios de sesión de usuarios, indexados por ID de usuario, correspondientes a aquellos usuarios que están 'en línea' en el tiempo actual / anterior. Esto se utiliza para determinar cuándo un usuario ha iniciado o finalizado la sesión..

Luego iniciamos nuestra solicitud de datos sobre quién está en línea con wp.heartbeat.enqueue y escuche la respuesta vinculando una devolución de llamada al evento heartbeat-tick.whoisonline. En esa devolución de llamada, verificamos los datos devueltos por el servidor, realizamos las acciones necesarias y luego nos aseguramos de que nuestra solicitud de datos esté en cola para el siguiente tiempo.

 // Inicia las variables var whoisonline = online: false, onlinePrev: false; jQuery (document) .ready (function () // ¡Ajuste el tiempo inicial a rápido, solo con fines demostrativos! wp.heartbeat.interval ('fast'); // Encolar son datos wp.heartbeat.enqueue ('who-is -online ',' whoisonline ', false); jQuery (document) .on (' heartbeat-tick.whoisonline ', function (event, data, textStatus, jqXHR) if (data.hasOwnProperty (' whoisonline ')) / / Realizar acciones con los datos devueltos // En nuestro ejemplo, queremos adjuntar datos para el siguiente tiempo. // Esto podría no ser el caso en todas las aplicaciones: solo haga cola de datos cuando necesite. Wp.heartbeat.enqueue ( 'who-is-online', 'whoisonline', false);););

Ahora, vamos a completar los detalles de la lógica dentro de nuestra heartbeat-tick.whoisonline llamar de vuelta. Cada vez que se reciben datos del servidor, primero verificamos que contiene una matriz de usuarios registrados (que se darían con la clave 'whoisonline'), al verificar data.hasOwnProperty ('whoisonline'). Si es así…

  • Actualizar whoisonline.onlinePrev para reflejar quién estaba en línea en el último tiempo, y whoisonline.online para reflejar quién está en línea en el ritmo actual.
  • Compruebe las ID de usuario que aparecen en whoisonline.online, pero no están en whoisonline.onlinePrev. Estos usuarios acaban de iniciar sesión..
  • Compruebe las ID de usuario que aparecen en whoisonline.onlinePrev, pero no están en whoisonline.online. Estos usuarios acaban de cerrar sesión.

El archivo de JavaScript terminado entonces se ve como:

 var whoisonline = online: false, onlinePrev: false; jQuery (document) .ready (function () // Establecer el tiempo inicial como wp.heartbeat.interval ('fast') rápido; // Encolar son datos 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 == = falso) // Si se acaba de cargar, no digas nada ... whoisonline.online = data.whoisonline; whoisonline.onlinePrev = whoisonline.online || ; for (var id en whoisonline.onlinePrev) if (! whoisonline.online.hasOwnProperty (id)) jQuery.noticeAdd (text: whoisonline.onlinePrev [id] + "is offline"); for (var id en whoisonline.online) if (! whoisonline.onlinePrev .hasOwnProperty (id)) jQuery.noticeAdd (text: whoisonline.online [id] + "is now online"); wp.heartbeat.enqueue ('who-is-online', 'whoisonline', falso);););

Cargando nuestros scripts y estilos

Este complemento hará uso del complemento jQuery Notice de Tim Benniks, un complemento ligero de notificación tipo gruñido para jQuery. Simplemente descárguelo y extráigalo a la raíz de su complemento (debe constar de solo dos archivos: jquery.notice.js y jquery.notice.css)

Ahora que se ha agregado el complemento jQuery, la última pieza del rompecabezas es poner en cola los scripts y estilos necesarios. Queremos que este complemento funcione tanto en la parte frontal como en la parte administrativa, por lo que usaremos tanto admin_enqueue_scripts y wp_enqueue_scripts Hook, pero solo queremos cargar el script para usuarios registrados.

 Funcione whoisonline_load_scripts () / * Solo cargue scripts cuando lo necesite, en este caso, en todas partes si el usuario está conectado * / 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');

Y ese es el plugin terminado.

Puede ver el código completo en este repositorio de GitHub. Hay mucho espacio para mejorar aquí (por ejemplo, mostrar una lista de usuarios y cuándo se activaron por última vez), pero es de esperar que este complemento relativamente simple haya demostrado cómo funciona la API de Heartbeat.