$form_data WPForms form data. */ public function get_form_id( array $form_data ): string { if ( isset( $form_data['id'] ) && is_scalar( $form_data['id'] ) && '' !== (string) $form_data['id'] ) { return self::DEFAULT_FORM_ID . '-' . (string) $form_data['id']; } return self::DEFAULT_FORM_ID; } /** * Build context from WPForms process data. * * @param array $fields Normalized WPForms fields. * @param array $entry WPForms entry data. * @param array $form_data WPForms form data. * @param array $fallback_posted_data Fallback posted data. * @param string $rate_limit_identifier Identifier used only for hashing. * @param int|null $timestamp Current timestamp. */ public function build_from_submission( array $fields, array $entry, array $form_data, array $fallback_posted_data, string $rate_limit_identifier = '', ?int $timestamp = null ): SubmissionContext { unset( $entry ); return $this->build_from_submitted_data( $this->normalize_submission_data( $fields, $fallback_posted_data ), $this->get_form_id( $form_data ), $rate_limit_identifier, $timestamp ); } /** * Normalize WPForms field data and root protection fields. * * @param array $fields Normalized WPForms fields. * @param array $fallback_posted_data Fallback posted data. * * @return array */ private function normalize_submission_data( array $fields, array $fallback_posted_data ): array { $submitted_data = $this->extract_internal_fields( $fallback_posted_data ); foreach ( $fields as $field_key => $field ) { $key = (string) $field_key; if ( is_array( $field ) ) { $value = $this->extract_field_value( $field ); if ( null !== $value ) { $submitted_data[ 'field_' . $key ] = $value; } continue; } if ( is_scalar( $field ) ) { $submitted_data[ 'field_' . $key ] = $field; } } return $submitted_data; } /** * Extract internal 2o2code Spamless Forms fields from posted data. * * @param array $posted_data Posted data. * * @return array */ private function extract_internal_fields( array $posted_data ): array { $internal_fields = array(); foreach ( $this->get_internal_field_names() as $field_name ) { if ( array_key_exists( $field_name, $posted_data ) ) { $internal_fields[ $field_name ] = $posted_data[ $field_name ]; } } return $internal_fields; } /** * Extract a scalar field value from WPForms field data. * * @param array $field Field data. * * @return scalar|null */ private function extract_field_value( array $field ) { foreach ( array( 'value', 'value_raw', 'name' ) as $value_key ) { if ( isset( $field[ $value_key ] ) && is_scalar( $field[ $value_key ] ) ) { return $field[ $value_key ]; } } return null; } /** * Get internal field names. * * @return array */ private function get_internal_field_names(): array { return array( ProtectionFieldRenderer::HONEYPOT_FIELD, ProtectionFieldRenderer::TOKEN_FIELD, ProtectionFieldRenderer::STARTED_AT_FIELD, ); } }