PluginProbe ʕ •ᴥ•ʔ
Elementor Website Builder – more than just a page builder / 4.1.0-beta3
Elementor Website Builder – more than just a page builder v4.1.0-beta3
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 4.0.6 4.0.5 4.0.4 4.0.3 3.22.0-dev1 4.0.0-beta3 3.22.0-dev2 4.0.0-beta4 3.22.0-dev3 4.0.0-beta5 3.22.0-dev4 4.0.0-dev1 3.22.0-dev5 4.0.0-dev2 3.22.0-dev6 4.0.0-dev3 3.22.1 4.0.0-dev4 3.22.2 4.0.0-dev5 3.22.3 4.0.1 3.23.0 4.0.2 3.23.0-beta1 3.23.0-beta2 3.23.0-beta3 3.23.0-beta4 3.23.0-beta5 3.23.0-beta6 3.23.0-dev1 3.23.0-dev2 3.23.0-dev3 3.23.0-dev4 3.23.0-dev5 3.23.0-dev6 3.23.1 3.23.2 3.23.3 3.23.4 3.24.0 3.24.0-beta1 3.24.0-beta2 3.24.0-beta3 3.24.0-dev1 3.24.0-dev2 3.24.0-dev3 3.24.1 3.24.2 3.24.3 3.24.4 3.24.5 3.24.6 3.24.7 3.24.8 3.25.0 3.25.0-beta1 3.25.0-beta2 3.25.0-beta3 3.25.0-dev1 3.25.0-dev2 3.25.0-dev3 3.25.1 3.25.10 3.25.11 3.25.2 3.25.3 3.25.4 3.25.5 3.25.6 3.25.7 3.25.8 3.25.9 3.26.0 3.26.0-beta1 3.26.0-beta2 3.26.0-beta3 3.26.0-beta4 3.26.0-beta5 3.26.0-dev1 3.26.0-dev2 3.26.0-dev3 3.26.0-dev4 3.26.0-dev5 3.26.1 3.26.2 3.26.3 3.26.4 3.26.5 3.27.0 3.27.0-beta1 3.27.0-beta2 3.27.0-dev1 3.27.0-dev2 3.27.1 3.27.2 3.27.3 3.27.4 3.27.5 3.27.6 3.27.7 3.28.0 3.28.0-beta1 3.28.0-beta2 3.28.0-beta3 3.28.0-dev1 3.28.0-dev2 3.28.0-dev3 3.28.1 3.28.2 3.28.3 3.28.4 3.29.0 3.29.0-beta1 trunk 3.29.0-beta2 3.0.0 3.29.0-beta3 3.0.1 3.29.0-beta4 3.0.10 3.29.0-dev1 3.0.11 3.29.0-dev2 3.0.12 3.29.0-dev3 3.0.13 3.29.0-dev4 3.0.14 3.29.1 3.0.15 3.29.2 3.0.16 3.3.0 3.0.2 3.3.1 3.0.3 3.30.0 3.0.4 3.30.0-beta1 3.0.5 3.30.0-beta2 3.0.6 3.30.0-beta3 3.0.7 3.30.0-dev1 3.0.8 3.30.0-dev2 3.0.8.1 3.30.0-dev3 3.0.9 3.30.1 3.1.0 3.30.2 3.1.0-beta1 3.30.3 3.1.0-beta2 3.30.4 3.1.0-beta3 3.31.0 3.1.0-beta4 3.31.0-beta1 3.1.0-dev1 3.31.0-beta2 3.1.0-dev2 3.31.0-dev1 3.1.0-dev3 3.31.0-dev2 3.1.1 3.31.1 3.1.2 3.31.2 3.1.3 3.31.3 3.1.4 3.31.4 3.10.0 3.31.5 3.10.0-dev1 3.32.0 3.10.1 3.32.0-beta1 3.10.2 3.32.0-beta2 3.11.0 3.32.0-beta3 3.11.0-beta1 3.32.0-dev1 3.11.0-beta2 3.32.0-dev2 3.11.0-beta3 3.32.0-dev3 3.11.0-dev1 3.32.1 3.11.0-dev2 3.32.2 3.11.0-dev3 3.32.3 3.11.1 3.32.4 3.11.2 3.32.5 3.11.3 3.33.0 3.11.4 3.33.0-beta1 3.11.5 3.33.0-beta2 3.12.0 3.33.0-beta3 3.12.1 3.33.0-beta4 3.12.2 3.33.0-dev1 3.13.0 3.33.0-dev2 3.13.0-beta1 3.33.0-dev3 3.13.0-beta2 3.33.0-dev4 3.13.0-beta3 3.33.1 3.13.0-dev3 3.33.2 3.13.0-dev4 3.33.3 3.13.1 3.33.4 3.13.2 3.33.5 3.13.3 3.33.6 3.13.4 3.34.0 3.14.0 3.34.0-beta1 3.14.0-beta1 3.34.0-beta2 3.14.0-beta2 3.34.0-beta3 3.14.0-beta3 3.34.0-dev1 3.14.0-beta4 3.34.0-dev2 3.14.0-beta5 3.34.1 3.14.1 3.34.2 3.15.0 3.34.3 3.15.1 3.34.4 3.15.2 3.35.0 3.15.3 3.35.0-beta1 3.16.0 3.35.0-beta2 3.16.0-beta3 3.35.0-beta3 3.16.0-beta4 3.35.0-beta4 3.16.0-dev1 3.35.0-dev1 3.16.0-dev2 3.35.0-dev2 3.16.1 3.35.0-dev3 3.16.2 3.35.0-dev4 3.16.3 3.35.1 3.16.4 3.35.2 3.16.5 3.35.3 3.16.6 3.35.4 3.17.0 3.35.5 3.17.0-dev2 3.35.6 3.17.0-dev3 3.35.7 3.17.0-dev4 3.35.8 3.17.1 3.35.9 3.17.2 3.4.0 3.17.3 3.4.0-dev7 3.18.0 3.4.0-dev8 3.18.0-beta1 3.4.0-dev9 3.18.0-beta2 3.4.1 3.18.0-beta3 3.4.2 3.18.0-beta4 3.4.3 3.18.0-dev1 3.4.4 3.18.1 3.4.5 3.18.2 3.4.6 3.18.3 3.4.7 3.19.0 3.4.8 3.19.0-beta1 3.5.0 3.19.0-beta2 3.5.0-beta1 3.19.0-beta3 3.5.0-beta2 3.19.0-beta4 3.5.0-beta3 3.19.0-beta5 3.5.0-beta4 3.19.0-beta6 3.5.0-beta5 3.19.0-dev1 3.5.0-beta7 3.19.0-dev2 3.5.0-beta8 3.19.0-dev3 3.5.0-dev8 3.19.0-dev4 3.5.0-dev9 3.19.0-dev5 3.5.1 3.19.0-dev6 3.5.2 3.19.1 3.5.3 3.19.2 3.5.4 3.19.3 3.5.5 3.19.4 3.5.6 3.2.0 3.6.0 3.2.1 3.6.0-beta1 3.2.2 3.6.0-beta2 3.2.3 3.6.0-beta3 3.2.4 3.6.0-beta4 3.2.5 3.6.0-beta5 3.20.0 3.6.0-dev1 3.20.0-beta1 3.6.0-dev10 3.20.0-beta2 3.6.1 3.20.0-beta3 3.6.2 3.20.0-beta4 3.6.3 3.20.0-dev1 3.6.4 3.20.0-dev2 3.6.5 3.20.0-dev3 3.6.6 3.20.0-dev4 3.6.7 3.20.1 3.6.8 3.20.2 3.7.0 3.20.3 3.7.0-beta1 3.20.4 3.7.0-beta2 3.21.0 3.7.0-beta3 3.21.0-beta1 3.7.0-beta4 3.21.0-beta2 3.7.0-dev1 3.21.0-beta3 3.7.1 3.21.0-dev1 3.7.2 3.21.0-dev2 3.7.3 3.21.0-dev3 3.7.4 3.21.1 3.7.5 3.21.2 3.7.6 3.21.3 3.7.7 3.21.4 3.7.8 3.21.5 3.8.0 3.21.6 3.8.0-beta1 3.21.7 3.8.0-beta2 3.21.8 3.8.0-beta3 3.22.0 3.8.1 3.22.0-beta1 3.9.0 3.22.0-beta2 3.9.1 3.22.0-beta3 3.9.2 3.22.0-beta4 4.0.0 3.22.0-beta5 4.0.0-beta1 3.22.0-beta6 4.0.0-beta2
elementor / includes / tracker.php
elementor / includes Last commit date
admin-templates 1 year ago base 2 weeks ago controls 4 months ago editor-templates 2 weeks ago elements 2 weeks ago interfaces 1 year ago libraries 1 year ago managers 2 weeks ago settings 2 months ago template-library 2 weeks ago widgets 2 weeks ago api.php 2 weeks ago autoloader.php 7 months ago beta-testers.php 3 years ago compatibility.php 1 year ago conditions.php 3 years ago db.php 4 months ago editor-assets-api.php 2 months ago embed.php 1 year ago fonts.php 1 year ago frontend.php 1 month ago heartbeat.php 3 years ago maintenance-mode.php 7 months ago maintenance.php 1 year ago plugin.php 1 month ago preview.php 2 weeks ago rollback.php 4 months ago shapes.php 9 months ago stylesheet.php 8 months ago tracker.php 6 months ago user-data.php 7 months ago user.php 5 months ago utils.php 2 weeks ago
tracker.php
686 lines
1 <?php
2 namespace Elementor;
3
4 use Elementor\Core\Common\Modules\EventTracker\DB as Events_DB_Manager;
5 use Elementor\Core\Experiments\Experiments_Reporter;
6 use Elementor\Modules\System_Info\Module as System_Info_Module;
7
8 if ( ! defined( 'ABSPATH' ) ) {
9 exit; // Exit if accessed directly.
10 }
11
12 /**
13 * Elementor tracker.
14 *
15 * Elementor tracker handler class is responsible for sending non-sensitive plugin
16 * data to Elementor servers for users that actively allowed data tracking.
17 *
18 * @since 1.0.0
19 */
20 class Tracker {
21
22 /**
23 * API URL.
24 *
25 * Holds the URL of the Tracker API.
26 *
27 * @since 1.0.0
28 * @access private
29 *
30 * @var string API URL.
31 */
32 private static $api_url = 'https://my.elementor.com/api/v1/tracker/';
33
34 private static $notice_shown = false;
35
36 const LAST_TERMS_UPDATED = '2025-07-07';
37
38 /**
39 * Init.
40 *
41 * Initialize Elementor tracker.
42 *
43 * @since 1.0.0
44 * @access public
45 * @static
46 */
47 public static function init() {
48 add_action( 'elementor/tracker/send_event', [ __CLASS__, 'send_tracking_data' ] );
49 add_action( 'admin_init', [ __CLASS__, 'handle_tracker_actions' ] );
50
51 add_action( 'update_option_elementor_allow_tracking', [ __CLASS__, 'set_last_update_time' ] );
52 }
53
54 /**
55 * Check for settings opt-in.
56 *
57 * Checks whether the site admin has opted-in for data tracking, or not.
58 *
59 * @since 1.0.0
60 * @access public
61 * @static
62 *
63 * @param string $new_value Allowed tracking value.
64 *
65 * @return string Return `yes` if tracking allowed, `no` otherwise.
66 */
67 public static function check_for_settings_optin( $new_value ) {
68 $old_value = get_option( 'elementor_allow_tracking', 'no' );
69 if ( $old_value !== $new_value && 'yes' === $new_value ) {
70 Plugin::$instance->custom_tasks->add_tasks_requested_to_run( [
71 'opt_in_recalculate_usage',
72 'opt_in_send_tracking_data',
73 ] );
74 }
75
76 self::set_last_update_time();
77
78 if ( empty( $new_value ) ) {
79 $new_value = 'no';
80 }
81
82 return $new_value;
83 }
84
85 /**
86 * Send tracking data.
87 *
88 * Decide whether to send tracking data, or not.
89 *
90 * @since 1.0.0
91 * @access public
92 * @static
93 *
94 * @param bool $override
95 */
96 public static function send_tracking_data( $override = false ) {
97 // Don't trigger this on AJAX Requests.
98 if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
99 return;
100 }
101
102 if ( ! self::is_allow_track() ) {
103 return;
104 }
105
106 $last_send = self::get_last_send_time();
107
108 /**
109 * Tracker override send.
110 *
111 * Filters whether to override sending tracking data or not.
112 *
113 * @since 1.0.0
114 *
115 * @param bool $override Whether to override default setting or not.
116 */
117 $override = apply_filters( 'elementor/tracker/send_override', $override );
118
119 if ( ! $override ) {
120 $last_send_interval = strtotime( '-1 week' );
121
122 /**
123 * Tracker last send interval.
124 *
125 * Filters the interval of between two tracking requests.
126 *
127 * @since 1.0.0
128 *
129 * @param int $last_send_interval A date/time string. Default is `strtotime( '-1 week' )`.
130 */
131 $last_send_interval = apply_filters( 'elementor/tracker/last_send_interval', $last_send_interval );
132
133 // Send a maximum of once per week by default.
134 if ( $last_send && $last_send > $last_send_interval ) {
135 return;
136 }
137 } elseif ( $last_send && $last_send > strtotime( '-1 hours' ) ) {
138 return;
139 }
140
141 // Update time first before sending to ensure it is set.
142 update_option( 'elementor_tracker_last_send', time() );
143
144 $params = self::get_tracking_data( empty( $last_send ) );
145
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 add_filter( 'https_ssl_verify', '__return_false' );
151
152 wp_safe_remote_post(
153 self::$api_url,
154 [
155 'timeout' => 25,
156 'blocking' => false,
157 'body' => [
158 'data' => wp_json_encode( $params ),
159 ],
160 ]
161 );
162
163 // After sending the event tracking data, we reset the events table.
164 Events_DB_Manager::reset_table();
165 }
166
167 /**
168 * Is allow track.
169 *
170 * Checks whether the site admin has opted-in for data tracking, or not.
171 *
172 * @since 1.0.0
173 * @access public
174 * @static
175 */
176 public static function is_allow_track() {
177 return 'yes' === get_option( 'elementor_allow_tracking', 'no' );
178 }
179
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 /**
204 * Handle tracker actions.
205 *
206 * Check if the user opted-in or opted-out and update the database.
207 *
208 * Fired by `admin_init` action.
209 *
210 * @since 1.0.0
211 * @access public
212 * @static
213 */
214 public static function handle_tracker_actions() {
215 if ( ! isset( $_GET['elementor_tracker'] ) ) {
216 return;
217 }
218
219 if ( 'opt_into' === $_GET['elementor_tracker'] ) {
220 check_admin_referer( 'opt_into' );
221
222 self::set_opt_in( true );
223 }
224
225 if ( 'opt_out' === $_GET['elementor_tracker'] ) {
226 check_admin_referer( 'opt_out' );
227
228 self::set_opt_in( false );
229 }
230
231 wp_safe_redirect( remove_query_arg( 'elementor_tracker' ) );
232 exit;
233 }
234
235 /**
236 * @since 2.2.0
237 * @access public
238 * @static
239 */
240 public static function is_notice_shown() {
241 return self::$notice_shown;
242 }
243
244 public static function set_opt_in( $value ) {
245 if ( $value ) {
246 update_option( 'elementor_allow_tracking', 'yes' );
247 self::set_last_update_time();
248
249 self::send_tracking_data( true );
250 } else {
251 update_option( 'elementor_allow_tracking', 'no' );
252 update_option( 'elementor_tracker_notice', '1' );
253 }
254 }
255
256 /**
257 * Get system reports data.
258 *
259 * Retrieve the data from system reports.
260 *
261 * @since 2.0.0
262 * @access private
263 * @static
264 *
265 * @return array The data from system reports.
266 */
267 private static function get_system_reports_data() {
268 $reports = Plugin::$instance->system_info->load_reports( System_Info_Module::get_allowed_reports() );
269
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 $system_reports = [];
276 foreach ( $reports as $report_key => $report_details ) {
277 $system_reports[ $report_key ] = [];
278 foreach ( $report_details['report']->get_report() as $sub_report_key => $sub_report_details ) {
279 $system_reports[ $report_key ][ $sub_report_key ] = $sub_report_details['value'];
280 }
281 }
282 return $system_reports;
283 }
284
285 /**
286 * Get last send time.
287 *
288 * Retrieve the last time tracking data was sent.
289 *
290 * @since 2.0.0
291 * @access private
292 * @static
293 *
294 * @return int|false The last time tracking data was sent, or false if
295 * tracking data never sent.
296 */
297 private static function get_last_send_time() {
298 $last_send_time = get_option( 'elementor_tracker_last_send', false );
299
300 /**
301 * Tracker last send time.
302 *
303 * Filters the last time tracking data was sent.
304 *
305 * @since 1.0.0
306 *
307 * @param int|false $last_send_time The last time tracking data was sent,
308 * or false if tracking data never sent.
309 */
310 $last_send_time = apply_filters( 'elementor/tracker/last_send_time', $last_send_time );
311
312 return $last_send_time;
313 }
314
315 /**
316 * Get non elementor post usages.
317 *
318 * Retrieve the number of posts that not using elementor.
319
320 * @return array The number of posts using not used by Elementor grouped by post types
321 * and post status.
322 */
323 public static function get_non_elementor_posts_usage() {
324 global $wpdb;
325
326 $usage = [];
327
328 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
329 $results = $wpdb->get_results(
330 "SELECT `post_type`, `post_status`, COUNT(`ID`) `hits`
331 FROM {$wpdb->posts} `p`
332 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id` AND `meta_key` = '_elementor_edit_mode' )
333 WHERE `post_type` != 'elementor_library' AND `meta_value` IS NULL
334 GROUP BY `post_type`, `post_status`;"
335 );
336
337 if ( $results ) {
338 foreach ( $results as $result ) {
339 $usage[ $result->post_type ][ $result->post_status ] = $result->hits;
340 }
341 }
342
343 return $usage;
344 }
345
346 /**
347 * Get posts usage.
348 *
349 * Retrieve the number of posts using Elementor.
350 *
351 * @since 2.0.0
352 * @access public
353 * @static
354 *
355 * @return array The number of posts using Elementor grouped by post types
356 * and post status.
357 */
358 public static function get_posts_usage() {
359 global $wpdb;
360
361 $usage = [];
362
363 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
364 $results = $wpdb->get_results(
365 "SELECT `post_type`, `post_status`, COUNT(`ID`) `hits`
366 FROM {$wpdb->posts} `p`
367 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id`)
368 WHERE `post_type` != 'elementor_library'
369 AND `meta_key` = '_elementor_edit_mode' AND `meta_value` = 'builder'
370 GROUP BY `post_type`, `post_status`;"
371 );
372
373 if ( $results ) {
374 foreach ( $results as $result ) {
375 $usage[ $result->post_type ][ $result->post_status ] = (int) $result->hits;
376 }
377 }
378
379 return $usage;
380 }
381
382 /**
383 * Get library usage.
384 *
385 * Retrieve the number of Elementor library items saved.
386 *
387 * @since 2.0.0
388 * @access public
389 * @static
390 *
391 * @return array The number of Elementor library items grouped by post types
392 * and meta value.
393 */
394 public static function get_library_usage() {
395 global $wpdb;
396
397 $usage = [];
398
399 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
400 $results = $wpdb->get_results(
401 "SELECT `meta_value`, COUNT(`ID`) `hits`
402 FROM {$wpdb->posts} `p`
403 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id`)
404 WHERE `post_type` = 'elementor_library'
405 AND `meta_key` = '_elementor_template_type'
406 GROUP BY `post_type`, `meta_value`;"
407 );
408
409 if ( $results ) {
410 foreach ( $results as $result ) {
411 $usage[ $result->meta_value ] = $result->hits;
412 }
413 }
414
415 return $usage;
416 }
417
418 /**
419 * Get usage of general settings.
420 * 'Elementor->Settings->General'.
421 *
422 * @return array
423 */
424 public static function get_settings_general_usage() {
425 return self::get_tracking_data_from_settings( 'general' );
426 }
427
428 /**
429 * Get usage of advanced settings.
430 * 'Elementor->Settings->Advanced'.
431 *
432 * @return array
433 */
434 public static function get_settings_advanced_usage() {
435 return self::get_tracking_data_from_settings( 'advanced' );
436 }
437
438 /**
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 * Get usage of experiments settings.
450 *
451 * 'Elementor->Settings->Experiments'.
452 *
453 * @return array
454 */
455 public static function get_settings_experiments_usage() {
456 $system_info = Plugin::$instance->system_info;
457
458 /**
459 * @var $experiments_report Experiments_Reporter
460 */
461 $experiments_report = $system_info->create_reporter( [
462 'class_name' => Experiments_Reporter::class,
463 ] );
464
465 return $experiments_report->get_experiments()['value'];
466 }
467
468 /**
469 * Get usage of general tools.
470 * 'Elementor->Tools->General'.
471 *
472 * @return array
473 */
474 public static function get_tools_general_usage() {
475 return self::get_tracking_data_from_tools( 'general' );
476 }
477
478 /**
479 * Get usage of 'version control' tools.
480 * 'Elementor->Tools->Version Control'.
481 *
482 * @return array
483 */
484 public static function get_tools_version_control_usage() {
485 return self::get_tracking_data_from_tools( 'versions' );
486 }
487
488 /**
489 * Get usage of 'maintenance' tools.
490 * 'Elementor->Tools->Maintenance'.
491 *
492 * @return array
493 */
494 public static function get_tools_maintenance_usage() {
495 return self::get_tracking_data_from_tools( 'maintenance_mode' );
496 }
497
498 /**
499 * Get library usage extend.
500 *
501 * Retrieve the number of Elementor library items saved.
502 *
503 * @return array The number of Elementor library items grouped by post types, post status
504 * and meta value.
505 */
506 public static function get_library_usage_extend() {
507 global $wpdb;
508
509 $usage = [];
510
511 // phpcs:ignore WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.DirectQuery
512 $results = $wpdb->get_results(
513 "SELECT `meta_value`, COUNT(`ID`) `hits`, `post_status`
514 FROM {$wpdb->posts} `p`
515 LEFT JOIN {$wpdb->postmeta} `pm` ON(`p`.`ID` = `pm`.`post_id`)
516 WHERE `post_type` = 'elementor_library'
517 AND `meta_key` = '_elementor_template_type'
518 GROUP BY `post_type`, `meta_value`, `post_status`;"
519 );
520
521 if ( $results ) {
522 foreach ( $results as $result ) {
523 if ( empty( $usage[ $result->meta_value ] ) ) {
524 $usage[ $result->meta_value ] = [];
525 }
526
527 if ( empty( $usage[ $result->meta_value ][ $result->post_status ] ) ) {
528 $usage[ $result->meta_value ][ $result->post_status ] = 0;
529 }
530
531 $usage[ $result->meta_value ][ $result->post_status ] += $result->hits;
532 }
533 }
534
535 return $usage;
536 }
537
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 }
555
556 /**
557 * Get the tracking data
558 *
559 * Retrieve tracking data and apply filter
560 *
561 * @access public
562 * @static
563 *
564 * @param bool $is_first_time
565 *
566 * @return array
567 */
568 public static function get_tracking_data( $is_first_time = false ) {
569 $params = [
570 'system' => self::get_system_reports_data(),
571 'site_lang' => get_bloginfo( 'language' ),
572 'email' => get_option( 'admin_email' ),
573 'usages' => [
574 'posts' => self::get_posts_usage(),
575 'non-elementor-posts' => self::get_non_elementor_posts_usage(),
576 'library' => self::get_library_usage(),
577 'settings' => [
578 'general' => self::get_settings_general_usage(),
579 'advanced' => self::get_settings_advanced_usage(),
580 'experiments' => self::get_settings_experiments_usage(),
581 ],
582 'tools' => [
583 'general' => self::get_tools_general_usage(),
584 'version' => self::get_tools_version_control_usage(),
585 'maintenance' => self::get_tools_maintenance_usage(),
586 ],
587 'library-details' => self::get_library_usage_extend(),
588 ],
589 'is_first_time' => $is_first_time,
590 'install_time' => Plugin::instance()->get_install_time(),
591 ];
592
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 /**
604 * Tracker send tracking data params.
605 *
606 * Filters the data parameters when sending tracking request.
607 *
608 * @param array $params Variable to encode as JSON.
609 *
610 * @since 1.0.0
611 */
612 $params = apply_filters( 'elementor/tracker/send_tracking_data_params', $params );
613
614 return $params;
615 }
616
617 /**
618 * @param string $tab_name
619 * @return array
620 */
621 private static function get_tracking_data_from_settings( $tab_name ) {
622 return self::get_tracking_data_from_settings_page(
623 Plugin::$instance->settings->get_tabs(),
624 $tab_name
625 );
626 }
627
628 /**
629 * @param string $tab_name
630 * @return array
631 */
632 private static function get_tracking_data_from_tools( $tab_name ) {
633 return self::get_tracking_data_from_settings_page(
634 Plugin::$instance->tools->get_tabs(),
635 $tab_name
636 );
637 }
638
639 private static function get_tracking_data_from_settings_page( $tabs, $tab_name ) {
640 $result = [];
641
642 if ( empty( $tabs[ $tab_name ] ) ) {
643 return $result;
644 }
645
646 $tab = $tabs[ $tab_name ];
647
648 foreach ( $tab['sections'] as $section_name => $section ) {
649 foreach ( $section['fields'] as $field_name => $field ) {
650 // Skips fields with '_' prefix.
651 if ( '_' === $field_name[0] ) {
652 continue;
653 }
654
655 $default_value = null;
656 $args = $field['field_args'];
657 switch ( $args['type'] ) {
658 case 'checkbox':
659 $default_value = $args['value'];
660 break;
661
662 case 'select':
663 case 'checkbox_list_cpt':
664 $default_value = $args['std'];
665 break;
666
667 case 'checkbox_list_roles':
668 $default_value = null;
669 break;
670
671 // 'raw_html' is used as action and not as data.
672 case 'raw_html':
673 continue 2; // Skip fields loop.
674
675 default:
676 trigger_error( 'Invalid type: \'' . $args['type'] . '\'' ); // phpcs:ignore
677 }
678
679 $result[ $field_name ] = get_option( 'elementor_' . $field_name, $default_value );
680 }
681 }
682
683 return $result;
684 }
685 }
686