PluginProbe
Elementor Website Builder – more than just a page builder / 3.5.6
Elementor Website Builder – more than just a page builder v3.5.6
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
← All changes | includes/tracker.php +11 -90 4.2.33.5.6 View file →
@@ -1,8 +1,7 @@
1 1 <?php
2 2 namespace Elementor;
3 3
4 -use Elementor\Core\Common\Modules\EventTracker\DB as Events_DB_Manager;
5 4 use Elementor\Core\Experiments\Experiments_Reporter;
6 5 use Elementor\Modules\System_Info\Module as System_Info_Module;
7 6
8 7 if ( ! defined( 'ABSPATH' ) ) {
@@ -28,14 +27,12 @@
28 27 * @access private
29 28 *
30 29 * @var string API URL.
31 30 */
32 - private static $api_url = 'https://my.elementor.com/api/v1/tracker/';
31 + private static $_api_url = 'https://my.elementor.com/api/v1/tracker/';
33 32
34 33 private static $notice_shown = false;
35 34
36 - const LAST_TERMS_UPDATED = '2025-07-07';
37 -
38 35 /**
39 36 * Init.
40 37 *
41 38 * Initialize Elementor tracker.
@@ -46,10 +43,8 @@
46 43 */
47 44 public static function init() {
48 45 add_action( 'elementor/tracker/send_event', [ __CLASS__, 'send_tracking_data' ] );
49 46 add_action( 'admin_init', [ __CLASS__, 'handle_tracker_actions' ] );
50 -
51 - add_action( 'update_option_elementor_allow_tracking', [ __CLASS__, 'set_last_update_time' ] );
52 47 }
53 48
54 49 /**
55 50 * Check for settings opt-in.
@@ -72,10 +67,8 @@
72 67 'opt_in_send_tracking_data',
73 68 ] );
74 69 }
75 70
76 - self::set_last_update_time();
77 -
78 71 if ( empty( $new_value ) ) {
79 72 $new_value = 'no';
80 73 }
81 74
@@ -133,10 +126,13 @@
133 126 // Send a maximum of once per week by default.
134 127 if ( $last_send && $last_send > $last_send_interval ) {
135 128 return;
136 129 }
137 - } elseif ( $last_send && $last_send > strtotime( '-1 hours' ) ) {
138 - return;
130 + } else {
131 + // Make sure there is at least a 1 hour delay between override sends, we dont want duplicate calls due to double clicking links.
132 + if ( $last_send && $last_send > strtotime( '-1 hours' ) ) {
133 + return;
134 + }
139 135 }
140 136
141 137 // Update time first before sending to ensure it is set.
142 138 update_option( 'elementor_tracker_last_send', time() );
@@ -142,27 +138,21 @@
142 138 update_option( 'elementor_tracker_last_send', time() );
143 139
144 140 $params = self::get_tracking_data( empty( $last_send ) );
145 141
146 - // Tracking data is used for System Info reports, and events should not be included in System Info reports,
147 - // so it is added here.
148 - $params['analytics_events'] = self::get_events();
149 -
150 142 add_filter( 'https_ssl_verify', '__return_false' );
151 143
152 144 wp_safe_remote_post(
153 - self::$api_url,
145 + self::$_api_url,
154 146 [
155 147 'timeout' => 25,
156 148 'blocking' => false,
149 + // 'sslverify' => false,
157 150 'body' => [
158 151 'data' => wp_json_encode( $params ),
159 152 ],
160 153 ]
161 154 );
162 -
163 - // After sending the event tracking data, we reset the events table.
164 - Events_DB_Manager::reset_table();
165 155 }
166 156
167 157 /**
168 158 * Is allow track.
@@ -176,31 +166,8 @@
176 166 public static function is_allow_track() {
177 167 return 'yes' === get_option( 'elementor_allow_tracking', 'no' );
178 168 }
179 169
180 - public static function get_last_update_time() {
181 - return get_option( 'elementor_allow_tracking_last_update', false );
182 - }
183 -
184 - public static function set_last_update_time(): void {
185 - update_option( 'elementor_allow_tracking_last_update', gmdate( 'U' ) );
186 - }
187 -
188 - public static function has_terms_changed( $terms_updated = self::LAST_TERMS_UPDATED ): bool {
189 - if ( ! self::is_allow_track() ) {
190 - return false;
191 - }
192 -
193 - $last_update_time = self::get_last_update_time();
194 - if ( $last_update_time ) {
195 - $terms_updated_timestamp = strtotime( $terms_updated . ' UTC' );
196 -
197 - return $last_update_time < $terms_updated_timestamp;
198 - }
199 -
200 - return true;
201 - }
202 -
203 170 /**
204 171 * Handle tracker actions.
205 172 *
206 173 * Check if the user opted-in or opted-out and update the database.
@@ -227,9 +194,9 @@
227 194
228 195 self::set_opt_in( false );
229 196 }
230 197
231 - wp_safe_redirect( remove_query_arg( 'elementor_tracker' ) );
198 + wp_redirect( remove_query_arg( 'elementor_tracker' ) );
232 199 exit;
233 200 }
234 201
235 202 /**
@@ -243,10 +210,8 @@
243 210
244 211 public static function set_opt_in( $value ) {
245 212 if ( $value ) {
246 213 update_option( 'elementor_allow_tracking', 'yes' );
247 - self::set_last_update_time();
248 -
249 214 self::send_tracking_data( true );
250 215 } else {
251 216 update_option( 'elementor_allow_tracking', 'no' );
252 217 update_option( 'elementor_tracker_notice', '1' );
@@ -266,13 +231,8 @@
266 231 */
267 232 private static function get_system_reports_data() {
268 233 $reports = Plugin::$instance->system_info->load_reports( System_Info_Module::get_allowed_reports() );
269 234
270 - // The log report should not be sent with the usage data - it is not used and causes bloat.
271 - if ( isset( $reports['log'] ) ) {
272 - unset( $reports['log'] );
273 - }
274 -
275 235 $system_reports = [];
276 236 foreach ( $reports as $report_key => $report_details ) {
277 237 $system_reports[ $report_key ] = [];
278 238 foreach ( $report_details['report']->get_report() as $sub_report_key => $sub_report_details ) {
@@ -324,9 +284,8 @@
324 284 global $wpdb;
325 285
326 286 $usage = [];
327 287
328 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
329 288 $results = $wpdb->get_results(
330 289 "SELECT `post_type`, `post_status`, COUNT(`ID`) `hits`
331 290 FROM {$wpdb->posts} `p`
332 291 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id` AND `meta_key` = '_elementor_edit_mode' )
@@ -359,9 +318,8 @@
359 318 global $wpdb;
360 319
361 320 $usage = [];
362 321
363 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
364 322 $results = $wpdb->get_results(
365 323 "SELECT `post_type`, `post_status`, COUNT(`ID`) `hits`
366 324 FROM {$wpdb->posts} `p`
367 325 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id`)
@@ -395,9 +353,8 @@
395 353 global $wpdb;
396 354
397 355 $usage = [];
398 356
399 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
400 357 $results = $wpdb->get_results(
401 358 "SELECT `meta_value`, COUNT(`ID`) `hits`
402 359 FROM {$wpdb->posts} `p`
403 360 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id`)
@@ -412,8 +369,9 @@
412 369 }
413 370 }
414 371
415 372 return $usage;
373 +
416 374 }
417 375
418 376 /**
419 377 * Get usage of general settings.
@@ -435,18 +393,8 @@
435 393 return self::get_tracking_data_from_settings( 'advanced' );
436 394 }
437 395
438 396 /**
439 - * Get usage of performance settings.
440 - * 'Elementor->Settings->Performance'.
441 - *
442 - * @return array
443 - */
444 - public static function get_settings_performance_usage() {
445 - return self::get_tracking_data_from_settings( 'performance' );
446 - }
447 -
448 - /**
449 397 * Get usage of experiments settings.
450 398 *
451 399 * 'Elementor->Settings->Experiments'.
452 400 *
@@ -507,9 +455,8 @@
507 455 global $wpdb;
508 456
509 457 $usage = [];
510 458
511 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
512 459 $results = $wpdb->get_results(
513 460 "SELECT `meta_value`, COUNT(`ID`) `hits`, `post_status`
514 461 FROM {$wpdb->posts} `p`
515 462 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id`)
@@ -532,26 +479,9 @@
532 479 }
533 480 }
534 481
535 482 return $usage;
536 - }
537 483
538 - public static function get_events() {
539 - global $wpdb;
540 - $table_name = $wpdb->prefix . Events_DB_Manager::TABLE_NAME;
541 -
542 - // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
543 - $results = $wpdb->get_results( "SELECT event_data FROM {$table_name}" );
544 -
545 - $events_data = [];
546 -
547 - foreach ( $results as $event ) {
548 - // Results are stored in the database as a JSON string. Since all tracking data is encoded right before
549 - // being sent, it is now decoded.
550 - $events_data[] = json_decode( $event->event_data, true );
551 - }
552 -
553 - return $events_data;
554 484 }
555 485
556 486 /**
557 487 * Get the tracking data
@@ -589,18 +519,8 @@
589 519 'is_first_time' => $is_first_time,
590 520 'install_time' => Plugin::instance()->get_install_time(),
591 521 ];
592 522
593 - $site_key = Api::get_site_key();
594 - if ( ! empty( $site_key ) ) {
595 - $params['site_key'] = $site_key;
596 - }
597 -
598 - $allowed_usage_time = self::get_last_update_time();
599 - if ( ! empty( $allowed_usage_time ) ) {
600 - $params['allowed_usage_time'] = $allowed_usage_time;
601 - }
602 -
603 523 /**
604 524 * Tracker send tracking data params.
605 525 *
606 526 * Filters the data parameters when sending tracking request.
@@ -607,8 +527,9 @@
607 527 *
608 528 * @param array $params Variable to encode as JSON.
609 529 *
610 530 * @since 1.0.0
531 + *
611 532 */
612 533 $params = apply_filters( 'elementor/tracker/send_tracking_data_params', $params );
613 534
614 535 return $params;