Registro de consentimientos de términos y condiciones

Descripción

El artículo 7.1 del RGPD exige algo más que un valor booleano: El registro del consentimiento, que debe poder justificarse, debe incluir una marca temporal, la dirección IP, el agente de usuario, la versión del documento vigente en ese momento y el texto exacto que se mostró al usuario.

Registro de consentimiento de términos y condiciones cubre esta carencia para cualquier casilla de aceptación de tu sitio, con o sin WooCommerce. Todos los consentimientos aceptados, ya sea en la página de finalizar compra de WooCommerce, en un formulario de Contact Form 7, en el formulario de comentarios de WordPress o en un shortcode o bloque independiente, se registran en una fila de una tabla indexada específica, sellada con un hash SHA-256 del texto aceptado, para que cualquier cambio posterior sea detectable. Desde una pantalla de administración clara, puedes filtrar, buscar, exportar a CSV, integrar con las herramientas de privacidad nativas de WordPress y abrir un certificado imprimible tamaño A4 por registro (tu navegador lo guarda como PDF con un solo clic).

Funciona con o sin WooCommerce

Si está activo WooCommerce el menú está en «WooCommerce Consentimientos» y el proceso de finalizar compra se registra automáticamente. En caso contrario, el menú está en «Usuarios Consentimientos» y el resto del plugin (registros, ajustes, exportación a CSV, certificado en PDF, integración con herramientas de privacidad) sigue funcionando de la misma manera.

Cuatro orígenes de consentimiento

  • Finalizar compra de WooCommerce (automático cuando está activo WC): Captura la casilla nativa de términos y condiciones.
  • Contact Form 7 (suscripción): Detecta automáticamente los campos [acceptance] y el primer campo de correo electrónico del formulario. Se almacena como cf7_form_{ID}, un tipo por formulario. No se necesitan fragmentos de código.
  • Comentarios de WordPress (consentimiento expreso): Registra la casilla de verificación nativa wp-comment-cookies-consent (introducida en WP 4.9.6) cuando el visitante da su consentimiento. Se almacena como comment_consent.
  • Shortcode [tccl_consent_box] y bloque Gutenberg: Inserta una casilla de consentimiento independiente en cualquier página, entrada, área de widgets o campo HTML de un generador de formularios. El envío se realiza a una variable REST y se crea un registro. Siempre disponible.

Para cualquier otro caso (Gravity Forms, WPForms, Fluent Forms, flujos personalizados), llama a tccl_save_consent() desde el gancho correspondiente.

Por qué una tabla específica

Almacenar miles de registros de consentimiento en wp_postmeta resulta ineficaz y lento. El plugin utiliza su propia tabla indexada y ofrece una función pública (tccl_save_consent) a la que puedes llamar desde cualquier lugar para registrar consentimientos adicionales en un mismo lugar.

Características principales

  • Registra la marca temporal en UTC, la dirección IP, el agente de usuario, la versión del documento, la URL de origen y el texto completo del consentimiento de cada aceptación.
  • Tabla de base de datos personalizada con los índices correctos (para no saturar wp_postmeta).
  • A prueba de manipulaciones: Cada registro está sellado con un hash SHA-256. Cualquier modificación posterior del texto almacenado se detecta y se señala como «MANIPULADO» en la lista de registros.
  • Certificado imprimible en A4 de cada registro, con un botón integrado «Imprimir / Guardar como PDF»: El navegador exporta el certificado a PDF de forma nativa, sin necesidad de librerías externas.
  • Integración con las herramientas de privacidad nativas: Herramientas > Exportar datos personales y Herramientas > Borrar datos personales incluyen registros de consentimiento (el borrado anonimiza los datos en lugar de borrarlos, ya que el registro en sí mismo es la base legal para conservarlos).
  • Los textos de la página de finalizar compra de WooCommerce son opcionales. Si los dejas en blanco se mostrarán al cliente los textos nativos de WooCommerce y se guardarán tal cual.
  • Aumento automático de la versión cuando cambia el texto (se sugiere MAJOR.MINOR-AAAA-MM-DD).
  • Desactivación opcional del almacenamiento de IP y/o agente de usuario.
  • Retención configurable con un botón de anonimización con un solo clic (se conservan los registros, se borra la información de identificación personal).
  • Filtros en tiempo real con coincidencia parcial (correo electrónico, pedido, intervalo de fechas, tipo) + exportación a CSV filtrada con tabla de caracteres UTF-8 (se abre fácilmente en Excel).
  • (Cuando está activo WooCommerce) Caja meta en el pedido con el resumen del consentimiento, el distintivo de integridad y el indicador de versión obsoleta. Columna «Consentimiento» en la lista de pedidos (versión clásica y HPOS) con un indicador visual rápido del estado. Línea de consentimiento opcional en el correo electrónico de nuevo pedido (administrador) y en el correo electrónico de confirmación del pedido (cliente) , ambas desactivadas por defecto.
  • Ajuste opcional delete_data_on_uninstall (desactivado por defecto). La desinstalación no borra evidencias de consentimiento a menos que tú lo decidas explícitamente.
  • Compatible con HPOS (tablas de pedidos personalizadas).
  • Función pública tccl_save_consent() para registrar consentimientos desde cualquier lugar.

