Detectar el cuerpo real
Un mu-plugin localiza el rango de bloques de texto del artículo y excluye header, footer, índice, compartir, relacionados y categorías.
Qué artículos se leen hasta el final, dónde se abandonan y qué componentes se usan. Lo construí completo: plugin, dataLayer, Tag Manager, GA4 y dashboard. Y encontré dos fallos que no estaban en el código.
El blog medía vistas y algunos clics sueltos. No había forma de saber si un artículo se leía o se abandonaba en el primer párrafo, ni de segmentar por categoría o idioma.
Complicación técnica: la plantilla de artículo estaba montada con un page builder, sin contenedor semántico del cuerpo. Medir el scroll de toda la página habría mezclado header, barra lateral y footer.
Lo que parecía obvio y no era. Descartar bien ahorra días de trabajo en la dirección equivocada.
Mide la página, no el artículo, y solo a un umbral.
Añadía riesgo en cada rediseño. Mejor detectar el cuerpo desde el DOM.
Útil, pero no alimenta GA4 ni permite cruzar con conversión.
Un mu-plugin localiza el rango de bloques de texto del artículo y excluye header, footer, índice, compartir, relacionados y categorías.
article_view, reading_depth (25/50/75/100), article_complete, reading_session_end y category_click, todos con categoría, idioma, ID, título y número de palabras.
11 variables de dataLayer, 5 activadores de evento y 5 etiquetas de GA4, más 7 dimensiones y 2 métricas personalizadas.
El plugin empujaba al dataLayer, pero el workspace de GTM llevaba 8 días sin publicar. Además, una propiedad antigua de GA4 que se creía pausada seguía recibiendo eventos.
El desglose por artículo solo funcionaba para un evento. El plugin enviaba el título en todos; faltaba el parámetro en 4 etiquetas de GTM.
Looker Studio con embudo de abandono, finalización por artículo y uso de componentes, filtrable por categoría e idioma.
Fragmentos simplificados y sin datos del cliente, para que se vea el enfoque técnico real.
window.dataLayer.push({
event: 'reading_depth',
percent: 75,
max_percent: 75,
post_id: 18234,
post_title: 'How to …',
post_category: 'Guides',
content_language: 'en',
word_count: 1840,
reading_time_min: 8
});const start = body.getBoundingClientRect().top + scrollY;
const end = start + body.offsetHeight - innerHeight;
const pct = Math.min(100, Math.max(0, (scrollY - start) / (end - start) * 100));
[25, 50, 75, 100].forEach(t => { if (pct >= t && !sent.has(t)) { sent.add(t); push(t); } });Cada evento lleva el contexto completo del artículo. Así cualquier informe se puede cortar por post sin cruces.
El dato ya salía bien del sitio; el fallo estaba aguas abajo.
| Indicador | Antes | Después | Contexto |
|---|---|---|---|
| Eventos de lectura | 1 | 5 | profundidad, finalización, sesión, categorías |
| Definiciones propias en GA4 | 0 | 9 | 7 dimensiones + 2 métricas |
| Eventos atribuidos por artículo | 1 de 5 | 5 de 5 | parámetro añadido en GTM |
| Propiedad antigua activa | Sin detectar | Identificada | limpieza aparte |
Cuando «no llegan los datos», recorro la cadena entera en orden: dataLayer, contenedor publicado, parámetros de cada etiqueta y definiciones en GA4.
Solo al 90 % de la página completa. No distingue el artículo del resto ni mide finalización.
No. Acumulan desde que se registran.
No en este caso: el cuerpo del artículo se detecta desde el DOM.
Si ya tienes un WordPress en producción, reviso el contexto y te digo con honestidad si lo que necesitas es desarrollo, SEO técnico, rendimiento o automatización.
Empezar un proyecto