type = 'adcaptcha'; $this->verify = new Verify(); $this->setup(); } private function setup(): void { if (!class_exists('GF_Fields')) { return; } if (GF_Fields::get('adcaptcha')) { return; } try { if (!GF_Fields::get('adcaptcha')) { GF_Fields::register($this); } } catch (Exception $e) { throw $e; } $this->setup_hooks(); } private function setup_hooks(): void { add_action('wp_enqueue_scripts', [AdCaptcha::class, 'enqueue_scripts'], 9); add_action( 'wp_enqueue_scripts', [ Verify::class, 'get_success_token' ] ); add_filter('gform_field_groups_form_editor', [$this, 'add_to_field_groups']); add_filter('gform_field_content', [$this, 'modify_gform_field_content'], 10, 2); add_filter('gform_validation', [$this, 'verify_captcha']); add_action('admin_head', [$this, 'custom_admin_field_icon_style']); add_action('admin_init', [$this, 'update_adcaptcha_label']); add_action('admin_footer', [$this, 'enqueue_admin_script']); add_filter('gform_pre_render', [$this, 'handle_adcaptcha_token']); add_action('gform_preview_body_open', [$this, 'enqueue_preview_scripts']); } public function add_to_field_groups($field_groups): array { foreach ($field_groups['advanced_fields']['fields'] as $field) { if ($field['data-type'] === 'adcaptcha') { return $field_groups; } } $field_groups['advanced_fields']['fields'][] = [ 'data-type' => (string) $this->type, 'value' => $this->get_form_editor_field_title(), 'label' => $this->get_form_editor_field_title(), ]; return $field_groups; } public function modify_gform_field_content($content, $field) { if ($field->type === 'adcaptcha') { return str_replace($field->get_field_label(false, ''), '', $content); } return $content; } public function verify_captcha($validation_result) { $form = $validation_result['form']; $is_valid = $validation_result['is_valid']; foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha') { $successToken = sanitize_text_field(wp_unslash($_POST['adcaptcha_successToken'] ?? '')); if (empty($successToken) || trim($successToken) === '') { $field->failed_validation = true; $field->validation_message = __('Incomplete CAPTCHA, Please try again.', 'adcaptcha'); $is_valid = false; } if($is_valid) { $response = $this->verify->verify_token($successToken); if (!$response) { $field->failed_validation = true; $field->validation_message = __('Invalid token.', 'adcaptcha'); $is_valid = false; } } } } $validation_result['is_valid'] = $is_valid; $validation_result['form'] = $form; return $validation_result; } public function custom_admin_field_icon_style() { echo ''; } public function update_adcaptcha_label() { $forms = GFAPI::get_forms(); if (!$forms || !is_array($forms)) { return; } foreach ($forms as $form) { $updated = false; foreach ($form['fields'] as &$field) { if ($field->type === 'adcaptcha' && $field->label !== __('adCAPTCHA', 'adcaptcha')) { $field->label = __('adCAPTCHA', 'adcaptcha'); $updated = true; } } if ($updated) { GFAPI::update_form($form); } } } public function enqueue_admin_script() { ?> document.addEventListener('DOMContentLoaded', function() { let adCaptchaField = document.querySelector('.adcaptcha_successToken'); if (adCaptchaField) { setTimeout(function() { if (window.adcap) { window.adcap.setVerificationState('success'); adCaptchaField.value = '{$successToken}'; } }, 500); } }); "; } return $form; } public function enqueue_preview_scripts($form_id) { echo ""; } public function get_field_input($form, $value = '', $entry = null) { $form_id = $form['id'] ?? null; if ($form_id === null) { return ''; } $field_id = (int) $this->id; if ($this->is_form_editor()) { return "