Contents
Introducción: ¿qué es Heartbeat y por qué controlarlo?
El Heartbeat API de WordPress es un mecanismo que permite a WordPress y a plugins comunicarse periódicamente entre el navegador y el servidor mediante llamadas AJAX (admin-ajax.php). Se usa para funcionalidades como autosave, bloqueo de edición (post locking), notificaciones en tiempo real, y sincronización de datos en el editor. Por defecto envía pulsos cada ~15 segundos en el admin, lo que en entornos con muchas sesiones simultáneas o en hosting compartido puede aumentar la carga del servidor y el número de peticiones admin-ajax.php.
Reducir o controlar la actividad del Heartbeat puede mejorar rendimiento y consumo de recursos, pero hay que hacerlo con cuidado: desactivar o espaciar en exceso funciones como el autosave y el bloqueo de post puede causar pérdida de datos o colisiones de edición. En este artículo se explica en detalle cómo reducir su actividad con filtros PHP y con scripts de control en JavaScript, cuándo aplicarlo y ejemplos prácticos seguros.
Principios y buenas prácticas
- Priorizar seguridad y experiencia de usuario: no desactives el Heartbeat de forma global sin evaluar el impacto (autosave, post-lock).
- Aplicar cambios por contexto: aumentar el intervalo en el front-end o en pantallas de bajo riesgo, y mantener intervalos más cortos sólo donde haga falta (p. ej. colaboración en tiempo real).
- Probar y medir: usar la pestaña Network (filtro XHR) del navegador o herramientas como Query Monitor para comprobar las llamadas a admin-ajax.php antes y después.
- Implementar en plugin o en un mu-plugin: evitar perder cambios con cambios de tema lo ideal es un plugin propio o un mu-plugin para producción.
Métodos principales para reducir la actividad de Heartbeat
- Modificar el intervalo con el filtro PHP heartbeat_settings.
- Desregistrar/detener el script Heartbeat en contextos específicos (por ejemplo en el front-end si no es necesario).
- Interceptar y modificar los datos que se envían mediante eventos JavaScript (heartbeat-send) para evitar payloads pesados.
- Usar un script cliente (JS) que cambie dinámicamente el intervalo según la actividad del usuario o la pantalla.
1) Cambiar el intervalo de Heartbeat mediante filtro PHP
El filtro heartbeat_settings permite modificar parámetros del Heartbeat que se envían al cliente. Cambiar únicamente el intervalo suele ser la forma más segura de reducir la carga sin perder funcionalidad.
Ejemplo: aumentar el intervalo global a 60 segundos (añádelo a un plugin o a functions.php de tu child theme):
Consejo: en lugar de aplicar esto globalmente, valora aplicarlo sólo en front-end o en pantallas donde no se necesite autosave.
2) Desactivar o deregistrar Heartbeat en el front-end
Si no necesitas Heartbeat en la parte pública del sitio, puedes desregistrarlo en las páginas no administrativas. Atención: algunos plugins de e-commerce, notificaciones o formularios pueden depender del Heartbeat en front-end.
Este enfoque elimina completamente el Heartbeat en el front-end. Si prefieres mantenerlo pero con menor frecuencia, usa el filtro heartbeat_settings sobre is_admin() o condiciones equivalentes.
3) Controlar el intervalo con un script en el cliente (JS)
En muchas ocasiones es útil cambiar el intervalo sólo en pantallas concretas, por ejemplo al editar entradas. Para eso se encola un script que depende de heartbeat y que modifica la configuración del Heartbeat en el cliente.
Encola el script desde PHP (ejecutar sólo en pantallas de edición de posts):
120, // segundos deseados ) ) } ?>
Contenido del archivo heartbeat-control.js (ajusta la lógica al uso):
jQuery( function( ) { // Asegurarse de que heartbeat y la variable localizada existen if ( typeof heartbeat !== undefined typeof miHb !== undefined miHb.interval ) { heartbeat.interval( parseInt( miHb.interval, 10 ) ) } // Ejemplo avanzado: aumentar el intervalo cuando no hay actividad del usuario var lastActivity = Date.now() ( document ).on( mousemove keydown scroll, function() { lastActivity = Date.now() } ) setInterval( function() { var idle = Date.now() - lastActivity if ( idle > 1000 60 10 ) { // 10 minutos inactivo heartbeat.interval( 600 ) // 10 minutos entre pulsos } else { heartbeat.interval( parseInt( miHb.interval, 10 ) ) } }, 1000 60 ) // comprobar cada minuto } )
Este patrón permite adaptar la frecuencia al comportamiento del usuario y reducir peticiones cuando la sesión está inactiva.
4) Interceptar y reducir los datos que se envían en cada pulso
Algunos plugins agregan grandes cantidades de datos al Heartbeat. Interceptar el evento heartbeat-send en JavaScript permite eliminar o simplificar esos datos antes de que se envíen, reduciendo carga tanto en tráfico como en procesamiento server-side.
jQuery( document ).on( heartbeat-send, function( e, data ) { // Ejemplo: impedir que un plugin (p. ej. wc para WooCommerce) añada su carga if ( data.hasOwnProperty( wc ) ) { delete data.wc } // Ejemplo: condicional para evitar enviar datos si no hay actividad real // if ( condicion_de_inactividad ) { for ( var k in data ) { if ( data.hasOwnProperty(k) ) delete data[k] } } } )
Combinar esta técnica con intervalos mayores produce un ahorro significativo en tráfico y procesamiento.
Ejemplos combinados y recomendaciones de implementación
A continuación, un flujo recomendado que puedes ajustar según el sitio:
- Mide la carga actual (Query Monitor, Network). Identifica origen de peticiones y payloads.
- Si Heartbeat no es necesario en el front-end: deregistrarlo en front-end.
- Si Heartbeat es necesario en admin, aumentar el intervalo para la mayoría de pantallas (p. ej. 60-120s), y mantener 15s sólo donde haya colaboración en tiempo real.
- Interceptar y eliminar datos innecesarios con heartbeat-send en JS, si encuentras payloads grandes de plugins.
- Probar en staging y monitorizar errores/efectos secundarios (autoguardado, bloqueo de post, notificaciones).
Tabla orientativa de intervalos
Contexto | Intervalo recomendado | Impacto |
---|---|---|
Editor colaborativo en tiempo real | 15-30s | Mejor sincronización, mayor carga |
Editor normal (un solo autor) | 60-120s | Autosave razonable, menor carga |
Front-end sin funciones en tiempo real | Desactivado o >300s | Reduce muchas peticiones comprobar dependencias |
Sitios con muchas sesiones simultáneas | 120-600s | Reduce carga en hosting compartido |
Pruebas y verificación
- Usa la pestaña Network del navegador y filtra por XHR para ver las llamadas a admin-ajax.php y su frecuencia.
- Instala Query Monitor para visualizar llamadas AJAX y hooks que usan Heartbeat.
- Revisa logs de servidor y consumo de CPU/IO antes y después de aplicar cambios.
- Comprueba funcionalidades críticas: autosave, bloqueo de edición, notificaciones y cualquier plugin que use Heartbeat.
Ejemplo práctico: plugin mínimo para aumentar intervalo sólo en el editor
Un plugin simple que aumenta el intervalo sólo en post.php/post-new.php y protege el front-end:
120 ) ) } ?>
Archivo heartbeat-control.js (colocar en la misma carpeta del plugin):
jQuery( function( ) { if ( typeof heartbeat !== undefined typeof chsHb !== undefined chsHb.interval ) { heartbeat.interval( parseInt( chsHb.interval, 10 ) ) } } )
Advertencias finales
- No subas el intervalo a valores extremos si dependes de features en tiempo real (p. ej. editores colaborativos, notificaciones críticas).
- Informa a tu equipo de edición sobre cualquier cambio en autosave o bloqueo para evitar confusiones.
- Si usas soluciones de caché agresivas o proxies, controla que no interfieran con el comportamiento del Heartbeat.
Resumen
Reducir la actividad del Heartbeat es una intervención muy efectiva para bajar la carga en entornos con muchas conexiones simultáneas, siempre que se haga de forma selectiva y probada. Las técnicas más seguras son: aumentar el intervalo con heartbeat_settings, desregistrar Heartbeat sólo en front-end cuando no sea necesario, y usar scripts en cliente para modular la frecuencia y el contenido enviado. Testea en staging y vigila la funcionalidad crítica (autosave, bloqueo de post) antes de aplicar en producción.
|
Acepto donaciones de BAT's mediante el navegador Brave 🙂 |