load_settings(); add_action('woocommerce_checkout_process', array($this, 'validate_custom_fields')); } private function load_settings() { $this->settings = get_option('enspireplugins_acfw_settings', array()); $this->custom_fields = isset($this->settings['custom_fields']) ? $this->settings['custom_fields'] : array(); } public function validate_custom_fields() { if (empty($this->custom_fields)) { return; } $active_fields = array_filter($this->custom_fields, function($field) { return isset($field['active']) && $field['active'] === 'yes'; }); if (empty($active_fields)) { return; } $valid = true; foreach ($active_fields as $field) { if ($field['type'] === 'heading') { continue; } $field_id = 'enspireplugins_acfw_' . $field['id']; $field_value = $this->get_field_value($field_id, $field['type']); if ($field['required'] === 'yes' && empty($field_value)) { wc_add_notice( sprintf( /* translators: %s: field label */ esc_html__('%s is a required field.', 'additional-checkout-fields-for-woo'), '' . esc_html($field['label']) . '' ), 'error' ); $valid = false; } if (!empty($field_value)) { switch ($field['type']) { case 'email': if (!is_email($field_value)) { wc_add_notice( sprintf( /* translators: %s: field label */ esc_html__('%s must be a valid email address.', 'additional-checkout-fields-for-woo'), '' . esc_html($field['label']) . '' ), 'error' ); $valid = false; } break; case 'url': if (!filter_var($field_value, FILTER_VALIDATE_URL)) { wc_add_notice( sprintf( /* translators: %s: field label */ esc_html__('%s must be a valid URL.', 'additional-checkout-fields-for-woo'), '' . esc_html($field['label']) . '' ), 'error' ); $valid = false; } break; case 'number': if (!is_numeric($field_value)) { wc_add_notice( sprintf( /* translators: %s: field label */ esc_html__('%s must be a valid number.', 'additional-checkout-fields-for-woo'), '' . esc_html($field['label']) . '' ), 'error' ); $valid = false; } break; case 'tel': if (!WC_Validation::is_phone($field_value)) { wc_add_notice( sprintf( /* translators: %s: field label */ esc_html__('%s must be a valid phone number.', 'additional-checkout-fields-for-woo'), '' . esc_html($field['label']) . '' ), 'error' ); $valid = false; } break; } } } return $valid; } private function get_field_value($field_id, $field_type) { // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce verification is handled by WooCommerce checkout process if (!isset($_POST[$field_id])) { return ''; } switch ($field_type) { case 'checkbox': // phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce verification is handled by WooCommerce checkout process return isset($_POST[$field_id]) ? map_deep(wp_unslash($_POST[$field_id]), 'sanitize_text_field') : array(); case 'textarea': // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Nonce verification is handled by WooCommerce checkout process, input is sanitized below return trim(sanitize_textarea_field(wp_unslash($_POST[$field_id]))); default: // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized -- Nonce verification is handled by WooCommerce checkout process, input is sanitized below return trim(sanitize_text_field(wp_unslash($_POST[$field_id]))); } } }