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
elementor / core / common / modules / events-manager / module.php

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

177 lines 5.6 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\Common\Modules\EventsManager\RestApi\Events_Proxy_REST_API;
9 use Elementor\Core\Experiments\Manager as Experiments_Manager;
10 use Elementor\Includes\EditorAssetsAPI;
11 use Elementor\Utils;
12 use Elementor\Plugin;
13 use Elementor\Tracker;
14
15 if ( ! defined( 'ABSPATH' ) ) {
16 exit; // Exit if accessed directly.
17 }
18
19 class Module extends BaseModule {
20
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';
24
25 const API_UPSTREAM_HOST = 'https://api-eu.mixpanel.com';
26 const LIBS_UPSTREAM_HOST = 'https://cdn.mxpnl.com/libs';
27
28 public function __construct() {
29 parent::__construct();
30
31 ( new Events_Proxy_REST_API() )->register_hooks();
32 }
33
34 public function get_name() {
35 return 'events-manager';
36 }
37
38 public static function get_editor_events_config() {
39 $can_send_events = self::can_send_events();
40
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;
44
45 if ( $can_send_events ) {
46 $mixpanel_config = self::get_remote_mixpanel_config();
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 }
55 }
56
57 $settings = [
58 'can_send_events' => $can_send_events,
59 'debug' => $debug,
60 'elementor_version' => ELEMENTOR_VERSION,
61 'site_url' => hash( 'sha256', get_site_url() ),
62 'wp_version' => get_bloginfo( 'version' ),
63 'user_agent' => esc_html( Utils::get_super_global_value( $_SERVER, 'HTTP_USER_AGENT' ) ),
64 'site_language' => get_locale(),
65 'site_key' => get_option( Base_App::OPTION_CONNECT_SITE_KEY ),
66 'subscription_id' => self::get_subscription_id(),
67 'subscription' => self::get_subscription(),
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/' ),
71 'flags_enabled' => $is_flags_enabled,
72 'user_id' => self::get_user_id(),
73 'session_recording_percent' => $session_recording_percent,
74 ];
75
76 return $settings;
77 }
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
104 public static function get_experimental_data(): array {
105 return [
106 'name' => static::EXPERIMENT_NAME,
107 'title' => esc_html__( 'Elementor Editor Events', 'elementor' ),
108 'description' => esc_html__( 'Editor events processing', 'elementor' ),
109 'hidden' => true,
110 'release_status' => Experiments_Manager::RELEASE_STATUS_ALPHA,
111 'default' => Experiments_Manager::STATE_INACTIVE,
112 'new_site' => [
113 'default_active' => true,
114 'minimum_installation_version' => '3.32.0',
115 ],
116 ];
117 }
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
126 private static function get_subscription_id() {
127 $subscription = self::get_subscription();
128
129 return $subscription['subscription_id'] ?? null;
130 }
131
132 private static function get_subscription() {
133 if ( ! Utils::has_pro() ) {
134 return null;
135 }
136
137 $license_data = get_option( '_elementor_pro_license_v2_data' );
138 if ( ! isset( $license_data['value'] ) ) {
139 return null;
140 }
141
142 return json_decode( $license_data['value'], true );
143 }
144
145 private static function get_remote_mixpanel_config() {
146 $editor_assets_api = new EditorAssetsAPI( [
147 EditorAssetsAPI::ASSETS_DATA_URL => static::REMOTE_MIXPANEL_CONFIG_URL,
148 EditorAssetsAPI::ASSETS_DATA_TRANSIENT_KEY => '_elementor_mixpanel_config',
149 EditorAssetsAPI::ASSETS_DATA_KEY => 'mixpanel',
150 ] );
151
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 );
175 }
176 }
177