Preparado para traducciones

Todas las cadenas utilizan el dominio de texto terms-conditions-consent-log. Las traducciones se gestionan a través de translate.wordpress.org.

Soporte

¿Necesitas ayuda o tienes sugerencias?

¿Te gusta el plugin? ¡Déjanos un comentario de 5 estrellas y así ayudas a que lo conozcan otros!

Acerca de AyudaWP.com

Somos especialistas en plugins de optimización de seguridad, SEO, IA y rendimiento para WordPress. Creamos herramientas que solucionan problemas reales a los propietarios de sitios WordPress manteniendo los más altos estándares de programación y requisitos de accesibilidad.

Capturas

  • Lista de registros con los filtros activos, columna de integridad y exportación a CSV.
  • Página de ajustes con los textos modificables, el control de versiones, opciones de correo electrónico y control de desinstalación.
  • Caja meta en el pedido, con el resumen del consentimiento, sello de integridad y botón para imprimir el certificado.
  • Columna de consentimientos en el listado de pedidos.
  • Certificado A4 imprimible listo para guardarse como PDF desde el navegador.
  • Archivo CSV exportado con registros filtrados (cabecera con metadatos + nombres de columnas comprensibles).

Bloques

Este plugin proporciona 1 bloque.

  • Consent box A self-contained consent checkbox that records each acceptance in the consent log.

Instalación

  1. Sube la carpeta del plugin a /wp-content/plugins/terms-conditions-consent-log/ o instálalo a través de «Plugins > Añadir nuevo».
  2. Activa el plugin.
  3. Abre la página de administración del plugin.
    • Si está activo WooCommerce: WooCommerce > Consentimientos.
    • En caso contrario: Usuarios > Consentimientos
  4. En la pestaña «Ajustes», puedes activar las integraciones con los comentarios de WordPress y/o Contact Form 7 (desactivadas por defecto), o simplemente pegar [tccl_consent_box] en cualquier página o entrada.
  5. (Opcional, solo para WooCommerce) Modifica el texto de la casilla de verificación o añade un párrafo informativo que se muestre antes de finalizar la compra. Déjalos vacíos para mantener el texto nativo de WooCommerce.
  6. A partir de ahora se registrará automáticamente cada consentimiento aceptado procedente de cualquiera de los orígenes activos.

FAQ

¿Puedo usar el plugin sin WooCommerce?

Sí. Actívalo en cualquier sitio WordPress y el menú aparecerá en «Usuarios > Consentimientos». Las secciones de registros, ajustes, exportación a CSV, certificado en PDF y la integración con las herramientas de privacidad funcionan todas de la misma manera. Los elementos específicos de WooCommerce (captura en la página de pago, caja meta en el pedido, columna de la lista de pedidos y línea del correo electrónico del pedido) solo se cargan cuando está activo WooCommerce.

¿Cómo puedo recopilar consentimientos desde Contact Form 7?

Abre «Consentimientos > Ajustes > Integraciones» y marca la casilla «Registrar cada envío de formulario CF7 que marque un campo [acceptance]». Luego asegúrate de que tus formularios de CF7 incluyan un campo [acceptance], p. ej.:

[acceptance privacy] I have read and agree to the privacy policy. [/acceptance]

El plugin utiliza el ID del formulario como parte del campo consent_type (cf7_form_{ID}), para poder filtrar cada formulario por separado. El primer campo de correo electrónico del formulario se utiliza como dirección de correo electrónico del remitente. Sin fragmentos de código ni modificaciones en el archivo functions.php.

Muestra una casilla de consentimiento propia + botón de envío, con un campo opcional de correo electrónico para los visitantes que no hayan iniciado sesión. El envío se realiza a una variable REST que registra el consentimiento mediante la función tccl_save_consent(). Puedes añadirla a cualquier página, entrada, área de widgets o campo HTML de un generador de formularios, p. ej.:

