register(...) * - action `zadex/forms/submitted` (Submission $s, array $run) after the actions ran * - action `zadex/forms/action_failed` (string $id, WP_Error $e, Submission $s) * - filter `zadex/forms/validate` (array $result, array $fields, array $settings, WP_REST_Request $r) * - filter `zadex/forms/email` (array $mail, Submission $s, string $prefix) * - filter `zadex/forms/rate_limit` ([limit, window]) / `zadex/forms/client_ip` / `zadex/forms/recaptcha_threshold` * - filter `zadex/forms/find_form` (?array $element, int $post_id, string $element_id) * - filter `zadex/forms/popup_options` (array $options) * - integrations (includes/Forms/Integrations/): filter `zadex/forms/webhook_request`, filter * `zadex/forms/webhook_reject_unsafe`, action `zadex/forms/integration_error`, cron `zadex_forms_webhook_retry` */ final class Forms { private static ?Actions $actions = null; private ?WidgetRegistry $widgets; public function __construct(?WidgetRegistry $widgets = null) { $this->widgets = $widgets; } /** Shared registry (one per request). */ public static function actions(): Actions { if (self::$actions === null) { self::$actions = new Actions(); } return self::$actions; } public function register(): void { // Nothing here may translate strings: this runs during plugins_loaded, before `init`. $widgets = $this->widgets; add_action('rest_api_init', static function () use ($widgets): void { (new SubmitController($widgets, self::actions()))->routes(); }); add_filter('zadex/widgets/manifests', static fn(array $manifests): array => self::actions()->extend_manifest($manifests), 20); add_filter('zadex/editor/config', [self::class, 'editor_config'], 10, 1); (new Integrations\Integrations())->register(); // Runs during plugins_loaded (Plugin::boot): migrate the table when the schema version changed. (new Submissions())->maybe_upgrade(); if (is_admin()) { (new SubmissionsPage())->register(); } } /** Runtime option list for the Popup action select (`optionsFrom: "popups"`). */ public static function editor_config(array $config): array { $config['data'] = is_array($config['data'] ?? null) ? $config['data'] : []; $config['data']['popups'] = Popups::options(); return $config; } }