$field_key, 'value' => $value]; } } if (!$fields) { return null; } return self::$decisions[$reference] = (new FormGuard_Client())->decide($reference, $fields); } public static function cf7(bool $spam, $submission = null): bool { if ($spam || !class_exists('WPCF7_Submission')) { return $spam; } $submission = $submission ?? WPCF7_Submission::get_instance(); if (!$submission) { return $spam; } $form = $submission->get_contact_form(); if (!$form) { return $spam; } $result = self::check('cf7', (int) $form->id(), $submission->get_posted_data()); return $result && in_array($result['decision']['action'], ['block', 'review'], true) ? true : $spam; } public static function cf7_result(array $result, $submission): array { if (!$submission || !method_exists($submission, 'get_contact_form')) { return $result; } $form = $submission->get_contact_form(); $decision = $form ? (self::$decisions['cf7_' . $form->id()] ?? null) : null; if ($decision && in_array($decision['decision']['action'], ['block', 'review'], true) && ($result['status'] ?? '') === 'spam' && $submission->get_status() === 'spam') { // Keep CF7's stopped/spam status; never report mail_sent. $result['message'] = self::message($decision); FormGuard_Receipts::confirm($decision); } return $result; } public static function wpforms(array $fields, array $entry, array $form_data): void { $id = absint($form_data['id'] ?? 0); if (!$id || !function_exists('wpforms') || !empty(wpforms()->process->errors[$id])) { return; } $values = []; foreach ($fields as $key => $field) { if (in_array($field['type'] ?? '', ['text', 'textarea', 'name', 'email'], true) && is_string($field['value'] ?? null)) { $values[(string) $key] = $field['value']; } } $result = self::check('wpforms', $id, $values); if ($result && in_array($result['decision']['action'], ['block', 'review'], true)) { wpforms()->process->errors[$id]['header'] = self::message($result); // Confirm only after processing finished with our blocking error. // Later hooks may change it, so sending a receipt here is too early. add_action('shutdown', static function () use ($id, $result): void { $process = wpforms()->process; if (($process->form_data['id'] ?? null) == $id && ($process->errors[$id]['header'] ?? '') === self::message($result)) { FormGuard_Receipts::confirm($result); } }, 50); } } public static function fluentform($insert_data, $data, $form): void { if (!is_array($insert_data) || !is_array($data) || !is_object($form) || (int) ($form->id ?? 0) < 1 || !empty($form->has_payment) || ($insert_data['status'] ?? '') === 'spam' || !class_exists('FluentForm\\Framework\\Validator\\ValidationException')) { return; } $values = array_intersect_key($data, FormGuard_FluentForms::fields($form)); $result = self::check('fluentform', (int) $form->id, $values); if (!$result || !in_array($result['decision']['action'], ['block', 'review'], true)) { return; } // This action runs after native validation and immediately before insert. // Throwing Fluent Forms' own terminal validation exception prevents the // entry, notifications and submission actions from being created/run. $error = new \FluentForm\Framework\Validator\ValidationException('', 422, null, ['errors' => ['formguard' => [self::message($result)]]]); FormGuard_Receipts::confirm($result); throw $error; } public static function forminator($errors, $id, $data) { if (!is_array($errors) || $errors || !is_numeric($id) || (int) $id < 1 || !is_array($data)) { return $errors; } $schema = FormGuard_Forminator::fields(FormGuard_Forminator::model((int) $id)); $values = []; foreach ($data as $field) { if (is_array($field) && is_string($field['name'] ?? null) && isset($schema[$field['name']]) && is_string($field['value'] ?? null)) { $values[$field['name']] = $field['value']; } } $result = self::check('forminator', (int) $id, $values); if ($result && in_array($result['decision']['action'], ['block', 'review'], true)) { // Forminator's handle_form catches Exception and returns its native // error response. Throwing here terminates validation before entry, // mail or integrations; later filters cannot remove our error. FormGuard_Receipts::confirm($result); throw new \Exception(esc_html(self::message($result))); } return $errors; } private static function message(array $result): string { if ($result['decision']['action'] === 'review') { return '内容を確認待ちとして受け付けました。通常の通知はまだ送信されていません。'; } return '受付条件に合わないため、送信できませんでした。'; } public static function notice(): void { if (!current_user_can('manage_options')) { return; } $status = get_option('formguard_status', []); if (($status['state'] ?? '') === 'degraded') { echo '

' . esc_html('FormArmorの保護が停止しています。問い合わせは通常どおり処理されています。接続状態と利用枠を確認してください。') . '

'; } } }