'John', 'email' => 'john@example.com'] * @param array $widget_settings Full widget settings - action extracts what it needs. * Example: ['email_to' => 'admin@site.com', 'email_subject' => 'New form', ...] * @param array $context Additional context (post_id, form_id, form_name). * Example: ['post_id' => 123, 'form_id' => 'contact', 'form_name' => 'Contact Form'] * @return array Result array with 'status' and optional data. * Success: ['status' => 'success', 'message' => '...', ...] * Failure: ['status' => 'failed', 'error' => '...', ...] */ abstract public function execute( array $form_data, array $widget_settings, array $context ): array; /** * Validate widget settings for this action. * * @param array $widget_settings Widget settings to validate. * @return bool|\WP_Error True if valid, WP_Error otherwise. */ protected function validate_settings( array $widget_settings ) { return true; } /** * Format a success result. * * @param string $message Success message. * @param array $additional_data Additional data to include. * @return array */ protected function success( string $message, array $additional_data = [] ): array { return array_merge( [ 'status' => 'success', 'message' => $message, ], $additional_data ); } /** * Format a failure result. * * @param string $error Error message. * @param array $additional_data Additional data to include. * @return array */ protected function failure( string $error, array $additional_data = [] ): array { return array_merge( [ 'status' => 'failed', 'error' => $error, ], $additional_data ); } }