__( 'Spectra Onboarding', 'ultimate-addons-for-gutenberg' ), 'product' => array( 'id' => 'spectra', 'name' => __( 'Spectra', 'ultimate-addons-for-gutenberg' ), ), 'logo' => UAGB_URL . 'assets/images/logos/spectra.svg', 'screens' => array( 'welcome' => array( 'heading' => __( 'Welcome to Spectra', 'ultimate-addons-for-gutenberg' ), 'description' => __( 'Build a fast, beautiful WordPress site—effortlessly.', 'ultimate-addons-for-gutenberg' ), 'banner' => array( 'type' => 'video', 'url' => 'https://www.youtube-nocookie.com/embed/GLNzTxArR6Y?showinfo=0&autoplay=1&modestbranding=1&rel=0', 'title' => __( 'Getting Started with Spectra', 'ultimate-addons-for-gutenberg' ), 'thumbnail' => UAGB_URL . 'admin-core/assets/images/onboarding-video-bg.png', ), 'items' => array( __( 'Trusted by 1.8M+ websites worldwide', 'ultimate-addons-for-gutenberg' ), __( 'Import ready-made patterns & templates', 'ultimate-addons-for-gutenberg' ), __( 'Easy customization—no coding or design skills', 'ultimate-addons-for-gutenberg' ), __( 'Drag & Drop blocks to build your layout', 'ultimate-addons-for-gutenberg' ), ), ), 'user-info' => array( 'description' => __( 'Get helpful updates, new features, and tips to make your website better—while helping us improve Spectra.', 'ultimate-addons-for-gutenberg' ), 'sourceOptions' => array( 'wordpress' => __( 'WordPress Plugin Directory', 'ultimate-addons-for-gutenberg' ), 'google' => __( 'Google Search', 'ultimate-addons-for-gutenberg' ), 'social' => __( 'Social Media', 'ultimate-addons-for-gutenberg' ), 'youtube' => __( 'YouTube', 'ultimate-addons-for-gutenberg' ), 'friend' => __( 'A friend or colleague', 'ultimate-addons-for-gutenberg' ), 'other' => __( 'Other', 'ultimate-addons-for-gutenberg' ), ), 'benefitOptions' => array( 'design-flexibility' => __( 'Advanced design flexibility without bloated builders', 'ultimate-addons-for-gutenberg' ), 'ai-and-templates' => __( 'AI and templates help me design quickly', 'ultimate-addons-for-gutenberg' ), 'fast-loading' => __( 'I need a fast-loading page builder', 'ultimate-addons-for-gutenberg' ), 'updates-and-support' => __( 'Regular updates and support from Brainstorm Force', 'ultimate-addons-for-gutenberg' ), 'other' => __( 'Other (please specify)', 'ultimate-addons-for-gutenberg' ), ), 'privacyPolicy' => array( 'url' => 'https://store.brainstormforce.com/usage-tracking/?utm_source=spectra_dashboard&utm_medium=onboarding&utm_campaign=link', 'label' => __( 'Privacy Policy', 'ultimate-addons-for-gutenberg' ), ), 'optIn' => array( 'description' => __( 'Stay in the loop and help shape Spectra! Get feature updates, and help us build a better Spectra by sharing how you use the plugin.', 'ultimate-addons-for-gutenberg' ), 'learnMoreUrl' => 'https://store.brainstormforce.com/usage-tracking/?utm_source=spectra_dashboard&utm_medium=onboarding&utm_campaign=link', ), ), 'features' => array( 'description' => __( 'Enable the features you need to design faster and build better with Spectra.', 'ultimate-addons-for-gutenberg' ), 'featureList' => self::get_feature_list(), 'upgradeUrl' => 'https://wpspectra.com/pricing/?utm_source=spectra_dashboard&utm_medium=onboarding&utm_campaign=pro-features', ), 'add-ons' => array( 'addonList' => self::get_addon_list(), ), 'done' => array( 'items' => array( __( 'Create a Page', 'ultimate-addons-for-gutenberg' ), __( 'Visit Dashboard', 'ultimate-addons-for-gutenberg' ), __( 'View Documentation', 'ultimate-addons-for-gutenberg' ), ), 'cta1' => array( 'url' => admin_url( 'post-new.php?post_type=page' ), 'label' => __( 'Create a Page', 'ultimate-addons-for-gutenberg' ), ), 'cta2' => array( 'url' => admin_url( 'admin.php?page=spectra' ), 'label' => __( 'Visit Dashboard', 'ultimate-addons-for-gutenberg' ), ), 'cta3' => array( 'url' => 'https://wpspectra.com/docs/?utm_source=spectra_dashboard&utm_medium=onboarding', 'label' => __( 'Docs & Help Center', 'ultimate-addons-for-gutenberg' ), ), ), ), 'exit' => array( 'url' => admin_url( 'admin.php?page=spectra' ), ), 'colors' => array(), 'option_name' => 'spectra_onboarding', 'pro_status' => self::get_pro_status(), 'pro_slug' => 'spectra-pro', ) ); // Completion hooks. add_action( 'one_onboarding_completion_spectra', array( $this, 'handle_onboarding_completion' ), 10, 2 ); add_action( 'one_onboarding_plugin_activated', array( $this, 'handle_plugin_activated' ) ); } /** * Get Spectra Pro plugin status. * * @since 2.19.23 * @return string */ private static function get_pro_status() { if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } if ( is_plugin_active( 'spectra-pro/spectra-pro.php' ) ) { return 'Activated'; } $all_plugins = get_plugins(); if ( isset( $all_plugins['spectra-pro/spectra-pro.php'] ) ) { return 'Installed'; } return 'Not Installed'; } /** * Handle onboarding completion. * * @since 2.19.23 * @param array $completion_data Onboarding state, user info, product details. * @param \WP_REST_Request $request REST request object. * @return void */ public function handle_onboarding_completion( $completion_data, $request ) { $screens = isset( $completion_data['screens'] ) ? $completion_data['screens'] : array(); $is_user_info_skipped = true; foreach ( $screens as $screen ) { if ( 'user-info' === $screen['id'] ) { $is_user_info_skipped = isset( $screen['skipped'] ) ? $screen['skipped'] : true; } } // Update analytics opt-in and send lead if user-info was not skipped. if ( ! $is_user_info_skipped ) { $user_info = isset( $completion_data['user_info'] ) ? $completion_data['user_info'] : array(); $optin = ! empty( $user_info['optIn'] ); // Update analytics opt-in. update_site_option( 'spectra_usage_optin', $optin ? 'yes' : 'no' ); // Only send lead to CRM if user opted in. if ( $optin ) { self::generate_lead( $user_info ); } } // Track onboarding completion event. if ( class_exists( 'UAGB_Analytics_Events' ) ) { $skipped_steps = array(); foreach ( $screens as $screen ) { if ( ! empty( $screen['skipped'] ) ) { $skipped_steps[] = sanitize_text_field( $screen['id'] ); } } $properties = array(); if ( ! empty( $skipped_steps ) ) { $properties['skipped_steps'] = implode( ',', $skipped_steps ); } UAGB_Analytics_Events::track( 'onboarding_completed', '', $properties ); } } /** * Handle plugin activation from onboarding add-ons step. * * @since 2.19.23 * @param string $slug Plugin slug. * @return void */ public function handle_plugin_activated( $slug ) { if ( empty( $slug ) ) { return; } if ( class_exists( 'BSF_UTM_Analytics' ) && is_callable( array( 'BSF_UTM_Analytics', 'update_referer' ) ) ) { BSF_UTM_Analytics::update_referer( 'spectra', $slug ); } } /** * Check if onboarding has been completed. * * @since 2.19.23 * @return bool */ public static function is_onboarding_completed() { $data = get_option( 'spectra_onboarding', array() ); return ! empty( $data ); } /** * Get feature list for the features step. * * @since 2.19.23 * @return array> */ public static function get_feature_list() { return array( array( 'title' => __( 'Design System (Global Styles)', 'ultimate-addons-for-gutenberg' ), 'description' => __( 'Set global colors and typography to keep your design consistent across your website.', 'ultimate-addons-for-gutenberg' ), ), array( 'title' => __( 'Advanced Layout Controls', 'ultimate-addons-for-gutenberg' ), 'description' => __( 'Build flexible layouts with containers, spacing, and responsive controls.', 'ultimate-addons-for-gutenberg' ), ), array( 'title' => __( 'Popup Builder', 'ultimate-addons-for-gutenberg' ), 'description' => __( 'Create engaging popups for promotions, announcements, and lead generation.', 'ultimate-addons-for-gutenberg' ), ), array( 'id' => 'dynamic-content', 'title' => __( 'Dynamic Content', 'ultimate-addons-for-gutenberg' ), 'description' => __( 'Connect your content and display dynamic data across your website with ease.', 'ultimate-addons-for-gutenberg' ), 'isPro' => true, ), array( 'id' => 'loop-builder', 'title' => __( 'Loop Builder', 'ultimate-addons-for-gutenberg' ), 'description' => __( 'Design custom layouts for blog posts, archives, and dynamic content.', 'ultimate-addons-for-gutenberg' ), 'isPro' => true, ), array( 'id' => 'login-register', 'title' => __( 'Login & Registration Forms', 'ultimate-addons-for-gutenberg' ), 'description' => __( 'Create custom login and registration forms to manage user access on your website.', 'ultimate-addons-for-gutenberg' ), 'isPro' => true, ), ); } /** * Get addon SVG icons. * * @since 2.19.23 * @return array */ private static function get_addon_icons() { return array( 'starter-templates' => '', 'surerank' => '', 'sureforms' => '', 'suremails' => '', ); } /** * Get add-on list for the add-ons step. * * @since 2.19.23 * @return array> */ public static function get_addon_list() { $icons = self::get_addon_icons(); return array( array( 'slug' => 'astra-sites', 'title' => __( 'Starter Templates', 'ultimate-addons-for-gutenberg' ), 'logoSvg' => $icons['starter-templates'], 'description' => __( 'Launch websites quickly with 300+ professionally designed templates.', 'ultimate-addons-for-gutenberg' ), ), array( 'slug' => 'sureforms', 'title' => __( 'SureForms', 'ultimate-addons-for-gutenberg' ), 'logoSvg' => $icons['sureforms'], 'description' => __( 'Create beautiful forms that feel conversational and keep users engaged.', 'ultimate-addons-for-gutenberg' ), ), array( 'slug' => 'suremails', 'title' => __( 'SureMails', 'ultimate-addons-for-gutenberg' ), 'logoSvg' => $icons['suremails'], 'description' => __( 'Reliable email delivery so your emails actually reach the inbox.', 'ultimate-addons-for-gutenberg' ), ), array( 'slug' => 'surerank', 'title' => __( 'SureRank', 'ultimate-addons-for-gutenberg' ), 'logoSvg' => $icons['surerank'], 'description' => __( 'Simple, lightweight SEO assistant to help your site rank higher.', 'ultimate-addons-for-gutenberg' ), ), ); } /** * Send lead data to BSF metrics server. * * @since 2.19.23 * @param array $user_info User info from onboarding. * @return void */ private static function generate_lead( $user_info ) { if ( empty( $user_info ) || ! is_array( $user_info ) ) { return; } $body = array( 'first_name' => isset( $user_info['firstName'] ) && is_string( $user_info['firstName'] ) ? sanitize_text_field( $user_info['firstName'] ) : '', 'last_name' => isset( $user_info['lastName'] ) && is_string( $user_info['lastName'] ) ? sanitize_text_field( $user_info['lastName'] ) : '', 'email' => isset( $user_info['email'] ) && is_string( $user_info['email'] ) ? sanitize_email( $user_info['email'] ) : '', 'source' => isset( $user_info['source'] ) && is_string( $user_info['source'] ) ? sanitize_text_field( $user_info['source'] ) : '', 'new_user' => isset( $user_info['newUser'] ) && is_string( $user_info['newUser'] ) ? sanitize_text_field( $user_info['newUser'] ) : '', 'benefit_id' => isset( $user_info['benefitId'] ) && is_string( $user_info['benefitId'] ) ? sanitize_text_field( $user_info['benefitId'] ) : '', 'benefit_text' => isset( $user_info['benefitText'] ) && is_string( $user_info['benefitText'] ) ? sanitize_text_field( $user_info['benefitText'] ) : '', 'opt_in' => ! empty( $user_info['optIn'] ) ? 'yes' : 'no', 'plugin' => 'spectra', 'version' => defined( 'UAGB_VER' ) ? UAGB_VER : '', 'site_url' => get_site_url(), ); wp_remote_post( 'https://metrics.brainstormforce.com/wp-json/bsf-metrics-server/v1/subscribe', array( 'body' => wp_json_encode( $body ), 'headers' => array( 'Content-Type' => 'application/json' ), 'blocking' => false, 'sslverify' => true, ) ); } /** * Get onboarding analytics data for bsf_core_stats payload. * * @since 2.19.23 * @return array */ public static function get_onboarding_analytics_data() { $onboarding = get_option( 'spectra_onboarding', array() ); if ( ! is_array( $onboarding ) || empty( $onboarding ) ) { return array(); } $data = array( 'boolean_values' => array( 'onboarding_completed' => true, ), ); // Extract skipped screens. if ( ! empty( $onboarding['screens'] ) && is_array( $onboarding['screens'] ) ) { $skipped = array(); foreach ( $onboarding['screens'] as $screen ) { if ( ! empty( $screen['skipped'] ) && ! empty( $screen['id'] ) ) { $skipped[] = sanitize_text_field( $screen['id'] ); } } if ( ! empty( $skipped ) ) { $data['onboarding_skipped_steps'] = $skipped; } } return $data; } /** * Register personal data exporter for GDPR. * * @since 2.19.23 * @param array> $exporters Registered exporters. * @return array> */ public function register_data_exporter( $exporters ) { $exporters['spectra-onboarding'] = array( 'exporter_friendly_name' => __( 'Spectra Onboarding Data', 'ultimate-addons-for-gutenberg' ), 'callback' => array( $this, 'export_personal_data' ), ); return $exporters; } /** * Register personal data eraser for GDPR. * * @since 2.19.23 * @param array> $erasers Registered erasers. * @return array> */ public function register_data_eraser( $erasers ) { $erasers['spectra-onboarding'] = array( 'eraser_friendly_name' => __( 'Spectra Onboarding Data', 'ultimate-addons-for-gutenberg' ), 'callback' => array( $this, 'erase_personal_data' ), ); return $erasers; } /** * Export personal data collected during onboarding. * * @since 2.19.23 * @param string $email_address Email address to export data for. * @return array{data: array>, done: bool} */ public function export_personal_data( $email_address ) { $data = array(); $onboarding = get_option( 'spectra_onboarding', array() ); $user_info = is_array( $onboarding ) && isset( $onboarding['user_info'] ) && is_array( $onboarding['user_info'] ) ? $onboarding['user_info'] : array(); if ( ! empty( $user_info['email'] ) && $email_address === $user_info['email'] ) { $data[] = array( 'group_id' => 'spectra-onboarding', 'group_label' => __( 'Spectra Onboarding', 'ultimate-addons-for-gutenberg' ), 'item_id' => 'spectra-onboarding-details', 'data' => array( array( 'name' => __( 'First Name', 'ultimate-addons-for-gutenberg' ), 'value' => isset( $user_info['firstName'] ) && is_string( $user_info['firstName'] ) ? $user_info['firstName'] : '', ), array( 'name' => __( 'Last Name', 'ultimate-addons-for-gutenberg' ), 'value' => isset( $user_info['lastName'] ) && is_string( $user_info['lastName'] ) ? $user_info['lastName'] : '', ), array( 'name' => __( 'Email', 'ultimate-addons-for-gutenberg' ), 'value' => is_string( $user_info['email'] ) ? $user_info['email'] : '', ), ), ); } return array( 'data' => $data, 'done' => true, ); } /** * Erase personal data collected during onboarding. * * @since 2.19.23 * @param string $email_address Email address to erase data for. * @return array{items_removed: int, items_retained: int, messages: array, done: bool} */ public function erase_personal_data( $email_address ) { $items_removed = 0; $onboarding = get_option( 'spectra_onboarding', array() ); $user_info = is_array( $onboarding ) && isset( $onboarding['user_info'] ) && is_array( $onboarding['user_info'] ) ? $onboarding['user_info'] : array(); if ( ! empty( $user_info['email'] ) && $email_address === $user_info['email'] ) { delete_option( 'spectra_onboarding' ); $items_removed = 1; } return array( 'items_removed' => $items_removed, 'items_retained' => 0, 'messages' => array(), 'done' => true, ); } } }