PluginProbe
weForms – Easy Drag & Drop Contact Form Builder For WordPress / 1.6.27
weForms – Easy Drag & Drop Contact Form Builder For WordPress v1.6.27
1.6.7 1.6.8 1.6.9 1.6.12 1.6.13 1.6.14 1.6.15 1.6.16 1.6.17 1.6.18 1.6.19 1.6.2 1.6.20 1.6.21 1.6.22 1.6.23 1.6.24 1.6.25 1.6.26 1.6.27 1.6.28 1.6.3 1.6.4 1.6.5 1.6.6 All 74 releases
weforms / includes / functions.php

functions.php in weForms – Easy Drag & Drop Contact Form Builder For WordPress 1.6.27, at includes/functions.php

1,359 lines 37.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 /**
4 * Get a single form
5 *
6 * @since 1.0.3
7 *
8 * @param int $form_id
9 *
10 * @return false|WP_Post
11 */
12 function weform_get_form( $form_id ) {
13 return weforms()->form->get( $form_id );
14 }
15
16 /**
17 * Get contact form templates
18 *
19 * @return array
20 */
21 function weforms_get_form_template_categories() {
22 $categories = [
23 'default' => [
24 'name' => 'Default Templates',
25 'icon' => 'fa fa-bars',
26 ],
27 'registration' => [
28 'name' => 'Registration Templates',
29 'icon' => 'fa fa-user-plus',
30 ],
31 'application' => [
32 'name' => 'Application Templates',
33 'icon' => 'fa fa-address-card-o',
34 ],
35 'request' => [
36 'name' => 'Request Templates',
37 'icon' => 'fa fa-hand-paper-o',
38 ],
39 'event' => [
40 'name' => 'Event Templates',
41 'icon' => 'fa fa-calendar',
42 ],
43 'feedback' => [
44 'name' => 'Feedback Templates',
45 'icon' => 'fa fa-comments',
46 ],
47 'employment' => [
48 'name' => 'Employment Templates',
49 'icon' => 'fa fa-suitcase',
50 ],
51 'payment' => [
52 'name' => 'Payment Templates',
53 'icon' => 'fa fa-money',
54 ],
55 'reservation' => [
56 'name' => 'Reservation Templates',
57 'icon' => 'fa fa-bandcamp',
58 ],
59 'others' => [
60 'name' => 'Others Templates',
61 'icon' => 'fa fa-info-circle',
62 ],
63 ];
64
65 return apply_filters( 'weforms_form_template_categories', $categories );
66 }
67
68 /**
69 * Get entries by a form_id
70 *
71 * @param int $form_id
72 * @param array $args
73 *
74 * @return object
75 */
76 function weforms_get_form_entries( $form_id, $args = [] ) {
77 global $wpdb;
78
79 $defaults = [
80 'number' => 10,
81 'offset' => 0,
82 'orderby' => 'created_at',
83 'status' => 'publish',
84 'order' => 'DESC',
85 ];
86
87 $r = wp_parse_args( $args, $defaults );
88
89 $query = $wpdb->prepare(
90 "
91 SELECT id, form_id, user_id, INET_NTOA( user_ip ) as ip_address, created_at
92 FROM $wpdb->weforms_entries
93 WHERE form_id = %d AND status = %s
94 ORDER BY %s %s
95 LIMIT %d, %d
96 ",
97 array(
98 $form_id,
99 $r['status'],
100 $r['orderby'],
101 $r['order'],
102 $r['offset'],
103 $r['number'],
104 )
105 );
106
107 $results = $wpdb->get_results( $query );
108
109 return $results;
110 }
111
112 /**
113 * Count all entries from weForms_entries table
114 *
115 * @param array $args
116 *
117 * @return int $number
118 */
119 function weforms_count_entries( $args = [] ) {
120 global $wpdb;
121
122 $defaults = [
123 'orderby' => 'created_at',
124 'status' => 'publish',
125 'order' => 'DESC',
126 ];
127
128 $r = wp_parse_args( $args, $defaults );
129
130 $query = $wpdb->prepare(
131 "
132 SELECT id, form_id, user_id, INET_NTOA( user_ip ) as ip_address, created_at
133 FROM $wpdb->weforms_entries
134 WHERE status = %s
135 ORDER BY %s %s
136 ",
137 array(
138 $r['status'],
139 $r['orderby'],
140 $r['order'],
141 )
142 );
143
144 $results = $wpdb->get_results( $query );
145
146 return count( $results );
147 }
148
149 /**
150 * Get payments by a form_id
151 *
152 * @param int $form_id
153 * @param array $args
154 *
155 * @return object
156 */
157 function weforms_get_form_payments( $form_id, $args = [] ) {
158 global $wpdb;
159
160 $defaults = [
161 'number' => 10,
162 'offset' => 0,
163 'orderby' => 'created_at',
164 'order' => 'DESC',
165 ];
166
167 $r = wp_parse_args( $args, $defaults );
168
169 $query = $wpdb->prepare(
170 "
171 SELECT *
172 FROM wp_weforms_payments
173 WHERE form_id = %d
174 ORDER BY %s %s
175 LIMIT %d, %d
176 ",
177 array(
178 $form_id,
179 $r['orderby'],
180 $r['order'],
181 $r['offset'],
182 $r['number'],
183 )
184 );
185
186 $results = $wpdb->get_results( $query );
187
188 return $results;
189 }
190
191 /**
192 * Get payments by a entry_id
193 *
194 * @param int $entry_id
195 *
196 * @return object
197 */
198 function weforms_get_entry_payment( $entry_id ) {
199 global $wpdb;
200
201 $query = $wpdb->prepare(
202 "
203 SELECT transaction_id
204 FROM $wpdb->prefix 'weforms_payments'
205 WHERE entry_id = %d
206 ",
207 array(
208 $entry_id
209 )
210 );
211 $payment = $wpdb->get_row( $query );
212
213 return $payment;
214 }
215
216 /**
217 * Get an entry by id
218 *
219 * @param int $entry_id
220 *
221 * @return object
222 */
223 function weforms_get_entry( $entry_id ) {
224 global $wpdb;
225
226 $cache_key = 'weforms-entry-' . $entry_id;
227 $entry = wp_cache_get( $cache_key, 'weforms' );
228
229 if ( false === $entry ) {
230 $query = 'SELECT id, form_id, user_id, user_device, referer, INET_NTOA( user_ip ) as ip_address, created_at
231 FROM ' . $wpdb->weforms_entries . '
232 WHERE id = %d';
233
234 $entry = $wpdb->get_row( $wpdb->prepare( $query, $entry_id ) );
235 wp_cache_set( $cache_key, $entry );
236 }
237
238 return $entry;
239 }
240
241 /**
242 * Insert a new entry
243 *
244 * @param array $args
245 * @param array $fields
246 *
247 * @return WP_Error|int
248 */
249 function weforms_insert_entry( $args, $fields = [] ) {
250 global $wpdb;
251
252 $browser = weforms_get_browser();
253
254 $defaults = [
255 'form_id' => 0,
256 'user_id' => get_current_user_id(),
257 'user_ip' => ip2long( weforms_get_client_ip() ),
258 'user_device' => $browser['name'] . '/' . $browser['platform'],
259 'referer' => isset( $_SERVER['HTTP_REFERER'] ) ? sanitize_url( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) : '',
260 'created_at' => current_time( 'mysql' )
261 ];
262
263 $r = wp_parse_args( $args, $defaults );
264
265 if ( !$r['form_id'] ) {
266 return new WP_Error( 'no-form-id', __( 'No form ID was found.', 'weforms' ) );
267 }
268
269 if ( !$fields ) {
270 return new WP_Error( 'no-fields', __( 'No form fields were found.', 'weforms' ) );
271 }
272
273 $success = $wpdb->insert( $wpdb->weforms_entries, $r );
274
275 if ( is_wp_error( $success ) || !$success ) {
276 return new WP_Error( 'could-not-create', __( 'Could not create an entry', 'weforms' ) );
277 }
278
279 $entry_id = $wpdb->insert_id;
280
281 foreach ( $fields as $key => $value ) {
282 weforms_add_entry_meta( $entry_id, $key, $value );
283 }
284
285 return $entry_id;
286 }
287
288 /**
289 * Change an entry status
290 *
291 * @param int $entry_id
292 * @param string $status
293 *
294 * @return int|bool
295 */
296 function weforms_change_entry_status( $entry_id, $status ) {
297 global $wpdb;
298
299 return $wpdb->update(
300 $wpdb->weforms_entries,
301 [
302 'status' => $status,
303 ],
304 [
305 'id' => $entry_id,
306 ],
307 [ '%s' ],
308 [ '%d' ]
309 );
310 }
311
312 /**
313 * Delete an entry
314 *
315 * @param int $entry_id
316 *
317 * @return int|bool
318 */
319 function weforms_delete_entry( $entry_id ) {
320 global $wpdb;
321
322 weforms_delete_entry_attachments( $entry_id );
323
324 $deleted = $wpdb->delete(
325 $wpdb->weforms_entries, [
326 'id' => $entry_id,
327 ], [ '%d' ]
328 );
329
330 if ( $deleted ) {
331 $wpdb->delete(
332 $wpdb->weforms_entrymeta, [
333 'weforms_entry_id' => $entry_id,
334 ], [ '%d' ]
335 );
336 }
337
338 return $deleted;
339 }
340
341 /**
342 * Delete attachments of an entry
343 *
344 * @param int $entry_id
345 *
346 * @since 1.3.5
347 */
348 function weforms_delete_entry_attachments( $entry_id ) {
349 $entry = weforms_get_entry( $entry_id );
350 $fields = weforms_get_form_field_labels( $entry->form_id );
351
352 if ( !$fields ) {
353 return false;
354 }
355
356 foreach ( $fields as $meta_key => $field ) {
357 $value = weforms_get_entry_meta( $entry_id, $meta_key, true );
358
359 if ( in_array( $field['type'], [ 'image_upload', 'file_upload' ] ) ) {
360 if ( is_array( $value ) && $value ) {
361 foreach ( $value as $attachment_id ) {
362 wp_delete_attachment( $attachment_id, true );
363 }
364 }
365 }
366 }
367 }
368
369 /**
370 * Add meta data field to an entry.
371 *
372 * @param int $entry_id entry ID
373 * @param string $meta_key metadata name
374 * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.
375 * @param bool $unique Optional. Whether the same key should not be added.
376 * Default false.
377 *
378 * @return int|false meta ID on success, false on failure
379 */
380 function weforms_add_entry_meta( $entry_id, $meta_key, $meta_value, $unique = false ) {
381 return add_metadata( 'weforms_entry', $entry_id, $meta_key, $meta_value, $unique );
382 }
383
384 /**
385 * Retrieve entry meta field for a entry.
386 *
387 * @param int $entry_id entry ID
388 * @param string $key Optional. The meta key to retrieve. By default, returns
389 * data for all keys. Default empty.
390 * @param bool $single Optional. Whether to return a single value. Default false.
391 *
392 * @return mixed Will be an array if $single is false. Will be value of meta data
393 * field if $single is true.
394 */
395 function weforms_get_entry_meta( $entry_id, $key = '', $single = false ) {
396 return get_metadata( 'weforms_entry', $entry_id, $key, $single );
397 }
398
399 /**
400 * Update entry meta field based on entry ID.
401 *
402 * Use the $prev_value parameter to differentiate between meta fields with the
403 * same key and entry ID.
404 *
405 * If the meta field for the entry does not exist, it will be added.
406 *
407 * @param int $entry_id entry ID
408 * @param string $meta_key metadata key
409 * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.
410 * @param mixed $prev_value Optional. Previous value to check before removing.
411 * Default empty.
412 *
413 * @return int|bool meta ID if the key didn't exist, true on successful update,
414 * false on failure
415 */
416 function weforms_update_entry_meta( $entry_id, $meta_key, $meta_value, $prev_value = '' ) {
417 return update_metadata( 'weforms_entry', $entry_id, $meta_key, $meta_value, $prev_value );
418 }
419
420 /**
421 * Delete everything from entry meta matching meta key.
422 *
423 * @param string $entry_meta_key key to search for when deleting
424 *
425 * @return bool whether the entry meta key was deleted from the database
426 */
427 function weforms_delete_entry_meta_by_key( $meta_key ) {
428 return delete_metadata( 'weforms_entry', null, $meta_key, '', true );
429 }
430
431 /**
432 * Retrieve entry meta fields, based on entry ID.
433 *
434 * The entry meta fields are retrieved from the cache where possible,
435 * so the function is optimized to be called more than once.
436 *
437 * @since 1.2.0
438 *
439 * @param int $entry_id optional
440 *
441 * @return array entry meta for the given entry
442 */
443 function weforms_get_entry_custom( $entry_id = 0 ) {
444 $entry_id = absint( $entry_id );
445
446 return weforms_get_entry_meta( $entry_id );
447 }
448
449 /**
450 * Retrieve meta field names for a entry.
451 *
452 * If there are no meta fields, then nothing (null) will be returned.
453 *
454 * @param int $entry_id optional
455 *
456 * @return array|void array of the keys, if retrieved
457 */
458 function weforms_get_entry_custom_keys( $entry_id = 0 ) {
459 $custom = weforms_get_entry_custom( $entry_id );
460
461 if ( !is_array( $custom ) ) {
462 return false;
463 }
464
465 if ( $keys = array_keys( $custom ) ) {
466 return $keys;
467 }
468 }
469
470 /**
471 * Get the number of entries count on a form
472 *
473 * @param int $form_id
474 *
475 * @return int
476 */
477 function weforms_count_form_entries( $form_id, $status = 'publish' ) {
478 global $wpdb;
479
480 return (int) $wpdb->get_var( $wpdb->prepare( 'SELECT count(id) FROM ' . $wpdb->weforms_entries . ' WHERE form_id = %d AND status = %s', $form_id, $status ) );
481 }
482
483 /**
484 * Get the number of entries count on a form
485 *
486 * @param int $form_id
487 *
488 * @return int
489 */
490 function weforms_count_form_payments( $form_id ) {
491 global $wpdb;
492
493 if ( !class_exists( 'WeForms_Payment' ) ) {
494 return 0;
495 }
496
497 return (int) $wpdb->get_var( $wpdb->prepare( 'SELECT count(id) FROM ' . $wpdb->prefix . 'weforms_payments' . ' WHERE form_id = %d', $form_id ) );
498 }
499
500 /**
501 * Get the form author details
502 *
503 * @param int $form_id
504 *
505 * @return array
506 */
507 function weforms_get_form_author_details( $form_id ) {
508 if ( empty( $form_id ) ) {
509 return;
510 }
511
512 $author_details = [];
513 $form = get_post( $form_id );
514 $author_id = $form->post_author;
515
516 $author_details['username'] = get_the_author_meta( 'user_login', $author_id );
517 $author_details['avatar'] = get_avatar_url( $author_id );
518
519 return $author_details;
520 }
521
522 /**
523 * Get table column heads for a form
524 *
525 * For now, return only text type fields
526 *
527 * @param int $form_id
528 *
529 * @return array
530 */
531 function weforms_get_entry_columns( $form_id, $limit = 6 ) {
532 $fields = weforms()->form->get( $form_id )->get_fields();
533 $columns = [];
534
535 // filter by input types
536 if ( $limit ) {
537 $fields = array_filter( $fields, function ( $item ) {
538 return in_array( $item['template'], [ 'text_field', 'name_field', 'dropdown_field', 'radio_field', 'email_address', 'url_field', 'column_field' ] );
539 } );
540 }
541
542 if ( $fields ) {
543 foreach ( $fields as $field ) {
544 if ( $field['template'] == 'column_field' ) {
545 foreach ( $field['inner_fields'] as $c_field ) {
546 $columns[ $c_field[0]['name'] ] = $c_field[0]['label'];
547 }
548 continue;
549 }
550 $columns[ $field['name'] ] = $field['label'];
551 }
552 }
553
554 // if passed 0/false, return all columns
555 if ( $limit && sizeof( $columns ) > $limit ) {
556 $columns = array_slice( $columns, 0, $limit ); // max 6 columns
557 }
558
559 return apply_filters( 'weforms_get_entry_columns', $columns, $form_id );
560 }
561
562 /**
563 * Get table column heads for a form
564 *
565 * For now, return only text type fields
566 *
567 * @param int $form_id
568 *
569 * @return array
570 */
571 function weforms_get_payment_columns( $form_id, $limit = 6 ) {
572 $fields = weforms()->form->get( $form_id )->get_fields();
573 $columns = [];
574
575 // filter by input types
576 if ( $limit ) {
577 $fields = array_filter( $fields, function ( $item ) {
578 return in_array( $item['template'], [ 'text_field', 'name_field', 'dropdown_field', 'radio_field', 'email_address', 'url_field' ] );
579 } );
580 }
581
582 if ( $fields ) {
583 foreach ( $fields as $field ) {
584 $columns[ $field['name'] ] = $field['label'];
585 }
586 }
587
588 // if passed 0/false, return all collumns
589 if ( $limit && sizeof( $columns ) > $limit ) {
590 $columns = array_slice( $columns, 0, $limit ); // max 6 columns
591 }
592
593 return apply_filters( 'weforms_get_entry_columns', $columns, $form_id );
594 }
595
596 /**
597 * Get fields from a form by it's meta key
598 *
599 * @param int $form_id
600 *
601 * @return array
602 */
603 function weforms_get_form_field_labels( $form_id ) {
604 $fields = weforms()->form->get( $form_id )->get_fields();
605 $exclude = [ 'step_start', 'section_break', 'recaptcha', 'shortcode', 'action_hook' ];
606
607 if ( !$fields ) {
608 return false;
609 }
610
611 $data = [];
612
613 foreach ( $fields as $field ) {
614 if ( empty( $field['name'] ) ) {
615 continue;
616 }
617
618 // exclude the fields
619 if ( in_array( $field['template'], $exclude ) ) {
620 continue;
621 }
622
623 $data[ $field['name'] ] = [
624 'label' => $field['label'],
625 'type' => $field['template'],
626 ];
627 }
628
629 return $data;
630 }
631
632 /**
633 * Get data from an entry
634 *
635 * @param int $entry_id
636 * @param int $form_id
637 *
638 * @return false|array
639 */
640 function weforms_get_entry_data( $entry_id ) {
641 $data = [];
642 $entry = weforms_get_entry( $entry_id );
643 $fields = weforms_get_form_field_labels( $entry->form_id );
644
645 if ( !$fields ) {
646 return false;
647 }
648
649 foreach ( $fields as $meta_key => $field ) {
650 $value = weforms_get_entry_meta( $entry_id, $meta_key, true );
651
652 if ( $field['type'] == 'textarea' ) {
653 $data[ $meta_key ] = weforms_format_text( $value );
654 } elseif ( $field['type'] == 'name' ) {
655 $data[ $meta_key ] = implode( ' ', explode( WeForms::$field_separator, $value ) );
656 } elseif ( in_array( $field['type'], [ 'image_upload', 'file_upload' ] ) ) {
657 $data[ $meta_key ] = '';
658
659 if ( is_array( $value ) && $value ) {
660 foreach ( $value as $attachment_id ) {
661 if ( $field['type'] == 'image_upload' ) {
662 $thumb = wp_get_attachment_image( $attachment_id, 'thumbnail' );
663 } else {
664 $thumb = get_post_field( 'post_title', $attachment_id );
665 }
666
667 $full_size = wp_get_attachment_url( $attachment_id );
668
669 $data[ $meta_key ] .= sprintf( '<a href="%s" target="_blank">%s</a> ', $full_size, $thumb );
670 }
671 }
672 } elseif ( in_array( $field['type'], [ 'checkbox', 'multiselect' ] ) ) {
673 $data[ $meta_key ] = explode( WeForms::$field_separator, $value );
674 } elseif ( $field['type'] == 'map' ) {
675 list( $lat, $long ) = explode( ',', $value );
676
677 $data[ $meta_key ] = [
678 'lat' => $lat,
679 'long' => $long,
680 ];
681 } else {
682 $data[ $meta_key ] = $value;
683 }
684 }
685
686 return [
687 'fields' => $fields,
688 'data' => $data,
689 ];
690 }
691
692 /**
693 * Format a text and apply WP function callbacks
694 *
695 * @param string $content
696 *
697 * @return string
698 */
699 function weforms_format_text( $content ) {
700 $content = wptexturize( $content );
701 $content = convert_smilies( $content );
702 $content = wpautop( $content );
703 $content = make_clickable( $content );
704
705 return $content;
706 }
707
708 /**
709 * Get User Agent browser and OS type
710 *
711 * @return array
712 */
713 function weforms_get_browser() {
714 $u_agent = isset( $_SERVER['HTTP_USER_AGENT'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : '';
715 $bname = 'Unknown';
716 $platform = 'Unknown';
717 $version = '';
718
719 // first get the platform
720 if ( preg_match( '/linux/i', $u_agent ) ) {
721 $platform = 'Linux';
722 } elseif ( preg_match( '/macintosh|mac os x/i', $u_agent ) ) {
723 $platform = 'MAC OS';
724 } elseif ( preg_match( '/windows|win32/i', $u_agent ) ) {
725 $platform = 'Windows';
726 }
727
728 // next get the name of the useragent yes seperately and for good reason
729 if ( preg_match( '/MSIE/i', $u_agent ) && !preg_match( '/Opera/i', $u_agent ) ) {
730 $bname = 'Internet Explorer';
731 $ub = 'MSIE';
732 } elseif ( preg_match( '/Trident/i', $u_agent ) ) {
733 // this condition is for IE11
734 $bname = 'Internet Explorer';
735 $ub = 'rv';
736 } elseif ( preg_match( '/Firefox/i', $u_agent ) ) {
737 $bname = 'Mozilla Firefox';
738 $ub = 'Firefox';
739 } elseif ( preg_match( '/Chrome/i', $u_agent ) ) {
740 $bname = 'Google Chrome';
741 $ub = 'Chrome';
742 } elseif ( preg_match( '/Safari/i', $u_agent ) ) {
743 $bname = 'Apple Safari';
744 $ub = 'Safari';
745 } elseif ( preg_match( '/Opera/i', $u_agent ) ) {
746 $bname = 'Opera';
747 $ub = 'Opera';
748 } elseif ( preg_match( '/Netscape/i', $u_agent ) ) {
749 $bname = 'Netscape';
750 $ub = 'Netscape';
751 }
752
753 // finally get the correct version number
754 // Added "|:"
755 $known = [ 'Version', $ub, 'other' ];
756 $pattern = '#(?<browser>' . join( '|', $known ) .
757 ')[/|: ]+(?<version>[0-9.|a-zA-Z.]*)#';
758
759 if ( !preg_match_all( $pattern, $u_agent, $matches ) ) {
760 // we have no matching number just continue
761 }
762
763 // see how many we have
764 $i = count( $matches['browser'] );
765
766 if ( $i != 1 ) {
767 // we will have two since we are not using 'other' argument yet
768 // see if version is before or after the name
769 if ( strripos( $u_agent, 'Version' ) < strripos( $u_agent, $ub ) ) {
770 $version = $matches['version'][0];
771 } else {
772 $version = $matches['version'][1];
773 }
774 } else {
775 $version = $matches['version'][0];
776 }
777
778 // check if we have a number
779 if ( $version == null || $version == '' ) {
780 $version = '';
781 }
782
783 return [
784 'userAgent' => $u_agent,
785 'name' => $bname,
786 'version' => $version,
787 'platform' => $platform,
788 'pattern' => $pattern,
789 ];
790 }
791
792 /**
793 * Get form notification merge tags
794 *
795 * @since 1.0
796 *
797 * @return array
798 */
799 function weforms_get_merge_tags() {
800 $tags = [
801 'form' => [
802 'title' => __( 'Form', 'weforms' ),
803 'tags' => [
804 'entry_id' => __( 'Entry ID', 'weforms' ),
805 'form_id' => __( 'Form ID', 'weforms' ),
806 'form_name' => __( 'Form Name', 'weforms' ),
807 ],
808 ],
809 'system' => [
810 'title' => __( 'System', 'weforms' ),
811 'tags' => [
812 'admin_email' => __( 'Site Administrator Email', 'weforms' ),
813 'date' => __( 'Date', 'weforms' ),
814 'site_name' => __( 'Site Title', 'weforms' ),
815 'site_url' => __( 'Site URL', 'weforms' ),
816 'page_title' => __( 'Embedded Page Title', 'weforms' ),
817 ],
818 ],
819 'user' => [
820 'title' => __( 'User', 'weforms' ),
821 'tags' => [
822 'ip_address' => __( 'IP Address', 'weforms' ),
823 'user_id' => __( 'User ID', 'weforms' ),
824 'first_name' => __( 'First Name', 'weforms' ),
825 'last_name' => __( 'Last Name', 'weforms' ),
826 'display_name' => __( 'Display Name', 'weforms' ),
827 'user_email' => __( 'Email', 'weforms' ),
828 ],
829 ],
830 'urls' => [
831 'title' => __( 'URL\'s', 'weforms' ),
832 'tags' => [
833 'url_page' => __( 'Embeded Page URL', 'weforms' ),
834 'url_referer' => __( 'Referer URL', 'weforms' ),
835 'url_login' => __( 'Login URL', 'weforms' ),
836 'url_logout' => __( 'Logout URL', 'weforms' ),
837 'url_register' => __( 'Register URL', 'weforms' ),
838 'url_lost_password' => __( 'Lost Password URL', 'weforms' ),
839 'personal_data_erase_confirm_url' => __( 'Personal Data Erase Confirmation URL', 'weforms' ),
840 'personal_data_export_confirm_url' => __( 'Personal Data Export Confirmation URL', 'weforms' ),
841 ],
842 ],
843 ];
844
845 return apply_filters( 'wpuf_cf_merge_tags', $tags );
846 }
847
848 /**
849 * Record a form view count
850 *
851 * @param int $form_id
852 *
853 * @return void
854 */
855 function weforms_track_form_view( $form_id ) {
856 // don't track administrators
857 if ( current_user_can( 'administrator' ) ) {
858 return;
859 }
860
861 // ability to turn this off if someone doesn't like this tracking
862 $is_enabled = apply_filters( 'weforms_track_form_view', true );
863
864 if ( !$is_enabled ) {
865 return;
866 }
867
868 // increase the count
869 $meta_key = '_weforms_view_count';
870 $number = (int) get_post_meta( $form_id, $meta_key, true );
871
872 update_post_meta( $form_id, $meta_key, ( $number + 1 ) );
873 }
874
875 /**
876 * Get form view count of a form
877 *
878 * @param int $form_id
879 *
880 * @return int
881 */
882 function weforms_get_form_views( $form_id ) {
883 return (int) get_post_meta( $form_id, '_weforms_view_count', true );
884 }
885
886 /**
887 * Get the weForms global settings
888 *
889 * @param string $key
890 * @param mixed $default
891 *
892 * @return mixed
893 */
894 function weforms_get_settings( $key = '', $default = '' ) {
895 $settings = get_option( 'weforms_settings', [] );
896 $settings = apply_filters( 'weforms_get_settings', $settings );
897
898 if ( empty( $key ) ) {
899 return $settings;
900 }
901
902 if ( isset( $settings[ $key ] ) ) {
903 return $settings[ $key ];
904 }
905
906 return $default;
907 }
908
909 /**
910 * Update Settings
911 *
912 * @param array $updated_settings
913 *
914 * @return array
915 */
916 function weforms_update_settings( $updated_settings = [] ) {
917 $previuos_settings = weforms_get_settings();
918
919 $settings = array_merge( $previuos_settings, $updated_settings );
920
921 update_option( 'weforms_settings', $settings );
922
923 return $settings;
924 }
925
926 /**
927 * Form access capability for forms
928 *
929 * @since 1.0.5
930 *
931 * @return string
932 */
933 function weforms_form_access_capability() {
934 return apply_filters( 'weforms_form_access_capability', 'manage_options' );
935 }
936
937 /**
938 * Form access capability for forms
939 *
940 * @since 1.2.4
941 *
942 * @return string
943 */
944 function weforms_log_file_path() {
945 return apply_filters( 'weforms_log_file_path', WP_CONTENT_DIR . '/weforms.log' );
946 }
947
948 /**
949 * Clear the buffer
950 *
951 * prevents ajax breakage and endless loading icon. A LIFE SAVER!!!
952 *
953 * @since 1.1.0
954 *
955 * @return void
956 */
957 function weforms_clear_buffer() {
958 if ( ob_get_length() > 0 ) {
959 ob_clean();
960 }
961 }
962
963 /**
964 * Get the client IP address
965 *
966 * @since 1.1.0
967 *
968 * @return string
969 */
970 function weforms_get_client_ip() {
971 $ipaddress = '';
972
973 if ( isset( $_SERVER['HTTP_CLIENT_IP'] ) ) {
974 $ipaddress = sanitize_text_field( wp_unslash( $_SERVER['HTTP_CLIENT_IP'] ) );
975 } elseif ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
976 $ipaddress = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED_FOR'] ) );
977 } elseif ( isset( $_SERVER['HTTP_X_FORWARDED'] ) ) {
978 $ipaddress = sanitize_text_field( wp_unslash( $_SERVER['HTTP_X_FORWARDED'] ) );
979 } elseif ( isset( $_SERVER['HTTP_FORWARDED_FOR'] ) ) {
980 $ipaddress = sanitize_text_field( wp_unslash( $_SERVER['HTTP_FORWARDED_FOR'] ) );
981 } elseif ( isset( $_SERVER['HTTP_FORWARDED'] ) ) {
982 $ipaddress = sanitize_text_field( wp_unslash( $_SERVER['HTTP_FORWARDED'] ) );
983 } elseif ( isset( $_SERVER['REMOTE_ADDR'] ) ) {
984 $ipaddress = sanitize_text_field( wp_unslash( $_SERVER['REMOTE_ADDR'] ) );
985 } else {
986 $ipaddress = 'UNKNOWN';
987 }
988
989 return $ipaddress;
990 }
991
992 /**
993 * Save form fields
994 *
995 * @since 1.1.0
996 *
997 * @param int $form_id
998 * @param array $field
999 * @param int $field_id
1000 * @param int $order
1001 *
1002 * @return int ID of updated or inserted post
1003 */
1004 function weforms_insert_form_field( $form_id, $field = [], $field_id = null, $order = 0 ) {
1005 $args = [
1006 'post_type' => 'wpuf_input',
1007 'post_parent' => $form_id,
1008 'post_status' => 'publish',
1009 'post_content' => maybe_serialize( wp_unslash( $field ) ),
1010 'menu_order' => $order,
1011 ];
1012
1013 if ( $field_id ) {
1014 $args['ID'] = $field_id;
1015 }
1016
1017 if ( $field_id ) {
1018 return wp_update_post( $args );
1019 } else {
1020 return wp_insert_post( $args );
1021 }
1022 }
1023
1024 /**
1025 * Allowed upload extensions
1026 *
1027 * @return array
1028 */
1029 function weforms_allowed_extensions() {
1030 $extesions = [
1031 'images' => [
1032 'ext' => 'jpg,jpeg,gif,png,bmp',
1033 'label' => __( 'Images', 'weforms' ),
1034 ],
1035 'audio' => [
1036 'ext' => 'mp3,wav,ogg,wma,mka,m4a,ra,mid,midi',
1037 'label' => __( 'Audio', 'weforms' ),
1038 ],
1039 'video' => [
1040 'ext' => 'avi,divx,flv,mov,ogv,mkv,mp4,m4v,divx,mpg,mpeg,mpe',
1041 'label' => __( 'Videos', 'weforms' ),
1042 ],
1043 'pdf' => [
1044 'ext' => 'pdf',
1045 'label' => __( 'PDF', 'weforms' ),
1046 ],
1047 'office' => [
1048 'ext' => 'doc,ppt,pps,xls,mdb,docx,xlsx,pptx,odt,odp,ods,odg,odc,odb,odf,rtf,txt',
1049 'label' => __( 'Office Documents', 'weforms' ),
1050 ],
1051 'zip' => [
1052 'ext' => 'zip,gz,gzip,rar,7z',
1053 'label' => __( 'Zip Archives', 'weforms' ),
1054 ],
1055 'exe' => [
1056 'ext' => 'exe',
1057 'label' => __( 'Executable Files', 'weforms' ),
1058 ],
1059 'csv' => [
1060 'ext' => 'csv',
1061 'label' => __( 'CSV', 'weforms' ),
1062 ],
1063 ];
1064
1065 return apply_filters( 'weforms_allowed_extensions', $extesions );
1066 }
1067
1068 /**
1069 * Get form integration settings
1070 *
1071 * @since 1.1.0
1072 *
1073 * @param int $form_id
1074 *
1075 * @return array
1076 */
1077 function weforms_get_form_integrations( $form_id ) {
1078 $integrations = get_post_meta( $form_id, 'integrations', true );
1079
1080 if ( !$integrations ) {
1081 return [];
1082 }
1083
1084 return $integrations;
1085 }
1086
1087 /**
1088 * Check if an integration is active
1089 *
1090 * @since 1.1.0
1091 *
1092 * @param int $form_id
1093 * @param string $integration_id
1094 *
1095 * @return bool
1096 */
1097 function weforms_is_integration_active( $form_id, $integration_id ) {
1098 $integrations = weforms_get_form_integrations( $form_id );
1099
1100 if ( !$integrations ) {
1101 return false;
1102 }
1103
1104 foreach ( $integrations as $id => $integration ) {
1105 if ( $integration_id == $id && $integration->enabled == true ) {
1106 return $integration;
1107 }
1108 }
1109
1110 return false;
1111 }
1112
1113 /**
1114 * Get Flat UI Colors
1115 *
1116 * @return array
1117 */
1118 function weforms_get_flat_ui_colors() {
1119 return [ '#1abc9c', '#2ecc71', '#3498db', '#9b59b6', '#34495e' ];
1120 }
1121
1122 /**
1123 * Get default form settings
1124 *
1125 * @return array
1126 */
1127 function weforms_get_default_form_settings() {
1128 return apply_filters(
1129 'weforms_get_default_form_settings', [
1130 'redirect_to' => 'same',
1131 'message' => __( 'Thanks for contacting us! We will get in touch with you shortly.', 'weforms' ),
1132 'page_id' => '',
1133 'url' => '',
1134
1135 'submit_text' => __( 'Submit', 'weforms' ),
1136 'submit_button_cond' => [
1137 'condition_status' => 'no',
1138 'cond_logic' => 'any',
1139 'conditions' => [
1140 [
1141 'name' => '',
1142 'operator' => '=',
1143 'option' => '',
1144 ],
1145 ],
1146 ],
1147
1148 'schedule_form' => 'false',
1149 'schedule_start' => '',
1150 'schedule_end' => '',
1151 'sc_pending_message' => __( 'Form submission hasn\'t been started yet', 'weforms' ),
1152 'sc_expired_message' => __( 'Form submission is now closed.', 'weforms' ),
1153 'require_login' => 'false',
1154 'req_login_message' => __( 'You need to login to submit a query.', 'weforms' ),
1155 'limit_entries' => 'false',
1156 'limit_number' => '100',
1157 'limit_message' => __( 'Sorry, we have reached the maximum number of submissions.', 'weforms' ),
1158 'label_position' => 'above',
1159 'use_theme_css' => 'wpuf-style',
1160 'quiz_form' => 'no',
1161 'shuffle_question_order' => 'no',
1162 'release_grade' => 'after_submission',
1163 'respondent_can_see' => [ 'missed_questions', 'correct_answers', 'point_values' ],
1164 'total_points' => 0,
1165 'enable_multistep' => false,
1166 'multistep_progressbar_type' => 'progressive',
1167 'humanpresence_enabled' => false,
1168
1169 // payment
1170 'payment_paypal_images' => 'https://www.paypalobjects.com/webstatic/mktg/logo/AM_mc_vs_dc_ae.jpg',
1171
1172 'payment_paypal_label' => __( 'PayPal', 'weforms' ),
1173 'payment_stripe_label' => __( 'Credit Card', 'weforms' ),
1174 'payment_stripe_images' => [ 'visa', 'mastercard', 'amex', 'discover' ],
1175
1176 'payment_stripe_deactivate' => '',
1177 'stripe_mode' => 'live',
1178 'stripe_page_id' => '',
1179
1180 'stripe_override_keys' => '',
1181 'stripe_email' => '',
1182 'stripe_key' => '',
1183 'stripe_secret_key' => '',
1184 'stripe_key_test' => '',
1185 'stripe_secret_key_test' => '',
1186
1187 'stripe_prefill_email' => '',
1188 'stripe_user_email_field' => '',
1189
1190 'payment_paypal_deactivate' => '',
1191 'paypal_mode' => 'live',
1192 'paypal_type' => '_cart',
1193
1194 'paypal_override' => '',
1195 'paypal_email' => '',
1196
1197 'paypal_page_id' => '',
1198
1199 'paypal_prefill_email' => '',
1200 'paypal_user_email_field' => '',
1201 ]
1202 );
1203 }
1204
1205 /**
1206 * Get default form settings
1207 *
1208 * @return array
1209 */
1210 function weforms_get_default_form_notification() {
1211 return apply_filters(
1212 'weforms_get_default_form_notification', [
1213 'active' => 'true',
1214
1215 'type' => 'email',
1216 'smsTo' => '',
1217 'smsText' => '[{form_name}] ' . __( 'New Form Submission', 'weforms' ) . ' #{entry_id}',
1218
1219 'name' => __( 'Admin Notification', 'weforms' ),
1220 'subject' => '[{form_name}] ' . __( 'New Form Submission', 'weforms' ) . ' #{entry_id}',
1221 'to' => '{admin_email}',
1222 'replyTo' => '{field:email}',
1223 'message' => '{all_fields}',
1224 'fromName' => '{site_name}',
1225 'fromAddress' => '{admin_email}',
1226 'cc' => '',
1227 'bcc' => '',
1228 'weforms_cond' => [
1229 'condition_status' => 'no',
1230 'cond_logic' => 'any',
1231 'conditions' => [
1232 [
1233 'name' => '',
1234 'operator' => '=',
1235 'option' => '',
1236 ],
1237 ],
1238 ],
1239 ]
1240 );
1241 }
1242
1243 /**
1244 * weforms_get_pain_text
1245 *
1246 * @param $value mixed
1247 *
1248 * @return string
1249 **/
1250 function weforms_get_pain_text( $value ) {
1251 // Security fix: Removed unsafe unserialize() call to prevent PHP Object Injection.
1252 // WordPress's get_metadata() already handles deserialization safely.
1253 // Any serialized strings at this point should be treated as untrusted user input.
1254
1255 if ( is_array( $value ) ) {
1256 $string_value = [];
1257 foreach ( $value as $key => $single_value ) {
1258 // Only recursively process arrays, not serialized strings
1259 if ( is_array( $single_value ) ) {
1260 $single_value = weforms_get_pain_text( $single_value );
1261 }
1262
1263 $single_value = ucwords( str_replace( [ '_', '-' ], ' ', $key ) ) . ': ' . ucwords( $single_value );
1264
1265 $string_value[] = $single_value;
1266 }
1267
1268 $value = implode( WeForms::$field_separator, $string_value );
1269 }
1270
1271 $value = trim( strip_tags( $value ) );
1272
1273 // escape spreadsheet special characters to prevent formula exploits.
1274 $value = preg_match( '/^[=+@-]/', $value ) ? '\'' . $value : $value;
1275
1276 return $value;
1277 }
1278
1279 /**
1280 * Get countries
1281 *
1282 * @since 1.1.0
1283 *
1284 * @param string $type (optional)
1285 *
1286 * @return array|string
1287 */
1288 function weforms_get_countries( $type = 'array' ) {
1289 $countries = include WEFORMS_INCLUDES . '/country-list.php';
1290
1291 if ( $type == 'json' ) {
1292 $countries = json_encode( $countries );
1293 }
1294
1295 return $countries;
1296 }
1297
1298 /**
1299 * Get country name
1300 *
1301 * @since 1.3.7
1302 *
1303 * @param string $country_code (required)
1304 *
1305 * @return string
1306 */
1307 function get_country_name( $country_code ) {
1308 if ( empty( $country_code ) ) {
1309 return;
1310 }
1311
1312 $countries = weforms_get_countries();
1313
1314 foreach ( $countries as $country ) {
1315 if ( $country['code'] == $country_code ) {
1316 return $country['name'];
1317 }
1318 }
1319 }
1320
1321 /**
1322 * Localize countries
1323 *
1324 * @since 1.3.5
1325 *
1326 * @return array
1327 */
1328 function weforms_localized_countries( $script ) {
1329 $script['countries'] = weforms_get_countries();
1330
1331 return $script;
1332 }
1333 add_filter( 'weforms_localized_script', 'weforms_localized_countries' );
1334
1335 function is_weforms_api_allowed_guest_submission() {
1336 $permission = false;
1337
1338 if ( current_user_can( 'read' ) ) {
1339 $permission = true;
1340 }
1341
1342 return apply_filters( 'weforms_anonymous_entry_submit_permission', $permission );
1343 }
1344
1345 /**
1346 * Clean variables using weforms_clean. Arrays are cleaned recursively.
1347 * Non-scalar values are ignored.
1348 *
1349 * @param string|array $var Data to sanitize.
1350 * @return string|array
1351 */
1352 function weforms_clean( $var ) {
1353 if ( is_array( $var ) ) {
1354 return array_map( 'weforms_clean', $var );
1355 } else {
1356 return is_scalar( $var ) ? sanitize_textarea_field( wp_unslash( $var ) ) : $var;
1357 }
1358 }
1359