PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.20
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.20
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
formidable / classes / models / FrmUsage.php

FrmUsage.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.20, at classes/models/FrmUsage.php

475 lines 10.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 if ( ! defined( 'ABSPATH' ) ) {
3 die( 'You are not allowed to call this page directly.' );
4 }
5
6 /**
7 * @since 3.06.04
8 */
9 class FrmUsage {
10
11 /**
12 * @since 3.06.04
13 *
14 * @return void
15 */
16 public function send_snapshot() {
17 if ( ! $this->tracking_allowed() ) {
18 return;
19 }
20
21 $ep = 'aHR0cHM6Ly91c2FnZTIuZm9ybWlkYWJsZWZvcm1zLmNvbS9zbmFwc2hvdA==';
22 // $ep = base64_encode( 'http://localhost:4567/snapshot' ); // Uncomment for testing
23 $body = json_encode( $this->snapshot() );
24
25 // Setup variable for wp_remote_request.
26 $post = array(
27 'method' => 'POST',
28 'headers' => array(
29 'Accept' => 'application/json',
30 'Content-Type' => 'application/json',
31 'Content-Length' => strlen( $body ),
32 ),
33 'body' => $body,
34 // Without this, Debug Log catches the `http_request_failed` error.
35 'timeout' => 45,
36 );
37
38 // Remove time limit to execute this function.
39 if ( function_exists( 'set_time_limit' ) ) {
40 set_time_limit( 0 );
41 }
42
43 wp_remote_request( base64_decode( $ep ), $post );
44 }
45
46 /**
47 * @since 3.06.04
48 * @return string
49 */
50 public function uuid( $regenerate = false ) {
51 $uuid_key = 'frm-usage-uuid';
52 $uuid = get_option( $uuid_key );
53
54 if ( $regenerate || empty( $uuid ) ) {
55 // Definitely not cryptographically secure but
56 // close enough to provide an unique id
57 $uuid = md5( uniqid() . site_url() );
58 update_option( $uuid_key, $uuid, 'no' );
59 }
60
61 return $uuid;
62 }
63
64 /**
65 * @since 3.06.04
66 * @return array
67 */
68 public function snapshot() {
69 global $wpdb, $wp_version;
70
71 $theme_data = wp_get_theme();
72 $form_counts = FrmForm::get_count();
73
74 $snap = array(
75 'uuid' => $this->uuid(),
76 // Let's keep it anonymous.
77 'admin_email' => '',
78 'wp_version' => $wp_version,
79 'php_version' => phpversion(),
80 'mysql_version' => $wpdb->db_version(),
81 'os' => FrmAppHelper::get_server_os(),
82 'locale' => get_locale(),
83
84 'active_license' => FrmAppHelper::pro_is_installed(),
85 'form_count' => $form_counts->published,
86 'entry_count' => FrmEntry::getRecordCount(),
87 'timestamp' => gmdate( 'c' ),
88
89 'theme_name' => is_object( $theme_data ) ? $theme_data->Name : '', // phpcs:ignore WordPress.NamingConventions
90 'plugins' => $this->plugins(),
91 'settings' => array(
92 $this->settings(),
93 ),
94 'forms' => $this->forms(),
95 'fields' => $this->fields(),
96 'actions' => $this->actions(),
97
98 'onboarding-wizard' => $this->onboarding_wizard(),
99 'flows' => FrmUsageController::get_flows_data(),
100 'payments' => $this->payments(),
101 'subscriptions' => $this->payments( 'frm_subscriptions' ),
102 );
103
104 if ( method_exists( 'FrmProAddonsController', 'get_readable_license_type' ) ) {
105 $snap['active_license'] = FrmProAddonsController::get_readable_license_type();
106 }
107
108 return apply_filters( 'frm_usage_snapshot', $snap );
109 }
110
111 /**
112 * Gets onboarding wizard data.
113 *
114 * @since 6.16.1
115 *
116 * @return array
117 */
118 private function onboarding_wizard() {
119 $data = FrmOnboardingWizardController::get_usage_data();
120 $skipped_keys = array(
121 'default_email',
122 'is_subscribed',
123 'allows_tracking',
124 'summary_emails',
125 'installed_addons',
126 );
127
128 foreach ( $skipped_keys as $skipped_key ) {
129 unset( $data[ $skipped_key ] );
130 }
131
132 return $data;
133 }
134
135 /**
136 * Gets payments data.
137 *
138 * @since 6.16.1
139 *
140 * @param string $table Database table name.
141 * @return array
142 */
143 private function payments( $table = 'frm_payments' ) {
144 $allowed_tables = array( 'frm_payments', 'frm_subscriptions' );
145 if ( ! in_array( $table, $allowed_tables, true ) ) {
146 return array();
147 }
148
149 if ( ! FrmTransLiteAppHelper::payments_table_exists() ) {
150 return array();
151 }
152
153 global $wpdb;
154 $rows = $wpdb->get_results(
155 $wpdb->prepare(
156 'SELECT amount, status, paysys, created_at FROM %1$s',
157 $wpdb->prefix . $table
158 )
159 );
160
161 $payments = array();
162 foreach ( $rows as $row ) {
163 $payments[] = array(
164 'amount' => (float) $row->amount,
165 'status' => $row->status,
166 'gateway' => $row->paysys,
167 'created_at' => $row->created_at,
168 );
169 }
170
171 return $payments;
172 }
173
174 /**
175 * @since 3.06.04
176 * @return array
177 */
178 private function plugins() {
179 $plugin_list = FrmAppHelper::get_plugins();
180
181 $plugins = array();
182 foreach ( $plugin_list as $slug => $info ) {
183 $plugins[] = array(
184 'name' => $info['Name'],
185 'slug' => $slug,
186 'version' => $info['Version'],
187 'active' => is_plugin_active( $slug ),
188 );
189 }
190
191 return $plugins;
192 }
193
194 /**
195 * Add global settings to tracking data.
196 *
197 * @since 3.06.04
198 * @return array
199 */
200 private function settings() {
201 $settings_list = FrmAppHelper::get_settings();
202 $settings = array(
203 'messages' => $this->messages( $settings_list ),
204 'permissions' => $this->permissions( $settings_list ),
205 );
206 $pass_settings = array(
207 'load_style',
208 'fade_form',
209 're_type',
210 're_lang',
211 're_multi',
212 'menu',
213 'mu_menu',
214 'no_ips',
215 'custom_header_ip',
216 'enable_gdpr',
217 'no_gdpr_cookies',
218 'btsp_css',
219 'btsp_version',
220 'admin_bar',
221 'summary_emails',
222 'active_captcha',
223 );
224
225 foreach ( $pass_settings as $setting ) {
226 if ( isset( $settings_list->$setting ) ) {
227 $settings[ $setting ] = $this->maybe_json( $settings_list->$setting );
228 }
229 }
230
231 $settings = apply_filters( 'frm_usage_settings', $settings );
232
233 $settings['messages'] = $this->maybe_json( $settings['messages'] );
234 $settings['permissions'] = $this->maybe_json( $settings['permissions'] );
235
236 return $settings;
237 }
238
239 /**
240 * Include the permissions settings for each capability.
241 *
242 * @since 3.06.04
243 *
244 * @param FrmSettings $settings_list
245 * @return array
246 */
247 private function messages( $settings_list ) {
248 $messages = array(
249 'success_msg',
250 'blank_msg',
251 'unique_msg',
252 'invalid_msg',
253 'failed_msg',
254 'submit_value',
255 'login_msg',
256 'admin_permission',
257 );
258
259 $default = $settings_list->default_options();
260
261 $message_settings = array();
262 foreach ( $messages as $message ) {
263 $message_settings[ 'changed-' . $message ] = $settings_list->$message === $default[ $message ] ? 0 : 1;
264 }
265
266 return $message_settings;
267 }
268
269 /**
270 * Include the permissions settings for each capability.
271 *
272 * @since 3.06.04
273 *
274 * @param FrmSettings $settings_list
275 * @return array
276 */
277 private function permissions( $settings_list ) {
278 $permissions = array();
279 $frm_roles = FrmAppHelper::frm_capabilities();
280
281 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
282 if ( isset( $settings_list->$frm_role ) ) {
283 $permissions[ $frm_role ] = $settings_list->$frm_role;
284 }
285 }
286
287 return $permissions;
288 }
289
290 /**
291 * @since 3.06.04
292 * @return array
293 */
294 private function forms() {
295 $s_query = array(
296 array(
297 'or' => 1,
298 'parent_form_id' => null,
299 'parent_form_id <' => 1,
300 ),
301 );
302
303 $saved_forms = FrmForm::getAll( $s_query );
304 $forms = array();
305 $settings = array(
306 'form_class',
307 'akismet',
308 'honeypot',
309 'antispam',
310 'custom_style',
311 'success_action',
312 'show_form',
313 'no_save',
314 'ajax_load',
315 'ajax_submit',
316 'js_validate',
317 'logged_in_role',
318 'single_entry',
319 'single_entry_type',
320 'editable_role',
321 'open_editable_role',
322 'edit_action',
323 'edit_value',
324 'edit_msg',
325 'save_draft',
326 'draft_msg',
327 'submit_align',
328 'protect_files',
329 'protect_files_role',
330 'max_entries',
331 'open_status',
332 'closed_msg',
333 'open_date',
334 'close_date',
335 'copy',
336 'prev_value',
337 'submit_conditions',
338 );
339
340 $style = new FrmStyle();
341 foreach ( $saved_forms as $form ) {
342 $new_form = array(
343 'form_id' => $form->id,
344 'description' => $form->description,
345 'logged_in' => $form->logged_in,
346 'editable' => $form->editable,
347 'is_template' => $form->is_template,
348 'entry_count' => FrmEntry::getRecordCount( $form->id ),
349 'field_count' => $this->form_field_count( $form->id ),
350 'form_action_count' => $this->form_action_count( $form->id ),
351 );
352
353 foreach ( $settings as $setting ) {
354 if ( isset( $form->options[ $setting ] ) ) {
355 if ( 'custom_style' === $setting ) {
356 $style->id = $form->options[ $setting ];
357
358 if ( ! $style->id ) {
359 $style_name = 0;
360 } elseif ( 1 === intval( $style->id ) ) {
361 $style_name = 'formidable-style';
362 } else {
363 $style_post = $style->get_one();
364 $style_name = $style_post ? $style_post->post_name : 'formidable-style';
365 }
366
367 $new_form[ $setting ] = $style_name;
368 } else {
369 $new_form[ $setting ] = $this->maybe_json( $form->options[ $setting ] );
370 }
371 }
372 }
373
374 $forms[] = apply_filters( 'frm_usage_form', $new_form, compact( 'form' ) );
375 }//end foreach
376
377 // If the array uses numeric keys, reset them.
378 return $forms;
379 }
380
381 /**
382 * @since 3.06.04
383 * @return int
384 */
385 private function form_field_count( $form_id ) {
386 global $wpdb;
387
388 $join = $wpdb->prefix . 'frm_fields fi JOIN ' . $wpdb->prefix . 'frm_forms fo ON (fi.form_id=fo.id)';
389
390 $field_query = array(
391 'or' => 1,
392 'fi.form_id' => $form_id,
393 'parent_form_id' => $form_id,
394 );
395
396 return FrmDb::get_count( $join, $field_query );
397 }
398
399 /**
400 * @since 3.06.04
401 * @return int
402 */
403 private function form_action_count( $form_id ) {
404 $args = array(
405 'post_type' => FrmFormActionsController::$action_post_type,
406 'menu_order' => $form_id,
407 'fields' => 'ids',
408 );
409
410 $actions = FrmDb::check_cache( json_encode( $args ), 'frm_actions', $args, 'get_posts' );
411 return count( $actions );
412 }
413
414 /**
415 * Get the last 100 fields created.
416 *
417 * @since 3.06.04
418 * @return array
419 */
420 private function fields() {
421 $args = array(
422 'limit' => 50,
423 'order_by' => 'id DESC',
424 );
425
426 $fields = FrmDb::get_results( 'frm_fields', array(), 'id, form_id, name, type, field_options', $args );
427 foreach ( $fields as $k => $field ) {
428 FrmAppHelper::unserialize_or_decode( $field->field_options );
429 $fields[ $k ]->field_options = json_encode( $field->field_options );
430 }
431 return $fields;
432 }
433
434 /**
435 * @since 3.06.04
436 * @return array
437 */
438 private function actions() {
439 $args = array(
440 'post_type' => FrmFormActionsController::$action_post_type,
441 'numberposts' => 100,
442 );
443
444 $actions = array();
445
446 $saved_actions = FrmDb::check_cache( json_encode( $args ), 'frm_actions', $args, 'get_posts' );
447 foreach ( $saved_actions as $action ) {
448 $actions[] = array(
449 'form_id' => $action->menu_order,
450 'type' => $action->post_excerpt,
451 'status' => $action->post_status,
452 'settings' => $action->post_content,
453 );
454 }
455
456 return $actions;
457 }
458
459 /**
460 * @since 3.06.04
461 * @return bool
462 */
463 private function tracking_allowed() {
464 return FrmUsageController::tracking_allowed();
465 }
466
467 /**
468 * @since 3.06.04
469 * @return string
470 */
471 private function maybe_json( $value ) {
472 return is_array( $value ) ? json_encode( $value ) : $value;
473 }
474 }
475