Integration Failure — emails the admin when an integration throws. */ public static function notify_on_failure( string $key, \Throwable $e, int $entry_id ) { if ( ! Settings::get( 'integration_failure_email_enabled', true ) ) { return; } wp_mail( Settings::get( 'notification_email', get_option( 'admin_email' ) ), sprintf( /* translators: %s: integration key, e.g. "webhook" */ __( 'ChargeForms: "%s" integration failed', 'chargeforms' ), $key ), sprintf( /* translators: 1: entry id, 2: error message */ __( "The \"%1\$s\" integration failed while processing entry #%2\$d.\n\nError: %3\$s", 'chargeforms' ), $key, $entry_id, $e->getMessage() ) ); } public static function register_defaults() { self::register( new Webhook_Integration() ); self::register( new Mailchimp_Integration() ); self::register( new Marketing_Integration( 'brevo' ) ); self::register( new Marketing_Integration( 'activecampaign' ) ); self::register( new Slack_Integration() ); self::register( new Discord_Integration() ); self::register( new Telegram_Integration() ); self::register( new Notion_Integration() ); self::register( new Hubspot_Integration() ); self::register( new Google_Sheets_Integration() ); /** * Lets the Pro add-on (or any third-party plugin) register additional * integrations without editing ChargeForms core. * * @param Abstract_Integration[] $integrations */ $extra = apply_filters( 'chargeforms_register_integrations', [] ); foreach ( $extra as $integration ) { self::register( $integration ); } } public static function register( Abstract_Integration $integration ) { self::$integrations[ $integration->key() ] = $integration; } public static function all(): array { return self::$integrations; } /** * Runs every registered integration that has settings saved for this form. * Hooked to `chargeforms_after_submission` — fired from Submission_Handler. */ public static function dispatch( int $entry_id, array $values, array $form ) { $form_integrations = $form['settings']['integrations'] ?? []; foreach ( self::$integrations as $key => $integration ) { $settings = $form_integrations[ $key ] ?? []; if ( ! $integration->is_configured( $settings ) ) { continue; } try { $integration->process( $values, $form, $entry_id, $settings ); } catch ( \Throwable $e ) { // A failing integration must never break the actual submission. do_action( 'chargeforms_integration_error', $key, $e, $entry_id ); } } } }