PluginProbe
Elementor Website Builder – more than just a page builder / 4.3.0-beta3
Elementor Website Builder – more than just a page builder v4.3.0-beta3
4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 All 452 releases
← All changes | core/common/modules/events-manager/module.php +82 -8 4.0.94.3.0-beta3 View file →
@@ -3,8 +3,10 @@
3 3 namespace Elementor\Core\Common\Modules\EventsManager;
4 4
5 5 use Elementor\Core\Base\Module as BaseModule;
6 6 use Elementor\Core\Common\Modules\Connect\Apps\Base_App;
7 +use Elementor\Core\Common\Modules\Connect\Apps\Common_App;
8 +use Elementor\Core\Common\Modules\EventsManager\RestApi\Events_Proxy_REST_API;
7 9 use Elementor\Core\Experiments\Manager as Experiments_Manager;
8 10 use Elementor\Includes\EditorAssetsAPI;
9 11 use Elementor\Utils;
10 12 use Elementor\Plugin;
@@ -16,32 +18,46 @@
16 18
17 19 class Module extends BaseModule {
18 20
19 21 const EXPERIMENT_NAME = 'editor_events';
22 + const DEFAULT_SESSION_RECORDING_PERCENT = 0;
23 + const REMOTE_MIXPANEL_CONFIG_URL = 'https://assets.elementor.com/mixpanel/v1/mixpanel.json';
20 24
21 - const REMOTE_MIXPANEL_CONFIG_URL = 'https://assets.elementor.com/mixpanel/v1/mixpanel.json';
25 + const API_UPSTREAM_HOST = 'https://api-eu.mixpanel.com';
26 + const LIBS_UPSTREAM_HOST = 'https://cdn.mxpnl.com/libs';
22 27
28 + public function __construct() {
29 + parent::__construct();
30 +
31 + ( new Events_Proxy_REST_API() )->register_hooks();
32 + }
33 +
23 34 public function get_name() {
24 35 return 'events-manager';
25 36 }
26 37
27 38 public static function get_editor_events_config() {
28 - $can_send_events = ! empty( ELEMENTOR_EDITOR_EVENTS_MIXPANEL_TOKEN ) &&
29 - Tracker::is_allow_track() &&
30 - ! Tracker::has_terms_changed( '2025-07-07' ) &&
31 - Plugin::$instance->experiments->is_feature_active( self::EXPERIMENT_NAME );
39 + $can_send_events = self::can_send_events();
32 40
33 41 $is_flags_enabled = false;
42 + $session_recording_percent = self::DEFAULT_SESSION_RECORDING_PERCENT;
43 + $debug = ( defined( 'ELEMENTOR_EDITOR_EVENTS_DEBUG' ) && ELEMENTOR_EDITOR_EVENTS_DEBUG ) ?? false;
34 44
35 45 if ( $can_send_events ) {
36 46 $mixpanel_config = self::get_remote_mixpanel_config();
37 - $is_flags_enabled = EditorAssetsAPI::has_valid_nested_array( $mixpanel_config, [ 0 ] )
38 - ? (bool) ( $mixpanel_config[0]['flags'] ?? false )
39 - : false;
47 + $has_config = EditorAssetsAPI::has_valid_nested_array( $mixpanel_config, [ 0 ] );
48 +
49 + if ( $has_config ) {
50 + $is_flags_enabled = (bool) ( $mixpanel_config[0]['flags'] ?? false );
51 +
52 + $session_replays = $mixpanel_config[0]['sessionReplays'] ?? [];
53 + $session_recording_percent = $session_replays['recordSessionsPercent'] ?? null;
54 + }
40 55 }
41 56
42 57 $settings = [
43 58 'can_send_events' => $can_send_events,
59 + 'debug' => $debug,
44 60 'elementor_version' => ELEMENTOR_VERSION,
45 61 'site_url' => hash( 'sha256', get_site_url() ),
46 62 'wp_version' => get_bloginfo( 'version' ),
47 63 'user_agent' => esc_html( Utils::get_super_global_value( $_SERVER, 'HTTP_USER_AGENT' ) ),
@@ -49,14 +65,43 @@
49 65 'site_key' => get_option( Base_App::OPTION_CONNECT_SITE_KEY ),
50 66 'subscription_id' => self::get_subscription_id(),
51 67 'subscription' => self::get_subscription(),
52 68 'token' => ELEMENTOR_EDITOR_EVENTS_MIXPANEL_TOKEN,
69 + 'proxy_api_host' => rest_url( Events_Proxy_REST_API::API_NAMESPACE . '/' . Events_Proxy_REST_API::API_BASE . '/api' ),
70 + 'proxy_lib_base_path' => rest_url( Events_Proxy_REST_API::API_NAMESPACE . '/' . Events_Proxy_REST_API::API_BASE . '/libs/' ),
53 71 'flags_enabled' => $is_flags_enabled,
72 + 'user_id' => self::get_user_id(),
73 + 'session_recording_percent' => $session_recording_percent,
54 74 ];
55 75
56 76 return $settings;
57 77 }
58 78
79 + public static function dispatch_event( string $event_name, array $properties = [] ): void {
80 + if ( ! self::can_send_events() ) {
81 + return;
82 + }
83 +
84 + try {
85 + $user_id = self::get_user_id();
86 +
87 + $context = [
88 + 'user_id' => $user_id,
89 + 'distinct_id' => $user_id,
90 + 'subscription_id' => self::get_subscription_id(),
91 + 'site_key' => get_option( Base_App::OPTION_CONNECT_SITE_KEY ),
92 + 'app_version' => ELEMENTOR_VERSION,
93 + 'wp_version' => get_bloginfo( 'version' ),
94 + 'site_language' => get_locale(),
95 + 'source' => 'server',
96 + ];
97 +
98 + Server_Events_Client::track( $event_name, array_merge( $properties, $context ) );
99 + } catch ( \Throwable $e ) {
100 + return;
101 + }
102 + }
103 +
59 104 public static function get_experimental_data(): array {
60 105 return [
61 106 'name' => static::EXPERIMENT_NAME,
62 107 'title' => esc_html__( 'Elementor Editor Events', 'elementor' ),
@@ -70,8 +115,15 @@
70 115 ],
71 116 ];
72 117 }
73 118
119 + private static function can_send_events(): bool {
120 + return ! empty( ELEMENTOR_EDITOR_EVENTS_MIXPANEL_TOKEN ) &&
121 + Tracker::is_allow_track() &&
122 + ! Tracker::has_terms_changed() &&
123 + Plugin::$instance->experiments->is_feature_active( self::EXPERIMENT_NAME );
124 + }
125 +
74 126 private static function get_subscription_id() {
75 127 $subscription = self::get_subscription();
76 128
77 129 return $subscription['subscription_id'] ?? null;
@@ -97,6 +149,28 @@
97 149 EditorAssetsAPI::ASSETS_DATA_KEY => 'mixpanel',
98 150 ] );
99 151
100 152 return $editor_assets_api->get_assets_data();
153 + }
154 +
155 + public static function get_mixpanel_api_host() {
156 + $mixpanel_config = self::get_remote_mixpanel_config();
157 +
158 + return wp_http_validate_url( $mixpanel_config[0]['apiHost'] ?? static::API_UPSTREAM_HOST );
159 + }
160 +
161 + public static function get_mixpanel_lib_host() {
162 + $mixpanel_config = self::get_remote_mixpanel_config();
163 +
164 + return wp_http_validate_url( $mixpanel_config[0]['libHost'] ?? static::LIBS_UPSTREAM_HOST );
165 + }
166 +
167 + private static function get_user_id() {
168 + $user_common_data = get_user_option( Common_App::OPTION_CONNECT_COMMON_DATA_KEY );
169 +
170 + if ( ! is_array( $user_common_data ) ) {
171 + return null;
172 + }
173 +
174 + return Common_App::get_connect_user_id_from_access_token( $user_common_data['access_token'] ?? null );
101 175 }
102 176 }