Banner de consentimiento
Beaconry trae su propio banner de consentimiento de dos botones para que no necesites un plugin de cookies aparte para cumplir. Sigue el modelo estricto de la UE: no se rastrea nada hasta que el visitante acepta activamente. Sin casillas premarcadas, sin "al continuar aceptas", sin eventos en la red antes de un clic. El banner es el módulo nl-data-gate, el mismo motor del que el resto del pipeline lee su estado de consentimiento.
Por qué un banner integrado
El rastreo server-side no te exime del consentimiento. Tanto si la petición va de navegador a Meta como de servidor a Meta, sigues procesando los datos de un visitante con fines publicitarios, y en la UE eso necesita una base legal. Todo el pipeline de Beaconry se controla con una sola señal, la cookie nl_pref, y el banner es lo que la escribe. Puedes traer tu propio gestor de consentimiento en su lugar (mira "Apagar el banner" más abajo), pero si no tienes ninguno, el banner incluido hace que Beaconry cumpla out of the box, sin un solo plugin extra.
Que quede claro una cosa: el gate es real. Detiene todo el pipeline, despacho server-side incluido, no solo los píxeles de navegador. Hasta que nl_pref lleve analytics: true, el motor de navegador no dispara nada y el endpoint REST rechaza lo poco que pudiera llegarle. Sin aceptar no hay rastreo, punto.
Dos botones, sin consentimiento implícito
El banner renderiza exactamente dos acciones más un enlace de privacidad:
- Aceptar escribe el consentimiento con analytics y marketing en
truey deja correr el pipeline. - Rechazar escribe el consentimiento con analytics y marketing en
false. La decisión se guarda, así que no se molesta al visitante en cada página, pero no se rastrea nada. - Enlace de privacidad apunta a tu política de privacidad (configurable, mira abajo).
No hay un camino de consentimiento implícito a propósito. Hacer scroll no acepta. Navegar a la siguiente página no acepta. Cerrar el banner con Escape cuenta como rechazar, no como aceptar, porque descartar un diálogo nunca debe leerse como acuerdo. La única forma de iniciar el rastreo es un clic explícito en Aceptar. Ese es el comportamiento que exigen las reglas de la UE de "sin consentimiento implícito", y es el predeterminado sin ninguna configuración.
Hasta que exista una decisión, el banner simplemente permanece arriba y no se escribe ninguna cookie de consentimiento. En la primera página donde el visitante hace clic en Aceptar, se fija la cookie y se dispara un evento nl:gate:changed para que el motor de rastreo pueda arrancar de inmediato en esa misma página, sin recarga.
La cookie nl_pref
La única fuente de verdad para el consentimiento es una cookie first-party llamada nl_pref, escrita en el cliente con path=/; SameSite=Lax y (en HTTPS) el flag Secure. Contiene un objeto JSON, no un flag pelado:
{"analytics":true,"marketing":true,"functional":true,"timestamp":1733650800,"version":1}Qué significa cada campo:
analyticses el gate que Beaconry realmente lee.truedeja fluir los eventos,falselos bloquea.marketingregistra la misma decisión de aceptar/rechazar (el banner es binario, así que ambos se mueven juntos) y se usa al retirar el consentimiento para saber qué cookies de tracker purgar.functionales siempretrue; las cookies estrictamente necesarias no requieren opt-in.timestampes el segundo Unix en que se tomó la decisión, útil para registros de prueba de consentimiento.versiondeja que el esquema evolucione sin leer mal cookies antiguas.
La cookie dura un año (max-age 365 días), luego el banner reaparece para que el consentimiento se renueve periódicamente en lugar de asumirse para siempre. El valor se relee de forma defensiva: cualquier cosa que no sea JSON válido con una clave analytics booleana se trata como "todavía sin decisión" y el banner vuelve a mostrarse, así que una cookie corrupta o editada a mano nunca puede activar el rastreo en silencio.
Retirar el consentimiento limpia activamente. Según el artículo 7(3) del RGPD, revocar tiene que ser tan fácil como conceder. Cuando un visitante pasa de aceptar a rechazar, el motor no solo reescribe nl_pref, también caduca las cookies de tracker first-party comunes que se fijaron durante la sesión consentida (Google Analytics _ga* / _gcl_*, las propias del motor nl_sid / nl_dev / nl_ref / nl_ext, LinkedIn li_fat_id, Meta _fbp / _fbc, TikTok _ttp / ttclid y compañía) y, si hay un Meta Pixel presente, llama a fbq('consent', 'revoke') para que deje de enviar de inmediato. El visitante recibe un tarro de cookies limpio al retirar, no solo un cambio de flag.
Personalizar en la pestaña Banner
Todo lo que ve el visitante vive bajo wp-admin, Beaconry, Cookie Banner. Nada de aquí es obligatorio, cada campo recae en un valor por defecto incluido y sensato, así que una instalación nueva ya tiene un banner funcional y localizado.
Activar / desactivar
Un único interruptor maestro, "Mostrar el banner de consentimiento en la primera visita". La insignia de estado a su lado indica Visible u Oculto para que veas el estado actual de un vistazo.
Textos
Cuatro campos de texto, cada uno opcional, cada uno recayendo en el valor por defecto localizado cuando se deja en blanco:
| Campo | Qué define | Por defecto (EN) |
|---|---|---|
| Mensaje | El texto del cuerpo del banner | We use cookies for anonymous reach measurement. You can revoke at any time. |
| Botón aceptar | Etiqueta de la acción de aceptar | Accept |
| Botón rechazar | Etiqueta de la acción de rechazar | Reject |
| Texto del enlace de privacidad | Etiqueta del enlace de privacidad | Privacy |
Los valores por defecto incluidos están hardcodeados por idioma (alemán e inglés vienen en el motor) porque el banner se dispara muy temprano en el ciclo de vida de la página, antes de que el stack completo de traducción de WordPress esté listo, así que no puede depender de un override de idioma cargado tarde para su primera pintura.
Colores
Tres campos de color opcionales, "Fondo", "Color de texto" y "Acento (botones)". Deja cualquiera de ellos en blanco y el banner hereda ese token de tu tema activo, Beaconry solo sobrescribe un color del banner cuando defines un valor explícitamente. Cada campo tiene un selector de color nativo junto a un input hex para que puedas escribir #ff6a1a o elegirlo visualmente. El color de acento pinta el botón Aceptar; la acción de rechazar se queda como un discreto botón de texto subrayado por diseño, para que la opción principal sea visualmente obvia sin dark patterns.
URL de privacidad
Adónde apunta el enlace de privacidad. Déjalo en blanco y Beaconry enlaza a /datenschutz/ en el sitio actual. Ponlo en cualquier URL para apuntar a otro lugar. En instalaciones multilingües esta única URL se resuelve a la página por idioma correcta en el momento de la petición, cubierto en la siguiente sección.
Reabrir el banner más tarde
El consentimiento tiene que ser revocable. Coloca el shortcode [beaconry_revoke_consent] en tu página de privacidad (o donde sea) y renderiza un enlace inline "gestionar cookies" que borra nl_pref y vuelve a mostrar el banner para que el visitante pueda cambiar de opinión. Sobrescribe la etiqueta con [beaconry_revoke_consent text="Gestionar cookies"]. Por dentro, el enlace lleva el atributo data-nl-cookie-settings que el motor del banner escucha, así que reabre el diálogo en vivo en lugar de solo recargar.
Accesibilidad
El banner es un diálogo modal de verdad, no un div con estilo, y se comporta como tal para usuarios de teclado y lector de pantalla:
role="dialog"+aria-modal="true"con unaria-labellocalizado ("Cookie settings" / "Cookie-Einstellungen"), para que la tecnología asistiva lo anuncie como un diálogo modal con nombre.- El foco se mueve dentro del diálogo al mostrarse. Cuando el banner se desliza, el foco aterriza en el botón Aceptar, así que un usuario de teclado o lector de pantalla está de inmediato dentro del diálogo en lugar de buscarlo.
- El foco queda atrapado. Tab y Shift+Tab circulan solo entre el enlace de privacidad y los dos botones; no puedes salir con Tab a la página detrás del diálogo mientras haya una decisión pendiente.
- Escape descarta como rechazar. Según la WCAG 2.1, un diálogo debe responder a Escape; aquí Escape guarda una decisión de rechazo (nunca una aceptación silenciosa) y cierra el banner.
- Indicadores de foco visibles. Los botones y el enlace de privacidad tienen contornos
:focus-visibleexplícitos, así que el foco de teclado siempre es visible sin importar el tema. - Tras una decisión, el foco se libera. El elemento activo se desenfoca al aceptar o rechazar para que el foco vuelva limpiamente al flujo del documento.
También respeta prefers-reduced-motion: la transición de deslizamiento se reemplaza por un simple fundido de opacidad para visitantes que pidieron al SO reducir el movimiento. Y se renderiza fuera del camino crítico (en un idle callback) para que nunca bloquee la primera pintura ni perjudique tu Largest Contentful Paint.
Multilingüe (WPML y Polylang)
Dos cosas tienen que localizarse en un sitio multilingüe: el texto del banner y la URL de privacidad (un visitante alemán debería aterrizar en /datenschutz/, uno inglés en /privacy-policy/). Beaconry maneja ambas, y el lugar correcto para traducir depende de qué plugin uses. La pestaña Banner muestra una pista "WPML detected" o "Polylang detected" que te dirige a la pantalla exacta.
Texto del banner
Los cuatro campos de texto (mensaje, aceptar, rechazar, texto del enlace de privacidad) más la URL de privacidad se declaran como strings traducibles:
- WPML. Beaconry incluye un
wpml-config.xmlque declara las claves de opciones del banner como textos de admin, así que aparecen automáticamente en WPML, String Translation bajo el dominioadmin_texts_bcnr_settings. Traduce ahí cada campo por idioma activo; WPML devuelve el valor traducido cuando los ajustes se leen en una petición de idioma no predeterminado, así que el camino de lectura normal de Beaconry recoge la traducción de forma transparente sin cableado extra. - Polylang. Polylang no tiene archivo de config declarativo, así que Beaconry registra las mismas claves vía
pll_register_stringen tiempo de admin. Aparecen bajo Idiomas, Traducciones en el grupo de stringsBeaconry. Solo se registran los campos que realmente rellenaste (un campo vacío se queda en su valor por defecto localizado incluido y no satura la lista).
Si dejas los campos de texto completamente en blanco, igual obtienes textos correctos por idioma de los valores por defecto en alemán e inglés incluidos, sin paso de traducción para esos dos. La ruta de String Translation es para cuando quieres tu propia redacción por idioma.
URL de privacidad por idioma
Introduces una URL de privacidad en la pestaña Banner, y Beaconry la resuelve al idioma del visitante en el momento de la petición. El resolutor pasa por el filtro bcnr_privacy_url:
- Si no hay ningún plugin multilingüe activo, la URL pasa intacta.
- La URL configurada se mapea a un post de WordPress vía
url_to_postid(). Si no resuelve a un post (una ruta estática, una URL externa), se devuelve tal cual, sin adivinar. - De lo contrario, Beaconry pregunta a WPML (
wpml_object_id) o Polylang (pll_get_post) por la traducción de esa página en el idioma actual y devuelve el permalink traducido. - Si no hay traducción para el idioma actual, recae en la URL original. El resolutor nunca devuelve vacío.
Así que apuntas el banner a, digamos, tu política de privacidad en inglés una vez, creas su traducción al alemán como una página de traducción normal de WPML/Polylang, y los visitantes alemanes obtienen automáticamente el permalink alemán en el enlace del banner. Sin un segundo campo de URL, sin lista de overrides por idioma.
Para setups exóticos (TranslatePress, MultilingualPress, un build personalizado) la detección es filtrable vía bcnr_is_multilingual, y puedes engancharte a bcnr_privacy_url directamente para aportar tu propio resolutor.
Apagar el banner (trae tu propio consentimiento)
Si ya usas una plataforma de gestión de consentimiento dedicada, apaga el banner de Beaconry y deja que tu CMP dirija el consentimiento. El contrato es simple: tu CMP debe escribir la cookie nl_pref ella misma. En concreto:
- El nombre de la cookie debe ser exactamente
nl_pref. - El valor debe ser un objeto JSON que contenga
"analytics"con un booleano (por ejemplo{"analytics": true, "marketing": true}). - Debe fijarse antes de cualquier carga de página que quieras rastrear.
Con el banner apagado y sin cookie presente, no se dispara nada, ese es el valor por defecto seguro, no un bug. Apaga el banner solo si tienes una solución externa que escribe la cookie, o si tu sitio opera de verdad en una región sin obligación de consentimiento. También hay un matiz para usuarios avanzados en sitios fuera de la UE: con el banner desactivado y sin cookie existente, el loader escribe un nl_pref permisivo para que el rastreo pueda correr sin banner. Úsalo solo donde tengas la certeza de que el consentimiento no es legalmente obligatorio.
¿Usa esto el sitio de marketing?
No, y es deliberado. beaconry.app no incluye GA4, ni Meta Pixel, ni motor de rastreo, ni banner de cookies, porque no hay nada que consentir. Un producto que vende rastreo respetuoso con la privacidad no debería rastrear en silencio a la gente que lee sobre él. El banner descrito aquí es lo que tus visitantes ven en tu sitio una vez que instalas el plugin y lo activas.