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])));
}
}
}