) * * @param array|string $atts Atributos. * @return string */ public function shortcode_checkbox( $atts = array() ): string { $atts = shortcode_atts( array( 'finalidad' => '', 'texto' => '', 'obligatorio' => 'si', 'herramienta' => '', ), $atts, 'cumpleconsent_casilla' ); $purposes = Purposes::all(); $key = sanitize_key( (string) $atts['finalidad'] ); if ( '' === $key || ! isset( $purposes[ $key ] ) ) { return ''; } if ( Purposes::REQUIRED === $key ) { return ''; } $field = '' !== (string) $atts['herramienta'] ? sanitize_key( (string) $atts['herramienta'] ) : 'cumpleconsent_casilla_' . $key; $label = (string) $atts['texto']; if ( '' === $label ) { $label = sprintf( /* translators: %s: finalidad */ __( 'Acepto el tratamiento de mis datos con la finalidad de %s, según el aviso de privacidad.', 'cumpleconsent' ), Purposes::lower( (string) $purposes[ $key ]['label'] ) ); } $required = 'no' !== strtolower( (string) $atts['obligatorio'] ); $id = $field . '-' . wp_rand( 100, 999 ); $html = array(); $html[] = ''; return implode( '', $html ); } /** * Registra una decisión tomada en un formulario. * * @param string $purpose Finalidad. * @param bool $granted Si la casilla venía marcada. * @param string $source Formulario de origen (cf7, wpforms, gravity, propio). * @return bool */ public static function record( string $purpose, bool $granted, string $source = 'propio' ): bool { $purpose = sanitize_key( $purpose ); if ( '' === $purpose ) { return false; } $choices = Purposes::sanitize_choices( array( $purpose => $granted ) ); // En un formulario se registra la finalidad declarada; el resto queda como no concedido. $payload = array(); foreach ( array_keys( Purposes::all() ) as $key ) { $payload[ $key ] = ( $key === $purpose ) ? $granted : false; } if ( Purposes::REQUIRED === $purpose ) { $payload[ $purpose ] = true; } $ip = isset( $_SERVER['REMOTE_ADDR'] ) ? sanitize_text_field( wp_unslash( (string) $_SERVER['REMOTE_ADDR'] ) ) : ''; $ip_hash = ( '' !== $ip && Settings::get( 'log_ip_hash', true ) ) ? hash_hmac( 'sha256', 'ip|' . $ip, Settings::log_salt() ) : ''; return Plugin::instance()->log->record( array( 'anon_id' => wp_hash( 'form|' . $ip . '|' . gmdate( 'Ymd' ) ), 'event' => $granted ? 'formulario_acepta' : 'formulario_rechaza', 'context' => 'formulario', 'choices' => $payload, 'ip_hash' => $ip_hash, ) ); } /** * Extrae las casillas del plugin de los datos enviados y las registra. * * @param array $posted Datos del envío. * @param string $source Origen. * @return int Cantidad registrada. */ private static function record_from_posted( array $posted, string $source ): int { $count = 0; foreach ( $posted as $field => $value ) { $field = (string) $field; if ( 0 !== strpos( $field, 'cumpleconsent_casilla_' ) ) { continue; } $purpose = sanitize_key( substr( $field, strlen( 'cumpleconsent_casilla_' ) ) ); if ( '' === $purpose ) { continue; } $granted = is_array( $value ) ? ! empty( $value[0] ) : ! empty( $value ); if ( self::record( $purpose, (bool) $granted, $source ) ) { ++$count; } } return $count; } /** * Contact Form 7. * * @param mixed $contact_form Formulario. */ public function on_cf7( $contact_form ): void { if ( ! class_exists( 'WPCF7_Submission' ) ) { return; } $submission = \WPCF7_Submission::get_instance(); if ( ! $submission ) { return; } $data = (array) $submission->get_posted_data(); self::record_from_posted( $data, 'cf7' ); } /** * WPForms. * * @param array $fields Campos. * @param array $entry Entrada. * @param array $form_data Datos del formulario. * @param int $entry_id ID de entrada. */ public function on_wpforms( $fields, $entry, $form_data, $entry_id ): void { $posted = array(); foreach ( (array) $fields as $field ) { if ( is_array( $field ) && isset( $field['name'] ) ) { $posted[ (string) $field['name'] ] = $field['value'] ?? ''; } } self::record_from_posted( $posted, 'wpforms' ); } /** * Gravity Forms. * * @param array $entry Entrada. * @param array $form Formulario. */ public function on_gravity( $entry, $form ): void { self::record_from_posted( is_array( $entry ) ? $entry : array(), 'gravity' ); } /** * ¿El envío traía una casilla de consentimiento aceptada? * Útil para que otros plugins condicionen el envío. * * @param array $posted Datos del envío. * @param string $purpose Finalidad. * @return bool */ public static function accepted( array $posted, string $purpose ): bool { $key = 'cumpleconsent_casilla_' . sanitize_key( $purpose ); if ( ! isset( $posted[ $key ] ) ) { return false; } $value = $posted[ $key ]; return is_array( $value ) ? ! empty( $value[0] ) : ! empty( $value ); } }