PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.0.08
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.0.08
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
← All changes | classes/helpers/FrmAppHelper.php +341 -1111 6.5.15.0.08 View file →
@@ -3,21 +3,16 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmAppHelper {
7 - public static $db_version = 98; // Version of the database we are moving to.
7 + public static $db_version = 98; // Version of the database we are moving to.
8 8 public static $pro_db_version = 37; //deprecated
9 - public static $font_version = 7;
9 + public static $font_version = 7;
10 10
11 11 /**
12 - * @var bool $added_gmt_offset_filter
13 - */
14 - private static $added_gmt_offset_filter = false;
15 -
16 - /**
17 12 * @since 2.0
18 13 */
19 - public static $plug_version = '6.5.1';
14 + public static $plug_version = '5.0.08';
20 15
21 16 /**
22 17 * @since 1.07.02
23 18 *
@@ -148,28 +143,12 @@
148 143
149 144 public static function get_menu_name() {
150 145 $frm_settings = self::get_settings();
151 146
152 - return FrmAddonsController::is_license_expired() ? 'Formidable' : $frm_settings->menu;
147 + return $frm_settings->menu;
153 148 }
154 149
155 150 /**
156 - * Determine if the current branding is set to 'formidable'.
157 - *
158 - * Checks the menu title, retrieved through get_menu_name,
159 - * and verifies if it matches the 'formidable' branding.
160 - *
161 - * @since 6.4.2
162 - *
163 - * @return bool True if the menu title is 'formidable', false otherwise.
164 - */
165 - public static function is_formidable_branding() {
166 - $menu_title = self::get_menu_name();
167 -
168 - return 'formidable' === strtolower( trim( $menu_title ) );
169 - }
170 -
171 - /**
172 151 * @since 3.05
173 152 */
174 153 public static function svg_logo( $atts = array() ) {
175 154 $defaults = array(
@@ -189,9 +168,9 @@
189 168 /**
190 169 * @since 4.0
191 170 */
192 171 public static function show_logo( $atts = array() ) {
193 - echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
172 + echo self::kses( self::svg_logo( $atts ), 'all' ); // WPCS: XSS ok.
194 173 }
195 174
196 175 /**
197 176 * @since 4.03.02
@@ -212,9 +191,9 @@
212 191 // Show nothing if it isn't an SVG.
213 192 $icon = '<div style="height:39px"></div>';
214 193 }
215 194 }
216 - echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
195 + echo self::kses( $icon, 'all' ); // WPCS: XSS ok.
217 196 }
218 197
219 198 /**
220 199 * @since 2.02.04
@@ -268,15 +247,15 @@
268 247 global $pagenow;
269 248 $get_page = self::simple_get( 'page', 'sanitize_title' );
270 249 if ( $pagenow ) {
271 250 // allow this to be true during ajax load i.e. ajax form builder loading
272 - $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
251 + $is_page = ( $pagenow == 'admin.php' || $pagenow == 'admin-ajax.php' ) && $get_page == $page;
273 252 if ( $is_page ) {
274 253 return true;
275 254 }
276 255 }
277 256
278 - return is_admin() && $get_page === $page;
257 + return is_admin() && $get_page == $page;
279 258 }
280 259
281 260 /**
282 261 * If the current page is for editing or creating a view.
@@ -348,18 +327,14 @@
348 327 * Check if on an admin page
349 328 *
350 329 * @since 2.0
351 330 *
331 + * @param None
332 + *
352 333 * @return boolean
353 334 */
354 335 public static function is_admin() {
355 - $is_admin = is_admin() && ! wp_doing_ajax();
356 -
357 - /**
358 - * @since 6.0
359 - * @param bool $is_admin
360 - */
361 - return apply_filters( 'frm_is_admin', $is_admin );
336 + return is_admin() && ! wp_doing_ajax();
362 337 }
363 338
364 339 /**
365 340 * Check if value contains blank value or empty array
@@ -392,37 +367,26 @@
392 367 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
393 368 }
394 369
395 370 /**
396 - * Get the server OS
371 + * Check for the IP address in several places
372 + * Used by [ip] shortcode
397 373 *
398 - * @since 6.4.2
399 - *
400 - * @return string
401 - */
402 - public static function get_server_os() {
403 - if ( function_exists( 'php_uname' ) ) {
404 - return php_uname( 's' );
405 - }
406 -
407 - if ( ! defined( 'PHP_OS' ) ) {
408 - return '';
409 - }
410 -
411 - // match the same response for Windows server as php_uname('s')
412 - return in_array( PHP_OS, array( 'WIN32', 'WINNT', 'Windows_NT' ), true ) ? 'Windows NT' : PHP_OS;
413 - }
414 -
415 - /**
416 - * Check for the IP address in several places (when custom headers are enabled).
417 - * Used by [ip] shortcode.
418 - *
419 374 * @return string The IP address of the current user
420 375 */
421 376 public static function get_ip_address() {
422 - $ip_options = self::should_use_custom_header_ip() ? self::get_custom_header_keys_for_ip() : array( 'REMOTE_ADDR' );
423 - $ip = '';
424 -
377 + $ip_options = array(
378 + 'HTTP_CLIENT_IP',
379 + 'HTTP_CF_CONNECTING_IP',
380 + 'HTTP_X_FORWARDED_FOR',
381 + 'HTTP_X_FORWARDED',
382 + 'HTTP_X_CLUSTER_CLIENT_IP',
383 + 'HTTP_X_REAL_IP',
384 + 'HTTP_FORWARDED_FOR',
385 + 'HTTP_FORWARDED',
386 + 'REMOTE_ADDR',
387 + );
388 + $ip = '';
425 389 foreach ( $ip_options as $key ) {
426 390 if ( ! isset( $_SERVER[ $key ] ) ) {
427 391 continue;
428 392 }
@@ -428,9 +392,9 @@
428 392 }
429 393
430 394 $key = self::get_server_value( $key );
431 395 foreach ( explode( ',', $key ) as $ip ) {
432 - $ip = trim( $ip ); // Just to be safe.
396 + $ip = trim( $ip ); // just to be safe.
433 397
434 398 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
435 399 return sanitize_text_field( $ip );
436 400 }
@@ -439,52 +403,8 @@
439 403
440 404 return sanitize_text_field( $ip );
441 405 }
442 406
443 - /**
444 - * @since 6.1
445 - *
446 - * @return array
447 - */
448 - public static function get_custom_header_keys_for_ip() {
449 - return array(
450 - 'HTTP_CLIENT_IP',
451 - 'HTTP_CF_CONNECTING_IP',
452 - 'HTTP_X_FORWARDED_FOR',
453 - 'HTTP_X_FORWARDED',
454 - 'HTTP_X_CLUSTER_CLIENT_IP',
455 - 'HTTP_X_REAL_IP',
456 - 'HTTP_FORWARDED_FOR',
457 - 'HTTP_FORWARDED',
458 - 'REMOTE_ADDR',
459 - );
460 - }
461 -
462 - /**
463 - * Check if we should check every HTTP header or just $_SERVER['REMOTE_ADDR'].
464 - * The other HTTP headers can be spoofed so this isn't recommended.
465 - * But in some cases (like reverse proxies), the IP may be empty if you use $_SERVER['REMOTE_ADDR'].
466 - *
467 - * @since 6.1
468 - *
469 - * @return bool
470 - */
471 - private static function should_use_custom_header_ip() {
472 - $settings = self::get_settings();
473 - $should_use_custom_header_ip = ! $settings->no_ips && $settings->custom_header_ip;
474 -
475 - /**
476 - * Filter whether to check spoofable HTTP headers.
477 - * This uses the custom_header_ip setting, but it is hidden if the GDPR option is also on.
478 - * As the IP is still checked for blacklist checks, someone with the GDPR option may still want to enable this when behind a reverse proxy.
479 - *
480 - * @since 6.1
481 - *
482 - * @param bool $should_use_custom_header_ip
483 - */
484 - return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
485 - }
486 -
487 407 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
488 408 if ( strpos( $param, '[' ) ) {
489 409 $params = explode( '[', $param );
490 410 $param = $params[0];
@@ -489,11 +409,12 @@
489 409 $params = explode( '[', $param );
490 410 $param = $params[0];
491 411 }
492 412
493 - if ( $src === 'get' ) {
494 - $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default ); // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
495 - if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
413 + if ( $src == 'get' ) {
414 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
415 + $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
416 + if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) {
496 417 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
497 418 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
498 419 }
499 420 self::sanitize_value( $sanitize, $value );
@@ -573,16 +494,16 @@
573 494 );
574 495 $args = wp_parse_args( $args, $defaults );
575 496
576 497 $value = $args['default'];
577 - if ( $args['type'] === 'get' ) {
498 + if ( $args['type'] == 'get' ) {
578 499 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
579 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
500 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
580 501 $value = wp_unslash( $_GET[ $args['param'] ] );
581 502 }
582 - } elseif ( $args['type'] === 'post' ) {
583 - if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
584 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
503 + } elseif ( $args['type'] == 'post' ) {
504 + if ( isset( $_POST[ $args['param'] ] ) ) {
505 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
585 506 $value = wp_unslash( $_POST[ $args['param'] ] );
586 507 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
587 508 self::unserialize_or_decode( $value );
588 509 }
@@ -587,9 +508,9 @@
587 508 self::unserialize_or_decode( $value );
588 509 }
589 510 }
590 511 } else {
591 - if ( isset( $_REQUEST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
512 + if ( isset( $_REQUEST[ $args['param'] ] ) ) {
592 513 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
593 514 $value = wp_unslash( $_REQUEST[ $args['param'] ] );
594 515 }
595 516 }
@@ -724,74 +645,8 @@
724 645 return wp_kses( $value, $allowed_html );
725 646 }
726 647
727 648 /**
728 - * The regular kses function strips [button_action] from submit button HTML.
729 - *
730 - * @since 5.0.13
731 - *
732 - * @param string $html
733 - * @return string
734 - */
735 - public static function kses_submit_button( $html ) {
736 - $included_button_action = false !== strpos( $html, '[button_action]' );
737 - $included_back_hook = false !== strpos( $html, '[back_hook]' );
738 - $included_draft_hook = false !== strpos( $html, '[draft_hook]' );
739 - add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
740 - add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
741 - $html = self::kses( $html, 'all' );
742 - remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
743 - remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
744 - if ( $included_button_action ) {
745 - if ( false !== strpos( $html, '<input type="submit"' ) ) {
746 - $pattern = '/(<input type="submit")([^>]*)(\/>)/';
747 - $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
748 - } else {
749 - $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
750 - $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
751 - }
752 - }
753 - if ( $included_back_hook ) {
754 - $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
755 - }
756 - if ( $included_draft_hook ) {
757 - $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
758 - }
759 - return $html;
760 - }
761 -
762 - /**
763 - * @since 5.0.13
764 - *
765 - * @param array $allowed_attr
766 - * @return array
767 - */
768 - public static function allow_visibility_style( $allowed_attr ) {
769 - $allowed_attr[] = 'visibility';
770 - return $allowed_attr;
771 - }
772 -
773 - /**
774 - * @since 5.0.13
775 - *
776 - * @param array $allowed_html
777 - * @return array
778 - */
779 - public static function add_allowed_submit_button_tags( $allowed_html ) {
780 - $allowed_html['input'] = array(
781 - 'type' => true,
782 - 'value' => true,
783 - 'formnovalidate' => true,
784 - 'name' => true,
785 - 'class' => true,
786 - );
787 - $allowed_html['button']['formnovalidate'] = true;
788 - $allowed_html['button']['name'] = true;
789 - $allowed_html['img']['style'] = true;
790 - return $allowed_html;
791 - }
792 -
793 - /**
794 649 * @since 2.05.03
795 650 */
796 651 private static function allowed_html( $allowed ) {
797 652 $html = self::safe_html();
@@ -816,16 +671,15 @@
816 671 'id' => true,
817 672 );
818 673
819 674 return array(
820 - 'a' => array(
821 - 'class' => true,
822 - 'href' => true,
823 - 'id' => true,
824 - 'rel' => true,
825 - 'target' => true,
826 - 'title' => true,
827 - 'tabindex' => true,
675 + 'a' => array(
676 + 'class' => true,
677 + 'href' => true,
678 + 'id' => true,
679 + 'rel' => true,
680 + 'target' => true,
681 + 'title' => true,
828 682 ),
829 683 'abbr' => array(
830 684 'title' => true,
831 685 ),
@@ -849,9 +703,8 @@
849 703 'class' => true,
850 704 'id' => true,
851 705 'title' => true,
852 706 'style' => true,
853 - 'role' => true,
854 707 ),
855 708 'dl' => array(),
856 709 'dt' => array(),
857 710 'em' => array(),
@@ -914,21 +767,19 @@
914 767 'id' => true,
915 768 'viewbox' => true,
916 769 ),
917 770 'svg' => array(
918 - 'class' => true,
919 - 'id' => true,
920 - 'xmlns' => true,
921 - 'viewbox' => true,
922 - 'width' => true,
923 - 'height' => true,
924 - 'style' => true,
925 - 'fill' => true,
926 - 'aria-label' => true,
927 - 'aria-hidden' => true,
771 + 'class' => true,
772 + 'id' => true,
773 + 'xmlns' => true,
774 + 'viewbox' => true,
775 + 'width' => true,
776 + 'height' => true,
777 + 'style' => true,
778 + 'fill' => true,
928 779 ),
929 780 'use' => array(
930 - 'href' => true,
781 + 'href' => true,
931 782 'xlink:href' => true,
932 783 ),
933 784 'ul' => $allow_class,
934 785 'label' => array(
@@ -1001,18 +852,8 @@
1001 852
1002 853 $html_atts = self::array_to_html_params( $atts );
1003 854
1004 855 $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1005 -
1006 - // Replace icons that have been removed.
1007 - $deprecated = array(
1008 - 'frm_clone_solid_icon' => 'frm_clone_icon',
1009 - );
1010 - if ( isset( $deprecated[ $icon ] ) ) {
1011 - $icon = $deprecated[ $icon ];
1012 - $class = str_replace( $icon, $deprecated[ $icon ], $class );
1013 - }
1014 -
1015 856 if ( $icon === $class ) {
1016 857 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1017 858 } else {
1018 859 $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
@@ -1019,15 +860,15 @@
1019 860 if ( strpos( $icon, ' ' ) ) {
1020 861 $icon = explode( ' ', $icon );
1021 862 $icon = reset( $icon );
1022 863 }
1023 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
864 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
1024 865 <use xlink:href="#' . esc_attr( $icon ) . '" />
1025 866 </svg>';
1026 867 }
1027 868
1028 869 if ( $echo ) {
1029 - echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
870 + echo $icon; // WPCS: XSS ok.
1030 871 } else {
1031 872 return $icon;
1032 873 }
1033 874 }
@@ -1032,88 +873,14 @@
1032 873 }
1033 874 }
1034 875
1035 876 /**
1036 - * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
1037 - *
1038 - * @since 5.0.13
1039 - *
1040 - * @param string $icon
1041 - * @return string
1042 - */
1043 - public static function kses_icon( $icon ) {
1044 - add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
1045 - add_filter( 'safecss_filter_attr_allow_css', 'FrmAppHelper::allow_style', 10, 2 );
1046 - add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_icon_tags' );
1047 - $icon = self::kses( $icon, 'all' );
1048 - remove_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
1049 - remove_filter( 'safecss_filter_attr_allow_css', 'FrmAppHelper::allow_style' );
1050 - remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_icon_tags' );
1051 - return $icon;
1052 - }
1053 -
1054 - /**
1055 - * @since 5.0.13.1
1056 - *
1057 - * @param array $allowed_html
1058 - * @return array
1059 - */
1060 - public static function add_allowed_icon_tags( $allowed_html ) {
1061 - $allowed_html['svg']['data-open'] = true;
1062 - $allowed_html['svg']['title'] = true;
1063 - return $allowed_html;
1064 - }
1065 -
1066 - /**
1067 - * @since 5.0.13
1068 - *
1069 - * @param array $allowed_attr
1070 - * @return array
1071 - */
1072 - public static function allow_vars_in_styles( $allowed_attr ) {
1073 - $allowed_attr[] = '--primary-700';
1074 - return $allowed_attr;
1075 - }
1076 -
1077 - /**
1078 - * @since 5.0.13
1079 - *
1080 - * @param bool $allow_css
1081 - * @param string $css_string
1082 - */
1083 - public static function allow_style( $allow_css, $css_string ) {
1084 - if ( ! $allow_css && 0 === strpos( $css_string, '--primary-700:' ) ) {
1085 - $split = explode( ':', $css_string, 2 );
1086 - $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1087 - }
1088 - return $allow_css;
1089 - }
1090 -
1091 - /**
1092 - * @since 5.0.13
1093 - *
1094 - * @param string $value
1095 - * @return bool
1096 - */
1097 - private static function is_a_valid_color( $value ) {
1098 - $match = 0;
1099 - if ( 0 === strpos( $value, 'rgba(' ) ) {
1100 - $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1101 - } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1102 - $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1103 - } elseif ( 0 === strpos( $value, '#' ) ) {
1104 - $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1105 - }
1106 - return (bool) $match;
1107 - }
1108 -
1109 - /**
1110 877 * Include svg images.
1111 878 *
1112 879 * @since 4.0.02
1113 880 */
1114 881 public static function include_svg() {
1115 - include_once self::plugin_path() . '/images/icons.svg';
882 + include_once( self::plugin_path() . '/images/icons.svg' );
1116 883 }
1117 884
1118 885 /**
1119 886 * Convert an associative array to HTML values.
@@ -1118,48 +885,19 @@
1118 885 /**
1119 886 * Convert an associative array to HTML values.
1120 887 *
1121 888 * @since 4.0.02
1122 - * @since 5.0.13 added $echo parameter.
1123 - *
1124 889 * @param array $atts
1125 - * @param bool $echo
1126 - * @return string|void
890 + * @return string
1127 891 */
1128 - public static function array_to_html_params( $atts, $echo = false ) {
1129 - $callback = function() use ( $atts ) {
1130 - if ( $atts ) {
1131 - foreach ( $atts as $key => $value ) {
1132 - echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1133 - }
892 + public static function array_to_html_params( $atts ) {
893 + $html = '';
894 + if ( ! empty( $atts ) ) {
895 + foreach ( $atts as $key => $value ) {
896 + $html .= ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1134 897 }
1135 - };
1136 - return self::clip( $callback, $echo );
1137 - }
1138 -
1139 - /**
1140 - * Call an echo function and either echo it or return the result as a string.
1141 - *
1142 - * @since 5.0.13
1143 - *
1144 - * @param Closure $echo_function
1145 - * @param bool $echo
1146 - * @return string|void
1147 - */
1148 - public static function clip( $echo_function, $echo = false ) {
1149 - if ( ! $echo ) {
1150 - ob_start();
1151 898 }
1152 -
1153 - if ( is_callable( $echo_function ) ) {
1154 - $echo_function();
1155 - }
1156 -
1157 - if ( ! $echo ) {
1158 - $return = ob_get_contents();
1159 - ob_end_clean();
1160 - return $return;
1161 - }
899 + return $html;
1162 900 }
1163 901
1164 902 /**
1165 903 * @since 3.0
@@ -1176,94 +914,31 @@
1176 914 include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1177 915 }
1178 916
1179 917 /**
1180 - * @since 6.0
1181 - *
1182 - * @param string $type
1183 - * @return void
1184 - */
1185 - public static function import_link( $type = 'secondary' ) {
1186 - ?>
1187 - <a href="<?php echo esc_url( admin_url( 'admin.php?page=formidable-import' ) ); ?>" class="button frm-button-<?php echo esc_attr( $type ); ?> frm_animate_bg">
1188 - <?php esc_html_e( 'Import', 'formidable' ); ?>
1189 - </a>
1190 - <?php
1191 - }
1192 -
1193 - /**
1194 - * Print applicable admin banner.
1195 - *
1196 - * @since 5.4.2
1197 - *
1198 - * @param bool $should_show_lite_upgrade
1199 - * @return void
1200 - */
1201 - public static function print_admin_banner( $should_show_lite_upgrade ) {
1202 - if ( ! current_user_can( 'administrator' ) ) {
1203 - FrmInbox::maybe_show_banner();
1204 - return;
1205 - }
1206 -
1207 - if ( self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1208 - // Print license warning or inbox banner and exit if either prints.
1209 - // And exit before printing the upgrade bar if it shouldn't be shown.
1210 - return;
1211 - }
1212 - ?>
1213 - <div class="frm-upgrade-bar">
1214 - <span>You're using Formidable Forms Lite. To unlock more features consider</span>
1215 - <a href="<?php echo esc_url( self::admin_upgrade_link( 'top-bar' ) ); ?>" target="_blank" rel="noopener">upgrading to Pro</a>.
1216 - </div>
1217 - <?php
1218 - }
1219 -
1220 - /**
1221 - * @since 5.4.2
1222 - *
1223 - * @return bool True if a banner is available and shown.
1224 - */
1225 - private static function maybe_show_license_warning() {
1226 - return is_callable( 'FrmProAddonsController::admin_banner' ) && FrmProAddonsController::admin_banner();
1227 - }
1228 -
1229 - /**
1230 - * Render a button for a new item (Form, Application, etc).
1231 - *
1232 918 * @since 3.0
1233 - * @param array $atts {
1234 - * @type array $link_hook Custom link hook, calls do_action and exits early.
1235 - * @type string $new_link Href value, default #.
1236 - * @type string $class Custom class names, space separated.
1237 - * @type string $button_text Button text. Default "Add New".
1238 - * }
1239 - * @return void
919 + * @param array $atts
1240 920 */
1241 921 public static function add_new_item_link( $atts ) {
1242 - if ( isset( $atts['link_hook'] ) ) {
922 + if ( ! empty( $atts['new_link'] ) ) {
923 + ?>
924 + <a href="<?php echo esc_url( $atts['new_link'] ); ?>" class="button button-primary frm-button-primary frm-with-plus">
925 + <?php self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' ); ?>
926 + <?php esc_html_e( 'Add New', 'formidable' ); ?>
927 + </a>
928 + <?php
929 + } elseif ( ! empty( $atts['trigger_new_form_modal'] ) ) {
930 + ?>
931 + <a href="#" class="button button-primary frm-button-primary frm-with-plus frm-trigger-new-form-modal">
932 + <?php
933 + self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' );
934 + esc_html_e( 'Add New', 'formidable' );
935 + ?>
936 + </a>
937 + <?php
938 + } elseif ( isset( $atts['link_hook'] ) ) {
1243 939 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1244 - return;
1245 940 }
1246 -
1247 - if ( empty( $atts['new_link'] ) && empty( $atts['trigger_new_form_modal'] ) && empty( $atts['class'] ) ) {
1248 - // Do not render a button if none of these attributes are set.
1249 - return;
1250 - }
1251 -
1252 - $href = ! empty( $atts['new_link'] ) ? esc_url( $atts['new_link'] ) : '#';
1253 - $class = 'button button-primary frm-button-primary';
1254 -
1255 - if ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1256 - $class .= ' frm-trigger-new-form-modal';
1257 - }
1258 -
1259 - if ( ! empty( $atts['class'] ) ) {
1260 - $class .= ' ' . $atts['class'];
1261 - }
1262 -
1263 - $button_text = ! empty( $atts['button_text'] ) ? $atts['button_text'] : __( 'Add New', 'formidable' );
1264 -
1265 - require self::plugin_path() . '/classes/views/shared/add-button.php';
1266 941 }
1267 942
1268 943 /**
1269 944 * @since 3.06
@@ -1321,14 +996,11 @@
1321 996 }
1322 997 }
1323 998
1324 999 /**
1325 - * Save all front-end js scripts into a single file.
1326 - * And save an additional single file of all front-end Stripe JS scripts.
1000 + * Save all front-end js scripts into a single file
1327 1001 *
1328 1002 * @since 3.0
1329 - *
1330 - * @return void
1331 1003 */
1332 1004 public static function save_combined_js() {
1333 1005 $file_atts = apply_filters(
1334 1006 'frm_js_location',
@@ -1339,36 +1011,13 @@
1339 1011 );
1340 1012 $new_file = new FrmCreateFile( $file_atts );
1341 1013
1342 1014 $files = array(
1015 + self::plugin_path() . '/js/jquery/jquery.placeholder.min.js',
1343 1016 self::plugin_path() . '/js/formidable.min.js',
1344 1017 );
1345 - /**
1346 - * @param array $files
1347 - */
1348 1018 $files = apply_filters( 'frm_combined_js_files', $files );
1349 1019 $new_file->combine_files( $files );
1350 -
1351 - // Create the minified Stripe Script.
1352 - $file_atts = apply_filters(
1353 - 'frm_stripe_js_location',
1354 - array(
1355 - 'file_name' => 'frmstrp.min.js',
1356 - 'new_file_path' => self::plugin_path() . '/js',
1357 - )
1358 - );
1359 - $new_file = new FrmCreateFile( $file_atts );
1360 - $files = array(
1361 - FrmStrpLiteAppHelper::plugin_path() . 'js/frmstrp.min.js',
1362 - );
1363 -
1364 - /**
1365 - * @since 6.5
1366 - *
1367 - * @param array $files
1368 - */
1369 - $files = apply_filters( 'frm_stripe_combined_js_files', $files );
1370 - $new_file->combine_files( $files );
1371 1020 }
1372 1021
1373 1022 /**
1374 1023 * Check a value from a shortcode to see if true or false.
@@ -1385,9 +1034,8 @@
1385 1034 }
1386 1035
1387 1036 /**
1388 1037 * Gets all post from a specific post type.
1389 - * This gets the entire WP_Post object so it can require a lot of memory. When only id and title are needed, consider using FrmAppHelper::get_post_ids_and_titles instead.
1390 1038 *
1391 1039 * @since 4.10.01 Add `$post_type` argument.
1392 1040 *
1393 1041 * @param string $post_type Post type to query. Default is `page`.
@@ -1405,30 +1053,8 @@
1405 1053 return get_posts( $query );
1406 1054 }
1407 1055
1408 1056 /**
1409 - * Gets post ids and titles for a specific post type.
1410 - *
1411 - * @since 5.0.09
1412 - *
1413 - * @param string $post_type Post type to query. Default is `page`.
1414 - * @return array
1415 - */
1416 - public static function get_post_ids_and_titles( $post_type = 'page' ) {
1417 - return FrmDb::get_results(
1418 - 'posts',
1419 - array(
1420 - 'post_type' => $post_type,
1421 - 'post_status' => array( 'publish', 'private' ),
1422 - ),
1423 - 'ID, post_title',
1424 - array(
1425 - 'order_by' => 'post_title ASC',
1426 - )
1427 - );
1428 - }
1429 -
1430 - /**
1431 1057 * Renders an autocomplete page selection or a regular dropdown depending on
1432 1058 * the total page count
1433 1059 *
1434 1060 * @since 4.03.06
@@ -1473,9 +1099,9 @@
1473 1099 */
1474 1100 public static function wp_pages_dropdown( $args = array(), $page_id = '', $truncate = false ) {
1475 1101 self::prep_page_dropdown_params( $page_id, $truncate, $args );
1476 1102
1477 - $pages = self::get_post_ids_and_titles( $args['post_type'] );
1103 + $pages = self::get_pages( $args['post_type'] );
1478 1104 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1479 1105
1480 1106 ?>
1481 1107 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
@@ -1529,8 +1155,9 @@
1529 1155 public static function post_edit_link( $post_id ) {
1530 1156 $post = get_post( $post_id );
1531 1157 if ( $post ) {
1532 1158 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1159 + $post_url = self::maybe_full_screen_link( $post_url );
1533 1160
1534 1161 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
1535 1162 }
1536 1163
@@ -1540,64 +1167,25 @@
1540 1167 /**
1541 1168 * Hide the WordPress menus on some pages.
1542 1169 *
1543 1170 * @since 4.0
1544 - *
1545 - * @return bool
1546 1171 */
1547 1172 public static function is_full_screen() {
1548 - return self::is_form_builder_page() ||
1549 - self::is_style_editor_page() ||
1550 - self::is_full_screen_view_builder_page();
1551 - }
1173 + $full_builder = self::is_form_builder_page();
1174 + $styler = self::is_admin_page( 'formidable-styles' ) || self::is_admin_page( 'formidable-styles2' );
1175 + $full_entries = self::simple_get( 'frm-full', 'absint' );
1552 1176
1553 - /**
1554 - * Check if user is on the style editor or its alternative URL.
1555 - * The first URL is a submenu "Styles" in the Formidable menu /wp-admin/admin.php?page=formidable-styles.
1556 - * The alternative URL is linked as a submenu "Forms" item of the Appearance menu /wp-admin/themes.php?page=formidable-styles2.
1557 - *
1558 - * @since 5.5.3
1559 - * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
1560 - *
1561 - * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
1562 - * @return bool
1563 - */
1564 - public static function is_style_editor_page( $view = '' ) {
1565 - if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
1566 - return false;
1567 - }
1568 -
1569 - if ( ! in_array( $view, array( 'list', 'edit' ), true ) ) {
1570 - return true;
1571 - }
1572 -
1573 - $action = self::simple_get( 'frm_action' );
1574 - $is_edit_mode = 'edit' === $action || ( ! $action && ! self::simple_get( 'id' ) && ! self::simple_get( 'form' ) );
1575 -
1576 - if ( ! $is_edit_mode && class_exists( 'FrmProStylesController' ) && in_array( $action, array( 'new_style', 'duplicate' ), true ) ) {
1577 - $is_edit_mode = true;
1578 - }
1579 -
1580 - $checking_for_edit_mode = 'edit' === $view;
1581 -
1582 - return $is_edit_mode === $checking_for_edit_mode;
1177 + return $full_builder || $full_entries || $styler || self::is_view_builder_page();
1583 1178 }
1584 1179
1585 1180 /**
1586 - * @since 5.5.3
1587 - *
1588 - * @return bool
1589 - */
1590 - private static function is_full_screen_view_builder_page() {
1591 - return self::is_admin_page( 'formidable-views-editor' );
1592 - }
1593 -
1594 - /**
1595 1181 * @since 4.0
1596 - * @deprecated 5.5.3
1597 1182 */
1598 1183 public static function maybe_full_screen_link( $link ) {
1599 - _deprecated_function( __METHOD__, '5.5.3' );
1184 + $is_full = self::simple_get( 'frm-full', 'absint' );
1185 + if ( $is_full && ! empty( $link ) && $link !== '#' ) {
1186 + $link .= '&frm-full=1';
1187 + }
1600 1188 return $link;
1601 1189 }
1602 1190
1603 1191 /**
@@ -1657,10 +1245,19 @@
1657 1245 * @param string $type Supports `auto`, `pro`, or `pro_only`.
1658 1246 * @return array
1659 1247 */
1660 1248 public static function frm_capabilities( $type = 'auto' ) {
1661 - if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
1662 - return self::get_lite_capabilities();
1249 + $cap = array(
1250 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
1251 + 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
1252 + 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
1253 + 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
1254 + 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
1255 + 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
1256 + );
1257 +
1258 + if ( ! self::pro_is_installed() && 'pro' !== $type && 'pro_only' !== $type ) {
1259 + return $cap;
1663 1260 }
1664 1261
1665 1262 $pro_cap = array(
1666 1263 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
@@ -1667,41 +1264,17 @@
1667 1264 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
1668 1265 'frm_view_reports' => __( 'View Reports', 'formidable' ),
1669 1266 'frm_edit_displays' => __( 'Add/Edit Views', 'formidable' ),
1670 1267 );
1671 - /**
1672 - * @since 5.3.1
1673 - *
1674 - * @param array<string,string> $pro_cap
1675 - */
1676 - $pro_cap = apply_filters( 'frm_pro_capabilities', $pro_cap );
1677 1268
1678 1269 if ( 'pro_only' === $type ) {
1679 1270 return $pro_cap;
1680 1271 }
1681 1272
1682 - return self::get_lite_capabilities() + $pro_cap;
1273 + return $cap + $pro_cap;
1683 1274 }
1684 1275
1685 1276 /**
1686 - * Get the list of lite plugin capabilities.
1687 - *
1688 - * @since 5.3.1
1689 - *
1690 - * @return array<string,string>
1691 - */
1692 - private static function get_lite_capabilities() {
1693 - return array(
1694 - 'frm_view_forms' => __( 'View Forms', 'formidable' ),
1695 - 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
1696 - 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
1697 - 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
1698 - 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
1699 - 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
1700 - );
1701 - }
1702 -
1703 - /**
1704 1277 * Call the WordPress current_user_can but also validate empty strings as true for any logged in user
1705 1278 *
1706 1279 * @since 4.06.03
1707 1280 *
@@ -1901,9 +1474,9 @@
1901 1474 foreach ( $array as $key => $value ) {
1902 1475 if ( is_array( $value ) ) {
1903 1476 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
1904 1477 } else {
1905 - if ( $keys === 'keep' ) {
1478 + if ( $keys == 'keep' ) {
1906 1479 $return[ $key ] = $value;
1907 1480 } else {
1908 1481 $return[] = $value;
1909 1482 }
@@ -1946,8 +1519,19 @@
1946 1519 return $val;
1947 1520 }
1948 1521
1949 1522 /**
1523 + * @since 2.0
1524 + * @return string The base Google APIS url for the current version of jQuery UI
1525 + */
1526 + public static function jquery_ui_base_url() {
1527 + $url = 'http' . ( is_ssl() ? 's' : '' ) . '://ajax.googleapis.com/ajax/libs/jqueryui/' . self::script_version( 'jquery-ui-core', '1.11.4' );
1528 + $url = apply_filters( 'frm_jquery_ui_base_url', $url );
1529 +
1530 + return $url;
1531 + }
1532 +
1533 + /**
1950 1534 * @param string $handle
1951 1535 */
1952 1536 public static function script_version( $handle, $default = 0 ) {
1953 1537 global $wp_scripts;
@@ -1967,20 +1551,10 @@
1967 1551
1968 1552 return $ver;
1969 1553 }
1970 1554
1971 - /**
1972 - * @since 5.0.13 added $echo param.
1973 - *
1974 - * @param string $url
1975 - * @param bool $echo
1976 - * @return string|void
1977 - */
1978 - public static function js_redirect( $url, $echo = false ) {
1979 - $callback = function() use ( $url ) {
1980 - echo '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
1981 - };
1982 - return self::clip( $callback, $echo );
1555 + public static function js_redirect( $url ) {
1556 + return '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
1983 1557 }
1984 1558
1985 1559 public static function get_user_id_param( $user_id ) {
1986 1560 if ( ! $user_id || is_numeric( $user_id ) ) {
@@ -1987,9 +1561,9 @@
1987 1561 return $user_id;
1988 1562 }
1989 1563
1990 1564 $user_id = sanitize_text_field( $user_id );
1991 - if ( $user_id === 'current' ) {
1565 + if ( $user_id == 'current' ) {
1992 1566 $user_id = get_current_user_id();
1993 1567 } else {
1994 1568 if ( is_email( $user_id ) ) {
1995 1569 $user = get_user_by( 'email', $user_id );
@@ -2039,38 +1613,21 @@
2039 1613 }
2040 1614
2041 1615 $key = self::prevent_numeric_and_reserved_keys( $key );
2042 1616
2043 - $similar_keys = FrmDb::get_col(
1617 + $key_check = FrmDb::get_var(
2044 1618 $table_name,
2045 1619 array(
2046 - $column . ' like%' => $key,
2047 - 'ID !' => $id,
1620 + $column => $key,
1621 + 'ID !' => $id,
2048 1622 ),
2049 1623 $column
2050 1624 );
2051 1625
2052 - // Create a unique field id if it has already been used.
2053 - if ( in_array( $key, $similar_keys, true ) ) {
1626 + if ( $key_check || is_numeric( $key_check ) ) {
2054 1627 $key = self::maybe_truncate_key_before_appending( $column, $key );
2055 -
2056 - /**
2057 - * Allow for a custom separator between the attempted key and the generated suffix.
2058 - *
2059 - * @since 5.2.03
2060 - *
2061 - * @param string $separator. Default empty.
2062 - * @param string $key the key without the added suffix.
2063 - */
2064 - $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
2065 -
2066 - $suffix = 2;
2067 - do {
2068 - $key_check = $key . $separator . $suffix;
2069 - ++$suffix;
2070 - } while ( in_array( $key_check, $similar_keys, true ) );
2071 -
2072 - $key = $key_check;
1628 + // Create a unique field id if it has already been used.
1629 + $key = $key . substr( md5( microtime() . rand() ), 0, 10 );
2073 1630 }
2074 1631
2075 1632 return $key;
2076 1633 }
@@ -2087,11 +1644,8 @@
2087 1644 if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2088 1645 $max_key_length_before_truncating = 60;
2089 1646 if ( strlen( $key ) > $max_key_length_before_truncating ) {
2090 1647 $key = substr( $key, 0, $max_key_length_before_truncating );
2091 - if ( is_numeric( $key ) ) {
2092 - $key .= 'a';
2093 - }
2094 1648 }
2095 1649 }
2096 1650 return $key;
2097 1651 }
@@ -2156,9 +1710,9 @@
2156 1710 return false;
2157 1711 }
2158 1712
2159 1713 if ( empty( $post_values ) ) {
2160 - $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
1714 + $post_values = wp_unslash( $_POST );
2161 1715 }
2162 1716
2163 1717 $values = array(
2164 1718 'id' => $record->id,
@@ -2176,11 +1730,11 @@
2176 1730 self::fill_form_opts( $record, $table, $post_values, $values );
2177 1731
2178 1732 self::prepare_field_arrays( $fields, $record, $values, array_merge( $args, compact( 'default', 'post_values' ) ) );
2179 1733
2180 - if ( $table === 'entries' ) {
1734 + if ( $table == 'entries' ) {
2181 1735 $values = FrmEntriesHelper::setup_edit_vars( $values, $record );
2182 - } elseif ( $table === 'forms' ) {
1736 + } elseif ( $table == 'forms' ) {
2183 1737 $values = FrmFormsHelper::setup_edit_vars( $values, $record, $post_values );
2184 1738 }
2185 1739
2186 1740 return $values;
@@ -2457,9 +2011,9 @@
2457 2011 *
2458 2012 * @return string $time_ago
2459 2013 */
2460 2014 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
2461 - if ( empty( $to ) && 0 !== $to ) {
2015 + if ( empty( $to ) ) {
2462 2016 $now = new DateTime();
2463 2017 } else {
2464 2018 $now = new DateTime( '@' . $to );
2465 2019 }
@@ -2710,9 +2264,8 @@
2710 2264 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
2711 2265 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
2712 2266 /* translators: %1$s: Form name, %2$s: Date */
2713 2267 'email_subject' => esc_attr( sprintf( __( 'If you leave the subject blank, the default will be used: %1$s Form submitted on %2$s', 'formidable' ), $form_name, self::site_name() ) ),
2714 - 'new_tab' => __( 'This option will open the link in a new browser tab. Please note that some popup blockers may prevent this from happening, in which case the link will be displayed.', 'formidable' ),
2715 2268 );
2716 2269
2717 2270 if ( ! isset( $tooltips[ $name ] ) ) {
2718 2271 return;
@@ -2739,12 +2292,8 @@
2739 2292 return;
2740 2293 }
2741 2294
2742 2295 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
2743 - if ( 'lite-reports' === $frm_action ) {
2744 - $frm_action = 'reports';
2745 - }
2746 -
2747 2296 if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
2748 2297 echo ' class="current_page"';
2749 2298 }
2750 2299 }
@@ -2801,15 +2350,12 @@
2801 2350 }
2802 2351 }
2803 2352
2804 2353 /**
2805 - * Check for either json or serialized data. This is temporary while transitioning
2354 + * Check for either json or serilized data. This is temporary while transitioning
2806 2355 * all data to json.
2807 2356 *
2808 2357 * @since 4.02.03
2809 - *
2810 - * @param array|string $value
2811 - * @return void
2812 2358 */
2813 2359 public static function unserialize_or_decode( &$value ) {
2814 2360 if ( is_array( $value ) ) {
2815 2361 return;
@@ -2815,9 +2361,9 @@
2815 2361 return;
2816 2362 }
2817 2363
2818 2364 if ( is_serialized( $value ) ) {
2819 - $value = self::maybe_unserialize_array( $value );
2365 + $value = maybe_unserialize( $value );
2820 2366 } else {
2821 2367 $value = self::maybe_json_decode( $value, false );
2822 2368 }
2823 2369 }
@@ -2822,44 +2368,13 @@
2822 2368 }
2823 2369 }
2824 2370
2825 2371 /**
2826 - * Safely unserialize an array if necessary.
2827 - * This function doesn't actually use unserialize. The string is parsed instead.
2828 - *
2829 - * @since 6.2
2830 - *
2831 - * @param mixed $value
2832 - * @return mixed
2833 - */
2834 - public static function maybe_unserialize_array( $value ) {
2835 - if ( ! is_string( $value ) ) {
2836 - return $value;
2837 - }
2838 -
2839 - // Since we only expect an array, skip anything that doesn't start with a:.
2840 - if ( ! is_serialized( $value ) || 'a:' !== substr( $value, 0, 2 ) ) {
2841 - return $value;
2842 - }
2843 -
2844 - $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
2845 - if ( is_array( $parsed ) ) {
2846 - $value = $parsed;
2847 - }
2848 -
2849 - return $value;
2850 - }
2851 -
2852 - /**
2853 2372 * Decode a JSON string.
2854 2373 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
2855 - *
2856 - * @param mixed $string
2857 - * @param bool $single_to_array
2858 - * @return mixed
2859 2374 */
2860 2375 public static function maybe_json_decode( $string, $single_to_array = true ) {
2861 - if ( is_array( $string ) || is_null( $string ) ) {
2376 + if ( is_array( $string ) ) {
2862 2377 return $string;
2863 2378 }
2864 2379
2865 2380 $new_string = json_decode( $string, true );
@@ -2877,36 +2392,8 @@
2877 2392 return $string;
2878 2393 }
2879 2394
2880 2395 /**
2881 - * @since 6.2.3
2882 - *
2883 - * @param string $value
2884 - * @return string
2885 - */
2886 - public static function maybe_utf8_encode( $value ) {
2887 - $from_format = 'ISO-8859-1';
2888 - $to_format = 'UTF-8';
2889 -
2890 - if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
2891 - if ( mb_check_encoding( $value, $from_format ) ) {
2892 - return mb_convert_encoding( $value, $to_format, $from_format );
2893 - }
2894 - return $value;
2895 - }
2896 -
2897 - if ( function_exists( 'iconv' ) ) {
2898 - $converted = iconv( $from_format, $to_format, $value );
2899 - // Value is false if $value is not ISO-8859-1.
2900 - if ( false !== $converted ) {
2901 - return $converted;
2902 - }
2903 - }
2904 -
2905 - return $value;
2906 - }
2907 -
2908 - /**
2909 2396 * Reformat the json serialized array in name => value array.
2910 2397 *
2911 2398 * @since 4.02.03
2912 2399 */
@@ -2972,17 +2459,14 @@
2972 2459 $version = self::plugin_version();
2973 2460 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
2974 2461
2975 2462 $global_strings = array(
2976 - 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
2977 - 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
2978 - 'url' => self::plugin_url(),
2979 - 'app_url' => 'https://formidableforms.com/',
2980 - 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
2981 - 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
2982 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
2983 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
2984 - 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
2463 + 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
2464 + 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
2465 + 'url' => self::plugin_url(),
2466 + 'app_url' => 'https://formidableforms.com/',
2467 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2468 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2985 2469 );
2986 2470 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
2987 2471
2988 2472 if ( $load ) {
@@ -3002,89 +2486,87 @@
3002 2486 */
3003 2487 public static function localize_script( $location ) {
3004 2488 global $wp_scripts;
3005 2489
2490 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2491 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2492 +
3006 2493 $script_strings = array(
3007 - 'ajax_url' => esc_url_raw( self::get_ajax_url() ),
3008 - 'images_url' => self::plugin_url() . '/images',
3009 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
3010 - 'remove' => __( 'Remove', 'formidable' ),
3011 - 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
3012 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
3013 - 'id' => __( 'ID', 'formidable' ),
3014 - 'no_results' => __( 'No results match', 'formidable' ),
3015 - 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
3016 - 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
3017 - 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
3018 - 'focus_first_error' => self::should_focus_first_error(),
3019 - 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
2494 + 'ajax_url' => $ajax_url,
2495 + 'images_url' => self::plugin_url() . '/images',
2496 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2497 + 'remove' => __( 'Remove', 'formidable' ),
2498 + 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
2499 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2500 + 'id' => __( 'ID', 'formidable' ),
2501 + 'no_results' => __( 'No results match', 'formidable' ),
2502 + 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
2503 + 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
2504 + 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
3020 2505 );
3021 2506
3022 2507 $data = $wp_scripts->get_data( 'formidable', 'data' );
3023 - if ( ! $data ) {
2508 + if ( empty( $data ) ) {
3024 2509 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3025 2510 }
3026 2511
3027 - if ( $location === 'admin' ) {
2512 + if ( $location == 'admin' ) {
3028 2513 $frm_settings = self::get_settings();
3029 2514 $admin_script_strings = array(
3030 - 'desc' => __( '(Click to add description)', 'formidable' ),
3031 - 'blank' => __( '(Blank)', 'formidable' ),
3032 - 'no_label' => __( '(no label)', 'formidable' ),
3033 - 'ok' => __( 'OK', 'formidable' ),
3034 - 'cancel' => __( 'Cancel', 'formidable' ),
3035 - 'default_label' => __( 'Default', 'formidable' ),
3036 - 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
3037 - 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
3038 - 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3039 - 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3040 - 'confirm' => __( 'Are you sure?', 'formidable' ),
3041 - 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3042 - 'conf_delete_sec' => __( 'All fields inside this Section will be deleted along with their data. Are you sure you want to delete this group of fields?', 'formidable' ),
3043 - 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3044 - 'default_unique' => $frm_settings->unique_msg,
3045 - 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3046 - 'enter_email' => __( 'Enter Email', 'formidable' ),
3047 - 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3048 - 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3049 - 'new_option' => __( 'New Option', 'formidable' ),
3050 - 'css_invalid_size' => __( 'In certain browsers (e.g. Firefox) text will not display correctly if the field height is too small relative to the field padding and text size. Please increase your field height or decrease your field padding.', 'formidable' ),
3051 - 'enter_password' => __( 'Enter Password', 'formidable' ),
3052 - 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3053 - 'import_complete' => __( 'Import Complete', 'formidable' ),
3054 - 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
3055 - 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
3056 - 'private_label' => __( 'Private', 'formidable' ),
3057 - 'jquery_ui_url' => '',
3058 - 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
3059 - 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
3060 - 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
3061 - 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
3062 - 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
3063 - 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
3064 - 'unsafe_params' => FrmFormsHelper::reserved_words(),
2515 + 'desc' => __( '(Click to add description)', 'formidable' ),
2516 + 'blank' => __( '(Blank)', 'formidable' ),
2517 + 'no_label' => __( '(no label)', 'formidable' ),
2518 + 'saving' => esc_attr( __( 'Saving', 'formidable' ) ),
2519 + 'saved' => esc_attr( __( 'Saved', 'formidable' ) ),
2520 + 'ok' => __( 'OK', 'formidable' ),
2521 + 'cancel' => __( 'Cancel', 'formidable' ),
2522 + 'default_label' => __( 'Default', 'formidable' ),
2523 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
2524 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
2525 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
2526 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
2527 + 'caution' => __( 'Heads up', 'formidable' ),
2528 + 'confirm' => __( 'Are you sure?', 'formidable' ),
2529 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
2530 + 'conf_delete_sec' => __( 'All fields inside this Section will be deleted along with their data. Are you sure you want to delete this group of fields?', 'formidable' ),
2531 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
2532 + 'default_unique' => $frm_settings->unique_msg,
2533 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
2534 + 'enter_email' => __( 'Enter Email', 'formidable' ),
2535 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
2536 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
2537 + 'new_option' => __( 'New Option', 'formidable' ),
2538 + 'css_invalid_size' => __( 'In certain browsers (e.g. Firefox) text will not display correctly if the field height is too small relative to the field padding and text size. Please increase your field height or decrease your field padding.', 'formidable' ),
2539 + 'enter_password' => __( 'Enter Password', 'formidable' ),
2540 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
2541 + 'import_complete' => __( 'Import Complete', 'formidable' ),
2542 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
2543 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
2544 + 'private_label' => __( 'Private', 'formidable' ),
2545 + 'jquery_ui_url' => self::jquery_ui_base_url(),
2546 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
2547 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
2548 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
2549 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
2550 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
2551 + 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
2552 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3065 2553 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3066 - 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
2554 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3067 2555 /* Translators: %s is the name of a parameter that is a reserved word. More than one word could be listed here, though that would not be common. */
3068 - 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
3069 - 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3070 - 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3071 - 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3072 - 'install' => __( 'Install', 'formidable' ),
3073 - 'active' => __( 'Active', 'formidable' ),
3074 - 'select_a_field' => __( 'Select a Field', 'formidable' ),
3075 - 'no_items_found' => __( 'No items found.', 'formidable' ),
3076 - 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3077 - 'saving' => '', // Deprecated in 6.0.
3078 - 'saved' => '', // Deprecated in 6.0.
2556 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
2557 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
2558 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
2559 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
2560 + 'install' => __( 'Install', 'formidable' ),
2561 + 'active' => __( 'Active', 'formidable' ),
2562 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
2563 + 'no_items_found' => __( 'No items found.', 'formidable' ),
3079 2564 );
3080 - /**
3081 - * @param array $admin_script_strings
3082 - */
3083 2565 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3084 2566
3085 2567 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3086 - if ( ! $data ) {
2568 + if ( empty( $data ) ) {
3087 2569 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3088 2570 }
3089 2571 }
3090 2572 }
@@ -3089,46 +2571,8 @@
3089 2571 }
3090 2572 }
3091 2573
3092 2574 /**
3093 - * @since 6.5
3094 - *
3095 - * @return string
3096 - */
3097 - public static function get_ajax_url() {
3098 - $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
3099 -
3100 - /**
3101 - * @since 2.0.13
3102 - *
3103 - * @param string $ajax_url
3104 - */
3105 - return apply_filters( 'frm_ajax_url', $ajax_url );
3106 - }
3107 -
3108 - /**
3109 - * Returns whether or not the first errored input should be auto-focused (default true).
3110 - *
3111 - * @since 5.2.05
3112 - *
3113 - * @return bool
3114 - */
3115 - private static function should_focus_first_error() {
3116 - return (bool) apply_filters( 'frm_focus_first_error', true );
3117 - }
3118 -
3119 - /**
3120 - * Returns whether or not field errors should include role="alert" (default true).
3121 - *
3122 - * @since 5.2.05
3123 - *
3124 - * @return bool
3125 - */
3126 - public static function should_include_alert_role_on_field_errors() {
3127 - return (bool) apply_filters( 'frm_include_alert_role_on_field_errors', true );
3128 - }
3129 -
3130 - /**
3131 2575 * Echo the message on the plugins listing page
3132 2576 *
3133 2577 * @since 1.07.10
3134 2578 *
@@ -3151,10 +2595,8 @@
3151 2595 /**
3152 2596 * If Pro is far outdated, show a message.
3153 2597 *
3154 2598 * @since 4.0.01
3155 - *
3156 - * @return void
3157 2599 */
3158 2600 public static function min_pro_version_notice( $min_version ) {
3159 2601 if ( ! self::is_formidable_admin() ) {
3160 2602 // Don't show admin-wide.
@@ -3170,9 +2612,9 @@
3170 2612
3171 2613 $pro_version = FrmProDb::$plug_version;
3172 2614 $expired = FrmAddonsController::is_license_expired();
3173 2615 ?>
3174 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2616 + <div class="error frm_previous_install">
3175 2617 <?php
3176 2618 esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
3177 2619 if ( empty( $expired ) ) {
3178 2620 echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
@@ -3211,9 +2653,9 @@
3211 2653 }
3212 2654
3213 2655 foreach ( $message as $m ) {
3214 2656 ?>
3215 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2657 + <div class="error frm_previous_install">
3216 2658 <?php echo esc_html( $m ); ?>
3217 2659 </div>
3218 2660 <?php
3219 2661 }
@@ -3218,25 +2660,17 @@
3218 2660 <?php
3219 2661 }
3220 2662 }
3221 2663
3222 - /**
3223 - * @param string $type
3224 - * @return array<string,string>
3225 - */
3226 2664 public static function locales( $type = 'date' ) {
3227 2665 $locales = array(
3228 2666 'en' => __( 'English', 'formidable' ),
3229 2667 'af' => __( 'Afrikaans', 'formidable' ),
3230 2668 'sq' => __( 'Albanian', 'formidable' ),
3231 - 'ar-DZ' => __( 'Algerian Arabic', 'formidable' ),
3232 - 'am' => __( 'Amharic', 'formidable' ),
3233 2669 'ar' => __( 'Arabic', 'formidable' ),
3234 2670 'hy' => __( 'Armenian', 'formidable' ),
3235 2671 'az' => __( 'Azerbaijani', 'formidable' ),
3236 2672 'eu' => __( 'Basque', 'formidable' ),
3237 - 'be' => __( 'Belarusian', 'formidable' ),
3238 - 'bn' => __( 'Bengali', 'formidable' ),
3239 2673 'bs' => __( 'Bosnian', 'formidable' ),
3240 2674 'bg' => __( 'Bulgarian', 'formidable' ),
3241 2675 'ca' => __( 'Catalan', 'formidable' ),
3242 2676 'zh-HK' => __( 'Chinese Hong Kong', 'formidable' ),
@@ -3255,15 +2689,12 @@
3255 2689 'fi' => __( 'Finnish', 'formidable' ),
3256 2690 'fr' => __( 'French', 'formidable' ),
3257 2691 'fr-CA' => __( 'French/Canadian', 'formidable' ),
3258 2692 'fr-CH' => __( 'French/Swiss', 'formidable' ),
3259 - 'gl' => __( 'Galician', 'formidable' ),
3260 - 'ka' => __( 'Georgian', 'formidable' ),
3261 2693 'de' => __( 'German', 'formidable' ),
3262 2694 'de-AT' => __( 'German/Austria', 'formidable' ),
3263 2695 'de-CH' => __( 'German/Switzerland', 'formidable' ),
3264 2696 'el' => __( 'Greek', 'formidable' ),
3265 - 'gu' => __( 'Gujarati', 'formidable' ),
3266 2697 'he' => __( 'Hebrew', 'formidable' ),
3267 2698 'iw' => __( 'Hebrew', 'formidable' ),
3268 2699 'hi' => __( 'Hindi', 'formidable' ),
3269 2700 'hu' => __( 'Hungarian', 'formidable' ),
@@ -3270,84 +2701,52 @@
3270 2701 'is' => __( 'Icelandic', 'formidable' ),
3271 2702 'id' => __( 'Indonesian', 'formidable' ),
3272 2703 'it' => __( 'Italian', 'formidable' ),
3273 2704 'ja' => __( 'Japanese', 'formidable' ),
3274 - 'kn' => __( 'Kannada', 'formidable' ),
3275 - 'kk' => __( 'Kazakh', 'formidable' ),
3276 - 'km' => __( 'Khmer', 'formidable' ),
3277 2705 'ko' => __( 'Korean', 'formidable' ),
3278 - 'ky' => __( 'Kyrgyz', 'formidable' ),
3279 - 'lo' => __( 'Laothian', 'formidable' ),
3280 2706 'lv' => __( 'Latvian', 'formidable' ),
3281 2707 'lt' => __( 'Lithuanian', 'formidable' ),
3282 - 'lb' => __( 'Luxembourgish', 'formidable' ),
3283 - 'mk' => __( 'Macedonian', 'formidable' ),
3284 - 'ml' => __( 'Malayalam', 'formidable' ),
3285 2708 'ms' => __( 'Malaysian', 'formidable' ),
3286 - 'mr' => __( 'Marathi', 'formidable' ),
3287 2709 'no' => __( 'Norwegian', 'formidable' ),
3288 - 'nb' => __( 'Norwegian Bokmål', 'formidable' ),
3289 - 'nn' => __( 'Norwegian Nynorsk', 'formidable' ),
3290 2710 'pl' => __( 'Polish', 'formidable' ),
3291 2711 'pt' => __( 'Portuguese', 'formidable' ),
3292 2712 'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
3293 2713 'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
3294 - 'rm' => __( 'Romansh', 'formidable' ),
3295 2714 'ro' => __( 'Romanian', 'formidable' ),
3296 2715 'ru' => __( 'Russian', 'formidable' ),
3297 2716 'sr' => __( 'Serbian', 'formidable' ),
3298 2717 'sr-SR' => __( 'Serbian', 'formidable' ),
3299 - 'si' => __( 'Sinhalese', 'formidable' ),
3300 2718 'sk' => __( 'Slovak', 'formidable' ),
3301 2719 'sl' => __( 'Slovenian', 'formidable' ),
3302 2720 'es' => __( 'Spanish', 'formidable' ),
3303 2721 'es-419' => __( 'Spanish/Latin America', 'formidable' ),
3304 - 'sw' => __( 'Swahili', 'formidable' ),
3305 2722 'sv' => __( 'Swedish', 'formidable' ),
3306 2723 'ta' => __( 'Tamil', 'formidable' ),
3307 - 'te' => __( 'Telugu', 'formidable' ),
3308 2724 'th' => __( 'Thai', 'formidable' ),
3309 - 'tj' => __( 'Tajiki', 'formidable' ),
3310 2725 'tr' => __( 'Turkish', 'formidable' ),
3311 2726 'uk' => __( 'Ukrainian', 'formidable' ),
3312 - 'ur' => __( 'Urdu', 'formidable' ),
3313 2727 'vi' => __( 'Vietnamese', 'formidable' ),
3314 - 'cy-GB' => __( 'Welsh', 'formidable' ),
3315 - 'zu' => __( 'Zulu', 'formidable' ),
3316 2728 );
3317 2729
3318 2730 if ( $type === 'captcha' ) {
3319 2731 // remove the languages unavailable for the captcha
3320 - $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
2732 + $unset = array( 'af', 'sq', 'hy', 'az', 'eu', 'bs', 'zh-HK', 'eo', 'et', 'fo', 'fr-CH', 'he', 'is', 'ms', 'sr-SR', 'ta' );
3321 2733 } else {
3322 2734 // remove the languages unavailable for the datepicker
3323 - $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'mr', 'lo', 'kn', 'si', 'gu', 'bn', 'zu', 'ur', 'te', 'sw', 'am' );
2735 + $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419' );
3324 2736 }
3325 2737
3326 2738 $locales = array_diff_key( $locales, array_flip( $unset ) );
2739 + $locales = apply_filters( 'frm_locales', $locales );
3327 2740
3328 - /**
3329 - * Filter available locale options.
3330 - *
3331 - * @since 5.4.5 Added $args parameter with type.
3332 - *
3333 - * @param array<string,string> $locales
3334 - * @param array $args {
3335 - * @type string $type
3336 - * }
3337 - */
3338 - $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3339 -
3340 2741 return $locales;
3341 2742 }
3342 2743
3343 2744 /**
3344 2745 * Output HTML containing reference text for accessibility
3345 - *
3346 - * @deprecated 5.1
3347 2746 */
3348 2747 public static function multiselect_accessibility() {
3349 - _deprecated_function( __METHOD__, '5.1' );
2748 + include_once self::plugin_path() . '/classes/views/frm-forms/multiselect-accessibility.php';
3350 2749 }
3351 2750
3352 2751 public static function get_menu_icon_class() {
3353 2752 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
@@ -3561,9 +2960,9 @@
3561 2960 *
3562 2961 * @return bool true if the current user is allowed to save unfiltered HTML.
3563 2962 */
3564 2963 public static function allow_unfiltered_html() {
3565 - if ( self::should_never_allow_unfiltered_html() ) {
2964 + if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) {
3566 2965 return false;
3567 2966 }
3568 2967 return current_user_can( 'unfiltered_html' );
3569 2968 }
@@ -3568,28 +2967,8 @@
3568 2967 return current_user_can( 'unfiltered_html' );
3569 2968 }
3570 2969
3571 2970 /**
3572 - * @since 5.0.13
3573 - *
3574 - * @return bool
3575 - */
3576 - public static function should_never_allow_unfiltered_html() {
3577 - if ( defined( 'DISALLOW_UNFILTERED_HTML' ) && DISALLOW_UNFILTERED_HTML ) {
3578 - return true;
3579 - }
3580 -
3581 - /**
3582 - * Formidable will check DISALLOW_UNFILTERED_HTML to determine if some form HTML should be filtered or not.
3583 - * In many cases, scripts are added intentionally to forms and will not be stripped if DISALLOW_UNFILTERED_HTML is not set.
3584 - * It is also possible to filter Formidable without defining DISALLOW_UNFILTERED_HTML, with add_filter( 'frm_disallow_unfiltered_html', '__return_true' );
3585 - *
3586 - * @since 5.0.13
3587 - */
3588 - return apply_filters( 'frm_disallow_unfiltered_html', false );
3589 - }
3590 -
3591 - /**
3592 2971 * @since 5.0.07
3593 2972 *
3594 2973 * @param array $values
3595 2974 * @param array $keys
@@ -3611,379 +2990,230 @@
3611 2990 return $values;
3612 2991 }
3613 2992
3614 2993 /**
3615 - * Some back end fields allow privleged users to add scripts.
3616 - * A site that uses the DISALLOW_UNFILTERED_HTML always remove scripts on echo.
3617 - *
3618 - * @since 5.0.13
3619 - *
3620 - * @param string $value
3621 - * @param array|string $allowed 'all' for everything included as defaults
3622 - * @return string
2994 + * @since 4.07
2995 + * @deprecated 4.09.01
3623 2996 */
3624 - public static function maybe_kses( $value, $allowed = 'all' ) {
3625 - if ( self::should_never_allow_unfiltered_html() ) {
3626 - $value = self::kses( $value, $allowed );
2997 + public static function renewal_message() {
2998 + if ( is_callable( 'FrmProAddonsController::renewal_message' ) ) {
2999 + FrmProAddonsController::renewal_message();
3000 + return;
3627 3001 }
3628 - return $value;
3002 +
3003 + if ( ! FrmAddonsController::is_license_expired() ) {
3004 + return;
3005 + }
3006 +
3007 + ?>
3008 + <div class="frm_error_style" style="text-align:left">
3009 + <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
3010 + &nbsp;
3011 + <?php esc_html_e( 'Your account has expired', 'formidable' ); ?>
3012 + <div style="float:right">
3013 + <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-expired', 'account/downloads/' ) ); ?>">
3014 + <?php esc_html_e( 'Renew Now', 'formidable' ); ?>
3015 + </a>
3016 + </div>
3017 + </div>
3018 + <?php
3629 3019 }
3630 3020
3631 3021 /**
3632 - * @since 5.0.16
3633 - *
3634 - * @return bool
3022 + * @since 4.08
3023 + * @deprecated 4.09.01
3635 3024 */
3636 - public static function show_landing_pages() {
3637 - return self::show_new_feature( 'landing' );
3025 + public static function expiring_message() {
3026 + _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3027 + if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3028 + FrmProAddonsController::expiring_message();
3029 + }
3638 3030 }
3639 3031
3640 3032 /**
3641 - * @since 5.0.16
3033 + * Use the WP 4.7 wp_doing_ajax function
3642 3034 *
3643 - * @return array
3035 + * @since 2.05.07
3036 + * @deprecated 4.04.04
3644 3037 */
3645 - public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
3646 - $params = array(
3647 - 'medium' => $medium,
3648 - 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
3649 - 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
3650 - 'screenshot' => 'landing.png',
3651 - );
3652 - return self::get_upgrade_data_params( 'landing', $params );
3038 + public static function wp_doing_ajax() {
3039 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3040 + return wp_doing_ajax();
3653 3041 }
3654 3042
3655 3043 /**
3656 - * @since 5.0.17
3657 - *
3658 - * @param string $plugin
3659 - * @return string|false
3044 + * @deprecated 4.0
3660 3045 */
3661 - private static function get_plan_required( $plugin ) {
3662 - $link = FrmAddonsController::install_link( $plugin );
3663 - return FrmFormsHelper::get_plan_required( $link );
3046 + public static function insert_opt_html( $args ) {
3047 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3048 + FrmFormsHelper::insert_opt_html( $args );
3664 3049 }
3665 3050
3666 3051 /**
3667 - * @since 5.0.17
3052 + * Used to filter shortcode in text widgets
3668 3053 *
3669 - * @param string
3670 - * @return bool
3054 + * @deprecated 2.5.4
3055 + * @codeCoverageIgnore
3671 3056 */
3672 - public static function show_new_feature( $feature ) {
3673 - $link = FrmAddonsController::install_link( $feature );
3674 - return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
3057 + public static function widget_text_filter_callback( $matches ) {
3058 + return FrmDeprecated::widget_text_filter_callback( $matches );
3675 3059 }
3676 3060
3677 3061 /**
3678 - * @since 5.0.17
3679 - *
3680 - * @param string $plugin
3681 - * @param array $params
3682 - * @return array
3062 + * @deprecated 3.01
3063 + * @codeCoverageIgnore
3683 3064 */
3684 - public static function get_upgrade_data_params( $plugin, $params ) {
3685 - $link = FrmAddonsController::install_link( $plugin );
3686 - if ( ! $link ) {
3687 - return $params;
3688 - }
3689 -
3690 - if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
3691 - $params['oneclick'] = json_encode( $link );
3692 - unset( $params['message'] );
3693 - if ( ! isset( $params['medium'] ) ) {
3694 - $params['medium'] = $plugin;
3695 - }
3696 - } else {
3697 - $params['requires'] = FrmFormsHelper::get_plan_required( $link );
3698 - }
3699 -
3700 - return $params;
3065 + public static function sanitize_array( &$values ) {
3066 + FrmDeprecated::sanitize_array( $values );
3701 3067 }
3702 3068
3703 3069 /**
3704 - * Returns true if every character in text is a hexadecimal 'digit', that is a decimal digit or a character from [A-Fa-f], false otherwise.
3705 - * Not every server installs the ctype extension, so use a fallback if the function does not exist.
3070 + * @param array $settings
3071 + * @param string $group
3706 3072 *
3707 - * @since 5.0.17
3708 - *
3709 - * @param string $text
3710 - * @return bool
3073 + * @since 2.0.6
3074 + * @deprecated 2.05.06
3075 + * @codeCoverageIgnore
3711 3076 */
3712 - public static function ctype_xdigit( $text ) {
3713 - if ( function_exists( 'ctype_xdigit' ) ) {
3714 - return ctype_xdigit( $text );
3715 - }
3716 - return is_string( $text ) && '' !== $text && ! preg_match( '/[^A-Fa-f0-9]/', $text );
3077 + public static function save_settings( $settings, $group ) {
3078 + return FrmDeprecated::save_settings( $settings, $group );
3717 3079 }
3718 3080
3719 3081 /**
3720 - * Set the current screen to avoid undefined notices.
3721 - *
3722 - * @since 5.2.01
3082 + * @since 2.0.4
3083 + * @deprecated 2.05.06
3084 + * @codeCoverageIgnore
3723 3085 */
3724 - public static function set_current_screen_and_hook_suffix() {
3725 - global $hook_suffix;
3726 - if ( is_null( $hook_suffix ) ) {
3727 - // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
3728 - $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
3729 - }
3730 - set_current_screen();
3086 + public static function save_json_post( $settings ) {
3087 + return FrmDeprecated::save_json_post( $settings );
3731 3088 }
3732 3089
3733 3090 /**
3734 - * Shows pill text.
3091 + * @since 2.0
3092 + * @deprecated 2.05.06
3093 + * @codeCoverageIgnore
3735 3094 *
3736 - * @since 5.2.02
3095 + * @param string $cache_key The unique name for this cache
3096 + * @param string $group The name of the cache group
3097 + * @param string $query If blank, don't run a db call
3098 + * @param string $type The wpdb function to use with this query
3737 3099 *
3738 - * @param string $text Text in the pill. Default is NEW.
3100 + * @return mixed $results The cache or query results
3739 3101 */
3740 - public static function show_pill_text( $text = null ) {
3741 - if ( null === $text ) {
3742 - $text = __( 'NEW', 'formidable' );
3743 - }
3744 - echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
3102 + public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
3103 + return FrmDeprecated::check_cache( $cache_key, $group, $query, $type, $time );
3745 3104 }
3746 3105
3747 3106 /**
3748 - * Count the number of decimals digits.
3749 - *
3750 - * @since 5.2.07
3751 - *
3752 - * @param mixed $num Number.
3753 - * @return int|false Returns `false` if the passed parameter is not number.
3107 + * @deprecated 2.05.06
3108 + * @codeCoverageIgnore
3754 3109 */
3755 - public static function count_decimals( $num ) {
3756 - if ( ! is_numeric( $num ) ) {
3757 - return false;
3758 - }
3759 -
3760 - $num = (string) $num;
3761 - $parts = explode( '.', $num );
3762 - if ( 1 === count( $parts ) ) {
3763 - return 0;
3764 - }
3765 -
3766 - return strlen( $parts[ count( $parts ) - 1 ] );
3110 + public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
3111 + return FrmDeprecated::set_cache( $cache_key, $results, $group, $time );
3767 3112 }
3768 3113
3769 3114 /**
3770 - * Prevent a fatal error in PHP8 if gmt_offset happens to be set an empty string.
3771 - * This is a bug in WordPress. It isn't safe to call current_time( 'timestamp' ) without this with an empty string offset.
3772 - * In the future this might be safe to remove. Keep an eye on the current_time function in functions.php.
3773 - *
3774 - * @since 5.3.1
3775 - *
3776 - * @return void
3115 + * @deprecated 2.05.06
3116 + * @codeCoverageIgnore
3777 3117 */
3778 - public static function filter_gmt_offset() {
3779 - if ( self::$added_gmt_offset_filter ) {
3780 - // Avoid adding twice.
3781 - return;
3782 - }
3783 -
3784 - add_filter(
3785 - 'option_gmt_offset',
3786 - function( $offset ) {
3787 - if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
3788 - // Leave a valid value alone.
3789 - return $offset;
3790 - }
3791 -
3792 - return 0;
3793 - }
3794 - );
3795 - self::$added_gmt_offset_filter = true;
3118 + public static function add_key_to_group_cache( $key, $group ) {
3119 + FrmDeprecated::add_key_to_group_cache( $key, $group );
3796 3120 }
3797 3121
3798 3122 /**
3799 - * @since 5.3.1
3800 - *
3801 - * @return bool
3123 + * @deprecated 2.05.06
3124 + * @codeCoverageIgnore
3802 3125 */
3803 - public static function on_form_listing_page() {
3804 - if ( ! self::is_admin_page( 'formidable' ) ) {
3805 - return false;
3806 - }
3807 -
3808 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
3809 - return ! $action || in_array( $action, self::get_form_listing_page_actions(), true );
3126 + public static function get_group_cached_keys( $group ) {
3127 + return FrmDeprecated::get_group_cached_keys( $group );
3810 3128 }
3811 3129
3812 3130 /**
3813 - * Get all actions that also display the forms list.
3814 - *
3815 - * @since 5.3.1
3816 - *
3817 - * @return array<string>
3131 + * @since 2.0
3132 + * @deprecated 2.05.06
3133 + * @codeCoverageIgnore
3134 + * @return mixed The cached value or false
3818 3135 */
3819 - private static function get_form_listing_page_actions() {
3820 - return array( 'list', 'trash', 'untrash', 'destroy' );
3136 + public static function check_cache_and_transient( $cache_key ) {
3137 + return FrmDeprecated::check_cache( $cache_key );
3821 3138 }
3822 3139
3823 3140 /**
3824 - * Safely call get_plugins, importing the required files if they are not yet loaded.
3141 + * @since 2.0
3142 + * @deprecated 2.05.06
3143 + * @codeCoverageIgnore
3825 3144 *
3826 - * @since 5.5
3827 - *
3828 - * @return array
3145 + * @param string $cache_key
3829 3146 */
3830 - public static function get_plugins() {
3831 - if ( ! function_exists( 'get_plugins' ) ) {
3832 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
3833 - }
3834 - return get_plugins();
3147 + public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
3148 + FrmDeprecated::delete_cache_and_transient( $cache_key, $group );
3835 3149 }
3836 3150
3837 3151 /**
3838 - * Make sure that the file we're trying to load is in fact the expected file type, and that it's coming from our S3 bucket.
3839 - * This is to make sure that the URL can't be exploited for a SSRF attack.
3152 + * @since 2.0
3153 + * @deprecated 2.05.06
3154 + * @codeCoverageIgnore
3840 3155 *
3841 - * @since 5.5.5
3842 - *
3843 - * @param string $url
3844 - * @param string $expected_extension
3845 - * @return bool
3156 + * @param string $group The name of the cache group
3846 3157 */
3847 - public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
3848 - $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
3849 - if ( ! $file_is_in_expected_s3_bucket ) {
3850 - return false;
3851 - }
3852 -
3853 - $parsed = parse_url( $url );
3854 - if ( ! is_array( $parsed ) ) {
3855 - // URL is malformed.
3856 - return false;
3857 - }
3858 -
3859 - $path = $parsed['path'];
3860 - $ext = pathinfo( $path, PATHINFO_EXTENSION );
3861 - if ( $expected_extension !== $ext ) {
3862 - // The URL isn't to an XML file.
3863 - return false;
3864 - }
3865 -
3866 - return true;
3158 + public static function cache_delete_group( $group ) {
3159 + FrmDeprecated::cache_delete_group( $group );
3867 3160 }
3868 3161
3869 3162 /**
3870 - * @since 4.08
3871 - * @deprecated 4.09.01
3163 + * @since 1.07.10
3164 + * @deprecated 2.05.06
3165 + * @codeCoverageIgnore
3166 + *
3167 + * @param string $term The value to escape
3168 + *
3169 + * @return string The escaped value
3872 3170 */
3873 - public static function expiring_message() {
3874 - _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3875 - if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3876 - FrmProAddonsController::expiring_message();
3877 - }
3171 + public static function esc_like( $term ) {
3172 + return FrmDeprecated::esc_like( $term );
3878 3173 }
3879 3174
3880 3175 /**
3881 - * Use the WP 4.7 wp_doing_ajax function
3176 + * @param string $order_query
3882 3177 *
3883 - * @since 2.05.07
3884 - * @deprecated 4.04.04
3178 + * @deprecated 2.05.06
3179 + * @codeCoverageIgnore
3885 3180 */
3886 - public static function wp_doing_ajax() {
3887 - _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3888 - return wp_doing_ajax();
3181 + public static function esc_order( $order_query ) {
3182 + return FrmDeprecated::esc_order( $order_query );
3889 3183 }
3890 3184
3891 3185 /**
3892 - * @deprecated 4.0
3186 + * @deprecated 2.05.06
3187 + * @codeCoverageIgnore
3893 3188 */
3894 - public static function insert_opt_html( $args ) {
3895 - _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3896 - FrmFormsHelper::insert_opt_html( $args );
3189 + public static function esc_order_by( &$order_by ) {
3190 + FrmDeprecated::esc_order_by( $order_by );
3897 3191 }
3898 3192
3899 3193 /**
3900 - * @deprecated 3.01
3194 + * @param string $limit
3195 + *
3196 + * @deprecated 2.05.06
3901 3197 * @codeCoverageIgnore
3902 3198 */
3903 - public static function sanitize_array( &$values ) {
3904 - FrmDeprecated::sanitize_array( $values );
3199 + public static function esc_limit( $limit ) {
3200 + return FrmDeprecated::esc_limit( $limit );
3905 3201 }
3906 3202
3907 3203 /**
3908 3204 * @since 2.0
3909 - * @deprecated 5.0.13
3910 - *
3911 - * @return string The base Google APIS url for the current version of jQuery UI
3205 + * @deprecated 2.05.06
3206 + * @codeCoverageIgnore
3912 3207 */
3913 - public static function jquery_ui_base_url() {
3914 - _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3915 - return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
3208 + public static function prepare_array_values( $array, $type = '%s' ) {
3209 + return FrmDeprecated::prepare_array_values( $array, $type );
3916 3210 }
3917 3211
3918 3212 /**
3919 - * @since 4.07
3920 - * @deprecated 6.0
3213 + * @deprecated 2.05.06
3214 + * @codeCoverageIgnore
3921 3215 */
3922 - public static function renewal_message() {
3923 - _deprecated_function( __METHOD__, '6.0', 'FrmProAddonsController::renewal_message' );
3924 - }
3925 -
3926 - /**
3927 - * Display a dismissable warning message and save its dismissal state.
3928 - *
3929 - * @since 6.3
3930 - *
3931 - * @param string $message The warning message to display.
3932 - * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
3933 - * @return void
3934 - */
3935 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
3936 - if ( ! $message || ! $option ) {
3937 - return;
3938 - }
3939 -
3940 - $ajax_callback = function() use ( $option ) {
3941 - self::dismiss_warning_message( $option );
3942 - };
3943 -
3944 - // We're handling JS codes with `doJsonPost` and it adds 'frm_' to the beginning of the action.
3945 - // To prevent any issues, we add 'frm_' from the beginning of the action.
3946 - add_action( 'wp_ajax_frm_' . $option, $ajax_callback );
3947 -
3948 - add_filter(
3949 - 'frm_message_list',
3950 - function( $show_messages ) use ( $message, $option ) {
3951 - if ( get_option( $option, false ) ) {
3952 - return $show_messages;
3953 - }
3954 -
3955 - $dismiss_icon = self::icon_by_class(
3956 - 'frmfont frm_close_icon',
3957 - array(
3958 - 'aria-label' => _x( 'Dismiss', 'warning message: close icon label', 'formidable' ),
3959 - 'echo' => false,
3960 - )
3961 - );
3962 -
3963 - $show_messages[] = $message;
3964 - $show_messages[] = '<span class="frm-warning-dismiss frmsvg" data-action="' . esc_attr( $option ) . '">' . $dismiss_icon . '</span>';
3965 -
3966 - return $show_messages;
3967 - }
3968 - );
3969 - }
3970 -
3971 - /**
3972 - * Dismiss a warning message and update the dismissal state.
3973 - *
3974 - * @since 6.3
3975 - *
3976 - * @param string $option The unique identifier for the dismissal state of the message.
3977 - * @return void
3978 - */
3979 - public static function dismiss_warning_message( $option = '' ) {
3980 - self::permission_check( 'frm_change_settings' );
3981 - check_ajax_referer( 'frm_ajax', 'nonce' );
3982 -
3983 - if ( $option ) {
3984 - update_option( $option, true, 'no' );
3985 - }
3986 -
3987 - wp_send_json_success();
3216 + public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
3217 + return FrmDeprecated::prepend_and_or_where( $starts_with, $where );
3988 3218 }
3989 3219 }