PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.14.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.14.1
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 +349 -1048 6.27 → 6.14.1 View file →
@@ -3,19 +3,23 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmAppHelper {
7 -
8 7 /**
9 8 * Version of the database we are moving to.
10 9 *
11 10 * @var int
12 11 */
13 - public static $db_version = 104;
12 + public static $db_version = 101;
14 13
15 14 /**
16 - * Used by the API add-on.
15 + * Deprecated.
17 16 *
17 + * @var int
18 + */
19 + public static $pro_db_version = 37;
20 +
21 + /**
18 22 * @var float
19 23 */
20 24 public static $font_version = 7;
21 25
@@ -28,9 +32,9 @@
28 32 * @since 2.0
29 33 *
30 34 * @var string
31 35 */
32 - public static $plug_version = '6.27';
36 + public static $plug_version = '6.14.1';
33 37
34 38 /**
35 39 * @var bool
36 40 */
@@ -55,9 +59,9 @@
55 59 /**
56 60 * @return string
57 61 */
58 62 public static function plugin_path() {
59 - return dirname( __DIR__, 2 );
63 + return dirname( dirname( __DIR__ ) );
60 64 }
61 65
62 66 /**
63 67 * @return string
@@ -85,9 +89,8 @@
85 89 * Get the name of this site
86 90 * Used for [sitename] shortcode
87 91 *
88 92 * @since 2.0
89 - *
90 93 * @return string
91 94 */
92 95 public static function site_name() {
93 96 return get_option( 'blogname' );
@@ -94,15 +97,13 @@
94 97 }
95 98
96 99 /**
97 100 * @param string $url
98 - *
99 101 * @return string
100 102 */
101 103 public static function make_affiliate_url( $url ) {
102 104 $affiliate_id = self::get_affiliate();
103 -
104 - if ( $affiliate_id ) {
105 + if ( ! empty( $affiliate_id ) ) {
105 106 $url = str_replace( array( 'http://', 'https://' ), '', $url );
106 107 $url = 'http://www.shareasale.com/r.cfm?u=' . absint( $affiliate_id ) . '&b=841990&m=64739&afftrack=plugin&urllink=' . urlencode( $url );
107 108 }
108 109
@@ -117,166 +118,64 @@
117 118 }
118 119
119 120 /**
120 121 * @since 3.04.02
121 - *
122 - * @param array|string $args If a string is passed, it is used for the utm_campaign attribute.
122 + * @param array|string $args
123 123 * @param string $page
124 124 */
125 125 public static function admin_upgrade_link( $args, $page = '' ) {
126 - if ( $page ) {
126 + if ( empty( $page ) ) {
127 + $page = 'https://formidableforms.com/lite-upgrade/';
128 + } else {
127 129 $page = str_replace( 'https://formidableforms.com/', '', $page );
128 130 $page = 'https://formidableforms.com/' . $page;
131 + }
132 +
133 + $anchor = '';
134 + if ( is_array( $args ) ) {
135 + $medium = $args['medium'];
136 + if ( isset( $args['content'] ) ) {
137 + $content = $args['content'];
138 + }
139 + if ( isset( $args['anchor'] ) ) {
140 + $anchor = '#' . $args['anchor'];
141 + }
129 142 } else {
130 - $page = 'https://formidableforms.com/lite-upgrade/';
143 + $medium = $args;
131 144 }
132 145
133 - $args = is_array( $args ) ? self::adjust_legacy_utm_args( $args ) : array( 'campaign' => $args );
134 -
135 146 $query_args = array(
136 - 'utm_source' => 'plugin',
137 - 'utm_medium' => self::get_utm_medium(),
147 + 'utm_source' => 'WordPress',
148 + 'utm_medium' => $medium,
149 + 'utm_campaign' => 'liteplugin',
138 150 );
139 - $query_args = self::maybe_add_utm_license( $query_args );
140 151
141 - if ( isset( $args['campaign'] ) ) {
142 - $query_args['utm_campaign'] = $args['campaign'];
152 + if ( isset( $content ) ) {
153 + $query_args['utm_content'] = $content;
143 154 }
144 155
145 - if ( isset( $args['content'] ) ) {
146 - $query_args['utm_content'] = $args['content'];
147 - }
148 -
149 - if ( isset( $args['param'] ) ) {
156 + if ( is_array( $args ) && isset( $args['param'] ) ) {
150 157 $query_args['f'] = $args['param'];
151 158 }
152 159
153 - if ( ! empty( $args['plan'] ) ) {
160 + if ( is_array( $args ) && ! empty( $args['plan'] ) ) {
154 161 $query_args['plan'] = $args['plan'];
155 162 }
156 163
157 - $link = add_query_arg( $query_args, $page );
158 -
159 - if ( isset( $args['anchor'] ) ) {
160 - $link .= '#' . $args['anchor'];
161 - }
162 -
164 + $link = add_query_arg( $query_args, $page ) . $anchor;
163 165 return self::make_affiliate_url( $link );
164 166 }
165 167
166 168 /**
167 - * If medium is "pro", add an additional utm_license param with their active license type.
168 - *
169 - * @since 6.25.1
170 - *
171 - * @param array $query_args
172 - * @param string $link
173 - *
174 - * @return array
175 - */
176 - private static function maybe_add_utm_license( $query_args, $link = '' ) {
177 - $medium = $query_args['utm_medium'] ?? self::pull_medium_from_link( $link );
178 -
179 - if ( 'pro' === $medium && is_callable( 'FrmProAddonsController::get_readable_license_type' ) ) {
180 - $query_args['utm_license'] = strtolower( FrmProAddonsController::get_readable_license_type() );
181 - }
182 -
183 - return $query_args;
184 - }
185 -
186 - /**
187 - * @since 6.26
188 - *
189 - * @param string $link
190 - *
191 - * @return string
192 - */
193 - private static function pull_medium_from_link( $link ) {
194 - if ( ! $link ) {
195 - return '';
196 - }
197 -
198 - $parsed = parse_url( $link );
199 -
200 - if ( ! is_array( $parsed ) || ! isset( $parsed['query'] ) ) {
201 - return '';
202 - }
203 -
204 - $query_args = wp_parse_args( $parsed['query'] );
205 -
206 - return empty( $query_args['utm_medium'] ) ? '' : $query_args['utm_medium'];
207 - }
208 -
209 - /**
210 - * @since 6.25.1
211 - *
212 - * @return string
213 - */
214 - private static function get_utm_medium() {
215 - return self::pro_is_connected() ? 'pro' : 'lite';
216 - }
217 -
218 - /**
219 - * Change campaign from "liteplugin" to what we're currently using for medium.
220 - *
221 - * @since 6.25.1
222 - *
223 - * @param array $args
224 - *
225 - * @return array
226 - */
227 - private static function adjust_legacy_utm_args( $args ) {
228 - if ( isset( $args['medium'] ) ) {
229 - $args['campaign'] = $args['medium'];
230 - unset( $args['medium'] );
231 - }
232 -
233 - return $args;
234 - }
235 -
236 - /**
237 - * @since 6.21
238 - *
239 - * @param string $cta_link
240 - * @param array $utm
241 - */
242 - public static function maybe_add_missing_utm( $cta_link, $utm ) {
243 - $utm = self::adjust_legacy_utm_args( $utm );
244 - $query_args = array();
245 -
246 - if ( ! str_contains( $cta_link, 'utm_source' ) ) {
247 - $query_args['utm_source'] = 'plugin';
248 - }
249 -
250 - if ( ! str_contains( $cta_link, 'utm_medium' ) ) {
251 - $query_args['utm_medium'] = self::get_utm_medium();
252 - }
253 -
254 - if ( ! str_contains( $cta_link, 'utm_campaign' ) && isset( $utm['campaign'] ) ) {
255 - $query_args['utm_campaign'] = $utm['campaign'];
256 - }
257 -
258 - if ( ! str_contains( $cta_link, 'utm_content' ) && isset( $utm['content'] ) ) {
259 - $query_args['utm_content'] = $utm['content'];
260 - }
261 -
262 - $query_args = self::maybe_add_utm_license( $query_args, $cta_link );
263 -
264 - return $query_args ? add_query_arg( $query_args, $cta_link ) : $cta_link;
265 - }
266 -
267 - /**
268 169 * Get the Formidable settings
269 170 *
270 171 * @since 2.0
271 172 *
272 173 * @param array $args - May include the form id when values need translation.
273 - *
274 174 * @return FrmSettings $frm_settings
275 175 */
276 176 public static function get_settings( $args = array() ) {
277 177 global $frm_settings;
278 -
279 178 if ( empty( $frm_settings ) ) {
280 179 $frm_settings = new FrmSettings( $args );
281 180 } elseif ( isset( $args['current_form'] ) ) {
282 181 // If the global has already been set, allow strings to be filtered.
@@ -290,9 +189,10 @@
290 189 * @return string
291 190 */
292 191 public static function get_menu_name() {
293 192 $frm_settings = self::get_settings();
294 - return FrmAddonsController::is_license_expired() || ! self::pro_is_installed() ? 'Formidable' : $frm_settings->menu;
193 +
194 + return FrmAddonsController::is_license_expired() ? 'Formidable' : $frm_settings->menu;
295 195 }
296 196
297 197 /**
298 198 * Determine if the current branding is set to 'formidable'.
@@ -307,9 +207,9 @@
307 207 return true;
308 208 }
309 209
310 210 $menu_icon = self::get_menu_icon_class();
311 - return str_contains( $menu_icon, 'frm_logo_icon' );
211 + return strpos( $menu_icon, 'frm_logo_icon' ) !== false;
312 212 }
313 213
314 214 /**
315 215 * @since 3.05
@@ -314,9 +214,8 @@
314 214 /**
315 215 * @since 3.05
316 216 *
317 217 * @param array $atts
318 - *
319 218 * @return string
320 219 */
321 220 public static function svg_logo( $atts = array() ) {
322 221 $defaults = array(
@@ -326,14 +225,12 @@
326 225 'orange' => '#f05a24',
327 226 );
328 227 $atts = array_merge( $defaults, $atts );
329 228
330 - // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong
331 229 return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 599.68 601.37" width="' . esc_attr( $atts['width'] ) . '" height="' . esc_attr( $atts['height'] ) . '">
332 230 <path fill="' . esc_attr( $atts['orange'] ) . '" d="M289.6 384h140v76h-140z"/>
333 231 <path fill="' . esc_attr( $atts['fill'] ) . '" d="M400.2 147h-200c-17 0-30.6 12.2-30.6 29.3V218h260v-71zM397.9 264H169.6v196h75V340H398a32.2 32.2 0 0 0 30.1-21.4 24.3 24.3 0 0 0 1.7-8.7V264zM299.8 601.4A300.3 300.3 0 0 1 0 300.7a299.8 299.8 0 1 1 511.9 212.6 297.4 297.4 0 0 1-212 88zm0-563A262 262 0 0 0 38.3 300.7a261.6 261.6 0 1 0 446.5-185.5 259.5 259.5 0 0 0-185-76.8z"/>
334 232 </svg>';
335 - // phpcs:enable SlevomatCodingStandard.Files.LineLength.LineTooLong
336 233 }
337 234
338 235 /**
339 236 * @since 4.0
@@ -338,13 +235,12 @@
338 235 /**
339 236 * @since 4.0
340 237 *
341 238 * @param array $atts
342 - *
343 239 * @return void
344 240 */
345 241 public static function show_logo( $atts = array() ) {
346 - self::kses_echo( self::svg_logo( $atts ), 'all' );
242 + echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
347 243 }
348 244
349 245 /**
350 246 * @since 4.03.02
@@ -359,11 +255,10 @@
359 255 )
360 256 );
361 257
362 258 $new_icon = apply_filters( 'frm_icon', $icon, true );
363 -
364 259 if ( $new_icon !== $icon ) {
365 - if ( str_starts_with( $new_icon, '<svg' ) ) {
260 + if ( strpos( $new_icon, '<svg' ) === 0 ) {
366 261 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
367 262 } else {
368 263 // Show nothing if it isn't an SVG.
369 264 $icon = '<div style="height:39px"></div>';
@@ -368,9 +263,9 @@
368 263 // Show nothing if it isn't an SVG.
369 264 $icon = '<div style="height:39px"></div>';
370 265 }
371 266 }
372 - self::kses_echo( $icon, 'all' );
267 + echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
373 268 }
374 269
375 270 /**
376 271 * @since 2.02.04
@@ -411,23 +306,14 @@
411 306 }
412 307
413 308 /**
414 309 * @since 4.06
415 - * @since 6.16.2 Added $check_for_settings parameter
416 310 *
417 - * @param bool $check_for_settings
418 - *
419 311 * @return bool
420 312 */
421 - public static function is_form_builder_page( $check_for_settings = true ) {
422 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
423 - $check_actions = array( 'edit', 'duplicate' );
424 -
425 - if ( $check_for_settings ) {
426 - $check_actions[] = 'settings';
427 - }
428 -
429 - return self::is_admin_page( 'formidable' ) && in_array( $action, $check_actions, true );
313 + public static function is_form_builder_page() {
314 + $action = self::simple_get( 'frm_action', 'sanitize_title' );
315 + return self::is_admin_page( 'formidable' ) && ( $action === 'edit' || $action === 'settings' || $action === 'duplicate' );
430 316 }
431 317
432 318 /**
433 319 * @return bool
@@ -432,57 +318,18 @@
432 318 /**
433 319 * @return bool
434 320 */
435 321 public static function is_formidable_admin() {
436 - $page = self::simple_get( 'page', 'sanitize_title' );
437 -
438 - if ( ! $page ) {
439 - return self::is_view_builder_page();
322 + $page = self::simple_get( 'page', 'sanitize_title' );
323 + $is_formidable = strpos( $page, 'formidable' ) !== false;
324 + if ( empty( $page ) ) {
325 + $is_formidable = self::is_view_builder_page();
440 326 }
441 327
442 - return str_contains( $page, 'formidable' );
328 + return $is_formidable;
443 329 }
444 330
445 331 /**
446 - * Checks if is a list page.
447 - *
448 - * @since 6.19
449 - *
450 - * @param string $page The name of the page to check.
451 - *
452 - * @return bool
453 - */
454 - public static function is_admin_list_page( $page = 'formidable' ) {
455 - if ( 'formidable' === $page ) {
456 - return self::on_form_listing_page();
457 - }
458 -
459 - if ( ! self::is_admin_page( $page ) ) {
460 - return false;
461 - }
462 -
463 - if ( 'formidable-entries' === $page ) {
464 - $action = self::simple_get( 'frm_action' );
465 -
466 - if ( ! $action || in_array( $action, self::get_entries_listing_page_form_actions(), true ) ) {
467 - return true;
468 - }
469 - }
470 -
471 - // Check edit or settings page.
472 - return ! self::simple_get( 'frm_action' );
473 - }
474 -
475 - /**
476 - * @since 6.20
477 - *
478 - * @return array<string>
479 - */
480 - private static function get_entries_listing_page_form_actions() {
481 - return array( 'list', 'destroy' );
482 - }
483 -
484 - /**
485 332 * Check for certain page in Formidable settings
486 333 *
487 334 * @since 2.0
488 335 *
@@ -492,13 +339,11 @@
492 339 */
493 340 public static function is_admin_page( $page = 'formidable' ) {
494 341 global $pagenow;
495 342 $get_page = self::simple_get( 'page', 'sanitize_title' );
496 -
497 343 if ( $pagenow ) {
498 344 // allow this to be true during ajax load i.e. ajax form builder loading
499 345 $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
500 -
501 346 if ( $is_page ) {
502 347 return true;
503 348 }
504 349 }
@@ -516,15 +361,15 @@
516 361 */
517 362 public static function is_view_builder_page() {
518 363 global $pagenow;
519 364
520 - if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), true ) ) {
365 + if ( $pagenow !== 'post.php' && $pagenow !== 'post-new.php' && $pagenow !== 'edit.php' ) {
521 366 return false;
522 367 }
523 368
524 369 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
525 370
526 - if ( ! $post_type ) {
371 + if ( empty( $post_type ) ) {
527 372 $post_id = self::simple_get( 'post', 'absint' );
528 373 $post = get_post( $post_id );
529 374 $post_type = $post ? $post->post_type : '';
530 375 }
@@ -542,9 +387,9 @@
542 387 public static function is_preview_page() {
543 388 global $pagenow;
544 389 $action = self::simple_get( 'action', 'sanitize_title' );
545 390
546 - return $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
391 + return $pagenow && $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
547 392 }
548 393
549 394 /**
550 395 * Check for ajax except the form preview page
@@ -565,9 +410,8 @@
565 410 }
566 411
567 412 /**
568 413 * @since 2.0.8
569 - *
570 414 * @return bool
571 415 */
572 416 public static function prevent_caching() {
573 417 global $frm_vars;
@@ -585,9 +429,8 @@
585 429 $is_admin = is_admin() && ! wp_doing_ajax();
586 430
587 431 /**
588 432 * @since 6.0
589 - *
590 433 * @param bool $is_admin
591 434 */
592 435 return apply_filters( 'frm_is_admin', $is_admin );
593 436 }
@@ -602,15 +445,14 @@
602 445 *
603 446 * @return bool
604 447 */
605 448 public static function is_empty_value( $value, $empty = '' ) {
606 - return $value === array() || $value === $empty;
449 + return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
607 450 }
608 451
609 452 /**
610 453 * @param mixed $value
611 454 * @param string $empty
612 - *
613 455 * @return bool
614 456 */
615 457 public static function is_not_empty_value( $value, $empty = '' ) {
616 458 return ! self::is_empty_value( $value, $empty );
@@ -664,9 +506,8 @@
664 506 continue;
665 507 }
666 508
667 509 $key = self::get_server_value( $key );
668 -
669 510 foreach ( explode( ',', $key ) as $ip ) {
670 511 // Just to be safe.
671 512 $ip = trim( $ip );
672 513
@@ -722,26 +563,16 @@
722 563 */
723 564 return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
724 565 }
725 566
726 - /**
727 - * @param string $param
728 - * @param mixed $default
729 - * @param string $src
730 - * @param callable|string $sanitize
731 - *
732 - * @return mixed
733 - */
734 567 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
735 - if ( str_contains( $param, '[' ) ) {
568 + if ( strpos( $param, '[' ) ) {
736 569 $params = explode( '[', $param );
737 570 $param = $params[0];
738 571 }
739 572
740 573 if ( $src === 'get' ) {
741 - // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
742 - $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
743 -
574 + $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
744 575 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
745 576 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
746 577 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
747 578 }
@@ -756,9 +587,9 @@
756 587 )
757 588 );
758 589 }
759 590
760 - if ( isset( $params ) && is_array( $value ) && $value ) {
591 + if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
761 592 foreach ( $params as $k => $p ) {
762 593 if ( ! $k || ! is_array( $value ) ) {
763 594 continue;
764 595 }
@@ -763,9 +594,9 @@
763 594 continue;
764 595 }
765 596
766 597 $p = trim( $p, ']' );
767 - $value = $value[ $p ] ?? $default;
598 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
768 599 }
769 600 }
770 601
771 602 return $value;
@@ -777,9 +608,8 @@
777 608 * @param string $param The key we are trying to access data from in $_POST.
778 609 * @param mixed $default The default if nothing is being sent.
779 610 * @param callable|string $sanitize Make sure to pass a sanitize method here. This function will NOT sanitize by default.
780 611 * @param bool $serialized
781 - *
782 612 * @return mixed
783 613 */
784 614 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
785 615 return self::get_simple_request(
@@ -830,10 +660,10 @@
830 660 'sanitize' => 'sanitize_text_field',
831 661 'serialized' => false,
832 662 );
833 663 $args = wp_parse_args( $args, $defaults );
834 - $value = $args['default'];
835 664
665 + $value = $args['default'];
836 666 if ( $args['type'] === 'get' ) {
837 667 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
838 668 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
839 669 $value = wp_unslash( $_GET[ $args['param'] ] );
@@ -841,9 +671,8 @@
841 671 } elseif ( $args['type'] === 'post' ) {
842 672 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
843 673 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
844 674 $value = wp_unslash( $_POST[ $args['param'] ] );
845 -
846 675 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
847 676 self::unserialize_or_decode( $value );
848 677 }
849 678 }
@@ -868,9 +697,9 @@
868 697 * @return string $value
869 698 */
870 699 public static function preserve_backslashes( $value ) {
871 700 // If backslashes have already been added, don't add them again
872 - if ( ! str_contains( $value, '\\\\' ) ) {
701 + if ( strpos( $value, '\\\\' ) === false ) {
873 702 $value = addslashes( $value );
874 703 }
875 704
876 705 return $value;
@@ -881,9 +710,8 @@
881 710 * If $value is an array, the sanitize function will get called for each item.
882 711 *
883 712 * @param callable $sanitize
884 713 * @param mixed $value
885 - *
886 714 * @return void
887 715 */
888 716 public static function sanitize_value( $sanitize, &$value ) {
889 717 if ( ! $sanitize ) {
@@ -896,13 +724,11 @@
896 724 }
897 725
898 726 if ( is_array( $value ) ) {
899 727 $temp_values = $value;
900 -
901 728 foreach ( $temp_values as $k => $v ) {
902 729 self::sanitize_value( $sanitize, $value[ $k ] );
903 730 }
904 -
905 731 return;
906 732 }
907 733
908 734 $value = call_user_func( $sanitize, $value );
@@ -907,17 +733,10 @@
907 733
908 734 $value = call_user_func( $sanitize, $value );
909 735 }
910 736
911 - /**
912 - * @param array $sanitize_method
913 - * @param array $values
914 - *
915 - * @return void
916 - */
917 737 public static function sanitize_request( $sanitize_method, &$values ) {
918 738 $temp_values = $values;
919 -
920 739 foreach ( $temp_values as $k => $val ) {
921 740 if ( isset( $sanitize_method[ $k ] ) ) {
922 741 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
923 742 }
@@ -927,9 +746,8 @@
927 746 /**
928 747 * @since 4.0.04
929 748 *
930 749 * @param mixed $value
931 - *
932 750 * @return void
933 751 */
934 752 public static function sanitize_with_html( &$value ) {
935 753 if ( current_user_can( 'frm_edit_entries' ) || current_user_can( 'administrator' ) ) {
@@ -974,15 +792,12 @@
974 792 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
975 793 * this MUST be done, else we'll be back to the '& entity' problem.
976 794 *
977 795 * @since 4.0.04
978 - *
979 - * @param mixed $value Value to decode, passed by reference.
980 796 */
981 797 public static function decode_specialchars( &$value ) {
982 798 if ( is_array( $value ) ) {
983 799 $temp_values = $value;
984 -
985 800 foreach ( $temp_values as $k => $v ) {
986 801 self::decode_specialchars( $value[ $k ] );
987 802 }
988 803 } else {
@@ -996,13 +811,13 @@
996 811 * Adapted from wp_specialchars_decode().
997 812 *
998 813 * @since 4.03.01
999 814 *
1000 - * @param string $string The string to prep, passed by reference.
815 + * @param string $string The string to prep.
1001 816 */
1002 817 private static function decode_amp( &$string ) {
1003 818 // Don't bother if there are no entities - saves a lot of processing
1004 - if ( ! $string || ! str_contains( $string, '&' ) ) {
819 + if ( empty( $string ) || strpos( $string, '&' ) === false ) {
1005 820 return;
1006 821 }
1007 822
1008 823 $translation = array(
@@ -1040,53 +855,38 @@
1040 855 * Sanitize the value, and allow some HTML
1041 856 *
1042 857 * @since 2.0
1043 858 *
1044 - * @param string $value The value to sanitize.
1045 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
859 + * @param string $value
860 + * @param array|string $allowed 'all' for everything included as defaults.
1046 861 *
1047 862 * @return string
1048 863 */
1049 864 public static function kses( $value, $allowed = array() ) {
1050 865 $allowed_html = self::allowed_html( $allowed );
866 +
1051 867 return wp_kses( $value, $allowed_html );
1052 868 }
1053 869
1054 870 /**
1055 - * Sanitizes and echoes a given value.
1056 - *
1057 - * @since 6.18
1058 - *
1059 - * @param string $value The value to sanitize and output.
1060 - * @param array|string $allowed Allowed HTML tags and attributes.
1061 - *
1062 - * @return void
1063 - */
1064 - public static function kses_echo( $value, $allowed = array() ) {
1065 - echo self::kses( $value, $allowed ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1066 - }
1067 -
1068 - /**
1069 871 * The regular kses function strips [button_action] from submit button HTML.
1070 872 *
1071 873 * @since 5.0.13
1072 874 *
1073 875 * @param string $html
1074 - *
1075 876 * @return string
1076 877 */
1077 878 public static function kses_submit_button( $html ) {
1078 - $included_button_action = str_contains( $html, '[button_action]' );
1079 - $included_back_hook = str_contains( $html, '[back_hook]' );
1080 - $included_draft_hook = str_contains( $html, '[draft_hook]' );
879 + $included_button_action = false !== strpos( $html, '[button_action]' );
880 + $included_back_hook = false !== strpos( $html, '[back_hook]' );
881 + $included_draft_hook = false !== strpos( $html, '[draft_hook]' );
1081 882 add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1082 883 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1083 884 $html = self::kses( $html, 'all' );
1084 885 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1085 886 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1086 -
1087 887 if ( $included_button_action ) {
1088 - if ( str_contains( $html, '<input type="submit"' ) ) {
888 + if ( false !== strpos( $html, '<input type="submit"' ) ) {
1089 889 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1090 890 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
1091 891 } else {
1092 892 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
@@ -1092,17 +892,14 @@
1092 892 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1093 893 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1094 894 }
1095 895 }
1096 -
1097 896 if ( $included_back_hook ) {
1098 897 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1099 898 }
1100 -
1101 899 if ( $included_draft_hook ) {
1102 900 $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1103 901 }
1104 -
1105 902 return $html;
1106 903 }
1107 904
1108 905 /**
@@ -1108,9 +905,8 @@
1108 905 /**
1109 906 * @since 5.0.13
1110 907 *
1111 908 * @param array $allowed_attr
1112 - *
1113 909 * @return array
1114 910 */
1115 911 public static function allow_visibility_style( $allowed_attr ) {
1116 912 $allowed_attr[] = 'visibility';
@@ -1120,9 +916,8 @@
1120 916 /**
1121 917 * @since 5.0.13
1122 918 *
1123 919 * @param array $allowed_html
1124 - *
1125 920 * @return array
1126 921 */
1127 922 public static function add_allowed_submit_button_tags( $allowed_html ) {
1128 923 $allowed_html['input'] = array(
@@ -1139,22 +934,17 @@
1139 934 }
1140 935
1141 936 /**
1142 937 * @since 2.05.03
1143 - *
1144 - * @param array|string $allowed
1145 - *
1146 - * @return array
1147 938 */
1148 939 private static function allowed_html( $allowed ) {
1149 940 $html = self::safe_html();
1150 941 $allowed_html = array();
1151 -
1152 942 if ( $allowed === 'all' ) {
1153 943 $allowed_html = $html;
1154 - } elseif ( $allowed ) {
944 + } elseif ( ! empty( $allowed ) ) {
1155 945 foreach ( (array) $allowed as $a ) {
1156 - $allowed_html[ $a ] = $html[ $a ] ?? array();
946 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1157 947 }
1158 948 }
1159 949
1160 950 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1295,13 +1085,8 @@
1295 1085 ),
1296 1086 'legend' => array(
1297 1087 'class' => true,
1298 1088 ),
1299 - 'option' => array(
1300 - 'class' => true,
1301 - 'value' => true,
1302 - 'selected' => true,
1303 - ),
1304 1089 );
1305 1090 }
1306 1091
1307 1092 /**
@@ -1314,16 +1099,14 @@
1314 1099 return;
1315 1100 }
1316 1101
1317 1102 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1318 -
1319 - if ( ! $action_name ) {
1103 + if ( empty( $action_name ) ) {
1320 1104 return;
1321 1105 }
1322 1106
1323 1107 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1324 -
1325 - if ( $new_action ) {
1108 + if ( ! empty( $new_action ) ) {
1326 1109 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1327 1110 }
1328 1111 }
1329 1112
@@ -1330,22 +1113,16 @@
1330 1113 /**
1331 1114 * Check the WP query for a parameter
1332 1115 *
1333 1116 * @since 2.0
1334 - *
1335 - * @param array|string $value
1336 - * @param string $param
1337 - *
1338 1117 * @return array|string
1339 1118 */
1340 1119 public static function get_query_var( $value, $param ) {
1341 - // phpcs:ignore Universal.Operators.StrictComparisons
1342 1120 if ( $value != '' ) {
1343 1121 return $value;
1344 1122 }
1345 1123
1346 1124 global $wp_query;
1347 -
1348 1125 if ( isset( $wp_query->query_vars[ $param ] ) ) {
1349 1126 $value = $wp_query->query_vars[ $param ];
1350 1127 }
1351 1128
@@ -1358,21 +1135,20 @@
1358 1135 * @since 4.0.02
1359 1136 *
1360 1137 * @param string $class
1361 1138 * @param array $atts
1362 - *
1363 1139 * @return string|null
1364 1140 */
1365 1141 public static function icon_by_class( $class, $atts = array() ) {
1366 1142 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1367 -
1368 1143 if ( isset( $atts['echo'] ) ) {
1369 1144 unset( $atts['echo'] );
1370 1145 }
1371 1146
1372 1147 $html_atts = self::array_to_html_params( $atts );
1373 - $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1374 1148
1149 + $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1150 +
1375 1151 // Replace icons that have been removed or renamed.
1376 1152 $deprecated = array(
1377 1153 'frm_clone_solid_icon' => 'frm_clone_icon',
1378 1154 'frm_keyalt_icon' => 'frm_key_icon',
@@ -1377,9 +1153,8 @@
1377 1153 'frm_clone_solid_icon' => 'frm_clone_icon',
1378 1154 'frm_keyalt_icon' => 'frm_key_icon',
1379 1155 'frm_keyalt_solid_icon' => 'frm_key_solid_icon',
1380 1156 );
1381 -
1382 1157 if ( isset( $deprecated[ $icon ] ) ) {
1383 1158 $icon = $deprecated[ $icon ];
1384 1159 $class = str_replace( $icon, $deprecated[ $icon ], $class );
1385 1160 }
@@ -1386,24 +1161,21 @@
1386 1161
1387 1162 if ( $icon === $class ) {
1388 1163 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1389 1164 } else {
1390 - $class = ! str_contains( $icon, ' ' ) ? '' : ' ' . $icon;
1391 -
1392 - if ( str_contains( $icon, ' ' ) ) {
1165 + $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
1166 + if ( strpos( $icon, ' ' ) ) {
1393 1167 $icon = explode( ' ', $icon );
1394 1168 $icon = reset( $icon );
1395 1169 }
1396 -
1397 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use href="#' . esc_attr( $icon ) . '" /></svg>';
1170 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use xlink:href="#' . esc_attr( $icon ) . '" /></svg>';
1398 1171 }
1399 1172
1400 1173 if ( $echo ) {
1401 1174 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1402 - return null;
1175 + } else {
1176 + return $icon;
1403 1177 }
1404 -
1405 - return $icon;
1406 1178 }
1407 1179
1408 1180 /**
1409 1181 * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
@@ -1410,9 +1182,8 @@
1410 1182 *
1411 1183 * @since 5.0.13
1412 1184 *
1413 1185 * @param string $icon
1414 - *
1415 1186 * @return string
1416 1187 */
1417 1188 public static function kses_icon( $icon ) {
1418 1189 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1428,15 +1199,13 @@
1428 1199 /**
1429 1200 * @since 5.0.13.1
1430 1201 *
1431 1202 * @param array $allowed_html
1432 - *
1433 1203 * @return array
1434 1204 */
1435 1205 public static function add_allowed_icon_tags( $allowed_html ) {
1436 1206 $allowed_html['svg']['data-open'] = true;
1437 1207 $allowed_html['svg']['title'] = true;
1438 - $allowed_html['svg']['tabindex'] = true;
1439 1208 return $allowed_html;
1440 1209 }
1441 1210
1442 1211 /**
@@ -1442,9 +1211,8 @@
1442 1211 /**
1443 1212 * @since 5.0.13
1444 1213 *
1445 1214 * @param array $allowed_attr
1446 - *
1447 1215 * @return array
1448 1216 */
1449 1217 public static function allow_vars_in_styles( $allowed_attr ) {
1450 1218 $allowed_attr[] = '--primary-700';
@@ -1457,9 +1225,9 @@
1457 1225 * @param bool $allow_css
1458 1226 * @param string $css_string
1459 1227 */
1460 1228 public static function allow_style( $allow_css, $css_string ) {
1461 - if ( ! $allow_css && str_starts_with( $css_string, '--primary-700:' ) ) {
1229 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-700:' ) ) {
1462 1230 $split = explode( ':', $css_string, 2 );
1463 1231 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1464 1232 }
1465 1233 return $allow_css;
@@ -1468,22 +1236,19 @@
1468 1236 /**
1469 1237 * @since 5.0.13
1470 1238 *
1471 1239 * @param string $value
1472 - *
1473 1240 * @return bool
1474 1241 */
1475 1242 private static function is_a_valid_color( $value ) {
1476 1243 $match = 0;
1477 -
1478 - if ( str_starts_with( $value, 'rgba(' ) ) {
1244 + if ( 0 === strpos( $value, 'rgba(' ) ) {
1479 1245 $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1480 - } elseif ( str_starts_with( $value, 'rgb(' ) ) {
1246 + } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1481 1247 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1482 - } elseif ( str_starts_with( $value, '#' ) ) {
1248 + } elseif ( 0 === strpos( $value, '#' ) ) {
1483 1249 $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1484 1250 }
1485 -
1486 1251 return (bool) $match;
1487 1252 }
1488 1253
1489 1254 /**
@@ -1489,9 +1254,8 @@
1489 1254 /**
1490 1255 * Include svg images.
1491 1256 *
1492 1257 * @since 4.0.02
1493 - *
1494 1258 * @return void
1495 1259 */
1496 1260 public static function include_svg() {
1497 1261 if ( self::$included_svg ) {
@@ -1510,9 +1274,8 @@
1510 1274 * @since 5.0.13 added $echo parameter.
1511 1275 *
1512 1276 * @param array $atts
1513 1277 * @param bool $echo
1514 - *
1515 1278 * @return string|void
1516 1279 */
1517 1280 public static function array_to_html_params( $atts, $echo = false ) {
1518 1281 $callback = function () use ( $atts ) {
@@ -1531,9 +1294,8 @@
1531 1294 * @since 5.0.13
1532 1295 *
1533 1296 * @param Closure $echo_function
1534 1297 * @param bool $echo
1535 - *
1536 1298 * @return string|null
1537 1299 */
1538 1300 public static function clip( $echo_function, $echo = false ) {
1539 1301 if ( ! $echo ) {
@@ -1543,9 +1305,13 @@
1543 1305 if ( is_callable( $echo_function ) ) {
1544 1306 $echo_function();
1545 1307 }
1546 1308
1547 - return $echo ? null : ob_get_clean();
1309 + if ( ! $echo ) {
1310 + $return = ob_get_contents();
1311 + ob_end_clean();
1312 + return $return;
1313 + }
1548 1314 }
1549 1315
1550 1316 /**
1551 1317 * @since 3.0
@@ -1550,18 +1316,15 @@
1550 1316 /**
1551 1317 * @since 3.0
1552 1318 *
1553 1319 * @param array $atts
1554 - *
1555 1320 * @return void
1556 1321 */
1557 1322 public static function get_admin_header( $atts ) {
1558 1323 $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1559 -
1560 1324 if ( empty( $atts['close'] ) ) {
1561 1325 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1562 1326 }
1563 -
1564 1327 if ( ! isset( $atts['import_link'] ) ) {
1565 1328 $atts['import_link'] = false;
1566 1329 }
1567 1330
@@ -1571,9 +1334,8 @@
1571 1334 /**
1572 1335 * @since 6.0
1573 1336 *
1574 1337 * @param string $type
1575 - *
1576 1338 * @return void
1577 1339 */
1578 1340 public static function import_link( $type = 'secondary' ) {
1579 1341 ?>
@@ -1588,9 +1350,8 @@
1588 1350 *
1589 1351 * @since 5.4.2
1590 1352 *
1591 1353 * @param bool $should_show_lite_upgrade
1592 - *
1593 1354 * @return void
1594 1355 */
1595 1356 public static function print_admin_banner( $should_show_lite_upgrade ) {
1596 1357 if ( ! current_user_can( 'administrator' ) ) {
@@ -1597,9 +1358,9 @@
1597 1358 FrmInbox::maybe_show_banner();
1598 1359 return;
1599 1360 }
1600 1361
1601 - if ( FrmSalesApi::maybe_show_banner() || self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1362 + if ( self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1602 1363 // Print license warning or inbox banner and exit if either prints.
1603 1364 // And exit before printing the upgrade bar if it shouldn't be shown.
1604 1365 return;
1605 1366 }
@@ -1604,33 +1365,16 @@
1604 1365 return;
1605 1366 }
1606 1367 ?>
1607 1368 <div class="frm-upgrade-bar">
1608 - <div class="frm-upgrade-bar-inner">
1609 1369 <?php
1610 - $cta_text = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_text' );
1611 -
1612 - if ( ! $cta_text ) {
1613 - $cta_text = __( 'upgrading to PRO', 'formidable' );
1614 - }
1615 -
1616 - $upgrade_link = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_link' );
1617 - $utm = array(
1618 - 'campaign' => 'settings-license',
1619 - 'content' => 'lite-banner',
1620 - );
1621 -
1622 - $upgrade_link = $upgrade_link ? self::maybe_add_missing_utm( $upgrade_link, $utm ) : self::admin_upgrade_link( $utm );
1623 -
1624 1370 printf(
1625 - /* translators: %1$s: Start link HTML, %2$s: CTA text ("upgrading to PRO" by default), %3$s: End link HTML */
1626 - esc_html__( 'You\'re using Formidable Forms Lite. To unlock more features consider %1$s%2$s%3$s.', 'formidable' ),
1627 - '<a href="' . esc_url( $upgrade_link ) . '">',
1628 - esc_html( $cta_text ),
1371 + /* translators: %1$s: Start link HTML, %2$s: End link HTML */
1372 + esc_html__( 'You\'re using Formidable Forms Lite. To unlock more features consider %1$supgrading to PRO%2$s.', 'formidable' ),
1373 + '<a href="' . esc_url( self::admin_upgrade_link( 'settings-license' ) ) . '">',
1629 1374 '</a>'
1630 1375 );
1631 1376 ?>
1632 - </div>
1633 1377 </div>
1634 1378 <?php
1635 1379 }
1636 1380
@@ -1646,9 +1390,8 @@
1646 1390 /**
1647 1391 * Render a button for a new item (Form, Application, etc).
1648 1392 *
1649 1393 * @since 3.0
1650 - *
1651 1394 * @param array $atts {
1652 1395 * Details about the button.
1653 1396 *
1654 1397 * @type array $link_hook Custom link hook, calls do_action and exits early.
@@ -1655,9 +1398,8 @@
1655 1398 * @type string $new_link Href value, default #.
1656 1399 * @type string $class Custom class names, space separated.
1657 1400 * @type string $button_text Button text. Default "Add New".
1658 1401 * }
1659 - *
1660 1402 * @return void
1661 1403 */
1662 1404 public static function add_new_item_link( $atts ) {
1663 1405 if ( isset( $atts['link_hook'] ) ) {
@@ -1683,12 +1425,8 @@
1683 1425 }
1684 1426
1685 1427 /**
1686 1428 * @since 3.06
1687 - *
1688 - * @param array $atts
1689 - *
1690 - * @return void
1691 1429 */
1692 1430 public static function show_search_box( $atts ) {
1693 1431 $defaults = array(
1694 1432 'placeholder' => '',
@@ -1695,9 +1433,8 @@
1695 1433 'tosearch' => '',
1696 1434 'text' => __( 'Search', 'formidable' ),
1697 1435 'input_id' => '',
1698 1436 'value' => false,
1699 - 'class' => '',
1700 1437 );
1701 1438 $atts = array_merge( $defaults, $atts );
1702 1439
1703 1440 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
@@ -1704,9 +1441,8 @@
1704 1441 $atts['tosearch'] = 'frm-card';
1705 1442 }
1706 1443
1707 1444 $class = 'frm-search-input';
1708 -
1709 1445 if ( ! empty( $atts['tosearch'] ) ) {
1710 1446 $class .= ' frm-auto-search';
1711 1447 }
1712 1448
@@ -1731,13 +1467,13 @@
1731 1467 if ( ! empty( $atts['tosearch'] ) ) {
1732 1468 $input_atts['autocomplete'] = 'off';
1733 1469 }
1734 1470 ?>
1735 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1471 + <p class="frm-search">
1736 1472 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1737 1473 <?php echo esc_html( $atts['text'] ); ?>:
1738 1474 </label>
1739 - <?php self::icon_by_class( 'frmfont frm_search_icon frm_svg20' ); ?>
1475 + <span class="frmfont frm_search_icon"></span>
1740 1476 <input <?php self::array_to_html_params( $input_atts, true ); ?> />
1741 1477 <?php
1742 1478 if ( empty( $atts['tosearch'] ) ) {
1743 1479 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
@@ -1747,17 +1483,14 @@
1747 1483 <?php
1748 1484 }
1749 1485
1750 1486 /**
1751 - * @param string $type Hook type slug.
1752 - * @param object|null $object Optional related object.
1753 - *
1487 + * @param string $type
1754 1488 * @return void
1755 1489 */
1756 1490 public static function trigger_hook_load( $type, $object = null ) {
1757 1491 // Only load the form hooks once.
1758 1492 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1759 -
1760 1493 if ( ! $hooks_loaded ) {
1761 1494 do_action( 'frm_load_' . $type . '_hooks' );
1762 1495 }
1763 1496 }
@@ -1816,14 +1549,14 @@
1816 1549 * True when value is 1, true, 'true', 'yes'
1817 1550 *
1818 1551 * @since 1.07.10
1819 1552 *
1820 - * @param int|string $value The value to compare.
1553 + * @param string $value The value to compare.
1821 1554 *
1822 1555 * @return bool
1823 1556 */
1824 1557 public static function is_true( $value ) {
1825 - return true === $value || '1' === (string) $value || 'true' === $value || 'yes' === $value;
1558 + return true === $value || 1 == $value || 'true' === $value || 'yes' === $value;
1826 1559 }
1827 1560
1828 1561 /**
1829 1562 * Gets all post from a specific post type.
@@ -1831,9 +1564,8 @@
1831 1564 *
1832 1565 * @since 4.10.01 Add `$post_type` argument.
1833 1566 *
1834 1567 * @param string $post_type Post type to query. Default is `page`.
1835 - *
1836 1568 * @return WP_Post[]
1837 1569 */
1838 1570 public static function get_pages( $post_type = 'page' ) {
1839 1571 $query = array(
@@ -1852,9 +1584,8 @@
1852 1584 *
1853 1585 * @since 5.0.09
1854 1586 *
1855 1587 * @param string $post_type Post type to query. Default is `page`.
1856 - *
1857 1588 * @return array
1858 1589 */
1859 1590 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1860 1591 return FrmDb::get_results(
@@ -1879,12 +1610,13 @@
1879 1610 *
1880 1611 * @param array $args Selection arguments.
1881 1612 */
1882 1613 public static function maybe_autocomplete_pages_options( $args ) {
1883 - $args = self::preformat_selection_args( $args );
1614 + $args = self::preformat_selection_args( $args );
1615 +
1884 1616 $pages_count = wp_count_posts( $args['post_type'] );
1885 1617
1886 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1618 + if ( $pages_count->publish <= 50 ) {
1887 1619 self::wp_pages_dropdown( $args );
1888 1620 return;
1889 1621 }
1890 1622
@@ -1908,106 +1640,8 @@
1908 1640 <?php
1909 1641 }
1910 1642
1911 1643 /**
1912 - * Maybe show an HTML select or autocomplete input based on the number of options.
1913 - *
1914 - * @since 6.21
1915 - *
1916 - * @param array $args Args. See the method for details.
1917 - */
1918 - public static function maybe_autocomplete_options( $args ) {
1919 - $defaults = array(
1920 - 'truncate' => false,
1921 - 'placeholder' => ' ',
1922 - 'name' => '',
1923 - 'id' => '',
1924 - 'selected' => '',
1925 - 'source' => array(),
1926 - 'dropdown_limit' => 50,
1927 - 'autocomplete_placeholder' => __( 'Select an option', 'formidable' ),
1928 - 'value_key' => 'value',
1929 - 'label_key' => 'label',
1930 - );
1931 -
1932 - $args = wp_parse_args( $args, $defaults );
1933 - $html_attrs = array();
1934 -
1935 - if ( ! empty( $args['name'] ) ) {
1936 - $html_attrs['name'] = $args['name'];
1937 - }
1938 -
1939 - if ( ! empty( $args['id'] ) ) {
1940 - $html_attrs['id'] = $args['id'];
1941 - }
1942 -
1943 - if ( count( $args['source'] ) <= $args['dropdown_limit'] ) {
1944 - ?>
1945 - <select <?php self::array_to_html_params( $html_attrs, true ); ?>>
1946 - <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
1947 - <?php
1948 - foreach ( $args['source'] as $key => $source ) :
1949 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1950 -
1951 - if ( ! empty( $args['truncate'] ) ) {
1952 - $value_label['label'] = self::truncate( $value_label['label'], $args['truncate'] );
1953 - }
1954 - ?>
1955 - <option value="<?php echo esc_attr( $value_label['value'] ); ?>" <?php selected( $value_label['value'], $args['selected'] ); ?>><?php echo esc_html( $value_label['label'] ); ?></option><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
1956 - <?php endforeach; ?>
1957 - </select>
1958 - <?php
1959 - } else {
1960 - $options = array();
1961 - $autocomplete_value = '';
1962 -
1963 - foreach ( $args['source'] as $key => $source ) {
1964 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1965 -
1966 - if ( $value_label['value'] === $args['selected'] ) {
1967 - $autocomplete_value = $value_label['label'];
1968 - }
1969 -
1970 - $options[] = $value_label;
1971 - }
1972 -
1973 - $html_attrs['type'] = 'hidden';
1974 - $html_attrs['class'] = 'frm_autocomplete_value_input';
1975 - $html_attrs['value'] = $args['selected'];
1976 - ?>
1977 - <input type="text" class="frm-custom-search"
1978 - data-source="<?php echo esc_attr( wp_json_encode( $options ) ); ?>"
1979 - placeholder="<?php echo esc_attr( $args['autocomplete_placeholder'] ); ?>"
1980 - value="<?php echo esc_attr( $autocomplete_value ); ?>" />
1981 - <input <?php self::array_to_html_params( $html_attrs, true ); ?> />
1982 - <?php
1983 - }//end if
1984 - }
1985 -
1986 - /**
1987 - * Gets dropdown value and label from autodropdown option.
1988 - *
1989 - * @since 6.21
1990 - *
1991 - * @param array|string $option Autocomplete option.
1992 - * @param string $key Array key of the option.
1993 - * @param array $args See {@see FrmAppHelper::maybe_autocomplete_options()}.
1994 - *
1995 - * @return array
1996 - */
1997 - private static function get_dropdown_value_and_label_from_option( $option, $key, $args ) {
1998 - if ( is_array( $option ) ) {
1999 - $value = $option[ $args['value_key'] ] ?? '';
2000 - $label = $option[ $args['label_key'] ] ?? '';
2001 - } else {
2002 - $value = $key;
2003 - $label = $option;
2004 - }
2005 -
2006 - return compact( 'value', 'label' );
2007 - }
2008 -
2009 - /**
2010 1644 * @param array $args
2011 1645 * @param string $page_id Deprecated.
2012 1646 * @param bool $truncate Deprecated.
2013 1647 */
@@ -2015,8 +1649,9 @@
2015 1649 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2016 1650
2017 1651 $pages = self::get_post_ids_and_titles( $args['post_type'] );
2018 1652 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1653 +
2019 1654 ?>
2020 1655 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2021 1656 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2022 1657 <?php foreach ( $pages as $page ) { ?>
@@ -2032,14 +1667,8 @@
2032 1667 * Fill in missing parameters passed to wp_pages_dropdown().
2033 1668 * This is for reverse compatibility with switching 3 params to 1.
2034 1669 *
2035 1670 * @since 4.03.06
2036 - *
2037 - * @param string $page_id Deprecated.
2038 - * @param bool $truncate Deprecated.
2039 - * @param mixed $args
2040 - *
2041 - * @return void
2042 1671 */
2043 1672 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2044 1673 if ( ! is_array( $args ) ) {
2045 1674 $args = array(
@@ -2056,12 +1685,8 @@
2056 1685 * Filter to format args for page dropdown or autocomplete
2057 1686 *
2058 1687 * @since 4.03.06
2059 1688 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2060 - *
2061 - * @param array $args
2062 - *
2063 - * @return array
2064 1689 */
2065 1690 private static function preformat_selection_args( $args ) {
2066 1691 $defaults = array(
2067 1692 'truncate' => false,
@@ -2074,18 +1699,13 @@
2074 1699
2075 1700 return array_merge( $defaults, $args );
2076 1701 }
2077 1702
2078 - /**
2079 - * @param int $post_id
2080 - *
2081 - * @return string
2082 - */
2083 1703 public static function post_edit_link( $post_id ) {
2084 1704 $post = get_post( $post_id );
2085 -
2086 1705 if ( $post ) {
2087 1706 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1707 +
2088 1708 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2089 1709 }
2090 1710
2091 1711 return '';
@@ -2112,9 +1732,8 @@
2112 1732 * @since 5.5.3
2113 1733 * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
2114 1734 *
2115 1735 * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
2116 - *
2117 1736 * @return bool
2118 1737 */
2119 1738 public static function is_style_editor_page( $view = '' ) {
2120 1739 if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
@@ -2146,8 +1765,17 @@
2146 1765 return self::is_admin_page( 'formidable-views-editor' );
2147 1766 }
2148 1767
2149 1768 /**
1769 + * @since 4.0
1770 + * @deprecated 5.5.3
1771 + */
1772 + public static function maybe_full_screen_link( $link ) {
1773 + _deprecated_function( __METHOD__, '5.5.3' );
1774 + return $link;
1775 + }
1776 +
1777 + /**
2150 1778 * @param string $field_name
2151 1779 * @param array|string $capability
2152 1780 * @param string $multiple 'single' and 'multiple'.
2153 1781 */
@@ -2162,9 +1790,8 @@
2162 1790 }
2163 1791
2164 1792 /**
2165 1793 * @since 4.07
2166 - *
2167 1794 * @param array|string $selected
2168 1795 * @param string $current
2169 1796 */
2170 1797 private static function selected( $selected, $current ) {
@@ -2179,9 +1806,8 @@
2179 1806 * @param array|string $capability
2180 1807 */
2181 1808 public static function roles_options( $capability ) {
2182 1809 global $frm_vars;
2183 -
2184 1810 if ( isset( $frm_vars['editable_roles'] ) ) {
2185 1811 $editable_roles = $frm_vars['editable_roles'];
2186 1812 } else {
2187 1813 $editable_roles = get_editable_roles();
@@ -2190,9 +1816,9 @@
2190 1816
2191 1817 foreach ( $editable_roles as $role => $details ) {
2192 1818 $name = translate_user_role( $details['name'] );
2193 1819 ?>
2194 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
1820 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?> </option>
2195 1821 <?php
2196 1822 unset( $role, $details );
2197 1823 }
2198 1824 }
@@ -2202,9 +1828,8 @@
2202 1828 *
2203 1829 * @since 5.0 Parameter `$type` supports `pro_only` value.
2204 1830 *
2205 1831 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2206 - *
2207 1832 * @return array
2208 1833 */
2209 1834 public static function frm_capabilities( $type = 'auto' ) {
2210 1835 if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
@@ -2222,8 +1847,14 @@
2222 1847 * @param array<string,string> $pro_cap
2223 1848 */
2224 1849 $pro_cap = apply_filters( 'frm_pro_capabilities', $pro_cap );
2225 1850
1851 + if ( ! array_key_exists( 'frm_edit_displays', $pro_cap ) && is_callable( 'FrmProAppHelper::views_is_installed' ) && FrmProAppHelper::views_is_installed() ) {
1852 + // For backward compatibility, add the Add/Edit Views permission if Pro is not up to date.
1853 + // This was added in 6.5.4. Remove this in the future.
1854 + $pro_cap['frm_edit_displays'] = __( 'Add/Edit Views', 'formidable' );
1855 + }
1856 +
2226 1857 if ( 'pro_only' === $type ) {
2227 1858 return $pro_cap;
2228 1859 }
2229 1860
@@ -2269,18 +1900,21 @@
2269 1900 if ( $role === 'loggedin' || ! $role ) {
2270 1901 return is_user_logged_in();
2271 1902 }
2272 1903
2273 - if ( (int) $role === 1 ) {
1904 + if ( $role == 1 ) {
2274 1905 $role = 'administrator';
2275 1906 }
2276 1907
2277 - return is_user_logged_in() ? current_user_can( $role ) : false;
1908 + if ( ! is_user_logged_in() ) {
1909 + return false;
1910 + }
1911 +
1912 + return current_user_can( $role );
2278 1913 }
2279 1914
2280 1915 /**
2281 1916 * @param array|string $needed_role
2282 - *
2283 1917 * @return bool
2284 1918 */
2285 1919 public static function user_has_permission( $needed_role ) {
2286 1920 if ( is_array( $needed_role ) ) {
@@ -2294,20 +1928,18 @@
2294 1928 }
2295 1929
2296 1930 $can = self::current_user_can( $needed_role );
2297 1931
2298 - if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ), true ) ) {
1932 + if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ) ) ) {
2299 1933 return $can;
2300 1934 }
2301 1935
2302 1936 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2303 -
2304 1937 foreach ( $roles as $role ) {
2305 1938 if ( current_user_can( $role ) ) {
2306 1939 return true;
2307 1940 }
2308 -
2309 - if ( $role === $needed_role ) {
1941 + if ( $role == $needed_role ) {
2310 1942 break;
2311 1943 }
2312 1944 }
2313 1945
@@ -2328,9 +1960,8 @@
2328 1960
2329 1961 $user_id = get_current_user_id();
2330 1962 $user = new WP_User( $user_id );
2331 1963 $frm_roles = self::frm_capabilities();
2332 -
2333 1964 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2334 1965 $user->add_cap( $frm_role );
2335 1966 unset( $frm_role, $frm_role_description );
2336 1967 }
@@ -2341,9 +1972,8 @@
2341 1972 *
2342 1973 * @since 2.0.6
2343 1974 *
2344 1975 * @param string $cap
2345 - *
2346 1976 * @return void
2347 1977 */
2348 1978 public static function force_capability( $cap = 'frm_change_settings' ) {
2349 1979 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
@@ -2348,9 +1978,8 @@
2348 1978 public static function force_capability( $cap = 'frm_change_settings' ) {
2349 1979 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
2350 1980 $role = get_role( 'administrator' );
2351 1981 $frm_roles = self::frm_capabilities();
2352 -
2353 1982 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2354 1983 $role->add_cap( $frm_role );
2355 1984 }
2356 1985 }
@@ -2362,18 +1991,15 @@
2362 1991 *
2363 1992 * @since 2.0
2364 1993 *
2365 1994 * @param string $permission
2366 - * @param string $show_message
2367 1995 */
2368 1996 public static function permission_check( $permission, $show_message = 'show' ) {
2369 1997 $permission_error = self::permission_nonce_error( $permission );
2370 -
2371 1998 if ( $permission_error !== false ) {
2372 - if ( 'hide' === $show_message ) {
1999 + if ( 'hide' == $show_message ) {
2373 2000 $permission_error = '';
2374 2001 }
2375 -
2376 2002 wp_die( esc_html( $permission_error ) );
2377 2003 }
2378 2004 }
2379 2005
@@ -2382,27 +2008,24 @@
2382 2008 *
2383 2009 * @since 2.0
2384 2010 *
2385 2011 * @param string $permission
2386 - * @param string $nonce_name
2387 - * @param string $nonce
2388 2012 *
2389 2013 * @return false|string The permission message or false if allowed
2390 2014 */
2391 2015 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
2392 - if ( $permission && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2016 + if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2393 2017 $frm_settings = self::get_settings();
2018 +
2394 2019 return $frm_settings->admin_permission;
2395 2020 }
2396 2021
2397 2022 $error = false;
2398 -
2399 - if ( ! $nonce_name ) {
2023 + if ( empty( $nonce_name ) ) {
2400 2024 return $error;
2401 2025 }
2402 2026
2403 2027 $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2404 -
2405 2028 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2406 2029 $frm_settings = self::get_settings();
2407 2030 $error = $frm_settings->admin_permission;
2408 2031 }
@@ -2409,14 +2032,8 @@
2409 2032
2410 2033 return $error;
2411 2034 }
2412 2035
2413 - /**
2414 - * @param array|string $values
2415 - * @param string $current
2416 - *
2417 - * @return void
2418 - */
2419 2036 public static function checked( $values, $current ) {
2420 2037 if ( self::check_selected( $values, $current ) ) {
2421 2038 echo ' checked="checked"';
2422 2039 }
@@ -2421,34 +2038,25 @@
2421 2038 echo ' checked="checked"';
2422 2039 }
2423 2040 }
2424 2041
2425 - /**
2426 - * @param array|string $values
2427 - * @param string $current
2428 - *
2429 - * @return bool
2430 - */
2431 2042 public static function check_selected( $values, $current ) {
2432 - $values = self::recursive_function_map( $values, 'trim' );
2433 - $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2043 + $values = self::recursive_function_map( $values, 'trim' );
2044 + $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2045 +
2434 2046 $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
2435 2047
2436 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict, Universal.Operators.StrictComparisons
2437 2048 return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2438 2049 }
2439 2050
2440 - /**
2441 - * @param array|string $value
2442 - * @param callable|string $function
2443 - *
2444 - * @return array|string
2445 - */
2446 2051 public static function recursive_function_map( $value, $function ) {
2447 2052 if ( is_array( $value ) ) {
2448 2053 $original_function = $function;
2449 - $function = count( $value ) ? explode( ', ', FrmDb::prepare_array_values( $value, $function ) ) : array( $function );
2450 -
2054 + if ( count( $value ) ) {
2055 + $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
2056 + } else {
2057 + $function = array( $function );
2058 + }
2451 2059 if ( ! self::is_assoc( $value ) ) {
2452 2060 $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2453 2061 } else {
2454 2062 foreach ( $value as $k => $v ) {
@@ -2459,9 +2067,9 @@
2459 2067 }
2460 2068 } else {
2461 2069 $value = self::maybe_update_value_if_null( $value, $function );
2462 2070 $value = call_user_func( $function, $value );
2463 - }//end if
2071 + }
2464 2072
2465 2073 return $value;
2466 2074 }
2467 2075
@@ -2468,12 +2076,10 @@
2468 2076 /**
2469 2077 * Updates value to empty string if it is null and being passed to a string function.
2470 2078 *
2471 2079 * @since 6.8.4
2472 - *
2473 2080 * @param mixed $value
2474 2081 * @param string $function
2475 - *
2476 2082 * @return mixed
2477 2083 */
2478 2084 private static function maybe_update_value_if_null( $value, $function ) {
2479 2085 if ( null === $value && in_array( $function, array( 'trim', 'strlen' ), true ) ) {
@@ -2482,13 +2088,8 @@
2482 2088
2483 2089 return $value;
2484 2090 }
2485 2091
2486 - /**
2487 - * @param array $array
2488 - *
2489 - * @return bool
2490 - */
2491 2092 public static function is_assoc( $array ) {
2492 2093 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2493 2094 }
2494 2095
@@ -2493,17 +2094,11 @@
2493 2094 }
2494 2095
2495 2096 /**
2496 2097 * Flatten a multi-dimensional array
2497 - *
2498 - * @param array $array
2499 - * @param string $keys
2500 - *
2501 - * @return array
2502 2098 */
2503 2099 public static function array_flatten( $array, $keys = 'keep' ) {
2504 2100 $return = array();
2505 -
2506 2101 foreach ( $array as $key => $value ) {
2507 2102 if ( is_array( $value ) ) {
2508 2103 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2509 2104 } elseif ( $keys === 'keep' ) {
@@ -2516,35 +2111,17 @@
2516 2111 return $return;
2517 2112 }
2518 2113
2519 2114 /**
2520 - * Flatten an array before imploding it to avoid Array to string conversion warnings.
2521 - *
2522 - * @since 6.16.1
2523 - *
2524 - * @param string $sep
2525 - * @param array $array
2526 - *
2527 - * @return string
2528 - */
2529 - public static function safe_implode( $sep, $array ) {
2530 - $array = self::array_flatten( $array );
2531 - return implode( $sep, $array );
2532 - }
2533 -
2534 - /**
2535 2115 * @param string $text
2536 2116 * @param bool $is_rich_text
2537 - *
2538 2117 * @return string
2539 2118 */
2540 2119 public static function esc_textarea( $text, $is_rich_text = false ) {
2541 2120 $safe_text = str_replace( '&quot;', '"', $text );
2542 -
2543 2121 if ( ! $is_rich_text ) {
2544 2122 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2545 2123 }
2546 -
2547 2124 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2548 2125
2549 2126 /**
2550 2127 * @param string $safe_text
@@ -2556,15 +2133,11 @@
2556 2133 /**
2557 2134 * Add auto paragraphs to text areas
2558 2135 *
2559 2136 * @since 2.0
2560 - *
2561 - * @param mixed $content
2562 - *
2563 - * @return mixed
2564 2137 */
2565 2138 public static function use_wpautop( $content ) {
2566 - if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
2139 + if ( apply_filters( 'frm_use_wpautop', true ) && ! is_array( $content ) ) {
2567 2140 $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2568 2141 }
2569 2142
2570 2143 return $content;
@@ -2569,44 +2142,33 @@
2569 2142
2570 2143 return $content;
2571 2144 }
2572 2145
2573 - /**
2574 - * Replace quotes with their HTML entities.
2575 - *
2576 - * @param string $val
2577 - *
2578 - * @return string
2579 - */
2580 2146 public static function replace_quotes( $val ) {
2581 2147 // Replace double quotes.
2582 2148 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2583 2149
2584 2150 // Replace single quotes.
2585 - return str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
2151 + $val = str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
2152 +
2153 + return $val;
2586 2154 }
2587 2155
2588 2156 /**
2589 - * @param string $handle
2590 - * @param int|string $default
2591 - *
2592 - * @return int|string
2157 + * @param string $handle
2593 2158 */
2594 2159 public static function script_version( $handle, $default = 0 ) {
2595 2160 global $wp_scripts;
2596 -
2597 2161 if ( ! $wp_scripts ) {
2598 2162 return $default;
2599 2163 }
2600 2164
2601 2165 $ver = $default;
2602 -
2603 2166 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2604 2167 return $ver;
2605 2168 }
2606 2169
2607 2170 $query = $wp_scripts->registered[ $handle ];
2608 -
2609 2171 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2610 2172 $ver = $query->ver;
2611 2173 }
2612 2174
@@ -2617,9 +2179,8 @@
2617 2179 * @since 5.0.13 added $echo param.
2618 2180 *
2619 2181 * @param string $url
2620 2182 * @param bool $echo
2621 - *
2622 2183 * @return string|null
2623 2184 */
2624 2185 public static function js_redirect( $url, $echo = false ) {
2625 2186 $callback = function () use ( $url ) {
@@ -2627,13 +2188,8 @@
2627 2188 };
2628 2189 return self::clip( $callback, $echo );
2629 2190 }
2630 2191
2631 - /**
2632 - * @param int|string $user_id
2633 - *
2634 - * @return int|string
2635 - */
2636 2192 public static function get_user_id_param( $user_id ) {
2637 2193 if ( ! $user_id || is_numeric( $user_id ) ) {
2638 2194 return $user_id;
2639 2195 }
@@ -2638,13 +2194,16 @@
2638 2194 return $user_id;
2639 2195 }
2640 2196
2641 2197 $user_id = sanitize_text_field( $user_id );
2642 -
2643 2198 if ( $user_id === 'current' ) {
2644 2199 $user_id = get_current_user_id();
2645 2200 } else {
2646 - $user = is_email( $user_id ) ? get_user_by( 'email', $user_id ) : get_user_by( 'login', $user_id );
2201 + if ( is_email( $user_id ) ) {
2202 + $user = get_user_by( 'email', $user_id );
2203 + } else {
2204 + $user = get_user_by( 'login', $user_id );
2205 + }
2647 2206
2648 2207 if ( $user ) {
2649 2208 $user_id = $user->ID;
2650 2209 }
@@ -2656,9 +2215,8 @@
2656 2215
2657 2216 /**
2658 2217 * @param string $filename
2659 2218 * @param array $atts
2660 - *
2661 2219 * @return false|string
2662 2220 */
2663 2221 public static function get_file_contents( $filename, $atts = array() ) {
2664 2222 if ( ! is_file( $filename ) ) {
@@ -2667,9 +2225,12 @@
2667 2225
2668 2226 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2669 2227 ob_start();
2670 2228 include $filename;
2671 - return ob_get_clean();
2229 + $contents = ob_get_contents();
2230 + ob_end_clean();
2231 +
2232 + return $contents;
2672 2233 }
2673 2234
2674 2235 /**
2675 2236 * @param string $name
@@ -2679,9 +2240,8 @@
2679 2240 * @param int $num_chars
2680 2241 */
2681 2242 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2682 2243 $key = '';
2683 -
2684 2244 if ( $name ) {
2685 2245 $key = sanitize_key( $name );
2686 2246 $key = self::maybe_clear_long_key( $key, $column );
2687 2247 }
@@ -2732,24 +2292,20 @@
2732 2292 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2733 2293 *
2734 2294 * @param string $column
2735 2295 * @param string $key
2736 - *
2737 2296 * @return string
2738 2297 */
2739 2298 private static function maybe_truncate_key_before_appending( $column, $key ) {
2740 2299 if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2741 2300 $max_key_length_before_truncating = 60;
2742 -
2743 2301 if ( strlen( $key ) > $max_key_length_before_truncating ) {
2744 2302 $key = substr( $key, 0, $max_key_length_before_truncating );
2745 -
2746 2303 if ( is_numeric( $key ) ) {
2747 2304 $key .= 'a';
2748 2305 }
2749 2306 }
2750 2307 }
2751 -
2752 2308 return $key;
2753 2309 }
2754 2310
2755 2311 /**
@@ -2756,9 +2312,8 @@
2756 2312 * Possibly reset a key to avoid conflicts with column size limits.
2757 2313 *
2758 2314 * @param string $key
2759 2315 * @param string $column
2760 - *
2761 2316 * @return string either the original key value, or an empty string if the key was too long.
2762 2317 */
2763 2318 private static function maybe_clear_long_key( $key, $column ) {
2764 2319 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
@@ -2767,25 +2322,21 @@
2767 2322 return $key;
2768 2323 }
2769 2324
2770 2325 /**
2771 - * @since 6.21 This is changed from `private` to `public`.
2772 - *
2773 2326 * @param int $num_chars
2774 - *
2775 2327 * @return string
2776 2328 */
2777 - public static function generate_new_key( $num_chars ) {
2778 - $max_slug_value = 36 ** $num_chars;
2329 + private static function generate_new_key( $num_chars ) {
2330 + $max_slug_value = pow( 36, $num_chars );
2779 2331
2780 2332 // We want to have at least 2 characters in the slug.
2781 2333 $min_slug_value = 37;
2782 - return base_convert( random_int( $min_slug_value, $max_slug_value ), 10, 36 );
2334 + return base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2783 2335 }
2784 2336
2785 2337 /**
2786 2338 * @param string $key
2787 - *
2788 2339 * @return string
2789 2340 */
2790 2341 private static function prevent_numeric_and_reserved_keys( $key ) {
2791 2342 if ( is_numeric( $key ) ) {
@@ -2799,14 +2350,12 @@
2799 2350 'editlink',
2800 2351 'siteurl',
2801 2352 'evenodd',
2802 2353 );
2803 -
2804 2354 if ( in_array( $key, $not_allowed, true ) ) {
2805 2355 $key .= 'a';
2806 2356 }
2807 2357 }
2808 -
2809 2358 return $key;
2810 2359 }
2811 2360
2812 2361 /**
@@ -2825,9 +2374,9 @@
2825 2374 if ( ! $record ) {
2826 2375 return false;
2827 2376 }
2828 2377
2829 - if ( ! $post_values ) {
2378 + if ( empty( $post_values ) ) {
2830 2379 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
2831 2380 }
2832 2381
2833 2382 $values = array(
@@ -2835,9 +2384,9 @@
2835 2384 'fields' => array(),
2836 2385 );
2837 2386
2838 2387 foreach ( array( 'name', 'description' ) as $var ) {
2839 - $default_val = $record->{$var} ?? '';
2388 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2840 2389 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2841 2390 unset( $var, $default_val );
2842 2391 }
2843 2392
@@ -2855,47 +2404,30 @@
2855 2404
2856 2405 return $values;
2857 2406 }
2858 2407
2859 - /**
2860 - * @param array|string $fields
2861 - * @param object $record
2862 - * @param array $values
2863 - * @param array $args
2864 - *
2865 - * @return void
2866 - */
2867 2408 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2868 - if ( $fields ) {
2409 + if ( ! empty( $fields ) ) {
2869 2410 foreach ( (array) $fields as $field ) {
2870 2411 if ( ! self::is_admin_page() ) {
2871 2412 // Don't prep default values on the form settings page.
2872 2413 $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2873 2414 }
2874 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2415 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2875 2416 self::fill_field_defaults( $field, $record, $values, $args );
2876 2417 }
2877 2418 }
2878 2419 }
2879 2420
2880 - /**
2881 - * @param object $field
2882 - * @param object $record
2883 - * @param array $values
2884 - * @param array $args
2885 - *
2886 - * @return void
2887 - */
2888 2421 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2889 2422 $post_values = $args['post_values'];
2890 2423
2891 2424 if ( $args['default'] ) {
2892 2425 $meta_value = $field->default_value;
2893 - } elseif ( $record->post_id && self::pro_is_installed() && ! empty( $field->field_options['post_field'] ) ) {
2426 + } elseif ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
2894 2427 if ( ! isset( $field->field_options['custom_field'] ) ) {
2895 2428 $field->field_options['custom_field'] = '';
2896 2429 }
2897 -
2898 2430 $meta_value = FrmProEntryMetaHelper::get_post_value(
2899 2431 $record->post_id,
2900 2432 $field->field_options['post_field'],
2901 2433 $field->field_options['custom_field'],
@@ -2909,10 +2441,9 @@
2909 2441 } else {
2910 2442 $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2911 2443 }//end if
2912 2444
2913 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2914 -
2445 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2915 2446 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2916 2447 $new_value = $post_values['item_meta'][ $field->id ];
2917 2448 self::unserialize_or_decode( $new_value );
2918 2449 } else {
@@ -2927,9 +2458,9 @@
2927 2458 $args['field_type'] = $field_type;
2928 2459
2929 2460 FrmFieldsHelper::prepare_edit_front_field( $field_array, $field, $values['id'], $args );
2930 2461
2931 - if ( empty( $field_array['unique'] ) ) {
2462 + if ( ! isset( $field_array['unique'] ) || ! $field_array['unique'] ) {
2932 2463 $field_array['unique_msg'] = '';
2933 2464 }
2934 2465
2935 2466 $field_array = array_merge( (array) $field->field_options, $field_array );
@@ -2996,21 +2527,15 @@
2996 2527 }
2997 2528
2998 2529 /**
2999 2530 * Set to POST value or default
3000 - *
3001 - * @param array $post_values
3002 - * @param array $values
3003 - *
3004 - * @return void
3005 2531 */
3006 2532 private static function fill_form_defaults( $post_values, array &$values ) {
3007 2533 $form_defaults = FrmFormsHelper::get_default_opts();
3008 2534
3009 2535 foreach ( $form_defaults as $opt => $default ) {
3010 - // phpcs:ignore Universal.Operators.StrictComparisons
3011 2536 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3012 - $values[ $opt ] = $post_values['options'][ $opt ] ?? $default;
2537 + $values[ $opt ] = $post_values && isset( $post_values['options'][ $opt ] ) ? $post_values['options'][ $opt ] : $default;
3013 2538 }
3014 2539
3015 2540 unset( $opt, $default );
3016 2541 }
@@ -3020,9 +2545,9 @@
3020 2545 }
3021 2546
3022 2547 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3023 2548 if ( ! isset( $values[ $h . '_html' ] ) ) {
3024 - $values[ $h . '_html' ] = $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h );
2549 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3025 2550 }
3026 2551 unset( $h );
3027 2552 }
3028 2553 }
@@ -3034,14 +2559,16 @@
3034 2559 *
3035 2560 * @return bool|int
3036 2561 */
3037 2562 public static function custom_style_value( $post_values ) {
3038 - if ( $post_values && isset( $post_values['options']['custom_style'] ) ) {
3039 - return absint( $post_values['options']['custom_style'] );
2563 + if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
2564 + $custom_style = absint( $post_values['options']['custom_style'] );
2565 + } else {
2566 + $frm_settings = self::get_settings();
2567 + $custom_style = ( $frm_settings->load_style !== 'none' );
3040 2568 }
3041 2569
3042 - $frm_settings = self::get_settings();
3043 - return $frm_settings->load_style !== 'none';
2570 + return $custom_style;
3044 2571 }
3045 2572
3046 2573 /**
3047 2574 * @param mixed $original_string
@@ -3047,9 +2574,8 @@
3047 2574 * @param mixed $original_string
3048 2575 * @param int|string $length
3049 2576 * @param int $minword
3050 2577 * @param string $continue
3051 - *
3052 2578 * @return string
3053 2579 */
3054 2580 public static function truncate( $original_string, $length, $minword = 3, $continue = '...' ) {
3055 2581 if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
@@ -3059,9 +2585,9 @@
3059 2585 $length = (int) $length;
3060 2586 $str = wp_strip_all_tags( (string) $original_string );
3061 2587 $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3062 2588
3063 - if ( $length === 0 ) {
2589 + if ( $length == 0 ) {
3064 2590 return '';
3065 2591 }
3066 2592
3067 2593 if ( $length <= 10 ) {
@@ -3068,10 +2594,11 @@
3068 2594 $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3069 2595 return $sub . ( $length < $original_len ? $continue : '' );
3070 2596 }
3071 2597
3072 - $sub = '';
3073 - $len = 0;
2598 + $sub = '';
2599 + $len = 0;
2600 +
3074 2601 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3075 2602
3076 2603 if ( ! is_array( $words ) ) {
3077 2604 return $original_string;
@@ -3077,11 +2604,10 @@
3077 2604 return $original_string;
3078 2605 }
3079 2606
3080 2607 foreach ( $words as $word ) {
3081 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2608 + $part = ( $sub != '' ? ' ' : '' ) . $word;
3082 2609 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3083 -
3084 2610 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3085 2611 break;
3086 2612 }
3087 2613
@@ -3106,9 +2632,8 @@
3106 2632 * @since 6.5.4
3107 2633 *
3108 2634 * @param string $sub Current substring.
3109 2635 * @param int $length The length limit.
3110 - *
3111 2636 * @return string
3112 2637 */
3113 2638 private static function maybe_force_truncate_on_string_with_no_spaces( $sub, $length ) {
3114 2639 if ( strlen( $sub ) < $length + 50 ) {
@@ -3116,9 +2641,8 @@
3116 2641 return $sub;
3117 2642 }
3118 2643
3119 2644 $first_space = strpos( $sub, ' ', $length );
3120 -
3121 2645 if ( false !== $first_space ) {
3122 2646 // Ignore anything with spaces.
3123 2647 return $sub;
3124 2648 }
@@ -3125,18 +2649,11 @@
3125 2649
3126 2650 return substr( $sub, 0, $length + 10 );
3127 2651 }
3128 2652
3129 - /**
3130 - * @param array $function_names
3131 - * @param array $args
3132 - *
3133 - * @return mixed
3134 - */
3135 2653 public static function mb_function( $function_names, $args ) {
3136 2654 $mb_function_name = $function_names[0];
3137 2655 $function_name = $function_names[1];
3138 -
3139 2656 if ( function_exists( $mb_function_name ) ) {
3140 2657 $function_name = $mb_function_name;
3141 2658 }
3142 2659
@@ -3142,21 +2659,14 @@
3142 2659
3143 2660 return call_user_func_array( $function_name, $args );
3144 2661 }
3145 2662
3146 - /**
3147 - * @param string $date
3148 - * @param string $date_format
3149 - * @param string $time_format
3150 - *
3151 - * @return string
3152 - */
3153 2663 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3154 - if ( ! $date ) {
2664 + if ( empty( $date ) ) {
3155 2665 return $date;
3156 2666 }
3157 2667
3158 - if ( ! $date_format ) {
2668 + if ( empty( $date_format ) ) {
3159 2669 $date_format = get_option( 'date_format' );
3160 2670 }
3161 2671
3162 2672 if ( preg_match( '/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date ) && self::pro_is_installed() ) {
@@ -3164,10 +2674,10 @@
3164 2674 $date = FrmProAppHelper::convert_date( $date, $frmpro_settings->date_format, 'Y-m-d' );
3165 2675 }
3166 2676
3167 2677 $formatted = self::get_localized_date( $date_format, $date );
3168 - $do_time = gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00';
3169 2678
2679 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3170 2680 if ( $do_time ) {
3171 2681 $formatted .= self::add_time_to_date( $time_format, $date );
3172 2682 }
3173 2683
@@ -3173,38 +2683,28 @@
3173 2683
3174 2684 return $formatted;
3175 2685 }
3176 2686
3177 - /**
3178 - * @param string $time_format
3179 - * @param string $date
3180 - *
3181 - * @return string
3182 - */
3183 2687 private static function add_time_to_date( $time_format, $date ) {
3184 - if ( ! $time_format ) {
2688 + if ( empty( $time_format ) ) {
3185 2689 $time_format = get_option( 'time_format' );
3186 2690 }
3187 2691
3188 2692 $trimmed_format = trim( $time_format );
3189 -
3190 - if ( $time_format && $trimmed_format ) {
3191 - return ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
2693 + $time = '';
2694 + if ( $time_format && ! empty( $trimmed_format ) ) {
2695 + $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3192 2696 }
3193 2697
3194 - return '';
2698 + return $time;
3195 2699 }
3196 2700
3197 2701 /**
3198 2702 * @since 2.0.8
3199 - *
3200 - * @param string $date_format
3201 - * @param string $date
3202 - *
3203 - * @return string
3204 2703 */
3205 2704 public static function get_localized_date( $date_format, $date ) {
3206 2705 $date = get_date_from_gmt( $date );
2706 +
3207 2707 return date_i18n( $date_format, strtotime( $date ) );
3208 2708 }
3209 2709
3210 2710 /**
@@ -3209,16 +2709,19 @@
3209 2709
3210 2710 /**
3211 2711 * Gets the time ago in words.
3212 2712 *
3213 - * @param int $from In seconds.
3214 - * @param int|string $to In seconds.
3215 - * @param int|string $levels Number of time units to include or a specific unit.
2713 + * @param int $from In seconds.
2714 + * @param int|string $to In seconds.
3216 2715 *
3217 2716 * @return string $time_ago
3218 2717 */
3219 2718 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3220 - $now = empty( $to ) && 0 !== $to ? new DateTime() : new DateTime( '@' . $to );
2719 + if ( empty( $to ) && 0 !== $to ) {
2720 + $now = new DateTime();
2721 + } else {
2722 + $now = new DateTime( '@' . $to );
2723 + }
3221 2724 $ago = new DateTime( '@' . $from );
3222 2725
3223 2726 // Get the time difference
3224 2727 $diff_object = $now->diff( $ago );
@@ -3232,9 +2735,8 @@
3232 2735
3233 2736 if ( ! is_numeric( $levels ) ) {
3234 2737 // Show time in specified unit.
3235 2738 $levels = self::get_unit( $levels );
3236 -
3237 2739 if ( isset( $time_strings[ $levels ] ) ) {
3238 2740 $diff = array(
3239 2741 $levels => self::time_format( $levels, $diff ),
3240 2742 );
@@ -3241,14 +2743,13 @@
3241 2743 $time_strings = array(
3242 2744 $levels => $time_strings[ $levels ],
3243 2745 );
3244 2746 }
3245 -
3246 2747 $levels = 1;
3247 2748 }
3248 2749
3249 2750 foreach ( $time_strings as $k => $v ) {
3250 - if ( ! empty( $diff[ $k ] ) ) {
2751 + if ( isset( $diff[ $k ] ) && $diff[ $k ] ) {
3251 2752 $time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
3252 2753 } elseif ( isset( $diff[ $k ] ) && count( $time_strings ) === 1 ) {
3253 2754 // Account for 0.
3254 2755 $time_strings[ $k ] = $diff[ $k ] . ' ' . $v[1];
@@ -3256,21 +2757,17 @@
3256 2757 unset( $time_strings[ $k ] );
3257 2758 }
3258 2759 }
3259 2760
3260 - $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
3261 - $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2761 + $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
2762 + $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2763 + $time_ago_string = implode( ' ', $time_strings );
3262 2764
3263 - return implode( ' ', $time_strings );
2765 + return $time_ago_string;
3264 2766 }
3265 2767
3266 2768 /**
3267 2769 * @since 4.05.01
3268 - *
3269 - * @param string $unit
3270 - * @param array $diff
3271 - *
3272 - * @return int
3273 2770 */
3274 2771 private static function time_format( $unit, $diff ) {
3275 2772 $return = array(
3276 2773 'y' => 'y',
@@ -3275,14 +2772,14 @@
3275 2772 $return = array(
3276 2773 'y' => 'y',
3277 2774 'd' => 'days',
3278 2775 );
3279 -
3280 2776 if ( isset( $return[ $unit ] ) ) {
3281 2777 return $diff[ $return[ $unit ] ];
3282 2778 }
3283 2779
3284 2780 $total = $diff['days'] * self::convert_time( 'd', $unit );
2781 +
3285 2782 $times = array( 'h', 'i', 's' );
3286 2783
3287 2784 foreach ( $times as $time ) {
3288 2785 if ( ! isset( $diff[ $time ] ) ) {
@@ -3296,13 +2793,8 @@
3296 2793 }
3297 2794
3298 2795 /**
3299 2796 * @since 4.05.01
3300 - *
3301 - * @param string $from
3302 - * @param string $to
3303 - *
3304 - * @return int
3305 2797 */
3306 2798 private static function convert_time( $from, $to ) {
3307 2799 $convert = array(
3308 2800 's' => 1,
@@ -3318,26 +2810,20 @@
3318 2810 }
3319 2811
3320 2812 /**
3321 2813 * @since 4.05.01
3322 - *
3323 - * @param string $unit
3324 - *
3325 - * @return int|string
3326 2814 */
3327 2815 private static function get_unit( $unit ) {
3328 2816 $units = self::get_time_strings();
3329 -
3330 2817 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3331 2818 return $unit;
3332 2819 }
3333 2820
3334 2821 foreach ( $units as $u => $strings ) {
3335 - if ( in_array( $unit, $strings, true ) ) {
2822 + if ( in_array( $unit, $strings ) ) {
3336 2823 return $u;
3337 2824 }
3338 2825 }
3339 -
3340 2826 return 1;
3341 2827 }
3342 2828
3343 2829 /**
@@ -3344,9 +2830,8 @@
3344 2830 * Get the translatable time strings. The untranslated version is a failsafe
3345 2831 * in case languages are changing for the unit set in the shortcode.
3346 2832 *
3347 2833 * @since 2.0.20
3348 - *
3349 2834 * @return array
3350 2835 */
3351 2836 private static function get_time_strings() {
3352 2837 return array(
@@ -3393,9 +2878,8 @@
3393 2878 /**
3394 2879 * @param int $r_count
3395 2880 * @param int $current_p
3396 2881 * @param int $p_size
3397 - *
3398 2882 * @return int
3399 2883 */
3400 2884 public static function get_last_record_num( $r_count, $current_p, $p_size ) {
3401 2885 return ( $r_count < $current_p * $p_size ? $r_count : $current_p * $p_size );
@@ -3404,13 +2888,11 @@
3404 2888 /**
3405 2889 * @param int $r_count
3406 2890 * @param int $current_p
3407 2891 * @param int $p_size
3408 - *
3409 2892 * @return int
3410 2893 */
3411 2894 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3412 - // phpcs:ignore Universal.Operators.StrictComparisons
3413 2895 if ( $current_p == 1 ) {
3414 2896 return 1;
3415 2897 }
3416 2898 return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
@@ -3416,22 +2898,17 @@
3416 2898 return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3417 2899 }
3418 2900
3419 2901 /**
3420 - * @param array $json_vars
3421 - *
3422 2902 * @return array
3423 2903 */
3424 2904 public static function json_to_array( $json_vars ) {
3425 2905 $vars = array();
3426 -
3427 2906 foreach ( $json_vars as $jv ) {
3428 2907 $jv_name = explode( '[', $jv['name'] );
3429 2908 $last = count( $jv_name ) - 1;
3430 -
3431 2909 foreach ( $jv_name as $p => $n ) {
3432 2910 $name = trim( $n, ']' );
3433 -
3434 2911 if ( ! isset( $l1 ) ) {
3435 2912 $l1 = $name;
3436 2913 }
3437 2914
@@ -3442,9 +2919,9 @@
3442 2919 if ( ! isset( $l3 ) ) {
3443 2920 $l3 = $name;
3444 2921 }
3445 2922
3446 - $this_val = $p === $last ? $jv['value'] : array();
2923 + $this_val = $p == $last ? $jv['value'] : array();
3447 2924
3448 2925 switch ( $p ) {
3449 2926 case 0:
3450 2927 $l1 = $name;
@@ -3477,15 +2954,10 @@
3477 2954
3478 2955 /**
3479 2956 * @param string $name
3480 2957 * @param string $l1
3481 - * @param mixed $val
3482 - * @param array $vars
3483 - *
3484 - * @return void
3485 2958 */
3486 2959 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3487 - // phpcs:ignore Universal.Operators.StrictComparisons
3488 2960 if ( $name == '' ) {
3489 2961 $vars[] = $val;
3490 2962 } elseif ( ! isset( $vars[ $l1 ] ) ) {
3491 2963 $vars[ $l1 ] = $val;
@@ -3491,26 +2963,19 @@
3491 2963 $vars[ $l1 ] = $val;
3492 2964 }
3493 2965 }
3494 2966
3495 - /**
3496 - * @param string $name
3497 - * @param string $class
3498 - * @param string $form_name
3499 - *
3500 - * @return void
3501 - */
3502 2967 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3503 2968 $tooltips = array(
3504 2969 'action_title' => __( 'Give this action a label for easy reference.', 'formidable' ),
3505 - 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected]. [default-email] is the address set in the global "Default Email Address" settings.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2970 + 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected]. [admin_email] is the address set in WP General Settings.', 'formidable' ),
3506 2971 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
3507 2972 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
3508 - 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <[email protected]> or [email protected].', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2973 + 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
3509 2974 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <[email protected]> or [email protected].', 'formidable' ),
3510 2975 /* translators: %1$s: Form name, %2$s: Date */
3511 - '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() ) ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3512 - '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' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2976 + '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() ) ),
2977 + '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' ),
3513 2978 );
3514 2979
3515 2980 if ( ! isset( $tooltips[ $name ] ) ) {
3516 2981 return;
@@ -3515,9 +2980,9 @@
3515 2980 if ( ! isset( $tooltips[ $name ] ) ) {
3516 2981 return;
3517 2982 }
3518 2983
3519 - if ( 'open' === $class ) {
2984 + if ( 'open' == $class ) {
3520 2985 echo ' frm_help"';
3521 2986 } else {
3522 2987 echo ' class="frm_help"';
3523 2988 }
@@ -3523,9 +2988,9 @@
3523 2988 }
3524 2989
3525 2990 echo ' title="' . esc_attr( $tooltips[ $name ] );
3526 2991
3527 - if ( 'open' !== $class ) {
2992 + if ( 'open' != $class ) {
3528 2993 echo '"';
3529 2994 }
3530 2995 }
3531 2996
@@ -3530,28 +2995,20 @@
3530 2995 }
3531 2996
3532 2997 /**
3533 2998 * Add the current_page class to that page in the form nav
3534 - *
3535 - * @param int|string $page
3536 - * @param int|string $current_page
3537 - * @param array $action
3538 - *
3539 - * @return void
3540 2999 */
3541 3000 public static function select_current_page( $page, $current_page, $action = array() ) {
3542 - // phpcs:ignore Universal.Operators.StrictComparisons
3543 3001 if ( $current_page != $page ) {
3544 3002 return;
3545 3003 }
3546 3004
3547 3005 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3548 -
3549 3006 if ( 'lite-reports' === $frm_action ) {
3550 3007 $frm_action = 'reports';
3551 3008 }
3552 3009
3553 - if ( ! $action || ( $frm_action && in_array( $frm_action, $action, true ) ) ) {
3010 + if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3554 3011 echo ' class="current_page"';
3555 3012 }
3556 3013 }
3557 3014
@@ -3582,18 +3039,13 @@
3582 3039 // Add extra slashes for \r\n since WP strips them.
3583 3040 $post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
3584 3041
3585 3042 // allow for &quot
3586 - return str_replace( '&quot;', '\\"', $post_content );
3043 + $post_content = str_replace( '&quot;', '\\"', $post_content );
3044 +
3045 + return $post_content;
3587 3046 }
3588 3047
3589 - /**
3590 - * @param array|string $val
3591 - * @param int|string $key
3592 - * @param array $post_content
3593 - *
3594 - * @return void
3595 - */
3596 3048 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3597 3049 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3598 3050 return;
3599 3051 }
@@ -3618,9 +3070,8 @@
3618 3070 *
3619 3071 * @since 4.02.03
3620 3072 *
3621 3073 * @param array|string $value
3622 - *
3623 3074 * @return void
3624 3075 */
3625 3076 public static function unserialize_or_decode( &$value ) {
3626 3077 if ( is_array( $value ) ) {
@@ -3626,9 +3077,13 @@
3626 3077 if ( is_array( $value ) ) {
3627 3078 return;
3628 3079 }
3629 3080
3630 - $value = is_serialized( $value ) ? self::maybe_unserialize_array( $value ) : self::maybe_json_decode( $value, false );
3081 + if ( is_serialized( $value ) ) {
3082 + $value = self::maybe_unserialize_array( $value );
3083 + } else {
3084 + $value = self::maybe_json_decode( $value, false );
3085 + }
3631 3086 }
3632 3087
3633 3088 /**
3634 3089 * Safely unserialize an array if necessary.
@@ -3636,9 +3091,8 @@
3636 3091 *
3637 3092 * @since 6.2
3638 3093 *
3639 3094 * @param mixed $value
3640 - *
3641 3095 * @return mixed
3642 3096 */
3643 3097 public static function maybe_unserialize_array( $value ) {
3644 3098 if ( ! is_string( $value ) ) {
@@ -3645,14 +3099,13 @@
3645 3099 return $value;
3646 3100 }
3647 3101
3648 3102 // Since we only expect an array, skip anything that doesn't start with a:.
3649 - if ( ! is_serialized( $value ) || ! str_starts_with( $value, 'a:' ) ) {
3103 + if ( ! is_serialized( $value ) || 'a:' !== substr( $value, 0, 2 ) ) {
3650 3104 return $value;
3651 3105 }
3652 3106
3653 3107 $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
3654 -
3655 3108 if ( is_array( $parsed ) ) {
3656 3109 $value = $parsed;
3657 3110 }
3658 3111
@@ -3662,12 +3115,11 @@
3662 3115 /**
3663 3116 * Decode a JSON string.
3664 3117 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3665 3118 *
3666 - * @param array|string|null $string
3667 - * @param bool $single_to_array
3668 - *
3669 - * @return array|string|null
3119 + * @param mixed $string
3120 + * @param bool $single_to_array
3121 + * @return mixed
3670 3122 */
3671 3123 public static function maybe_json_decode( $string, $single_to_array = true ) {
3672 3124 if ( is_array( $string ) || is_null( $string ) ) {
3673 3125 return $string;
@@ -3672,19 +3124,20 @@
3672 3124 if ( is_array( $string ) || is_null( $string ) ) {
3673 3125 return $string;
3674 3126 }
3675 3127
3676 - $new_string = json_decode( $string, true );
3677 - $single_value = false;
3678 -
3679 - if ( ! $single_to_array ) {
3680 - $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3128 + $new_string = json_decode( $string, true );
3129 + if ( function_exists( 'json_last_error' ) ) {
3130 + // php 5.3+
3131 + $single_value = false;
3132 + if ( ! $single_to_array ) {
3133 + $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3134 + }
3135 + if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3136 + $string = $new_string;
3137 + }
3681 3138 }
3682 3139
3683 - if ( json_last_error() === JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3684 - $string = $new_string;
3685 - }
3686 -
3687 3140 return $string;
3688 3141 }
3689 3142
3690 3143 /**
@@ -3690,9 +3143,8 @@
3690 3143 /**
3691 3144 * @since 6.2.3
3692 3145 *
3693 3146 * @param string $value
3694 - *
3695 3147 * @return string
3696 3148 */
3697 3149 public static function maybe_utf8_encode( $value ) {
3698 3150 $from_format = 'ISO-8859-1';
@@ -3701,15 +3153,13 @@
3701 3153 if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
3702 3154 if ( mb_check_encoding( $value, $from_format ) ) {
3703 3155 return mb_convert_encoding( $value, $to_format, $from_format );
3704 3156 }
3705 -
3706 3157 return $value;
3707 3158 }
3708 3159
3709 3160 if ( function_exists( 'iconv' ) ) {
3710 3161 $converted = iconv( $from_format, $to_format, $value );
3711 -
3712 3162 // Value is false if $value is not ISO-8859-1.
3713 3163 if ( false !== $converted ) {
3714 3164 return $converted;
3715 3165 }
@@ -3721,12 +3171,8 @@
3721 3171 /**
3722 3172 * Reformat the json serialized array in name => value array.
3723 3173 *
3724 3174 * @since 4.02.03
3725 - *
3726 - * @param array $form
3727 - *
3728 - * @return void
3729 3175 */
3730 3176 public static function format_form_data( &$form ) {
3731 3177 $formatted = array();
3732 3178
@@ -3733,11 +3179,9 @@
3733 3179 foreach ( $form as $input ) {
3734 3180 if ( ! isset( $input['name'] ) ) {
3735 3181 continue;
3736 3182 }
3737 -
3738 3183 $key = $input['name'];
3739 -
3740 3184 if ( isset( $formatted[ $key ] ) ) {
3741 3185 if ( is_array( $formatted[ $key ] ) ) {
3742 3186 $formatted[ $key ][] = $input['value'];
3743 3187 } else {
@@ -3754,9 +3198,8 @@
3754 3198 /**
3755 3199 * @since 4.02.03
3756 3200 *
3757 3201 * @param array|string $value
3758 - *
3759 3202 * @return string
3760 3203 */
3761 3204 public static function maybe_json_encode( $value ) {
3762 3205 if ( is_array( $value ) ) {
@@ -3770,19 +3213,18 @@
3770 3213 *
3771 3214 * @since 1.07.10
3772 3215 *
3773 3216 * @param string $post_type The name of the post type that may need to be highlighted.
3774 - *
3775 3217 * @return void
3776 3218 */
3777 3219 public static function maybe_highlight_menu( $post_type ) {
3778 3220 global $post;
3779 3221
3780 - if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] !== $post_type ) {
3222 + if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] != $post_type ) {
3781 3223 return;
3782 3224 }
3783 3225
3784 - if ( is_object( $post ) && $post->post_type !== $post_type ) {
3226 + if ( is_object( $post ) && $post->post_type != $post_type ) {
3785 3227 return;
3786 3228 }
3787 3229
3788 3230 self::load_admin_wide_js();
@@ -3794,9 +3236,8 @@
3794 3236 *
3795 3237 * @since 2.0
3796 3238 *
3797 3239 * @param bool $load
3798 - *
3799 3240 * @return void
3800 3241 */
3801 3242 public static function load_admin_wide_js( $load = true ) {
3802 3243 $version = self::plugin_version();
@@ -3807,9 +3248,9 @@
3807 3248 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3808 3249 'url' => self::plugin_url(),
3809 3250 'app_url' => 'https://formidableforms.com/',
3810 3251 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
3811 - 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3252 + 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
3812 3253 'loading' => __( 'Loading&hellip;', 'formidable' ),
3813 3254 'nonce' => wp_create_nonce( 'frm_ajax' ),
3814 3255 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3815 3256 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
@@ -3822,9 +3263,8 @@
3822 3263 }
3823 3264
3824 3265 /**
3825 3266 * @since 2.0.9
3826 - *
3827 3267 * @return void
3828 3268 */
3829 3269 public static function load_font_style() {
3830 3270 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
@@ -3831,13 +3271,12 @@
3831 3271 }
3832 3272
3833 3273 /**
3834 3274 * @param string $location
3835 - *
3836 3275 * @return void
3837 3276 */
3838 3277 public static function localize_script( $location ) {
3839 - global $wp_scripts, $wp_version;
3278 + global $wp_scripts;
3840 3279
3841 3280 $script_strings = array(
3842 3281 'ajax_url' => esc_url_raw( self::get_ajax_url() ),
3843 3282 'images_url' => self::plugin_url() . '/images',
@@ -3856,9 +3295,8 @@
3856 3295 'include_resend_email' => false,
3857 3296 );
3858 3297
3859 3298 $data = $wp_scripts->get_data( 'formidable', 'data' );
3860 -
3861 3299 if ( ! $data ) {
3862 3300 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3863 3301 }
3864 3302
@@ -3863,73 +3301,68 @@
3863 3301 }
3864 3302
3865 3303 if ( $location === 'admin' ) {
3866 3304 $admin_script_strings = array(
3867 - 'desc' => __( '(Click to add description)', 'formidable' ),
3868 - 'blank' => __( '(Blank)', 'formidable' ),
3869 - 'no_label' => self::get_no_label_text(),
3870 - 'ok' => __( 'OK', 'formidable' ),
3871 - 'cancel' => __( 'Cancel', 'formidable' ),
3872 - 'default_label' => __( 'Default', 'formidable' ),
3873 - 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
3874 - 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
3875 - 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3876 - 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3877 - 'confirm' => __( 'Are you sure?', 'formidable' ),
3878 - 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3879 - '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' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3880 - 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3881 - 'default_unique' => FrmFieldsHelper::default_unique_msg(),
3882 - 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3883 - 'enter_email' => __( 'Enter Email', 'formidable' ),
3884 - 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3885 - 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3886 - 'new_option' => __( 'New Option', 'formidable' ),
3887 - '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' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3888 - 'enter_password' => __( 'Enter Password', 'formidable' ),
3889 - 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3890 - 'import_complete' => __( 'Import Complete', 'formidable' ),
3891 - 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
3892 - 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
3893 - 'private_label' => __( 'Private', 'formidable' ),
3894 - 'jquery_ui_url' => '',
3895 - 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
3896 - 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
3897 - 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
3898 - 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
3899 - 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
3305 + 'desc' => __( '(Click to add description)', 'formidable' ),
3306 + 'blank' => __( '(Blank)', 'formidable' ),
3307 + 'no_label' => __( '(no label)', 'formidable' ),
3308 + 'ok' => __( 'OK', 'formidable' ),
3309 + 'cancel' => __( 'Cancel', 'formidable' ),
3310 + 'default_label' => __( 'Default', 'formidable' ),
3311 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
3312 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
3313 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3314 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3315 + 'confirm' => __( 'Are you sure?', 'formidable' ),
3316 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3317 + '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' ),
3318 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3319 + 'default_unique' => FrmFieldsHelper::default_unique_msg(),
3320 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3321 + 'enter_email' => __( 'Enter Email', 'formidable' ),
3322 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3323 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3324 + 'new_option' => __( 'New Option', 'formidable' ),
3325 + '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' ),
3326 + 'enter_password' => __( 'Enter Password', 'formidable' ),
3327 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3328 + 'import_complete' => __( 'Import Complete', 'formidable' ),
3329 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
3330 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
3331 + 'private_label' => __( 'Private', 'formidable' ),
3332 + 'jquery_ui_url' => '',
3333 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
3334 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
3335 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
3336 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
3337 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
3900 3338 /* translators: %d is the number of allowed actions per form */
3901 - 'only_one_action' => sprintf( __( 'This form action is limited to %d per form.', 'formidable' ), 1 ),
3902 - 'edit_action_text' => __( 'Please edit the existing form action.', 'formidable' ),
3903 - 'unsafe_params' => FrmFormsHelper::reserved_words(),
3339 + 'only_one_action' => sprintf( __( 'This form action is limited to %d per form.', 'formidable' ), 1 ),
3340 + 'edit_action_text' => __( 'Please edit the existing form action.', 'formidable' ),
3341 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3904 3342 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3905 - 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3343 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3906 3344 /* 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. */
3907 - 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3908 - 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3909 - 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3910 - 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3911 - 'install' => __( 'Install', 'formidable' ),
3912 - 'active' => __( 'Active', 'formidable' ),
3913 - 'installed' => __( 'Installed', 'formidable' ),
3914 - 'not_installed' => __( 'Not Installed', 'formidable' ),
3915 - 'select_a_field' => __( 'Select a Field', 'formidable' ),
3916 - 'no_items_found' => __( 'No items found.', 'formidable' ),
3917 - 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3345 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
3346 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3347 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3348 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3349 + 'install' => __( 'Install', 'formidable' ),
3350 + 'active' => __( 'Active', 'formidable' ),
3351 + 'installed' => __( 'Installed', 'formidable' ),
3352 + 'not_installed' => __( 'Not Installed', 'formidable' ),
3353 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
3354 + 'no_items_found' => __( 'No items found.', 'formidable' ),
3355 + 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3918 3356
3919 3357 // Deprecated in 6.0.
3920 - 'saving' => '',
3358 + 'saving' => '',
3921 3359
3922 3360 // Deprecated in 6.0.
3923 - 'saved' => '',
3361 + 'saved' => '',
3924 3362
3925 3363 // translators: %1$s: HTML open tag, %2$s: HTML end tag.
3926 - 'holdShiftMsg' => esc_html__( 'You can hold %1$sShift%2$s on your keyboard to select multiple fields', 'formidable' ),
3927 - 'noTitleText' => FrmFormsHelper::get_no_title_text(),
3928 -
3929 - // In older versions this event listener causes the section to immediately close again
3930 - // when the h3 element is clicked. It's only required in WP 6.7+.
3931 - 'requireAccordionTitleClickListener' => version_compare( $wp_version, '6.7', '>=' ),
3364 + 'holdShiftMsg' => esc_html__( 'You can hold %1$sShift%2$s on your keyboard to select multiple fields', 'formidable' ),
3932 3365 );
3933 3366 /**
3934 3367 * @param array $admin_script_strings
3935 3368 */
@@ -3935,9 +3368,8 @@
3935 3368 */
3936 3369 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3937 3370
3938 3371 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3939 -
3940 3372 if ( ! $data ) {
3941 3373 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3942 3374 }
3943 3375 }//end if
@@ -3943,19 +3375,8 @@
3943 3375 }//end if
3944 3376 }
3945 3377
3946 3378 /**
3947 - * Get the no label text.
3948 - *
3949 - * @since 6.25.1
3950 - *
3951 - * @return string
3952 - */
3953 - public static function get_no_label_text() {
3954 - return __( '(no label)', 'formidable' );
3955 - }
3956 -
3957 - /**
3958 3379 * @since 6.5
3959 3380 *
3960 3381 * @return string
3961 3382 */
@@ -3997,9 +3418,8 @@
3997 3418 *
3998 3419 * @since 1.07.10
3999 3420 *
4000 3421 * @param float $min_version The version the add-on requires.
4001 - *
4002 3422 * @return void
4003 3423 */
4004 3424 public static function min_version_notice( $min_version ) {
4005 3425 $frm_version = self::plugin_version();
@@ -4009,9 +3429,9 @@
4009 3429 return;
4010 3430 }
4011 3431
4012 3432 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
4013 - echo '<tr class="plugin-update-tr active"><th colspan="' . absint( $wp_list_table->get_column_count() ) . '" class="check-column plugin-update colspanchange"><div class="update-message">' . // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3433 + echo '<tr class="plugin-update-tr active"><th colspan="' . absint( $wp_list_table->get_column_count() ) . '" class="check-column plugin-update colspanchange"><div class="update-message">' .
4014 3434 esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
4015 3435 '</div></td></tr>';
4016 3436 }
4017 3437
@@ -4019,10 +3439,8 @@
4019 3439 * If Pro is far outdated, show a message.
4020 3440 *
4021 3441 * @since 4.0.01
4022 3442 *
4023 - * @param string $min_version
4024 - *
4025 3443 * @return void
4026 3444 */
4027 3445 public static function min_pro_version_notice( $min_version ) {
4028 3446 if ( ! self::is_formidable_admin() ) {
@@ -4032,14 +3450,25 @@
4032 3450
4033 3451 self::php_version_notice();
4034 3452
4035 3453 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4036 -
4037 3454 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4038 3455 return;
4039 3456 }
4040 3457
4041 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
3458 + $expired = FrmAddonsController::is_license_expired();
3459 + ?>
3460 + <div class="frm-banner-alert frm_error_style frm_previous_install">
3461 + <?php
3462 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
3463 + if ( empty( $expired ) ) {
3464 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
3465 + } else {
3466 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
3467 + }
3468 + ?>
3469 + </div>
3470 + <?php
4042 3471 }
4043 3472
4044 3473 /**
4045 3474 * If Pro is installed, check the version number.
@@ -4046,9 +3475,8 @@
4046 3475 *
4047 3476 * @since 4.0.01
4048 3477 *
4049 3478 * @param string $min_version
4050 - *
4051 3479 * @return bool
4052 3480 */
4053 3481 public static function meets_min_pro_version( $min_version ) {
4054 3482 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
@@ -4054,19 +3482,23 @@
4054 3482 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4055 3483 }
4056 3484
4057 3485 /**
4058 - * Show a message if the PHP version is below the recommendations.
3486 + * Show a message if the browser or PHP version is below the recommendations.
4059 3487 *
4060 3488 * @since 4.0.02
4061 - *
4062 3489 * @return void
4063 3490 */
4064 3491 private static function php_version_notice() {
4065 3492 $message = array();
3493 + if ( version_compare( phpversion(), '7.0', '<' ) ) {
3494 + $message[] = __( 'The version of PHP on your server is too low. If this is not corrected, you may see issues with Formidable Forms. Please contact your web host and ask to be updated to PHP 7.0+.', 'formidable' );
3495 + }
4066 3496
4067 - if ( version_compare( phpversion(), '7.0', '<' ) ) {
4068 - $message[] = __( 'The version of PHP on your server is too low. If this is not corrected, you may see issues with Formidable Forms. Please contact your web host and ask to be updated to PHP 7.0+.', 'formidable' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3497 + $browser = self::get_server_value( 'HTTP_USER_AGENT' );
3498 + $is_ie = strpos( $browser, 'MSIE' ) !== false;
3499 + if ( $is_ie ) {
3500 + $message[] = __( 'You are using an outdated browser that is not compatible with Formidable Forms. Please update to a more current browser (we recommend Chrome).', 'formidable' );
4069 3501 }
4070 3502
4071 3503 foreach ( $message as $m ) {
4072 3504 ?>
@@ -4078,9 +3510,8 @@
4078 3510 }
4079 3511
4080 3512 /**
4081 3513 * @param string $type
4082 - *
4083 3514 * @return array<string,string>
4084 3515 */
4085 3516 public static function locales( $type = 'date' ) {
4086 3517 $locales = array(
@@ -4190,13 +3621,14 @@
4190 3621 * @since 5.4.5 Added $args parameter with type.
4191 3622 *
4192 3623 * @param array<string,string> $locales
4193 3624 * @param array $args {
4194 - *
4195 3625 * @type string $type
4196 3626 * }
4197 3627 */
4198 - return apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3628 + $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3629 +
3630 + return $locales;
4199 3631 }
4200 3632
4201 3633 /**
4202 3634 * @return string
@@ -4203,14 +3635,12 @@
4203 3635 */
4204 3636 public static function get_menu_icon_class() {
4205 3637 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4206 3638 $settings = FrmProAppHelper::get_settings();
4207 -
4208 3639 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4209 3640 return $settings->menu_icon;
4210 3641 }
4211 3642 }
4212 -
4213 3643 return 'frmfont frm_logo_icon';
4214 3644 }
4215 3645
4216 3646 /**
@@ -4228,9 +3658,10 @@
4228 3658 * @type array $input_attrs Attributes of value input.
4229 3659 * }
4230 3660 */
4231 3661 public static function images_dropdown( $args ) {
4232 - $args = self::fill_default_images_dropdown_args( $args );
3662 + $args = self::fill_default_images_dropdown_args( $args );
3663 +
4233 3664 $input_attrs_str = self::get_images_dropdown_input_attrs( $args );
4234 3665 ob_start();
4235 3666 include self::plugin_path() . '/classes/views/shared/images-dropdown.php';
4236 3667 $output = ob_get_clean();
@@ -4251,9 +3682,8 @@
4251 3682 *
4252 3683 * @since 5.0.04
4253 3684 *
4254 3685 * @param array $args The arguments.
4255 - *
4256 3686 * @return array
4257 3687 */
4258 3688 private static function fill_default_images_dropdown_args( $args ) {
4259 3689 $defaults = array(
@@ -4266,8 +3696,14 @@
4266 3696
4267 3697 $new_args['options'] = (array) $new_args['options'];
4268 3698 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4269 3699
3700 + // Set the number of columns.
3701 + $new_args['col_class'] = ceil( 12 / count( $new_args['options'] ) );
3702 + if ( $new_args['col_class'] > 6 ) {
3703 + $new_args['col_class'] = ceil( $new_args['col_class'] / 2 );
3704 + }
3705 +
4270 3706 /**
4271 3707 * Allows modifying the arguments of images_dropdown() method.
4272 3708 *
4273 3709 * @since 5.0.04
@@ -4283,9 +3719,8 @@
4283 3719 *
4284 3720 * @since 5.0.04
4285 3721 *
4286 3722 * @param array $args The arguments.
4287 - *
4288 3723 * @return string
4289 3724 */
4290 3725 private static function get_images_dropdown_input_attrs( $args ) {
4291 3726 $input_attrs = $args['input_attrs'];
@@ -4292,9 +3727,8 @@
4292 3727 $input_attrs['type'] = 'radio';
4293 3728 $input_attrs['name'] = $args['name'];
4294 3729
4295 3730 $input_attrs_str = '';
4296 -
4297 3731 foreach ( $input_attrs as $key => $input_attr ) {
4298 3732 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4299 3733 }
4300 3734
@@ -4310,13 +3744,8 @@
4310 3744 }
4311 3745
4312 3746 /**
4313 3747 * @since 6.7.1
4314 - *
4315 - * @param array $option Option data.
4316 - * @param array $args The arguments of images_dropdown() method.
4317 - *
4318 - * @return array
4319 3748 */
4320 3749 public static function get_images_dropdown_atts( $option, $args ) {
4321 3750 $image = self::get_images_dropdown_option_image( $option, $args );
4322 3751 $classes = self::get_images_dropdown_option_classes( $option, $args );
@@ -4330,9 +3759,8 @@
4330 3759 * @since 5.0.04
4331 3760 *
4332 3761 * @param array $option Option data.
4333 3762 * @param array $args The arguments of images_dropdown() method.
4334 - *
4335 3763 * @return string
4336 3764 */
4337 3765 private static function get_images_dropdown_option_image( $option, $args ) {
4338 3766 $image = self::icon_by_class(
@@ -4361,9 +3789,8 @@
4361 3789 * @since 5.0.04
4362 3790 *
4363 3791 * @param array $option Option data.
4364 3792 * @param array $args The arguments of images_dropdown() method.
4365 - *
4366 3793 * @return string
4367 3794 */
4368 3795 private static function get_images_dropdown_option_classes( $option, $args ) {
4369 3796 $classes = '';
@@ -4391,19 +3818,17 @@
4391 3818 * @since 5.0.04
4392 3819 *
4393 3820 * @param array $option Option data.
4394 3821 * @param array $args The arguments of images_dropdown() method.
4395 - *
4396 3822 * @return string
4397 3823 */
4398 3824 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4399 3825 $html_attrs = '';
4400 -
4401 3826 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4402 3827 $html_attrs_arr = array();
4403 3828
4404 3829 foreach ( $option['custom_attrs'] as $key => $value ) {
4405 - if ( in_array( $key, array( 'type', 'class', 'data-value' ), true ) ) {
3830 + if ( in_array( $key, array( 'type', 'class', 'data-value' ) ) ) {
4406 3831 continue;
4407 3832 }
4408 3833
4409 3834 $html_attrs_arr[] = sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $value ) );
@@ -4461,9 +3886,8 @@
4461 3886 * @since 5.0.07
4462 3887 *
4463 3888 * @param array $values
4464 3889 * @param array $keys
4465 - *
4466 3890 * @return array
4467 3891 */
4468 3892 public static function maybe_filter_array( $values, $keys ) {
4469 3893 $allow_unfiltered_html = self::allow_unfiltered_html();
@@ -4488,9 +3912,8 @@
4488 3912 * @since 5.0.13
4489 3913 *
4490 3914 * @param string $value
4491 3915 * @param array|string $allowed 'all' for everything included as defaults.
4492 - *
4493 3916 * @return string
4494 3917 */
4495 3918 public static function maybe_kses( $value, $allowed = 'all' ) {
4496 3919 if ( self::should_never_allow_unfiltered_html() ) {
@@ -4505,18 +3928,17 @@
4505 3928 * @since 6.11.2
4506 3929 *
4507 3930 * @param string $key
4508 3931 * @param string $context Either 'display' or 'update'. On update, we want to allow a few keys that are never displayed.
4509 - *
4510 3932 * @return bool
4511 3933 */
4512 3934 public static function input_key_is_safe( $key, $context = 'display' ) {
4513 3935 if ( 'update' === $context && in_array( $key, array( 'opt', 'label' ), true ) ) {
4514 3936 $safe = true;
4515 - } elseif ( str_starts_with( $key, 'data-' ) ) {
3937 + } elseif ( 0 === strpos( $key, 'data-' ) ) {
4516 3938 // Allow all data attributes.
4517 3939 $safe = true;
4518 - } elseif ( str_starts_with( $key, 'aria-' ) ) {
3940 + } elseif ( 0 === strpos( $key, 'aria-' ) ) {
4519 3941 // Allow all aria attributes.
4520 3942 $safe = true;
4521 3943 } else {
4522 3944 $safe_keys = array(
@@ -4558,9 +3980,16 @@
4558 3980
4559 3981 /**
4560 3982 * @since 5.0.16
4561 3983 *
4562 - * @param string $medium
3984 + * @return bool
3985 + */
3986 + public static function show_landing_pages() {
3987 + return self::show_new_feature( 'landing' );
3988 + }
3989 +
3990 + /**
3991 + * @since 5.0.16
4563 3992 *
4564 3993 * @return array
4565 3994 */
4566 3995 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
@@ -4568,9 +3997,8 @@
4568 3997 'medium' => $medium,
4569 3998 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4570 3999 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4571 4000 'screenshot' => 'landing.png',
4572 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
4573 4001 );
4574 4002 return self::get_upgrade_data_params( 'landing', $params );
4575 4003 }
4576 4004
@@ -4577,35 +4005,24 @@
4577 4005 /**
4578 4006 * @since 5.0.17
4579 4007 *
4580 4008 * @param string $feature
4581 - *
4582 4009 * @return bool
4583 4010 */
4584 4011 public static function show_new_feature( $feature ) {
4585 4012 $link = FrmAddonsController::install_link( $feature );
4586 -
4587 - if ( array_key_exists( 'status', $link ) || array_key_exists( 'class', $link ) ) {
4588 - return true;
4589 - }
4590 -
4591 - return 'coupons' === $feature && class_exists( 'FrmCouponsAppController' );
4013 + return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4592 4014 }
4593 4015
4594 4016 /**
4595 - * Enhances upgrade data parameters with installation link and plan requirement information.
4596 - *
4597 4017 * @since 5.0.17
4598 4018 *
4599 - * @param string $plugin The plugin slug to get installation data for.
4600 - * @param array $params Initial parameters for the upgrade data.
4601 - * @param bool $detailed Whether to include detailed information.
4602 - *
4603 - * @return array Modified parameters with installation data.
4019 + * @param string $plugin
4020 + * @param array $params
4021 + * @return array
4604 4022 */
4605 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
4023 + public static function get_upgrade_data_params( $plugin, $params ) {
4606 4024 $link = FrmAddonsController::install_link( $plugin );
4607 -
4608 4025 if ( ! $link ) {
4609 4026 return $params;
4610 4027 }
4611 4028
@@ -4611,20 +4028,15 @@
4611 4028
4612 4029 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4613 4030 $params['oneclick'] = json_encode( $link );
4614 4031 unset( $params['message'] );
4615 -
4616 4032 if ( ! isset( $params['medium'] ) ) {
4617 4033 $params['medium'] = $plugin;
4618 4034 }
4619 4035 } else {
4620 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
4036 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4621 4037 }
4622 4038
4623 - if ( $detailed ) {
4624 - $params['plugin-status'] = $link['status'] ?? '';
4625 - }
4626 -
4627 4039 return $params;
4628 4040 }
4629 4041
4630 4042 /**
@@ -4633,9 +4045,8 @@
4633 4045 *
4634 4046 * @since 5.0.17
4635 4047 *
4636 4048 * @param string $text
4637 - *
4638 4049 * @return bool
4639 4050 */
4640 4051 public static function ctype_xdigit( $text ) {
4641 4052 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4650,14 +4061,12 @@
4650 4061 * @since 5.2.01
4651 4062 */
4652 4063 public static function set_current_screen_and_hook_suffix() {
4653 4064 global $hook_suffix;
4654 -
4655 4065 if ( is_null( $hook_suffix ) ) {
4656 4066 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4657 4067 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4658 4068 }
4659 -
4660 4069 set_current_screen();
4661 4070 }
4662 4071
4663 4072 /**
@@ -4679,9 +4088,8 @@
4679 4088 *
4680 4089 * @since 5.2.07
4681 4090 *
4682 4091 * @param mixed $num Number.
4683 - *
4684 4092 * @return false|int Returns `false` if the passed parameter is not number.
4685 4093 */
4686 4094 public static function count_decimals( $num ) {
4687 4095 if ( ! is_numeric( $num ) ) {
@@ -4689,9 +4097,8 @@
4689 4097 }
4690 4098
4691 4099 $num = (string) $num;
4692 4100 $parts = explode( '.', $num );
4693 -
4694 4101 if ( 1 === count( $parts ) ) {
4695 4102 return 0;
4696 4103 }
4697 4104
@@ -4773,20 +4180,17 @@
4773 4180 * @since 5.5.5
4774 4181 *
4775 4182 * @param string $url
4776 4183 * @param string $expected_extension
4777 - *
4778 4184 * @return bool
4779 4185 */
4780 4186 public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4781 - $file_is_in_expected_s3_bucket = str_starts_with( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4782 -
4187 + $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4783 4188 if ( ! $file_is_in_expected_s3_bucket ) {
4784 4189 return false;
4785 4190 }
4786 4191
4787 4192 $parsed = parse_url( $url );
4788 -
4789 4193 if ( ! is_array( $parsed ) ) {
4790 4194 // URL is malformed.
4791 4195 return false;
4792 4196 }
@@ -4792,10 +4196,14 @@
4792 4196 }
4793 4197
4794 4198 $path = $parsed['path'];
4795 4199 $ext = pathinfo( $path, PATHINFO_EXTENSION );
4796 - // The URL isn't to an XML file.
4797 - return $expected_extension === $ext;
4200 + if ( $expected_extension !== $ext ) {
4201 + // The URL isn't to an XML file.
4202 + return false;
4203 + }
4204 +
4205 + return true;
4798 4206 }
4799 4207
4800 4208 /**
4801 4209 * Display a dismissable warning message and save its dismissal state.
@@ -4803,9 +4211,8 @@
4803 4211 * @since 6.3
4804 4212 *
4805 4213 * @param string $message The warning message to display.
4806 4214 * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
4807 - *
4808 4215 * @return void
4809 4216 */
4810 4217 public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4811 4218 if ( ! $message || ! $option ) {
@@ -4848,9 +4255,8 @@
4848 4255 *
4849 4256 * @since 6.3
4850 4257 *
4851 4258 * @param string $option The unique identifier for the dismissal state of the message.
4852 - *
4853 4259 * @return void
4854 4260 */
4855 4261 public static function dismiss_warning_message( $option = '' ) {
4856 4262 self::permission_check( 'frm_change_settings' );
@@ -4872,8 +4278,17 @@
4872 4278 * @return string
4873 4279 */
4874 4280 public static function copy_for_lite_license() {
4875 4281 $message = __( 'You\'re using Formidable Forms Lite - no license needed. Enjoy!', 'formidable' ) . ' 🙂';
4282 +
4283 + if ( is_callable( 'FrmProAddonsController::get_readable_license_type' ) && ! class_exists( 'FrmProDashboardController' ) ) {
4284 + // Manage PRO versions without PRO dashboard functionality.
4285 + $license_type = FrmProAddonsController::get_readable_license_type();
4286 + if ( 'lite' !== strtolower( $license_type ) ) {
4287 + $message = 'Formidable Pro ' . $license_type;
4288 + }
4289 + }
4290 +
4876 4291 return apply_filters( 'frm_license_type_text', $message );
4877 4292 }
4878 4293
4879 4294 /**
@@ -4879,9 +4294,8 @@
4879 4294 /**
4880 4295 * Removes scripts that are unnecessarily loaded across the pages!
4881 4296 *
4882 4297 * @since 6.9
4883 - *
4884 4298 * @return void
4885 4299 */
4886 4300 public static function dequeue_extra_global_scripts() {
4887 4301 wp_dequeue_script( 'frm-surveys-admin' );
@@ -4899,9 +4313,8 @@
4899 4313 * @return void
4900 4314 */
4901 4315 public static function tooltip_icon( $tooltip_text, $atts = array() ) {
4902 4316 $atts['title'] = $tooltip_text;
4903 -
4904 4317 if ( isset( $atts['class'] ) ) {
4905 4318 $atts['class'] .= ' frm_help';
4906 4319 } else {
4907 4320 $atts['class'] = 'frm_help';
@@ -4910,118 +4323,6 @@
4910 4323 <span <?php self::array_to_html_params( $atts, true ); ?>>
4911 4324 <?php self::icon_by_class( 'frmfont frm_tooltip_icon' ); ?>
4912 4325 </span>
4913 4326 <?php
4914 - }
4915 -
4916 - /**
4917 - * Prints errors for settings in onboarding wizard or template settings.
4918 - *
4919 - * @since 6.15
4920 - *
4921 - * @param array $args Args.
4922 - *
4923 - * @return void
4924 - */
4925 - public static function print_setting_error( $args ) {
4926 - $args = wp_parse_args(
4927 - $args,
4928 - array(
4929 - 'id' => '',
4930 - 'errors' => array(),
4931 - 'class' => '',
4932 - )
4933 - );
4934 -
4935 - $args['class'] .= ' frm-validation-error frm-mt-xs frm_hidden';
4936 - ?>
4937 - <span id="<?php echo esc_attr( $args['id'] ); ?>" class="<?php echo esc_attr( $args['class'] ); ?>">
4938 - <?php
4939 - if ( is_array( $args['errors'] ) ) {
4940 - foreach ( $args['errors'] as $key => $msg ) {
4941 - ?>
4942 - <span frm-error="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $msg ); ?></span>
4943 - <?php
4944 - }
4945 - } else {
4946 - echo '<span>' . esc_html( $args['errors'] ) . '</span>';
4947 - }
4948 - ?>
4949 - </span>
4950 - <?php
4951 - }
4952 -
4953 - /**
4954 - * Check if GDPR is enabled.
4955 - *
4956 - * @since 6.19
4957 - *
4958 - * @return bool
4959 - */
4960 - public static function is_gdpr_enabled() {
4961 - $frm_settings = self::get_settings();
4962 - return $frm_settings->enable_gdpr || $frm_settings->no_ips || $frm_settings->custom_header_ip || $frm_settings->no_gdpr_cookies;
4963 - }
4964 -
4965 - /**
4966 - * Check if GDPR cookies are disabled.
4967 - *
4968 - * @since 6.19
4969 - *
4970 - * @return bool
4971 - */
4972 - public static function no_gdpr_cookies() {
4973 - $frm_settings = self::get_settings();
4974 - return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
4975 - }
4976 -
4977 - /**
4978 - * Check if a string is valid UTF-8.
4979 - *
4980 - * @since 6.24
4981 - *
4982 - * @param string $string The string to check.
4983 - *
4984 - * @return bool
4985 - */
4986 - public static function is_valid_utf8( $string ) {
4987 - // wp_is_valid_utf8 is added in WP 6.9.
4988 - if ( function_exists( 'wp_is_valid_utf8' ) ) {
4989 - return wp_is_valid_utf8( $string );
4990 - }
4991 -
4992 - // As of WP 6.9, seems_utf8 is deprecated.
4993 - return function_exists( 'seems_utf8' ) ? seems_utf8( $string ) : false;
4994 - }
4995 -
4996 - /**
4997 - * Get a documentation URL with UTM parameters and affiliate tracking.
4998 - *
4999 - * @since 6.26
5000 - *
5001 - * @param string $path The relative path to append to the base URL.
5002 - * @param string $campaign The campaign to use for UTM parameters.
5003 - * @param bool $add_kb_base Whether to prepend 'knowledgebase/' to the path. Default true.
5004 - *
5005 - * @return string The processed URL with UTM parameters and affiliate tracking.
5006 - */
5007 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5008 - $path = trim( $path, '/' );
5009 -
5010 - if ( $add_kb_base ) {
5011 - $path = 'knowledgebase/' . $path;
5012 - }
5013 -
5014 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
5015 - }
5016 -
5017 - /**
5018 - * @since 5.0.16
5019 - * @deprecated 6.26
5020 - *
5021 - * @return bool
5022 - */
5023 - public static function show_landing_pages() {
5024 - _deprecated_function( __METHOD__, '6.26' );
5025 - return true;
5026 4327 }
5027 4328 }