[tccl_consent_box text="I have read and agree to the privacy policy." consent_type="newsletter_signup"]

La misma funcionalidad está también disponible como bloque de Gutenbeg llamado «Casilla de consentimiento».

Important: the shortcode renders its own <form> with a submit button, so it should NOT be nested inside another form builder’s form (Contact Form 7, WPForms, Gravity Forms, Fluent Forms, Elementor Forms, etc.). If you embed it inside another form you will end up with two submit buttons and conflicting submit flows. For form builders, use the dedicated integration (CF7 is built in; for the rest, hook tccl_save_consent() from the relevant submission action — see the Gravity Forms / WPForms FAQ below).

Importante: NO utilices el shortcode como sustituto de la casilla de verificación de cookies de un plugin de cookies/banners (Complianz, CookieYes, Real Cookie Banner, etc.). El contexto jurídico es diferente, ya que los banners de cookies tienen que ver con la Directiva ePrivacy/cookies, este registro de consentimientos trata sobre los consentimientos específicos del artículo 7.1 del RGPD para el tratamiento concreto de datos personales. Mezclarlos da lugar a evidencias ambiguas.

¿Se registran automáticamente los consentimientos en los comentarios de WordPress?

No, están desactivadas por defecto. Actívalas en «Consentimientos > Ajustes > Integraciones». Solo se registran los comentarios en los que el visitante marca la casilla nativa «Guardar mi nombre, correo electrónico y sitio web…».

¿Funciona con el nuevo bloque de finalizar compra de WooCommerce?

Todavía no. Es totalmente compatible con la página de finalizar compra clásica. La compatibilidad con el bloque de finalizar compra está en la hoja de ruta.

¿Dónde se almacenan los datos?

En una tabla indexada personalizada llamada wp_tccl_consents (con el prefijo de tu sitio). Cuando está activo WooCommerce, cada pedido también obtiene tres registros meta (_tccl_terms_accepted, _tccl_terms_version, _tccl_recorded_at) para que la pantalla de edición de pedidos pueda mostrar el resumen sin consultar la tabla.

¿Cómo puedo subir la versión del documento cuando cambie los términos y condiciones?

Edita el campo de versión en «Registro de consentimientos > Ajustes», o simplemente marca la casilla «Subir versión al guardar». El plugin también puede actualizarla automáticamente si detecta que el texto de la casilla ha cambiado, pero no el campo de versión.

Three things to keep in mind:

  1. The version string in Settings must match the version label of your terms document character by character (e.g. 1.1-2026-05-17). It is a free-text identifier and the plugin just compares strings, so a trailing space or a different separator will be treated as a different version.
  2. Once you bump the version, every record stored under the previous version is automatically flagged as «Outdated» in the records list. This is on purpose — it is the GDPR audit trail showing which exact wording each subject accepted at that moment. «Outdated» is a feature, not a bug.
  3. Do NOT delete or «clean up» Outdated records. They are the legal proof of consent for the version that was in force when the subject accepted it. If the user retires the terms and a regulator later asks for evidence, those rows are what you show them.

¿Cómo puedo borrar o anonimizar datos de un cliente específico?

Utiliza la pantalla nativa de WordPress «Herramientas > Borrar datos personales». El plugin registra una herramienta de borrado que anonimiza los registros vinculados al correo electrónico solicitado (no los borra, ya que el propio registro constituye base legal para conservar la prueba del consentimiento). También puedes anonimizar los registros filtrados desde la pestaña de registros.

¿Cómo puedo exportar el historial de consentimientos de un cliente?

Utiliza «Herramientas > Exportar datos personales». El plugin registra un exportador que devuelve todos los registros de consentimiento vinculados a la dirección de correo electrónico solicitada.

¿Una desinstalación borrará mis datos?

Solo si lo aceptas expresamente. La opción «Eliminar todos los datos al desinstalar» está desactivada por defecto. Aunque desinstales la aplicación por error, el registro de tu consentimiento se mantendrá.

If you need to clean up a handful of test rows you generated while configuring the plugin (and you do not yet have the upcoming bulk-delete UI), you can remove them with a direct SQL statement against the consent table, e.g.:

DELETE FROM wp_tccl_consents WHERE id IN (1, 2, 3);

Replace wp_ with your site’s actual table prefix. This is an escape hatch for legitimate clean-up after a misconfigured form; it is not a recommended day-to-day flow — to handle real subject requests, use Tools > Erase Personal Data (anonymises) instead.

