PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.16.3
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.16.3
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.16.3, at classes/models/FrmUsage.php

471 lines 10.7 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 'btsp_css',
217 'btsp_version',
218 'admin_bar',
219 'summary_emails',
220 'active_captcha',
221 );
222
223 foreach ( $pass_settings as $setting ) {
224 if ( isset( $settings_list->$setting ) ) {
225 $settings[ $setting ] = $this->maybe_json( $settings_list->$setting );
226 }
227 }
228
229 $settings = apply_filters( 'frm_usage_settings', $settings );
230
231 $settings['messages'] = $this->maybe_json( $settings['messages'] );
232 $settings['permissions'] = $this->maybe_json( $settings['permissions'] );
233
234 return $settings;
235 }
236
237 /**
238 * Include the permissions settings for each capability.
239 *
240 * @since 3.06.04
241 *
242 * @param FrmSettings $settings_list
243 * @return array
244 */
245 private function messages( $settings_list ) {
246 $messages = array(
247 'success_msg',
248 'blank_msg',
249 'unique_msg',
250 'invalid_msg',
251 'failed_msg',
252 'submit_value',
253 'login_msg',
254 'admin_permission',
255 );
256
257 $message_settings = array();
258 foreach ( $messages as $message ) {
259 $message_settings[ $message ] = $settings_list->$message;
260 }
261
262 return $message_settings;
263 }
264
265 /**
266 * Include the permissions settings for each capability.
267 *
268 * @since 3.06.04
269 *
270 * @param FrmSettings $settings_list
271 * @return array
272 */
273 private function permissions( $settings_list ) {
274 $permissions = array();
275 $frm_roles = FrmAppHelper::frm_capabilities();
276
277 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
278 if ( isset( $settings_list->$frm_role ) ) {
279 $permissions[ $frm_role ] = $settings_list->$frm_role;
280 }
281 }
282
283 return $permissions;
284 }
285
286 /**
287 * @since 3.06.04
288 * @return array
289 */
290 private function forms() {
291 $s_query = array(
292 array(
293 'or' => 1,
294 'parent_form_id' => null,
295 'parent_form_id <' => 1,
296 ),
297 );
298
299 $saved_forms = FrmForm::getAll( $s_query );
300 $forms = array();
301 $settings = array(
302 'form_class',
303 'akismet',
304 'honeypot',
305 'antispam',
306 'custom_style',
307 'success_action',
308 'show_form',
309 'no_save',
310 'ajax_load',
311 'ajax_submit',
312 'js_validate',
313 'logged_in_role',
314 'single_entry',
315 'single_entry_type',
316 'editable_role',
317 'open_editable_role',
318 'edit_action',
319 'edit_value',
320 'edit_msg',
321 'save_draft',
322 'draft_msg',
323 'submit_align',
324 'protect_files',
325 'protect_files_role',
326 'max_entries',
327 'open_status',
328 'closed_msg',
329 'open_date',
330 'close_date',
331 'copy',
332 'prev_value',
333 'submit_conditions',
334 );
335
336 $style = new FrmStyle();
337 foreach ( $saved_forms as $form ) {
338 $new_form = array(
339 'form_id' => $form->id,
340 'description' => $form->description,
341 'logged_in' => $form->logged_in,
342 'editable' => $form->editable,
343 'is_template' => $form->is_template,
344 'entry_count' => FrmEntry::getRecordCount( $form->id ),
345 'field_count' => $this->form_field_count( $form->id ),
346 'form_action_count' => $this->form_action_count( $form->id ),
347 );
348
349 foreach ( $settings as $setting ) {
350 if ( isset( $form->options[ $setting ] ) ) {
351 if ( 'custom_style' === $setting ) {
352 $style->id = $form->options[ $setting ];
353
354 if ( ! $style->id ) {
355 $style_name = 0;
356 } elseif ( 1 === intval( $style->id ) ) {
357 $style_name = 'formidable-style';
358 } else {
359 $style_post = $style->get_one();
360 $style_name = $style_post ? $style_post->post_name : 'formidable-style';
361 }
362
363 $new_form[ $setting ] = $style_name;
364 } else {
365 $new_form[ $setting ] = $this->maybe_json( $form->options[ $setting ] );
366 }
367 }
368 }
369
370 $forms[] = apply_filters( 'frm_usage_form', $new_form, compact( 'form' ) );
371 }//end foreach
372
373 // If the array uses numeric keys, reset them.
374 return $forms;
375 }
376
377 /**
378 * @since 3.06.04
379 * @return int
380 */
381 private function form_field_count( $form_id ) {
382 global $wpdb;
383
384 $join = $wpdb->prefix . 'frm_fields fi JOIN ' . $wpdb->prefix . 'frm_forms fo ON (fi.form_id=fo.id)';
385
386 $field_query = array(
387 'or' => 1,
388 'fi.form_id' => $form_id,
389 'parent_form_id' => $form_id,
390 );
391
392 return FrmDb::get_count( $join, $field_query );
393 }
394
395 /**
396 * @since 3.06.04
397 * @return int
398 */
399 private function form_action_count( $form_id ) {
400 $args = array(
401 'post_type' => FrmFormActionsController::$action_post_type,
402 'menu_order' => $form_id,
403 'fields' => 'ids',
404 );
405
406 $actions = FrmDb::check_cache( json_encode( $args ), 'frm_actions', $args, 'get_posts' );
407 return count( $actions );
408 }
409
410 /**
411 * Get the last 100 fields created.
412 *
413 * @since 3.06.04
414 * @return array
415 */
416 private function fields() {
417 $args = array(
418 'limit' => 50,
419 'order_by' => 'id DESC',
420 );
421
422 $fields = FrmDb::get_results( 'frm_fields', array(), 'form_id, name, type, field_options', $args );
423 foreach ( $fields as $k => $field ) {
424 FrmAppHelper::unserialize_or_decode( $field->field_options );
425 $fields[ $k ]->field_options = json_encode( $field->field_options );
426 }
427 return $fields;
428 }
429
430 /**
431 * @since 3.06.04
432 * @return array
433 */
434 private function actions() {
435 $args = array(
436 'post_type' => FrmFormActionsController::$action_post_type,
437 'numberposts' => 100,
438 );
439
440 $actions = array();
441
442 $saved_actions = FrmDb::check_cache( json_encode( $args ), 'frm_actions', $args, 'get_posts' );
443 foreach ( $saved_actions as $action ) {
444 $actions[] = array(
445 'form_id' => $action->menu_order,
446 'type' => $action->post_excerpt,
447 'status' => $action->post_status,
448 'settings' => $action->post_content,
449 );
450 }
451
452 return $actions;
453 }
454
455 /**
456 * @since 3.06.04
457 * @return bool
458 */
459 private function tracking_allowed() {
460 return FrmUsageController::tracking_allowed();
461 }
462
463 /**
464 * @since 3.06.04
465 * @return string
466 */
467 private function maybe_json( $value ) {
468 return is_array( $value ) ? json_encode( $value ) : $value;
469 }
470 }
471