ODSLocal RGPD & Cookies (España)
PHP ≥ 8.1
WordPress ≥ 6.0
GPL v2+
Autor: Baqueiro
1. Alcance legal
ODSLocal RGPD cubre los tres marcos normativos aplicables a cualquier sitio web operado desde España:
- RGPD (Reglamento UE 2016/679) — bases de legitimación, derechos ARSOLP, delegado de protección (DPO), registros.
- LOPDGDD (Ley Orgánica 3/2018 de Protección de Datos) — menores, videovigilancia, deberes del responsable.
- LSSI-CE (Ley 34/2002) + guía AEPD 2024 — banner de cookies con aceptar/rechazar en igualdad visual, configuración granular, sin barreras de navegación.
Ningún plugin sustituye el asesoramiento jurídico. Revisa con tu DPO los textos generados. Los nombres y direcciones en los ajustes deben corresponder a la persona jurídica real responsable del tratamiento.
2. Instalación
- Sube
odslocal-rgpd/awp-content/plugins/. - Actívalo. La activación:
- Crea 5 páginas legales con sus shortcodes.
- Crea 2 tablas:
wp_odslocal_rgpd_consents(auditoría de consentimientos) ywp_odslocal_rgpd_requests(solicitudes de derechos). - Programa el cron diario
odslocal_rgpd_cleanup.
- Rellena la ficha de la organización (CIF, domicilio, DPO) en Ajustes → RGPD.
- Revisa el inventario de cookies y ajusta si tienes cookies propias no contempladas.
- Comprueba el banner en una ventana incógnita.
3. Páginas legales autocreadas
En la activación se crean (si no existen) estas páginas:
| Slug | Shortcode | Contenido | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
/aviso-legal/ |
(generado) | Identificación del titular, CIF, domicilio, contacto. | |||||||||||||||||||||||||
/politica-privacidad/ |
(generado) | Finalidades, bases legales, destinatarios, derechos, DPO. | |||||||||||||||||||||||||
/politica-cookies/ |
(generado + ) |
Tipología, duración, terceros. | |||||||||||||||||||||||||
/condiciones-uso/ |
(generado) | Términos de uso del sitio. | |||||||||||||||||||||||||
/ejercicio-derechos/ |
|
Formulario ARSOLP. |
Los textos incluyen enlaces internos correctos entre ellas (aviso ↔ privacidad ↔ cookies ↔ derechos).
4. Ajustes obligatorios
Ajustes → RGPD → Pestaña Organización:
| Campo | Importancia |
|---|---|
| Razón social | Obligatorio. Persona jurídica responsable. |
| CIF / NIF | Obligatorio. |
| Domicilio social | Obligatorio. |
| Email de contacto | Se usa como Reply-To de los emails automáticos. |
| Sitio web | Sanitizado con esc_url_raw. |
| Datos del DPO | Nombre + email; aparecen en la política de privacidad. |
| Autoridad de control | Por defecto AEPD; puede sobreescribirse (p. ej. autoridades autonómicas). |
| Retención de consentimientos | Meses. Por defecto 24. |
6. Bloqueador de scripts previo al consentimiento
Antes de que el usuario consienta, el plugin impide que se disparen cookies/trackers de terceros:
- Intercepta
wp_enqueue_scriptpara scripts conocidos (GA, Meta Pixel, Hotjar, Clarity, TikTok, etc.). - Reescribe los scripts a
type="text/plain" data-cookiecategory="analytics|marketing". - Al aceptar, el JS del banner flipea el tipo a
text/javascripty re-evalúa. - Si el usuario rechaza, los scripts permanecen inertes hasta que revoque la decisión.
6.1 Añadir mi propio script
add_filter('odslocal_rgpd_script_category', function($category, $handle){
if ($handle === 'mi-tracker') return 'marketing';
return $category;
}, 10, 2);
7. Inventario de cookies
Ajustes → RGPD → Cookies contiene la matriz completa:
| Campo | Ejemplo |
|---|---|
| Nombre | _ga |
| Categoría | Analítica |
| Proveedor | Google LLC |
| Finalidad | Distinguir usuarios únicos |
| Duración | 2 años |
| País | EE. UU. (con cláusula de transferencia internacional) |
Botón «Añadir cookie» (dinámico, sin recarga) para añadir cookies propias. El shortcode la renderiza en la política.Cookie Proveedor Finalidad Duración Categoría wordpress_logged_in_*WordPress Sesión de usuario autenticado Sesión Técnicas o estrictamente necesarias wp-settings-*WordPress Preferencias del panel 1 año Preferencias odslocal_rgpd_consenthttps://odslocal.es Guardar tu elección de cookies 12 meses Técnicas o estrictamente necesarias bdw_oc_fkhttps://odslocal.es Técnica y de seguridad. Vincula al navegador de la persona usuaria los mensajes que se muestran tras enviar un formulario (por ejemplo, los datos rellenados cuando hay un error o la consulta del estado de un envío), para que esa información no pueda verse desde otro dispositivo aunque se comparta el enlace. No se usa para analítica, publicidad ni seguimiento. Sesión Técnicas o estrictamente necesarias
8. Formulario de ejercicio de derechos
en /ejercicio-derechos/.
Tipos de solicitud
- Acceso (art. 15).
- Rectificación (art. 16).
- Supresión (art. 17 — derecho al olvido).
- Oposición (art. 21).
- Limitación (art. 18).
- Portabilidad (art. 20).
Flujo
- Usuario rellena: nombre, DNI/NIE, email, tipo de solicitud, motivo.
- Al enviar: se guarda en
wp_odslocal_rgpd_requestscon estadopending, se genera unrequest_codey se envía email al DPO + confirmación al solicitante. - El DPO entra en RGPD → Solicitudes, responde y marca como
in_progress/resolved/rejected. - Plazo legal: 30 días (ampliable a 2 meses más con motivación).
Anti-abuso
- Rate limit: 3 solicitudes del mismo email en 10 minutos.
- Honeypot invisible.
- Nonce + capability.
9. Shortcodes
| Shortcode | Propósito | |||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Formulario ARSOLP. | |||||||||||||||||||||||||
Ajustes de cookies |
Botón «Preferencias de cookies» para reabrir el banner (ideal en el footer). | |||||||||||||||||||||||||
|
Tabla completa de cookies. | |||||||||||||||||||||||||
|
Ficha legal de la empresa (razón social, CIF, domicilio, contacto). |
10. Registro de consentimientos
Tabla wp_odslocal_rgpd_consents con la evidencia de cada consentimiento:
| Campo | Valor |
|---|---|
uid |
UUID v4 del cliente (cookie del browser). |
action |
accept, reject, granular. |
categories |
JSON: {analytics: true, marketing: false}. |
policy_version |
Versión de la política vigente en ese momento. |
url |
URL donde se prestó el consentimiento. |
ip_hash |
Hash SHA-256 de la IP (no se guarda la IP clara). |
user_agent |
Truncado a 255 chars. |
created_at |
UTC. |
Los campos anteriores permiten demostrar ante una inspección AEPD qué consintió el usuario, cuándo, en qué URL, y sobre qué versión de la política, sin necesidad de guardar la IP en claro.
11. Retención y cron
- Cron
odslocal_rgpd_cleanupcorre diariamente. - Elimina consents más antiguos que
consent_retention_months(por defecto 24 meses). - Elimina requests resueltas hace más de 1 año (por ley de cancelación).
12. Seguridad y hardening
- IP spoofing resistant:
REMOTE_ADDRpor defecto;X-Forwarded-For/CF-Connecting-IPsolo siREMOTE_ADDRes privado/loopback (proxy real) o vía filtroodslocal_rgpd_trust_proxy_headers. - Rate limit en AJAX de consentimiento: dedupe UID+acción (2 s) + cap 30 filas/IP/5 min.
- Header injection:
Reply-Tosaneado contra CR/LF y specials RFC 5322. - URL sanitization:
esc_url_rawencompany_websiteysupervisory_url(bloqueajavascript:). - Nonce en todas las acciones AJAX y admin.
- Access-gated AJAX: rechazo de solicitudes sin capability apropiada.
13. Solución de problemas
El banner no aparece
- ¿Estás en ventana incógnita? Si ya consentiste, se oculta 12 meses.
- Comprueba Ajustes → Banner → Activo.
- ¿Tu CDN/cache sirve el HTML sin el banner? Purga.
Google Analytics se carga aunque rechace
- Revisa que GA está integrado vía
wp_enqueue_script(no inline en<head>del theme). - Si es inline, añade tu propia categoría via el filtro mostrado en §6.1.
Solicitudes de derechos no llegan al DPO
- Verifica que el email del DPO está configurado.
- Revisa spam.
- Instala WP Mail SMTP si tu host bloquea SMTP saliente.
IP siempre 127.0.0.1 en los consentimientos
Estás detrás de un reverse proxy que pasa la IP en un header no reconocido. Activa el trust explícito:
add_filter('odslocal_rgpd_trust_proxy_headers', '__return_true');