¿Cómo puedo recopilar los consentimientos de Gravity Forms, WPForms o cualquier otro origen?

Call the public tccl_save_consent() function from the relevant hook. Always read the document version from the plugin setting (tccl_get_setting( 'consent_version', '1.0' )) so all records line up with the current version in Settings — if you hardcode a date here that differs from the one in Settings, every record will be flagged as «Outdated» forever.

Example for Gravity Forms:

add_action( 'gform_after_submission', function ( $entry, $form ) {
    if ( ! empty( $entry['1.1'] ) ) { // ID of your consent checkbox in the entry.
        tccl_save_consent( array(
            'email'           => sanitize_email( $entry['2'] ?? '' ),
            'consent_type'    => 'gravity_form_' . absint( $form['id'] ),
            'consent_version' => tccl_get_setting( 'consent_version', '1.0' ),
            'consent_text'    => 'I have read and agree to the privacy policy.',
            'consent_value'   => 1,
        ) );
    }
}, 10, 2 );

Example for WPForms (a few things differ from Gravity Forms — read the comments):

add_action( 'wpforms_process_complete', function ( $fields, $entry, $form_data, $entry_id ) {
    // 1) Only act on the form(s) you want. Use the WPForms map below if you have several.
    $forms = array(
        // form_id => array( 'email' => email_field_id, 'checkbox' => gdpr_field_id ),
        123 => array( 'email' => 5, 'checkbox' => 7 ),
    );
    $form_id = (int) $form_data['id'];
    if ( ! isset( $forms[ $form_id ] ) ) {
        return;
    }
    $map = $forms[ $form_id ];

    // 2) The GDPR Agreement checkbox must be ticked.
    if ( empty( $fields[ $map['checkbox'] ]['value'] ) ) {
        return;
    }

    tccl_save_consent( array(
        'email'           => sanitize_email( $fields[ $map['email'] ]['value'] ?? '' ),
        'consent_type'    => 'wpforms_form_' . $form_id,
        'consent_version' => tccl_get_setting( 'consent_version', '1.0' ),
        'consent_text'    => 'I have read and agree to the privacy policy.',
        'consent_value'   => 1,
    ) );
}, 20, 4 );

Two critical details specific to WPForms:

  • accepted_args=4 is mandatory (the , 20, 4 at the end of add_action). Without it, the callback never receives $fields, the if ( empty( $fields[...] ) ) check evaluates to true on every submission and nothing is recorded. This is the most common copy-paste mistake when adapting a Gravity Forms snippet.
  • You need both field IDs: the email field ID and the GDPR Agreement checkbox field ID. To find them, open the form in WPForms (the URL contains form_id=X — that is the form ID) and click each field in the builder; the right-hand sidebar shows the field ID under «Advanced».

Same idea for fluentform/submission_inserted, user_register, forminator_custom_form_after_submission, elementor_pro/forms/new_record, etc. — adapt the callback signature to each plugin’s documented arguments.

¿Funciona la detección de IPs detrás de Cloudflare u otros proxies inversos?

El plugin lee únicamente REMOTE_ADDR y no confía en las cabeceras reenviadas, ya que estas pueden falsificarse sin un proxy verificado. Si tu proveedor de alojamiento incluye la IP del proxy en REMOTE_ADDR en lugar de la IP real del cliente, todas las entradas registrarán la IP del proxy. La mayoría de los proveedores de alojamiento compatibles con WordPress transmiten la IP real correctamente.

¿Qué significa «A prueba de manipulaciones» en este contexto?

Cuando se registra un consentimiento, el plugin genera un hash SHA-256 del texto exacto aceptado y lo almacena junto con el registro. Cada vez que se consulta, el hash almacenado se compara con uno recién generado, y cualquier diferencia se muestra como «MANIPULADO» en la lista de registros, el metabox de pedidos y la vista de certificados. Se trata de una comprobación de integridad criptográfica, no de una firma electrónica.

¿El certificado es un PDF real?

El plugin muestra una versión en A4 de una sola página con CSS optimizado para impresión y un botón «Imprimir / Guardar como PDF». Los navegadores modernos (Chrome, Safari, Firefox, Edge) exportan esa visualización a un PDF real de forma nativa, con la misma fidelidad que ofrecería una librería en el servidor, y con la ventaja añadida de que respeta el idioma y las fuentes de tu sitio web. No incluye ninguna librería externa, por lo que el plugin sigue siendo ligero.

