Mi cuenta

ODSLocal RGPD & Cookies (España)

Cumplimiento integral del RGPD, LOPDGDD y LSSI-CE — para webs en territorio español
Versión 1.0.1
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.
⚠ Este plugin es una herramienta
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

  1. Sube odslocal-rgpd/ a wp-content/plugins/.
  2. Actívalo. La activación:
    • Crea 5 páginas legales con sus shortcodes.
    • Crea 2 tablas: wp_odslocal_rgpd_consents (auditoría de consentimientos) y wp_odslocal_rgpd_requests (solicitudes de derechos).
    • Programa el cron diario odslocal_rgpd_cleanup.
  3. Rellena la ficha de la organización (CIF, domicilio, DPO) en Ajustes → RGPD.
  4. Revisa el inventario de cookies y ajusta si tienes cookies propias no contempladas.
  5. 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/
1. Identificación
2. Derecho que desea ejercer *
3. Detalles
4. Acreditación de identidad

Para tramitar tu solicitud necesitamos verificar tu identidad. Adjunta una imagen o PDF de tu DNI / NIE / Pasaporte. El documento se guardará en una zona privada del servidor, sólo accesible para el responsable del tratamiento, y se eliminará una vez resuelta la solicitud.

5. Verificación anti-spam

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_script para 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/javascript y 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.

8. Formulario de ejercicio de derechos

1. Identificación
2. Derecho que desea ejercer *
3. Detalles
4. Acreditación de identidad

Para tramitar tu solicitud necesitamos verificar tu identidad. Adjunta una imagen o PDF de tu DNI / NIE / Pasaporte. El documento se guardará en una zona privada del servidor, sólo accesible para el responsable del tratamiento, y se eliminará una vez resuelta la solicitud.

5. Verificación anti-spam

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

  1. Usuario rellena: nombre, DNI/NIE, email, tipo de solicitud, motivo.
  2. Al enviar: se guarda en wp_odslocal_rgpd_requests con estado pending, se genera un request_code y se envía email al DPO + confirmación al solicitante.
  3. El DPO entra en RGPD → Solicitudes, responde y marca como in_progress / resolved / rejected.
  4. 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
1. Identificación
2. Derecho que desea ejercer *
3. Detalles
4. Acreditación de identidad

Para tramitar tu solicitud necesitamos verificar tu identidad. Adjunta una imagen o PDF de tu DNI / NIE / Pasaporte. El documento se guardará en una zona privada del servidor, sólo accesible para el responsable del tratamiento, y se eliminará una vez resuelta la solicitud.

5. Verificación anti-spam

Formulario ARSOLP.
Ajustes de cookies Botón «Preferencias de cookies» para reabrir el banner (ideal en el footer).
Tabla completa de cookies.
  • Titular: Facultade de Ciencias Económicas e Empresariais
  • CIF/NIF: Q8650002B
  • Domicilio: Campus Lagoas-Marcosende s/n, Universidade de Vigo, Vigo, Pontevedra, España
  • Email: contacto@odslocal.es
  • Teléfono: —
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.
ℹ Cumplimiento «jurídicamente defensable»
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_cleanup corre 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_ADDR por defecto; X-Forwarded-For / CF-Connecting-IP solo si REMOTE_ADDR es privado/loopback (proxy real) o vía filtro odslocal_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-To saneado contra CR/LF y specials RFC 5322.
  • URL sanitization: esc_url_raw en company_website y supervisory_url (bloquea javascript:).
  • 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');
Saltar al contenido principal