'default', 'config' => '', ), $atts, 'adpf_form'); $form_id = sanitize_text_field($atts['id']); // Get form configuration $form_config = $this->get_form_config($form_id, $atts['config']); if (empty($form_config) || !isset($form_config['fields'])) { return '

' . esc_html__('Form configuration not found.', 'ad-pro-forms') . '

'; } // Store config for this form instance (for dynamic CSS) if (!isset($this->form_configs[$form_id])) { $this->form_configs[$form_id] = $form_config; } // If config was provided via shortcode attribute, register it temporarily for this request // so form handler can access it if (!empty($atts['config'])) { add_filter('adpf_form_config_' . $form_id, function() use ($form_config) { return $form_config; }, 999); } // Track that this form is rendered (for asset loading) if (!in_array($form_id, $this->forms_rendered)) { $this->forms_rendered[] = $form_id; } // Get settings, merging label_position from styling settings $settings = ADPF_Settings::get_settings(); $styling = ADPF_Styling::get_settings(); $settings['label_position'] = $styling['label_position']; // Start output buffering ob_start(); ?>
render_field($field, $settings); } ?>

required placeholder="" /> required placeholder="" /> required placeholder="" />
$option_value) : ?>

$option) : ?>

required placeholder="" />
form_configs[$form_id] = $config; return $config; } } // Try to get from database first $form = ADPF_Database::get_form($form_id); if ($form && isset($form->config)) { $this->form_configs[$form_id] = $form->config; return $form->config; } // Fallback to filter (for programmatically registered forms) $config = apply_filters('adpf_form_config_' . $form_id, false); // Store for later use if found if ($config) { $this->form_configs[$form_id] = $config; } return $config; } /** * Enqueue assets only when forms are rendered */ public function enqueue_assets() { if (empty($this->forms_rendered)) { return; } // Enqueue CSS wp_enqueue_style( 'adpf-frontend', ADPF_PLUGIN_URL . 'assets/css/frontend.css', array(), ADPF_VERSION ); // Build CSS variables from saved styling settings $s = ADPF_Styling::get_settings(); $primary = sanitize_hex_color($s['primary_color']) ?: '#2271b1'; $primary_hover = adpf_lighten_color($primary, 20); $text = sanitize_hex_color($s['text_color']) ?: '#333333'; $label = sanitize_hex_color($s['label_color']) ?: '#333333'; $border = sanitize_hex_color($s['border_color']) ?: '#dddddd'; $success = sanitize_hex_color($s['success_color']) ?: '#00a32a'; $error = sanitize_hex_color($s['error_color']) ?: '#d63638'; $radius = absint($s['border_radius']); $gap = absint($s['field_gap']); $padding = absint($s['field_padding']); $font_size = absint($s['font_size']); $css_vars = array( '--adpf-primary-color: ' . $primary . ';', '--adpf-primary-hover-color: ' . $primary_hover . ';', '--adpf-text-color: ' . $text . ';', '--adpf-label-color: ' . $label . ';', '--adpf-border-color: ' . $border . ';', '--adpf-border-focus-color: ' . $primary . ';', '--adpf-error-color: ' . $error . ';', '--adpf-success-color: ' . $success . ';', '--adpf-background-color: #ffffff;', '--adpf-button-text-color: #ffffff;', '--adpf-field-background-color: #ffffff;', '--adpf-dropdown-option-color: ' . $text . ';', '--adpf-font-family: inherit;', '--adpf-font-size: ' . $font_size . 'px;', '--adpf-label-font-size: 14px;', '--adpf-label-font-weight: 600;', '--adpf-explanation-font-size: 14px;', '--adpf-field-gap: ' . $gap . 'px;', '--adpf-field-padding: ' . $padding . 'px;', '--adpf-label-margin-bottom: 8px;', '--adpf-container-padding: 0px;', '--adpf-border-radius: ' . $radius . 'px;', '--adpf-border-width: 1px;', '--adpf-container-border-radius: 0px;', '--adpf-container-border-width: 0px;', '--adpf-container-border-color: #dddddd;', '--adpf-button-padding-top: 12px;', '--adpf-button-padding-right: 24px;', '--adpf-button-padding-bottom: 12px;', '--adpf-button-padding-left: 24px;', '--adpf-button-font-size: 16px;', '--adpf-button-font-weight: 600;', '--adpf-button-border-radius: ' . $radius . 'px;', '--adpf-button-spinner-color: #ffffff;', '--adpf-button-spinner-color-faded: rgba(255, 255, 255, 0.3);', '--adpf-container-blur: 0px;', ); wp_add_inline_style('adpf-frontend', '.adpf-form-wrapper { ' . implode(' ', $css_vars) . ' }'); // Enqueue JS wp_enqueue_script( 'adpf-frontend', ADPF_PLUGIN_URL . 'assets/js/frontend.js', array('jquery'), ADPF_VERSION, true ); // Localize script wp_localize_script('adpf-frontend', 'adpfAjax', array( 'ajaxurl' => admin_url('admin-ajax.php'), 'nonce' => wp_create_nonce('adpf_form_submit'), )); // Cloudflare Turnstile is a Pro feature - script not loaded in free version } }