To be clear: the plugin does NOT store any PDFs on disk and does NOT create an uploads folder of its own. The certificate is generated on demand as HTML each time you open it, and only becomes a PDF if you (or the customer) clicks «Print / Save as PDF» in the browser. There is nothing to clean up on the server. If the site has a Site Icon defined in Settings > General (the same option block themes and classic themes share), it is shown in the certificate header next to the site name — including on certificates of consents recorded before this version, since the icon is added at render time, not at storage time.

Reseñas

No hay valoraciones para este plugin.

Colaboradores y desarrolladores

«Registro de consentimientos de términos y condiciones» es un software de código abierto. Las siguientes personas han colaborado con este plugin.

Colaboradores

«Registro de consentimientos de términos y condiciones» está traducido en 1 idioma. Gracias a los traductores por sus contribuciones.

Traduce «Registro de consentimientos de términos y condiciones» a tu idioma.

¿Interesado en el desarrollo?

Revisa el código , echa un vistazo al repositorio SVN o suscríbete al registro de desarrollo por RSS.

Registro de cambios

1.1.0

  • New: the site icon (Settings > General > Site Icon, available in both classic and block/FSE themes since WordPress 6.5) is now shown on the printable consent certificate, next to the site name. Works for both new and previously stored records — the icon is rendered on demand each time the certificate is opened. Falls back gracefully when no site icon is set.
  • Docs: clarified that [tccl_consent_box] is a self-contained form — not meant to be nested inside another form builder’s form. Updated the FAQ and the source-file docblock.
  • Docs: expanded the WPForms snippet in the FAQ — full example with the mandatory accepted_args=4, reading consent_version from the global setting, and the multi-form id_form => [email, checkbox] pattern. Same fix applied to the Gravity Forms snippet (now reads the version from the setting instead of hardcoding a date).
  • Docs: clarified the version bump FAQ — the Settings string must match the document text character by character; pre-bump records are deliberately marked Outdated as the GDPR audit trail demands; do NOT delete Outdated rows.
  • Docs: clarified that the certificate is rendered as a print-optimised A4 view — no PDFs are stored on disk and the plugin owns no uploads folder.
  • Docs: clarified anonymisation vs deletion in the FAQ; documented the SQL escape hatch for cleaning up test rows without promoting it as a regular flow.

1.0.0

  • Versión inicial.
  • Funciona con o sin WooCommerce. El menú está en «WooCommerce > Consentimientos» cuando está activo WC, en caso contrario está en «Usuarios > Consentimientos». La capacidad mínima para acceder es manage_woocommerce o manage_options, según el caso. Filtrable mediante tccl_admin_menu_parent y tccl_admin_capability.
  • Aviso al activarlo en la pantalla de plugins, con enlaces rápidos a las pestañas de registros y ajustes.
  • Recopila la página de finalizar compra de WooCommerce (marca temporal en UTC, IP, agente de usuario, versión, URL de origen, texto exacto). Caja meta del pedido, columna «Consentimiento» en la lista de pedidos, líneas de consentimiento opcionales en el correo electrónico de nuevo pedido para el administrador y en el correo electrónico del pedido para el cliente. Compatible con HPOS.
  • Integración con Contact Form 7 (opcional): Recopila todos envío de formulario que incluya un campo [acceptance], incluyendo la URL de origen de la página en la que está el formulario. Se almacena como cf7_form_{ID}, un tipo por formulario.
  • Integración con los comentarios de WordPress (opcional) : Recopila la casilla de verificación nativa wp-comment-cookies-consent (desde WP 4.9.6) junto con el enlace permanente de la entrada. Se almacena como comment_consent.
  • Shortcode [tccl_consent_box] y bloque de Gutenberg: Casilla de consentimiento independiente con variable REST que se puede insertar en cualquier parate. El texto por defecto se sustituye por un valor configurable para todo el sitio en «Ajustes > Integraciones».
  • Función pública tccl_save_consent() (actualmente acepta una source_url opcional) para cualquier otro origen (Gravity Forms, WPForms, flujos personalizados…).
  • URL de origen registrada en cada aceptación que se muestra en la lista de registros, el certificado en PDF, la exportación a CSV y la exportación desde las herramientas de privacidad.
  • Sellado de integridad SHA-256 de cada registro.
  • Certificado en A4 imprimible para cada registro (el navegador lo guarda como PDF).
  • Integración con las herramientas de privacidad nativas de WordPress (exportar y borrar).
  • Filtros activos de coincidencia parcial (correo electrónico, pedido, intervalo de fechas, tipo) con exportación a CSV filtrada.
  • Borrado opcional de los datos del plugin al desinstalarlo (desactivado por defecto).