PluginProbe
Elementor Website Builder – more than just a page builder / 4.1.0-dev1
Elementor Website Builder – more than just a page builder v4.1.0-dev1
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 4.0.7 All 451 releases
elementor / core / common / modules / events-manager / module.php

module.php in Elementor Website Builder – more than just a page builder 4.1.0-dev1, at core/common/modules/events-manager/module.php

144 lines 4.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Elementor\Core\Common\Modules\EventsManager;
4
5 use Elementor\Core\Base\Module as BaseModule;
6 use Elementor\Core\Common\Modules\Connect\Apps\Base_App;
7 use Elementor\Core\Common\Modules\Connect\Apps\Common_App;
8 use Elementor\Core\Experiments\Manager as Experiments_Manager;
9 use Elementor\Includes\EditorAssetsAPI;
10 use Elementor\Utils;
11 use Elementor\Plugin;
12 use Elementor\Tracker;
13
14 if ( ! defined( 'ABSPATH' ) ) {
15 exit; // Exit if accessed directly.
16 }
17
18 class Module extends BaseModule {
19
20 const EXPERIMENT_NAME = 'editor_events';
21
22 const REMOTE_MIXPANEL_CONFIG_URL = 'https://assets.elementor.com/mixpanel/v1/mixpanel.json';
23
24 public function get_name() {
25 return 'events-manager';
26 }
27
28 public static function get_editor_events_config() {
29 $can_send_events = ! empty( ELEMENTOR_EDITOR_EVENTS_MIXPANEL_TOKEN ) &&
30 Tracker::is_allow_track() &&
31 ! Tracker::has_terms_changed( '2025-07-07' ) &&
32 Plugin::$instance->experiments->is_feature_active( self::EXPERIMENT_NAME );
33
34 $is_flags_enabled = false;
35 $session_recording_events = [];
36
37 if ( $can_send_events ) {
38 $mixpanel_config = self::get_remote_mixpanel_config();
39 $has_config = EditorAssetsAPI::has_valid_nested_array( $mixpanel_config, [ 0 ] );
40
41 if ( $has_config ) {
42 $is_flags_enabled = (bool) ( $mixpanel_config[0]['flags'] ?? false );
43
44 $session_replays = $mixpanel_config[0]['sessionReplays'] ?? [];
45 $is_session_replays_enabled = (bool) ( $session_replays['enabled'] ?? false );
46 $raw_events = $session_replays['events'] ?? null;
47 $events_map = is_array( $raw_events ) ? $raw_events : [];
48
49 if ( $is_session_replays_enabled ) {
50 $session_recording_events = array_values( array_filter(
51 self::get_session_recording_events(),
52 function ( $pair ) use ( $events_map ) {
53 if ( ! isset( $pair['start'] ) ) {
54 return false;
55 }
56 return (bool) ( $events_map[ $pair['start'] ] ?? false );
57 }
58 ) );
59 }
60 }
61 }
62
63 $settings = [
64 'can_send_events' => $can_send_events,
65 'elementor_version' => ELEMENTOR_VERSION,
66 'site_url' => hash( 'sha256', get_site_url() ),
67 'wp_version' => get_bloginfo( 'version' ),
68 'user_agent' => esc_html( Utils::get_super_global_value( $_SERVER, 'HTTP_USER_AGENT' ) ),
69 'site_language' => get_locale(),
70 'site_key' => get_option( Base_App::OPTION_CONNECT_SITE_KEY ),
71 'subscription_id' => self::get_subscription_id(),
72 'subscription' => self::get_subscription(),
73 'token' => ELEMENTOR_EDITOR_EVENTS_MIXPANEL_TOKEN,
74 'flags_enabled' => $is_flags_enabled,
75 'user_id' => self::get_user_id(),
76 'session_recording_events' => $session_recording_events,
77 ];
78
79 return $settings;
80 }
81
82 public static function get_experimental_data(): array {
83 return [
84 'name' => static::EXPERIMENT_NAME,
85 'title' => esc_html__( 'Elementor Editor Events', 'elementor' ),
86 'description' => esc_html__( 'Editor events processing', 'elementor' ),
87 'hidden' => true,
88 'release_status' => Experiments_Manager::RELEASE_STATUS_ALPHA,
89 'default' => Experiments_Manager::STATE_INACTIVE,
90 'new_site' => [
91 'default_active' => true,
92 'minimum_installation_version' => '3.32.0',
93 ],
94 ];
95 }
96
97 private static function get_subscription_id() {
98 $subscription = self::get_subscription();
99
100 return $subscription['subscription_id'] ?? null;
101 }
102
103 private static function get_subscription() {
104 if ( ! Utils::has_pro() ) {
105 return null;
106 }
107
108 $license_data = get_option( '_elementor_pro_license_v2_data' );
109 if ( ! isset( $license_data['value'] ) ) {
110 return null;
111 }
112
113 return json_decode( $license_data['value'], true );
114 }
115
116 private static function get_remote_mixpanel_config() {
117 $editor_assets_api = new EditorAssetsAPI( [
118 EditorAssetsAPI::ASSETS_DATA_URL => static::REMOTE_MIXPANEL_CONFIG_URL,
119 EditorAssetsAPI::ASSETS_DATA_TRANSIENT_KEY => '_elementor_mixpanel_config',
120 EditorAssetsAPI::ASSETS_DATA_KEY => 'mixpanel',
121 ] );
122
123 return $editor_assets_api->get_assets_data();
124 }
125
126 private static function get_session_recording_events(): array {
127 return [
128 // Each entry defines a recording window: recording starts when 'start' fires
129 // and stops when 'end' fires. 'end' is optional — omit or set to null to record indefinitely.
130 [ 'start' => 'editor_loaded' ],
131 ];
132 }
133
134 private static function get_user_id() {
135 $user_common_data = get_user_option( Common_App::OPTION_CONNECT_COMMON_DATA_KEY );
136
137 if ( ! is_array( $user_common_data ) ) {
138 return null;
139 }
140
141 return Common_App::get_connect_user_id_from_access_token( $user_common_data['access_token'] ?? null );
142 }
143 }
144