PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.20
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.20
6.35 6.34 6.33.1 6.33 6.32.1 6.32 6.31 6.25 6.25.1 6.26 6.26.1 6.27 6.28 6.29 6.3 6.3.1 6.3.2 6.30 6.4 6.4.1 6.4.2 6.5 6.5.1 6.5.2 6.5.3 All 141 releases
← All changes | classes/helpers/FrmAppHelper.php +393 -966 6.286.20 View file →
@@ -9,9 +9,9 @@
9 9 * Version of the database we are moving to.
10 10 *
11 11 * @var int
12 12 */
13 - public static $db_version = 104;
13 + public static $db_version = 103;
14 14
15 15 /**
16 16 * Used by the API add-on.
17 17 *
@@ -28,9 +28,9 @@
28 28 * @since 2.0
29 29 *
30 30 * @var string
31 31 */
32 - public static $plug_version = '6.28';
32 + public static $plug_version = '6.20';
33 33
34 34 /**
35 35 * @var bool
36 36 */
@@ -55,9 +55,9 @@
55 55 /**
56 56 * @return string
57 57 */
58 58 public static function plugin_path() {
59 - return dirname( __DIR__, 2 );
59 + return dirname( dirname( __DIR__ ) );
60 60 }
61 61
62 62 /**
63 63 * @return string
@@ -85,9 +85,8 @@
85 85 * Get the name of this site
86 86 * Used for [sitename] shortcode
87 87 *
88 88 * @since 2.0
89 - *
90 89 * @return string
91 90 */
92 91 public static function site_name() {
93 92 return get_option( 'blogname' );
@@ -94,15 +93,13 @@
94 93 }
95 94
96 95 /**
97 96 * @param string $url
98 - *
99 97 * @return string
100 98 */
101 99 public static function make_affiliate_url( $url ) {
102 100 $affiliate_id = self::get_affiliate();
103 -
104 - if ( $affiliate_id ) {
101 + if ( ! empty( $affiliate_id ) ) {
105 102 $url = str_replace( array( 'http://', 'https://' ), '', $url );
106 103 $url = 'http://www.shareasale.com/r.cfm?u=' . absint( $affiliate_id ) . '&b=841990&m=64739&afftrack=plugin&urllink=' . urlencode( $url );
107 104 }
108 105
@@ -117,167 +114,65 @@
117 114 }
118 115
119 116 /**
120 117 * @since 3.04.02
121 - *
122 - * @param array|string $args If a string is passed, it is used for the utm_campaign attribute.
118 + * @param array|string $args
123 119 * @param string $page
124 120 */
125 121 public static function admin_upgrade_link( $args, $page = '' ) {
126 - if ( $page ) {
122 + if ( empty( $page ) ) {
123 + $page = 'https://formidableforms.com/lite-upgrade/';
124 + } else {
127 125 $page = str_replace( 'https://formidableforms.com/', '', $page );
128 126 $page = 'https://formidableforms.com/' . $page;
127 + }
128 +
129 + $anchor = '';
130 + if ( is_array( $args ) ) {
131 + $medium = $args['medium'];
132 + if ( isset( $args['content'] ) ) {
133 + $content = $args['content'];
134 + }
135 + if ( isset( $args['anchor'] ) ) {
136 + $anchor = '#' . $args['anchor'];
137 + }
129 138 } else {
130 - $page = 'https://formidableforms.com/lite-upgrade/';
139 + $medium = $args;
131 140 }
132 141
133 - $args = is_array( $args ) ? self::adjust_legacy_utm_args( $args ) : array( 'campaign' => $args );
134 -
135 142 $query_args = array(
136 - 'utm_source' => 'plugin',
137 - 'utm_medium' => self::get_utm_medium(),
143 + 'utm_source' => 'WordPress',
144 + 'utm_medium' => $medium,
145 + 'utm_campaign' => 'liteplugin',
138 146 );
139 - $query_args = self::maybe_add_utm_license( $query_args );
140 147
141 - if ( isset( $args['campaign'] ) ) {
142 - $query_args['utm_campaign'] = $args['campaign'];
148 + if ( isset( $content ) ) {
149 + $query_args['utm_content'] = $content;
143 150 }
144 151
145 - if ( isset( $args['content'] ) ) {
146 - $query_args['utm_content'] = $args['content'];
147 - }
148 -
149 - if ( isset( $args['param'] ) ) {
152 + if ( is_array( $args ) && isset( $args['param'] ) ) {
150 153 $query_args['f'] = $args['param'];
151 154 }
152 155
153 - if ( ! empty( $args['plan'] ) ) {
156 + if ( is_array( $args ) && ! empty( $args['plan'] ) ) {
154 157 $query_args['plan'] = $args['plan'];
155 158 }
156 159
157 - $link = add_query_arg( $query_args, $page );
158 -
159 - if ( isset( $args['anchor'] ) ) {
160 - $link .= '#' . $args['anchor'];
161 - }
162 -
160 + $link = add_query_arg( $query_args, $page ) . $anchor;
163 161 return self::make_affiliate_url( $link );
164 162 }
165 163
166 164 /**
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 165 * Get the Formidable settings
269 166 *
270 167 * @since 2.0
271 168 *
272 169 * @param array $args - May include the form id when values need translation.
273 - *
274 - * @return FrmSettings
170 + * @return FrmSettings $frm_settings
275 171 */
276 172 public static function get_settings( $args = array() ) {
277 173 global $frm_settings;
278 -
279 - if ( ! $frm_settings ) {
174 + if ( empty( $frm_settings ) ) {
280 175 $frm_settings = new FrmSettings( $args );
281 176 } elseif ( isset( $args['current_form'] ) ) {
282 177 // If the global has already been set, allow strings to be filtered.
283 178 $frm_settings->maybe_filter_for_form( $args );
@@ -289,13 +184,11 @@
289 184 /**
290 185 * @return string
291 186 */
292 187 public static function get_menu_name() {
293 - if ( ! self::pro_is_installed() || FrmAddonsController::is_license_expired() ) {
294 - return 'Formidable';
295 - }
188 + $frm_settings = self::get_settings();
296 189
297 - return self::get_settings()->menu;
190 + return FrmAddonsController::is_license_expired() ? 'Formidable' : $frm_settings->menu;
298 191 }
299 192
300 193 /**
301 194 * Determine if the current branding is set to 'formidable'.
@@ -310,9 +203,9 @@
310 203 return true;
311 204 }
312 205
313 206 $menu_icon = self::get_menu_icon_class();
314 - return str_contains( $menu_icon, 'frm_logo_icon' );
207 + return strpos( $menu_icon, 'frm_logo_icon' ) !== false;
315 208 }
316 209
317 210 /**
318 211 * @since 3.05
@@ -317,9 +210,8 @@
317 210 /**
318 211 * @since 3.05
319 212 *
320 213 * @param array $atts
321 - *
322 214 * @return string
323 215 */
324 216 public static function svg_logo( $atts = array() ) {
325 217 $defaults = array(
@@ -329,14 +221,12 @@
329 221 'orange' => '#f05a24',
330 222 );
331 223 $atts = array_merge( $defaults, $atts );
332 224
333 - // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong
334 225 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'] ) . '">
335 226 <path fill="' . esc_attr( $atts['orange'] ) . '" d="M289.6 384h140v76h-140z"/>
336 227 <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"/>
337 228 </svg>';
338 - // phpcs:enable SlevomatCodingStandard.Files.LineLength.LineTooLong
339 229 }
340 230
341 231 /**
342 232 * @since 4.0
@@ -341,13 +231,12 @@
341 231 /**
342 232 * @since 4.0
343 233 *
344 234 * @param array $atts
345 - *
346 235 * @return void
347 236 */
348 237 public static function show_logo( $atts = array() ) {
349 - self::kses_echo( self::svg_logo( $atts ), 'all' );
238 + echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
350 239 }
351 240
352 241 /**
353 242 * @since 4.03.02
@@ -362,11 +251,10 @@
362 251 )
363 252 );
364 253
365 254 $new_icon = apply_filters( 'frm_icon', $icon, true );
366 -
367 255 if ( $new_icon !== $icon ) {
368 - if ( str_starts_with( $new_icon, '<svg' ) ) {
256 + if ( strpos( $new_icon, '<svg' ) === 0 ) {
369 257 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
370 258 } else {
371 259 // Show nothing if it isn't an SVG.
372 260 $icon = '<div style="height:39px"></div>';
@@ -371,9 +259,9 @@
371 259 // Show nothing if it isn't an SVG.
372 260 $icon = '<div style="height:39px"></div>';
373 261 }
374 262 }
375 - self::kses_echo( $icon, 'all' );
263 + echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
376 264 }
377 265
378 266 /**
379 267 * @since 2.02.04
@@ -423,13 +311,11 @@
423 311 */
424 312 public static function is_form_builder_page( $check_for_settings = true ) {
425 313 $action = self::simple_get( 'frm_action', 'sanitize_title' );
426 314 $check_actions = array( 'edit', 'duplicate' );
427 -
428 315 if ( $check_for_settings ) {
429 316 $check_actions[] = 'settings';
430 317 }
431 -
432 318 return self::is_admin_page( 'formidable' ) && in_array( $action, $check_actions, true );
433 319 }
434 320
435 321 /**
@@ -435,15 +321,15 @@
435 321 /**
436 322 * @return bool
437 323 */
438 324 public static function is_formidable_admin() {
439 - $page = self::simple_get( 'page', 'sanitize_title' );
440 -
441 - if ( ! $page ) {
442 - return self::is_view_builder_page();
325 + $page = self::simple_get( 'page', 'sanitize_title' );
326 + $is_formidable = strpos( $page, 'formidable' ) !== false;
327 + if ( empty( $page ) ) {
328 + $is_formidable = self::is_view_builder_page();
443 329 }
444 330
445 - return str_contains( $page, 'formidable' );
331 + return $is_formidable;
446 332 }
447 333
448 334 /**
449 335 * Checks if is a list page.
@@ -450,9 +336,8 @@
450 336 *
451 337 * @since 6.19
452 338 *
453 339 * @param string $page The name of the page to check.
454 - *
455 340 * @return bool
456 341 */
457 342 public static function is_admin_list_page( $page = 'formidable' ) {
458 343 if ( 'formidable' === $page ) {
@@ -464,9 +349,8 @@
464 349 }
465 350
466 351 if ( 'formidable-entries' === $page ) {
467 352 $action = self::simple_get( 'frm_action' );
468 -
469 353 if ( ! $action || in_array( $action, self::get_entries_listing_page_form_actions(), true ) ) {
470 354 return true;
471 355 }
472 356 }
@@ -495,13 +379,11 @@
495 379 */
496 380 public static function is_admin_page( $page = 'formidable' ) {
497 381 global $pagenow;
498 382 $get_page = self::simple_get( 'page', 'sanitize_title' );
499 -
500 383 if ( $pagenow ) {
501 - // Allow this to be true during ajax load i.e. ajax form builder loading
384 + // allow this to be true during ajax load i.e. ajax form builder loading
502 385 $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
503 -
504 386 if ( $is_page ) {
505 387 return true;
506 388 }
507 389 }
@@ -519,15 +401,15 @@
519 401 */
520 402 public static function is_view_builder_page() {
521 403 global $pagenow;
522 404
523 - if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), true ) ) {
405 + if ( $pagenow !== 'post.php' && $pagenow !== 'post-new.php' && $pagenow !== 'edit.php' ) {
524 406 return false;
525 407 }
526 408
527 409 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
528 410
529 - if ( ! $post_type ) {
411 + if ( empty( $post_type ) ) {
530 412 $post_id = self::simple_get( 'post', 'absint' );
531 413 $post = get_post( $post_id );
532 414 $post_type = $post ? $post->post_type : '';
533 415 }
@@ -545,9 +427,9 @@
545 427 public static function is_preview_page() {
546 428 global $pagenow;
547 429 $action = self::simple_get( 'action', 'sanitize_title' );
548 430
549 - return $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
431 + return $pagenow && $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
550 432 }
551 433
552 434 /**
553 435 * Check for ajax except the form preview page
@@ -568,9 +450,8 @@
568 450 }
569 451
570 452 /**
571 453 * @since 2.0.8
572 - *
573 454 * @return bool
574 455 */
575 456 public static function prevent_caching() {
576 457 global $frm_vars;
@@ -588,9 +469,8 @@
588 469 $is_admin = is_admin() && ! wp_doing_ajax();
589 470
590 471 /**
591 472 * @since 6.0
592 - *
593 473 * @param bool $is_admin
594 474 */
595 475 return apply_filters( 'frm_is_admin', $is_admin );
596 476 }
@@ -605,15 +485,14 @@
605 485 *
606 486 * @return bool
607 487 */
608 488 public static function is_empty_value( $value, $empty = '' ) {
609 - return $value === array() || $value === $empty;
489 + return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
610 490 }
611 491
612 492 /**
613 493 * @param mixed $value
614 494 * @param string $empty
615 - *
616 495 * @return bool
617 496 */
618 497 public static function is_not_empty_value( $value, $empty = '' ) {
619 498 return ! self::is_empty_value( $value, $empty );
@@ -667,9 +546,8 @@
667 546 continue;
668 547 }
669 548
670 549 $key = self::get_server_value( $key );
671 -
672 550 foreach ( explode( ',', $key ) as $ip ) {
673 551 // Just to be safe.
674 552 $ip = trim( $ip );
675 553
@@ -725,26 +603,16 @@
725 603 */
726 604 return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
727 605 }
728 606
729 - /**
730 - * @param string $param
731 - * @param mixed $default
732 - * @param string $src
733 - * @param callable|string $sanitize
734 - *
735 - * @return mixed
736 - */
737 607 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
738 - if ( str_contains( $param, '[' ) ) {
608 + if ( strpos( $param, '[' ) ) {
739 609 $params = explode( '[', $param );
740 610 $param = $params[0];
741 611 }
742 612
743 613 if ( $src === 'get' ) {
744 - // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
745 - $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
746 -
614 + $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
747 615 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
748 616 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
749 617 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
750 618 }
@@ -759,19 +627,17 @@
759 627 )
760 628 );
761 629 }
762 630
763 - if ( ! isset( $params ) || ! is_array( $value ) || ! $value ) {
764 - return $value;
765 - }
631 + if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
632 + foreach ( $params as $k => $p ) {
633 + if ( ! $k || ! is_array( $value ) ) {
634 + continue;
635 + }
766 636
767 - foreach ( $params as $k => $p ) {
768 - if ( ! $k || ! is_array( $value ) ) {
769 - continue;
637 + $p = trim( $p, ']' );
638 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
770 639 }
771 -
772 - $p = trim( $p, ']' );
773 - $value = $value[ $p ] ?? $default;
774 640 }
775 641
776 642 return $value;
777 643 }
@@ -782,9 +648,8 @@
782 648 * @param string $param The key we are trying to access data from in $_POST.
783 649 * @param mixed $default The default if nothing is being sent.
784 650 * @param callable|string $sanitize Make sure to pass a sanitize method here. This function will NOT sanitize by default.
785 651 * @param bool $serialized
786 - *
787 652 * @return mixed
788 653 */
789 654 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
790 655 return self::get_simple_request(
@@ -804,9 +669,9 @@
804 669 * @param string $param
805 670 * @param string $sanitize
806 671 * @param string $default
807 672 *
808 - * @return array|int|string
673 + * @return array|string
809 674 */
810 675 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
811 676 return self::get_simple_request(
812 677 array(
@@ -835,10 +700,10 @@
835 700 'sanitize' => 'sanitize_text_field',
836 701 'serialized' => false,
837 702 );
838 703 $args = wp_parse_args( $args, $defaults );
839 - $value = $args['default'];
840 704
705 + $value = $args['default'];
841 706 if ( $args['type'] === 'get' ) {
842 707 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
843 708 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
844 709 $value = wp_unslash( $_GET[ $args['param'] ] );
@@ -846,16 +711,16 @@
846 711 } elseif ( $args['type'] === 'post' ) {
847 712 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
848 713 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
849 714 $value = wp_unslash( $_POST[ $args['param'] ] );
850 -
851 715 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
852 716 self::unserialize_or_decode( $value );
853 717 }
854 718 }
855 719 } elseif ( isset( $_REQUEST[ $args['param'] ] ) ) {
856 - // phpcs:ignore phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
857 - $value = wp_unslash( $_REQUEST[ $args['param'] ] );
720 + // phpcs:ignore WordPress.Security.NonceVerification.Missing
721 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
722 + $value = wp_unslash( $_REQUEST[ $args['param'] ] );
858 723 }
859 724
860 725 self::sanitize_value( $args['sanitize'], $value );
861 726
@@ -868,13 +733,17 @@
868 733 * @since 2.0.8
869 734 *
870 735 * @param string $value
871 736 *
872 - * @return string Value.
737 + * @return string $value
873 738 */
874 739 public static function preserve_backslashes( $value ) {
875 740 // If backslashes have already been added, don't add them again
876 - return str_contains( $value, '\\\\' ) ? $value : addslashes( $value );
741 + if ( strpos( $value, '\\\\' ) === false ) {
742 + $value = addslashes( $value );
743 + }
744 +
745 + return $value;
877 746 }
878 747
879 748 /**
880 749 * Sanitize a value in-place.
@@ -881,9 +750,8 @@
881 750 * If $value is an array, the sanitize function will get called for each item.
882 751 *
883 752 * @param callable $sanitize
884 753 * @param mixed $value
885 - *
886 754 * @return void
887 755 */
888 756 public static function sanitize_value( $sanitize, &$value ) {
889 757 if ( ! $sanitize ) {
@@ -896,13 +764,11 @@
896 764 }
897 765
898 766 if ( is_array( $value ) ) {
899 767 $temp_values = $value;
900 -
901 768 foreach ( $temp_values as $k => $v ) {
902 769 self::sanitize_value( $sanitize, $value[ $k ] );
903 770 }
904 -
905 771 return;
906 772 }
907 773
908 774 $value = call_user_func( $sanitize, $value );
@@ -907,17 +773,10 @@
907 773
908 774 $value = call_user_func( $sanitize, $value );
909 775 }
910 776
911 - /**
912 - * @param array $sanitize_method
913 - * @param array $values
914 - *
915 - * @return void
916 - */
917 777 public static function sanitize_request( $sanitize_method, &$values ) {
918 778 $temp_values = $values;
919 -
920 779 foreach ( $temp_values as $k => $val ) {
921 780 if ( isset( $sanitize_method[ $k ] ) ) {
922 781 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
923 782 }
@@ -927,9 +786,8 @@
927 786 /**
928 787 * @since 4.0.04
929 788 *
930 789 * @param mixed $value
931 - *
932 790 * @return void
933 791 */
934 792 public static function sanitize_with_html( &$value ) {
935 793 if ( current_user_can( 'frm_edit_entries' ) || current_user_can( 'administrator' ) ) {
@@ -974,15 +832,12 @@
974 832 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
975 833 * this MUST be done, else we'll be back to the '& entity' problem.
976 834 *
977 835 * @since 4.0.04
978 - *
979 - * @param mixed $value Value to decode, passed by reference.
980 836 */
981 837 public static function decode_specialchars( &$value ) {
982 838 if ( is_array( $value ) ) {
983 839 $temp_values = $value;
984 -
985 840 foreach ( $temp_values as $k => $v ) {
986 841 self::decode_specialchars( $value[ $k ] );
987 842 }
988 843 } else {
@@ -996,13 +851,13 @@
996 851 * Adapted from wp_specialchars_decode().
997 852 *
998 853 * @since 4.03.01
999 854 *
1000 - * @param string $string The string to prep, passed by reference.
855 + * @param string $string The string to prep.
1001 856 */
1002 857 private static function decode_amp( &$string ) {
1003 858 // Don't bother if there are no entities - saves a lot of processing
1004 - if ( ! $string || ! str_contains( $string, '&' ) ) {
859 + if ( empty( $string ) || strpos( $string, '&' ) === false ) {
1005 860 return;
1006 861 }
1007 862
1008 863 $translation = array(
@@ -1040,15 +895,16 @@
1040 895 * Sanitize the value, and allow some HTML
1041 896 *
1042 897 * @since 2.0
1043 898 *
1044 - * @param string $value The value to sanitize.
1045 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
899 + * @param string $value
900 + * @param array|string $allowed 'all' for everything included as defaults.
1046 901 *
1047 902 * @return string
1048 903 */
1049 904 public static function kses( $value, $allowed = array() ) {
1050 905 $allowed_html = self::allowed_html( $allowed );
906 +
1051 907 return wp_kses( $value, $allowed_html );
1052 908 }
1053 909
1054 910 /**
@@ -1057,9 +913,8 @@
1057 913 * @since 6.18
1058 914 *
1059 915 * @param string $value The value to sanitize and output.
1060 916 * @param array|string $allowed Allowed HTML tags and attributes.
1061 - *
1062 917 * @return void
1063 918 */
1064 919 public static function kses_echo( $value, $allowed = array() ) {
1065 920 echo self::kses( $value, $allowed ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
@@ -1070,23 +925,21 @@
1070 925 *
1071 926 * @since 5.0.13
1072 927 *
1073 928 * @param string $html
1074 - *
1075 929 * @return string
1076 930 */
1077 931 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]' );
932 + $included_button_action = false !== strpos( $html, '[button_action]' );
933 + $included_back_hook = false !== strpos( $html, '[back_hook]' );
934 + $included_draft_hook = false !== strpos( $html, '[draft_hook]' );
1081 935 add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1082 936 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1083 937 $html = self::kses( $html, 'all' );
1084 938 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1085 939 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1086 -
1087 940 if ( $included_button_action ) {
1088 - if ( str_contains( $html, '<input type="submit"' ) ) {
941 + if ( false !== strpos( $html, '<input type="submit"' ) ) {
1089 942 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1090 943 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
1091 944 } else {
1092 945 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
@@ -1092,17 +945,14 @@
1092 945 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1093 946 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1094 947 }
1095 948 }
1096 -
1097 949 if ( $included_back_hook ) {
1098 950 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1099 951 }
1100 -
1101 952 if ( $included_draft_hook ) {
1102 - return str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
953 + $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1103 954 }
1104 -
1105 955 return $html;
1106 956 }
1107 957
1108 958 /**
@@ -1108,9 +958,8 @@
1108 958 /**
1109 959 * @since 5.0.13
1110 960 *
1111 961 * @param array $allowed_attr
1112 - *
1113 962 * @return array
1114 963 */
1115 964 public static function allow_visibility_style( $allowed_attr ) {
1116 965 $allowed_attr[] = 'visibility';
@@ -1120,9 +969,8 @@
1120 969 /**
1121 970 * @since 5.0.13
1122 971 *
1123 972 * @param array $allowed_html
1124 - *
1125 973 * @return array
1126 974 */
1127 975 public static function add_allowed_submit_button_tags( $allowed_html ) {
1128 976 $allowed_html['input'] = array(
@@ -1139,22 +987,17 @@
1139 987 }
1140 988
1141 989 /**
1142 990 * @since 2.05.03
1143 - *
1144 - * @param array|string $allowed
1145 - *
1146 - * @return array
1147 991 */
1148 992 private static function allowed_html( $allowed ) {
1149 993 $html = self::safe_html();
1150 994 $allowed_html = array();
1151 -
1152 995 if ( $allowed === 'all' ) {
1153 996 $allowed_html = $html;
1154 - } elseif ( $allowed ) {
997 + } elseif ( ! empty( $allowed ) ) {
1155 998 foreach ( (array) $allowed as $a ) {
1156 - $allowed_html[ $a ] = $html[ $a ] ?? array();
999 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1157 1000 }
1158 1001 }
1159 1002
1160 1003 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1161,10 +1004,8 @@
1161 1004 }
1162 1005
1163 1006 /**
1164 1007 * @since 2.05.03
1165 - *
1166 - * @return array
1167 1008 */
1168 1009 private static function safe_html() {
1169 1010 $allow_class = array(
1170 1011 'class' => true,
@@ -1316,16 +1157,14 @@
1316 1157 return;
1317 1158 }
1318 1159
1319 1160 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1320 -
1321 - if ( ! $action_name ) {
1161 + if ( empty( $action_name ) ) {
1322 1162 return;
1323 1163 }
1324 1164
1325 1165 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1326 -
1327 - if ( $new_action ) {
1166 + if ( ! empty( $new_action ) ) {
1328 1167 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1329 1168 }
1330 1169 }
1331 1170
@@ -1332,23 +1171,21 @@
1332 1171 /**
1333 1172 * Check the WP query for a parameter
1334 1173 *
1335 1174 * @since 2.0
1336 - *
1337 - * @param array|string $value
1338 - * @param string $param
1339 - *
1340 1175 * @return array|string
1341 1176 */
1342 1177 public static function get_query_var( $value, $param ) {
1343 - // phpcs:ignore Universal.Operators.StrictComparisons
1344 1178 if ( $value != '' ) {
1345 1179 return $value;
1346 1180 }
1347 1181
1348 1182 global $wp_query;
1183 + if ( isset( $wp_query->query_vars[ $param ] ) ) {
1184 + $value = $wp_query->query_vars[ $param ];
1185 + }
1349 1186
1350 - return $wp_query->query_vars[ $param ] ?? $value;
1187 + return $value;
1351 1188 }
1352 1189
1353 1190 /**
1354 1191 * Try to show the SVG if possible. Otherwise, use the font icon.
@@ -1356,21 +1193,20 @@
1356 1193 * @since 4.0.02
1357 1194 *
1358 1195 * @param string $class
1359 1196 * @param array $atts
1360 - *
1361 1197 * @return string|null
1362 1198 */
1363 1199 public static function icon_by_class( $class, $atts = array() ) {
1364 1200 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1365 -
1366 1201 if ( isset( $atts['echo'] ) ) {
1367 1202 unset( $atts['echo'] );
1368 1203 }
1369 1204
1370 1205 $html_atts = self::array_to_html_params( $atts );
1371 - $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1372 1206
1207 + $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1208 +
1373 1209 // Replace icons that have been removed or renamed.
1374 1210 $deprecated = array(
1375 1211 'frm_clone_solid_icon' => 'frm_clone_icon',
1376 1212 'frm_keyalt_icon' => 'frm_key_icon',
@@ -1375,9 +1211,8 @@
1375 1211 'frm_clone_solid_icon' => 'frm_clone_icon',
1376 1212 'frm_keyalt_icon' => 'frm_key_icon',
1377 1213 'frm_keyalt_solid_icon' => 'frm_key_solid_icon',
1378 1214 );
1379 -
1380 1215 if ( isset( $deprecated[ $icon ] ) ) {
1381 1216 $icon = $deprecated[ $icon ];
1382 1217 $class = str_replace( $icon, $deprecated[ $icon ], $class );
1383 1218 }
@@ -1384,24 +1219,21 @@
1384 1219
1385 1220 if ( $icon === $class ) {
1386 1221 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1387 1222 } else {
1388 - $class = str_contains( $icon, ' ' ) ? ' ' . $icon : '';
1389 -
1390 - if ( str_contains( $icon, ' ' ) ) {
1223 + $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
1224 + if ( strpos( $icon, ' ' ) ) {
1391 1225 $icon = explode( ' ', $icon );
1392 1226 $icon = reset( $icon );
1393 1227 }
1394 -
1395 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use href="#' . esc_attr( $icon ) . '" /></svg>';
1228 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use xlink:href="#' . esc_attr( $icon ) . '" /></svg>';
1396 1229 }
1397 1230
1398 1231 if ( $echo ) {
1399 1232 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1400 - return null;
1233 + } else {
1234 + return $icon;
1401 1235 }
1402 -
1403 - return $icon;
1404 1236 }
1405 1237
1406 1238 /**
1407 1239 * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
@@ -1408,9 +1240,8 @@
1408 1240 *
1409 1241 * @since 5.0.13
1410 1242 *
1411 1243 * @param string $icon
1412 - *
1413 1244 * @return string
1414 1245 */
1415 1246 public static function kses_icon( $icon ) {
1416 1247 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1426,15 +1257,13 @@
1426 1257 /**
1427 1258 * @since 5.0.13.1
1428 1259 *
1429 1260 * @param array $allowed_html
1430 - *
1431 1261 * @return array
1432 1262 */
1433 1263 public static function add_allowed_icon_tags( $allowed_html ) {
1434 1264 $allowed_html['svg']['data-open'] = true;
1435 1265 $allowed_html['svg']['title'] = true;
1436 - $allowed_html['svg']['tabindex'] = true;
1437 1266 return $allowed_html;
1438 1267 }
1439 1268
1440 1269 /**
@@ -1440,9 +1269,8 @@
1440 1269 /**
1441 1270 * @since 5.0.13
1442 1271 *
1443 1272 * @param array $allowed_attr
1444 - *
1445 1273 * @return array
1446 1274 */
1447 1275 public static function allow_vars_in_styles( $allowed_attr ) {
1448 1276 $allowed_attr[] = '--primary-700';
@@ -1455,9 +1283,9 @@
1455 1283 * @param bool $allow_css
1456 1284 * @param string $css_string
1457 1285 */
1458 1286 public static function allow_style( $allow_css, $css_string ) {
1459 - if ( ! $allow_css && str_starts_with( $css_string, '--primary-700:' ) ) {
1287 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-700:' ) ) {
1460 1288 $split = explode( ':', $css_string, 2 );
1461 1289 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1462 1290 }
1463 1291 return $allow_css;
@@ -1466,22 +1294,19 @@
1466 1294 /**
1467 1295 * @since 5.0.13
1468 1296 *
1469 1297 * @param string $value
1470 - *
1471 1298 * @return bool
1472 1299 */
1473 1300 private static function is_a_valid_color( $value ) {
1474 1301 $match = 0;
1475 -
1476 - if ( str_starts_with( $value, 'rgba(' ) ) {
1302 + if ( 0 === strpos( $value, 'rgba(' ) ) {
1477 1303 $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1478 - } elseif ( str_starts_with( $value, 'rgb(' ) ) {
1304 + } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1479 1305 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1480 - } elseif ( str_starts_with( $value, '#' ) ) {
1306 + } elseif ( 0 === strpos( $value, '#' ) ) {
1481 1307 $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1482 1308 }
1483 -
1484 1309 return (bool) $match;
1485 1310 }
1486 1311
1487 1312 /**
@@ -1487,9 +1312,8 @@
1487 1312 /**
1488 1313 * Include svg images.
1489 1314 *
1490 1315 * @since 4.0.02
1491 - *
1492 1316 * @return void
1493 1317 */
1494 1318 public static function include_svg() {
1495 1319 if ( self::$included_svg ) {
@@ -1508,9 +1332,8 @@
1508 1332 * @since 5.0.13 added $echo parameter.
1509 1333 *
1510 1334 * @param array $atts
1511 1335 * @param bool $echo
1512 - *
1513 1336 * @return string|void
1514 1337 */
1515 1338 public static function array_to_html_params( $atts, $echo = false ) {
1516 1339 $callback = function () use ( $atts ) {
@@ -1529,9 +1352,8 @@
1529 1352 * @since 5.0.13
1530 1353 *
1531 1354 * @param Closure $echo_function
1532 1355 * @param bool $echo
1533 - *
1534 1356 * @return string|null
1535 1357 */
1536 1358 public static function clip( $echo_function, $echo = false ) {
1537 1359 if ( ! $echo ) {
@@ -1541,9 +1363,13 @@
1541 1363 if ( is_callable( $echo_function ) ) {
1542 1364 $echo_function();
1543 1365 }
1544 1366
1545 - return $echo ? null : ob_get_clean();
1367 + if ( ! $echo ) {
1368 + $return = ob_get_contents();
1369 + ob_end_clean();
1370 + return $return;
1371 + }
1546 1372 }
1547 1373
1548 1374 /**
1549 1375 * @since 3.0
@@ -1548,18 +1374,15 @@
1548 1374 /**
1549 1375 * @since 3.0
1550 1376 *
1551 1377 * @param array $atts
1552 - *
1553 1378 * @return void
1554 1379 */
1555 1380 public static function get_admin_header( $atts ) {
1556 1381 $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1557 -
1558 1382 if ( empty( $atts['close'] ) ) {
1559 1383 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1560 1384 }
1561 -
1562 1385 if ( ! isset( $atts['import_link'] ) ) {
1563 1386 $atts['import_link'] = false;
1564 1387 }
1565 1388
@@ -1569,19 +1392,16 @@
1569 1392 /**
1570 1393 * @since 6.0
1571 1394 *
1572 1395 * @param string $type
1573 - *
1574 1396 * @return void
1575 1397 */
1576 1398 public static function import_link( $type = 'secondary' ) {
1577 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1578 1399 ?>
1579 1400 <a href="<?php echo esc_url( admin_url( 'admin.php?page=formidable-import' ) ); ?>" class="button frm-button-<?php echo esc_attr( $type ); ?> frm_animate_bg">
1580 1401 <?php esc_html_e( 'Import', 'formidable' ); ?>
1581 1402 </a>
1582 1403 <?php
1583 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1584 1404 }
1585 1405
1586 1406 /**
1587 1407 * Print applicable admin banner.
@@ -1588,9 +1408,8 @@
1588 1408 *
1589 1409 * @since 5.4.2
1590 1410 *
1591 1411 * @param bool $should_show_lite_upgrade
1592 - *
1593 1412 * @return void
1594 1413 */
1595 1414 public static function print_admin_banner( $should_show_lite_upgrade ) {
1596 1415 if ( ! current_user_can( 'administrator' ) ) {
@@ -1597,32 +1416,32 @@
1597 1416 FrmInbox::maybe_show_banner();
1598 1417 return;
1599 1418 }
1600 1419
1601 - if ( FrmSalesApi::maybe_show_banner() || self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1420 + if ( self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1602 1421 // Print license warning or inbox banner and exit if either prints.
1603 1422 // And exit before printing the upgrade bar if it shouldn't be shown.
1604 1423 return;
1605 1424 }
1606 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1607 1425 ?>
1608 1426 <div class="frm-upgrade-bar">
1609 1427 <div class="frm-upgrade-bar-inner">
1610 1428 <?php
1611 1429 $cta_text = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_text' );
1612 -
1613 1430 if ( ! $cta_text ) {
1614 1431 $cta_text = __( 'upgrading to PRO', 'formidable' );
1615 1432 }
1616 1433
1617 1434 $upgrade_link = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_link' );
1618 - $utm = array(
1619 - 'campaign' => 'settings-license',
1620 - 'content' => 'lite-banner',
1621 - );
1435 + if ( ! $upgrade_link ) {
1436 + $upgrade_link = self::admin_upgrade_link(
1437 + array(
1438 + 'medium' => 'settings-license',
1439 + 'content' => 'lite-banner',
1440 + )
1441 + );
1442 + }
1622 1443
1623 - $upgrade_link = $upgrade_link ? self::maybe_add_missing_utm( $upgrade_link, $utm ) : self::admin_upgrade_link( $utm );
1624 -
1625 1444 printf(
1626 1445 /* translators: %1$s: Start link HTML, %2$s: CTA text ("upgrading to PRO" by default), %3$s: End link HTML */
1627 1446 esc_html__( 'You\'re using Formidable Forms Lite. To unlock more features consider %1$s%2$s%3$s.', 'formidable' ),
1628 1447 '<a href="' . esc_url( $upgrade_link ) . '">',
@@ -1632,9 +1451,8 @@
1632 1451 ?>
1633 1452 </div>
1634 1453 </div>
1635 1454 <?php
1636 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1637 1455 }
1638 1456
1639 1457 /**
1640 1458 * @since 5.4.2
@@ -1648,9 +1466,8 @@
1648 1466 /**
1649 1467 * Render a button for a new item (Form, Application, etc).
1650 1468 *
1651 1469 * @since 3.0
1652 - *
1653 1470 * @param array $atts {
1654 1471 * Details about the button.
1655 1472 *
1656 1473 * @type array $link_hook Custom link hook, calls do_action and exits early.
@@ -1657,9 +1474,8 @@
1657 1474 * @type string $new_link Href value, default #.
1658 1475 * @type string $class Custom class names, space separated.
1659 1476 * @type string $button_text Button text. Default "Add New".
1660 1477 * }
1661 - *
1662 1478 * @return void
1663 1479 */
1664 1480 public static function add_new_item_link( $atts ) {
1665 1481 if ( isset( $atts['link_hook'] ) ) {
@@ -1685,12 +1501,8 @@
1685 1501 }
1686 1502
1687 1503 /**
1688 1504 * @since 3.06
1689 - *
1690 - * @param array $atts
1691 - *
1692 - * @return void
1693 1505 */
1694 1506 public static function show_search_box( $atts ) {
1695 1507 $defaults = array(
1696 1508 'placeholder' => '',
@@ -1697,9 +1509,8 @@
1697 1509 'tosearch' => '',
1698 1510 'text' => __( 'Search', 'formidable' ),
1699 1511 'input_id' => '',
1700 1512 'value' => false,
1701 - 'class' => '',
1702 1513 );
1703 1514 $atts = array_merge( $defaults, $atts );
1704 1515
1705 1516 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
@@ -1706,9 +1517,8 @@
1706 1517 $atts['tosearch'] = 'frm-card';
1707 1518 }
1708 1519
1709 1520 $class = 'frm-search-input';
1710 -
1711 1521 if ( ! empty( $atts['tosearch'] ) ) {
1712 1522 $class .= ' frm-auto-search';
1713 1523 }
1714 1524
@@ -1732,15 +1542,14 @@
1732 1542
1733 1543 if ( ! empty( $atts['tosearch'] ) ) {
1734 1544 $input_atts['autocomplete'] = 'off';
1735 1545 }
1736 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1737 1546 ?>
1738 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1547 + <p class="frm-search">
1739 1548 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1740 1549 <?php echo esc_html( $atts['text'] ); ?>:
1741 1550 </label>
1742 - <?php self::icon_by_class( 'frmfont frm_search_icon frm_svg20' ); ?>
1551 + <span class="frmfont frm_search_icon"></span>
1743 1552 <input <?php self::array_to_html_params( $input_atts, true ); ?> />
1744 1553 <?php
1745 1554 if ( empty( $atts['tosearch'] ) ) {
1746 1555 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
@@ -1747,21 +1556,17 @@
1747 1556 }
1748 1557 ?>
1749 1558 </p>
1750 1559 <?php
1751 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1752 1560 }
1753 1561
1754 1562 /**
1755 - * @param string $type Hook type slug.
1756 - * @param object|null $object Optional related object.
1757 - *
1563 + * @param string $type
1758 1564 * @return void
1759 1565 */
1760 1566 public static function trigger_hook_load( $type, $object = null ) {
1761 1567 // Only load the form hooks once.
1762 1568 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1763 -
1764 1569 if ( ! $hooks_loaded ) {
1765 1570 do_action( 'frm_load_' . $type . '_hooks' );
1766 1571 }
1767 1572 }
@@ -1820,14 +1625,14 @@
1820 1625 * True when value is 1, true, 'true', 'yes'
1821 1626 *
1822 1627 * @since 1.07.10
1823 1628 *
1824 - * @param bool|int|string $value The value to compare.
1629 + * @param string $value The value to compare.
1825 1630 *
1826 1631 * @return bool
1827 1632 */
1828 1633 public static function is_true( $value ) {
1829 - return true === $value || '1' === (string) $value || 'true' === $value || 'yes' === $value;
1634 + return true === $value || 1 == $value || 'true' === $value || 'yes' === $value;
1830 1635 }
1831 1636
1832 1637 /**
1833 1638 * Gets all post from a specific post type.
@@ -1835,9 +1640,8 @@
1835 1640 *
1836 1641 * @since 4.10.01 Add `$post_type` argument.
1837 1642 *
1838 1643 * @param string $post_type Post type to query. Default is `page`.
1839 - *
1840 1644 * @return WP_Post[]
1841 1645 */
1842 1646 public static function get_pages( $post_type = 'page' ) {
1843 1647 $query = array(
@@ -1856,9 +1660,8 @@
1856 1660 *
1857 1661 * @since 5.0.09
1858 1662 *
1859 1663 * @param string $post_type Post type to query. Default is `page`.
1860 - *
1861 1664 * @return array
1862 1665 */
1863 1666 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1864 1667 return FrmDb::get_results(
@@ -1883,12 +1686,13 @@
1883 1686 *
1884 1687 * @param array $args Selection arguments.
1885 1688 */
1886 1689 public static function maybe_autocomplete_pages_options( $args ) {
1887 - $args = self::preformat_selection_args( $args );
1690 + $args = self::preformat_selection_args( $args );
1691 +
1888 1692 $pages_count = wp_count_posts( $args['post_type'] );
1889 1693
1890 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1694 + if ( $pages_count->publish <= 50 ) {
1891 1695 self::wp_pages_dropdown( $args );
1892 1696 return;
1893 1697 }
1894 1698
@@ -1912,109 +1716,8 @@
1912 1716 <?php
1913 1717 }
1914 1718
1915 1719 /**
1916 - * Maybe show an HTML select or autocomplete input based on the number of options.
1917 - *
1918 - * @since 6.21
1919 - *
1920 - * @param array $args Args. See the method for details.
1921 - */
1922 - public static function maybe_autocomplete_options( $args ) {
1923 - $defaults = array(
1924 - 'truncate' => false,
1925 - 'placeholder' => ' ',
1926 - 'name' => '',
1927 - 'id' => '',
1928 - 'selected' => '',
1929 - 'source' => array(),
1930 - 'dropdown_limit' => 50,
1931 - 'autocomplete_placeholder' => __( 'Select an option', 'formidable' ),
1932 - 'value_key' => 'value',
1933 - 'label_key' => 'label',
1934 - );
1935 -
1936 - $args = wp_parse_args( $args, $defaults );
1937 - $html_attrs = array();
1938 -
1939 - if ( ! empty( $args['name'] ) ) {
1940 - $html_attrs['name'] = $args['name'];
1941 - }
1942 -
1943 - if ( ! empty( $args['id'] ) ) {
1944 - $html_attrs['id'] = $args['id'];
1945 - }
1946 -
1947 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1948 - if ( count( $args['source'] ) <= $args['dropdown_limit'] ) {
1949 - ?>
1950 - <select <?php self::array_to_html_params( $html_attrs, true ); ?>>
1951 - <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
1952 - <?php
1953 - foreach ( $args['source'] as $key => $source ) :
1954 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1955 -
1956 - if ( ! empty( $args['truncate'] ) ) {
1957 - $value_label['label'] = self::truncate( $value_label['label'], $args['truncate'] );
1958 - }
1959 - ?>
1960 - <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 ?>
1961 - <?php endforeach; ?>
1962 - </select>
1963 - <?php
1964 - return;
1965 - }
1966 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1967 -
1968 - $options = array();
1969 - $autocomplete_value = '';
1970 -
1971 - foreach ( $args['source'] as $key => $source ) {
1972 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1973 -
1974 - if ( $value_label['value'] === $args['selected'] ) {
1975 - $autocomplete_value = $value_label['label'];
1976 - }
1977 -
1978 - $options[] = $value_label;
1979 - }
1980 -
1981 - $html_attrs['type'] = 'hidden';
1982 - $html_attrs['class'] = 'frm_autocomplete_value_input';
1983 - $html_attrs['value'] = $args['selected'];
1984 - ?>
1985 - <input type="text" class="frm-custom-search"
1986 - data-source="<?php echo esc_attr( wp_json_encode( $options ) ); ?>"
1987 - placeholder="<?php echo esc_attr( $args['autocomplete_placeholder'] ); ?>"
1988 - value="<?php echo esc_attr( $autocomplete_value ); ?>" />
1989 - <input <?php self::array_to_html_params( $html_attrs, true ); ?> />
1990 - <?php
1991 - }
1992 -
1993 - /**
1994 - * Gets dropdown value and label from autodropdown option.
1995 - *
1996 - * @since 6.21
1997 - *
1998 - * @param array|string $option Autocomplete option.
1999 - * @param string $key Array key of the option.
2000 - * @param array $args See {@see FrmAppHelper::maybe_autocomplete_options()}.
2001 - *
2002 - * @return array
2003 - */
2004 - private static function get_dropdown_value_and_label_from_option( $option, $key, $args ) {
2005 - if ( is_array( $option ) ) {
2006 - $value = $option[ $args['value_key'] ] ?? '';
2007 - $label = $option[ $args['label_key'] ] ?? '';
2008 - } else {
2009 - $value = $key;
2010 - $label = $option;
2011 - }
2012 -
2013 - return compact( 'value', 'label' );
2014 - }
2015 -
2016 - /**
2017 1720 * @param array $args
2018 1721 * @param string $page_id Deprecated.
2019 1722 * @param bool $truncate Deprecated.
2020 1723 */
@@ -2022,9 +1725,9 @@
2022 1725 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2023 1726
2024 1727 $pages = self::get_post_ids_and_titles( $args['post_type'] );
2025 1728 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
2026 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1729 +
2027 1730 ?>
2028 1731 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2029 1732 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2030 1733 <?php foreach ( $pages as $page ) { ?>
@@ -2033,9 +1736,8 @@
2033 1736 </option>
2034 1737 <?php } ?>
2035 1738 </select>
2036 1739 <?php
2037 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2038 1740 }
2039 1741
2040 1742 /**
2041 1743 * Fill in missing parameters passed to wp_pages_dropdown().
@@ -2041,14 +1743,8 @@
2041 1743 * Fill in missing parameters passed to wp_pages_dropdown().
2042 1744 * This is for reverse compatibility with switching 3 params to 1.
2043 1745 *
2044 1746 * @since 4.03.06
2045 - *
2046 - * @param string $page_id Deprecated.
2047 - * @param bool $truncate Deprecated.
2048 - * @param mixed $args
2049 - *
2050 - * @return void
2051 1747 */
2052 1748 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2053 1749 if ( ! is_array( $args ) ) {
2054 1750 $args = array(
@@ -2065,12 +1761,8 @@
2065 1761 * Filter to format args for page dropdown or autocomplete
2066 1762 *
2067 1763 * @since 4.03.06
2068 1764 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2069 - *
2070 - * @param array $args
2071 - *
2072 - * @return array
2073 1765 */
2074 1766 private static function preformat_selection_args( $args ) {
2075 1767 $defaults = array(
2076 1768 'truncate' => false,
@@ -2083,18 +1775,13 @@
2083 1775
2084 1776 return array_merge( $defaults, $args );
2085 1777 }
2086 1778
2087 - /**
2088 - * @param int $post_id
2089 - *
2090 - * @return string
2091 - */
2092 1779 public static function post_edit_link( $post_id ) {
2093 1780 $post = get_post( $post_id );
2094 -
2095 1781 if ( $post ) {
2096 1782 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1783 +
2097 1784 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2098 1785 }
2099 1786
2100 1787 return '';
@@ -2107,9 +1794,11 @@
2107 1794 *
2108 1795 * @return bool
2109 1796 */
2110 1797 public static function is_full_screen() {
2111 - return self::is_form_builder_page() || self::is_style_editor_page() || self::is_full_screen_view_builder_page();
1798 + return self::is_form_builder_page() ||
1799 + self::is_style_editor_page() ||
1800 + self::is_full_screen_view_builder_page();
2112 1801 }
2113 1802
2114 1803 /**
2115 1804 * Check if user is on the style editor or its alternative URL.
@@ -2119,9 +1808,8 @@
2119 1808 * @since 5.5.3
2120 1809 * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
2121 1810 *
2122 1811 * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
2123 - *
2124 1812 * @return bool
2125 1813 */
2126 1814 public static function is_style_editor_page( $view = '' ) {
2127 1815 if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
@@ -2158,9 +1846,8 @@
2158 1846 * @param array|string $capability
2159 1847 * @param string $multiple 'single' and 'multiple'.
2160 1848 */
2161 1849 public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
2162 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
2163 1850 ?>
2164 1851 <select name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $field_name ); ?>"
2165 1852 <?php echo 'multiple' === $multiple ? 'multiple="multiple"' : ''; ?>
2166 1853 class="frm_multiselect">
@@ -2166,14 +1853,12 @@
2166 1853 class="frm_multiselect">
2167 1854 <?php self::roles_options( $capability ); ?>
2168 1855 </select>
2169 1856 <?php
2170 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2171 1857 }
2172 1858
2173 1859 /**
2174 1860 * @since 4.07
2175 - *
2176 1861 * @param array|string $selected
2177 1862 * @param string $current
2178 1863 */
2179 1864 private static function selected( $selected, $current ) {
@@ -2188,9 +1873,8 @@
2188 1873 * @param array|string $capability
2189 1874 */
2190 1875 public static function roles_options( $capability ) {
2191 1876 global $frm_vars;
2192 -
2193 1877 if ( isset( $frm_vars['editable_roles'] ) ) {
2194 1878 $editable_roles = $frm_vars['editable_roles'];
2195 1879 } else {
2196 1880 $editable_roles = get_editable_roles();
@@ -2199,9 +1883,9 @@
2199 1883
2200 1884 foreach ( $editable_roles as $role => $details ) {
2201 1885 $name = translate_user_role( $details['name'] );
2202 1886 ?>
2203 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
1887 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?> </option>
2204 1888 <?php
2205 1889 unset( $role, $details );
2206 1890 }
2207 1891 }
@@ -2211,9 +1895,8 @@
2211 1895 *
2212 1896 * @since 5.0 Parameter `$type` supports `pro_only` value.
2213 1897 *
2214 1898 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2215 - *
2216 1899 * @return array
2217 1900 */
2218 1901 public static function frm_capabilities( $type = 'auto' ) {
2219 1902 if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
@@ -2231,8 +1914,14 @@
2231 1914 * @param array<string,string> $pro_cap
2232 1915 */
2233 1916 $pro_cap = apply_filters( 'frm_pro_capabilities', $pro_cap );
2234 1917
1918 + if ( ! array_key_exists( 'frm_edit_displays', $pro_cap ) && is_callable( 'FrmProAppHelper::views_is_installed' ) && FrmProAppHelper::views_is_installed() ) {
1919 + // For backward compatibility, add the Add/Edit Views permission if Pro is not up to date.
1920 + // This was added in 6.5.4. Remove this in the future.
1921 + $pro_cap['frm_edit_displays'] = __( 'Add/Edit Views', 'formidable' );
1922 + }
1923 +
2235 1924 if ( 'pro_only' === $type ) {
2236 1925 return $pro_cap;
2237 1926 }
2238 1927
@@ -2278,18 +1967,21 @@
2278 1967 if ( $role === 'loggedin' || ! $role ) {
2279 1968 return is_user_logged_in();
2280 1969 }
2281 1970
2282 - if ( (int) $role === 1 ) {
1971 + if ( $role == 1 ) {
2283 1972 $role = 'administrator';
2284 1973 }
2285 1974
2286 - return is_user_logged_in() ? current_user_can( $role ) : false;
1975 + if ( ! is_user_logged_in() ) {
1976 + return false;
1977 + }
1978 +
1979 + return current_user_can( $role );
2287 1980 }
2288 1981
2289 1982 /**
2290 1983 * @param array|string $needed_role
2291 - *
2292 1984 * @return bool
2293 1985 */
2294 1986 public static function user_has_permission( $needed_role ) {
2295 1987 if ( is_array( $needed_role ) ) {
@@ -2303,20 +1995,18 @@
2303 1995 }
2304 1996
2305 1997 $can = self::current_user_can( $needed_role );
2306 1998
2307 - if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ), true ) ) {
1999 + if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ) ) ) {
2308 2000 return $can;
2309 2001 }
2310 2002
2311 2003 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2312 -
2313 2004 foreach ( $roles as $role ) {
2314 2005 if ( current_user_can( $role ) ) {
2315 2006 return true;
2316 2007 }
2317 -
2318 - if ( $role === $needed_role ) {
2008 + if ( $role == $needed_role ) {
2319 2009 break;
2320 2010 }
2321 2011 }
2322 2012
@@ -2337,9 +2027,8 @@
2337 2027
2338 2028 $user_id = get_current_user_id();
2339 2029 $user = new WP_User( $user_id );
2340 2030 $frm_roles = self::frm_capabilities();
2341 -
2342 2031 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2343 2032 $user->add_cap( $frm_role );
2344 2033 unset( $frm_role, $frm_role_description );
2345 2034 }
@@ -2350,9 +2039,8 @@
2350 2039 *
2351 2040 * @since 2.0.6
2352 2041 *
2353 2042 * @param string $cap
2354 - *
2355 2043 * @return void
2356 2044 */
2357 2045 public static function force_capability( $cap = 'frm_change_settings' ) {
2358 2046 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
@@ -2357,9 +2045,8 @@
2357 2045 public static function force_capability( $cap = 'frm_change_settings' ) {
2358 2046 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
2359 2047 $role = get_role( 'administrator' );
2360 2048 $frm_roles = self::frm_capabilities();
2361 -
2362 2049 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2363 2050 $role->add_cap( $frm_role );
2364 2051 }
2365 2052 }
@@ -2371,22 +2058,17 @@
2371 2058 *
2372 2059 * @since 2.0
2373 2060 *
2374 2061 * @param string $permission
2375 - * @param string $show_message
2376 2062 */
2377 2063 public static function permission_check( $permission, $show_message = 'show' ) {
2378 2064 $permission_error = self::permission_nonce_error( $permission );
2379 -
2380 - if ( $permission_error === false ) {
2381 - return;
2065 + if ( $permission_error !== false ) {
2066 + if ( 'hide' == $show_message ) {
2067 + $permission_error = '';
2068 + }
2069 + wp_die( esc_html( $permission_error ) );
2382 2070 }
2383 -
2384 - if ( 'hide' === $show_message ) {
2385 - $permission_error = '';
2386 - }
2387 -
2388 - wp_die( esc_html( $permission_error ) );
2389 2071 }
2390 2072
2391 2073 /**
2392 2074 * Check user permission and nonce
@@ -2393,27 +2075,24 @@
2393 2075 *
2394 2076 * @since 2.0
2395 2077 *
2396 2078 * @param string $permission
2397 - * @param string $nonce_name
2398 - * @param string $nonce
2399 2079 *
2400 2080 * @return false|string The permission message or false if allowed
2401 2081 */
2402 2082 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
2403 - if ( $permission && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2083 + if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2404 2084 $frm_settings = self::get_settings();
2085 +
2405 2086 return $frm_settings->admin_permission;
2406 2087 }
2407 2088
2408 2089 $error = false;
2409 -
2410 - if ( ! $nonce_name ) {
2090 + if ( empty( $nonce_name ) ) {
2411 2091 return $error;
2412 2092 }
2413 2093
2414 2094 $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2415 -
2416 2095 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2417 2096 $frm_settings = self::get_settings();
2418 2097 $error = $frm_settings->admin_permission;
2419 2098 }
@@ -2420,14 +2099,8 @@
2420 2099
2421 2100 return $error;
2422 2101 }
2423 2102
2424 - /**
2425 - * @param array|string $values
2426 - * @param string $current
2427 - *
2428 - * @return void
2429 - */
2430 2103 public static function checked( $values, $current ) {
2431 2104 if ( self::check_selected( $values, $current ) ) {
2432 2105 echo ' checked="checked"';
2433 2106 }
@@ -2432,34 +2105,25 @@
2432 2105 echo ' checked="checked"';
2433 2106 }
2434 2107 }
2435 2108
2436 - /**
2437 - * @param array|string $values
2438 - * @param string|null $current
2439 - *
2440 - * @return bool
2441 - */
2442 2109 public static function check_selected( $values, $current ) {
2443 - $values = self::recursive_function_map( $values, 'trim' );
2444 - $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2110 + $values = self::recursive_function_map( $values, 'trim' );
2111 + $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2112 +
2445 2113 $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
2446 2114
2447 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict, Universal.Operators.StrictComparisons
2448 - return is_array( $values ) ? in_array( $current, $values ) : $values == $current;
2115 + return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2449 2116 }
2450 2117
2451 - /**
2452 - * @param array|string $value
2453 - * @param callable|string $function
2454 - *
2455 - * @return array|string
2456 - */
2457 2118 public static function recursive_function_map( $value, $function ) {
2458 2119 if ( is_array( $value ) ) {
2459 2120 $original_function = $function;
2460 - $function = count( $value ) ? explode( ', ', FrmDb::prepare_array_values( $value, $function ) ) : array( $function );
2461 -
2121 + if ( count( $value ) ) {
2122 + $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
2123 + } else {
2124 + $function = array( $function );
2125 + }
2462 2126 if ( ! self::is_assoc( $value ) ) {
2463 2127 $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2464 2128 } else {
2465 2129 foreach ( $value as $k => $v ) {
@@ -2470,9 +2134,9 @@
2470 2134 }
2471 2135 } else {
2472 2136 $value = self::maybe_update_value_if_null( $value, $function );
2473 2137 $value = call_user_func( $function, $value );
2474 - }//end if
2138 + }
2475 2139
2476 2140 return $value;
2477 2141 }
2478 2142
@@ -2479,27 +2143,20 @@
2479 2143 /**
2480 2144 * Updates value to empty string if it is null and being passed to a string function.
2481 2145 *
2482 2146 * @since 6.8.4
2483 - *
2484 2147 * @param mixed $value
2485 2148 * @param string $function
2486 - *
2487 2149 * @return mixed
2488 2150 */
2489 2151 private static function maybe_update_value_if_null( $value, $function ) {
2490 2152 if ( null === $value && in_array( $function, array( 'trim', 'strlen' ), true ) ) {
2491 - return '';
2153 + $value = '';
2492 2154 }
2493 2155
2494 2156 return $value;
2495 2157 }
2496 2158
2497 - /**
2498 - * @param array $array
2499 - *
2500 - * @return bool
2501 - */
2502 2159 public static function is_assoc( $array ) {
2503 2160 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2504 2161 }
2505 2162
@@ -2504,22 +2161,16 @@
2504 2161 }
2505 2162
2506 2163 /**
2507 2164 * Flatten a multi-dimensional array
2508 - *
2509 - * @param array $array
2510 - * @param string $keys
2511 - *
2512 - * @return array
2513 2165 */
2514 2166 public static function array_flatten( $array, $keys = 'keep' ) {
2515 2167 $return = array();
2516 -
2517 2168 foreach ( $array as $key => $value ) {
2518 2169 if ( is_array( $value ) ) {
2519 2170 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2520 2171 } elseif ( $keys === 'keep' ) {
2521 - $return[ $key ] = $value;
2172 + $return[ $key ] = $value;
2522 2173 } else {
2523 2174 $return[] = $value;
2524 2175 }
2525 2176 }
@@ -2533,9 +2184,8 @@
2533 2184 * @since 6.16.1
2534 2185 *
2535 2186 * @param string $sep
2536 2187 * @param array $array
2537 - *
2538 2188 * @return string
2539 2189 */
2540 2190 public static function safe_implode( $sep, $array ) {
2541 2191 $array = self::array_flatten( $array );
@@ -2544,18 +2194,15 @@
2544 2194
2545 2195 /**
2546 2196 * @param string $text
2547 2197 * @param bool $is_rich_text
2548 - *
2549 2198 * @return string
2550 2199 */
2551 2200 public static function esc_textarea( $text, $is_rich_text = false ) {
2552 2201 $safe_text = str_replace( '&quot;', '"', $text );
2553 -
2554 2202 if ( ! $is_rich_text ) {
2555 2203 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2556 2204 }
2557 -
2558 2205 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2559 2206
2560 2207 /**
2561 2208 * @param string $safe_text
@@ -2567,59 +2214,44 @@
2567 2214 /**
2568 2215 * Add auto paragraphs to text areas
2569 2216 *
2570 2217 * @since 2.0
2571 - *
2572 - * @param mixed $content
2573 - *
2574 - * @return mixed
2575 2218 */
2576 2219 public static function use_wpautop( $content ) {
2577 2220 if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
2578 - return wpautop( str_replace( '<br>', '<br />', $content ) );
2221 + $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2579 2222 }
2580 2223
2581 2224 return $content;
2582 2225 }
2583 2226
2584 - /**
2585 - * Replace quotes with their HTML entities.
2586 - *
2587 - * @param string $val
2588 - *
2589 - * @return string
2590 - */
2591 2227 public static function replace_quotes( $val ) {
2592 2228 // Replace double quotes.
2593 2229 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2594 2230
2595 2231 // Replace single quotes.
2596 - return str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
2232 + $val = str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
2233 +
2234 + return $val;
2597 2235 }
2598 2236
2599 2237 /**
2600 - * @param string $handle
2601 - * @param int|string $default
2602 - *
2603 - * @return int|string
2238 + * @param string $handle
2604 2239 */
2605 2240 public static function script_version( $handle, $default = 0 ) {
2606 2241 global $wp_scripts;
2607 -
2608 2242 if ( ! $wp_scripts ) {
2609 2243 return $default;
2610 2244 }
2611 2245
2612 2246 $ver = $default;
2613 -
2614 2247 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2615 2248 return $ver;
2616 2249 }
2617 2250
2618 2251 $query = $wp_scripts->registered[ $handle ];
2619 -
2620 2252 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2621 - return $query->ver;
2253 + $ver = $query->ver;
2622 2254 }
2623 2255
2624 2256 return $ver;
2625 2257 }
@@ -2628,9 +2260,8 @@
2628 2260 * @since 5.0.13 added $echo param.
2629 2261 *
2630 2262 * @param string $url
2631 2263 * @param bool $echo
2632 - *
2633 2264 * @return string|null
2634 2265 */
2635 2266 public static function js_redirect( $url, $echo = false ) {
2636 2267 $callback = function () use ( $url ) {
@@ -2638,13 +2269,8 @@
2638 2269 };
2639 2270 return self::clip( $callback, $echo );
2640 2271 }
2641 2272
2642 - /**
2643 - * @param int|string $user_id
2644 - *
2645 - * @return int|string
2646 - */
2647 2273 public static function get_user_id_param( $user_id ) {
2648 2274 if ( ! $user_id || is_numeric( $user_id ) ) {
2649 2275 return $user_id;
2650 2276 }
@@ -2649,13 +2275,16 @@
2649 2275 return $user_id;
2650 2276 }
2651 2277
2652 2278 $user_id = sanitize_text_field( $user_id );
2653 -
2654 2279 if ( $user_id === 'current' ) {
2655 2280 $user_id = get_current_user_id();
2656 2281 } else {
2657 - $user = is_email( $user_id ) ? get_user_by( 'email', $user_id ) : get_user_by( 'login', $user_id );
2282 + if ( is_email( $user_id ) ) {
2283 + $user = get_user_by( 'email', $user_id );
2284 + } else {
2285 + $user = get_user_by( 'login', $user_id );
2286 + }
2658 2287
2659 2288 if ( $user ) {
2660 2289 $user_id = $user->ID;
2661 2290 }
@@ -2667,9 +2296,8 @@
2667 2296
2668 2297 /**
2669 2298 * @param string $filename
2670 2299 * @param array $atts
2671 - *
2672 2300 * @return false|string
2673 2301 */
2674 2302 public static function get_file_contents( $filename, $atts = array() ) {
2675 2303 if ( ! is_file( $filename ) ) {
@@ -2678,9 +2306,12 @@
2678 2306
2679 2307 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2680 2308 ob_start();
2681 2309 include $filename;
2682 - return ob_get_clean();
2310 + $contents = ob_get_contents();
2311 + ob_end_clean();
2312 +
2313 + return $contents;
2683 2314 }
2684 2315
2685 2316 /**
2686 2317 * @param string $name
@@ -2690,9 +2321,8 @@
2690 2321 * @param int $num_chars
2691 2322 */
2692 2323 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2693 2324 $key = '';
2694 -
2695 2325 if ( $name ) {
2696 2326 $key = sanitize_key( $name );
2697 2327 $key = self::maybe_clear_long_key( $key, $column );
2698 2328 }
@@ -2712,31 +2342,31 @@
2712 2342 $column
2713 2343 );
2714 2344
2715 2345 // Create a unique field id if it has already been used.
2716 - if ( ! in_array( $key, $similar_keys, true ) ) {
2717 - return $key;
2718 - }
2346 + if ( in_array( $key, $similar_keys, true ) ) {
2347 + $key = self::maybe_truncate_key_before_appending( $column, $key );
2719 2348
2720 - $key = self::maybe_truncate_key_before_appending( $column, $key );
2349 + /**
2350 + * Allow for a custom separator between the attempted key and the generated suffix.
2351 + *
2352 + * @since 5.2.03
2353 + *
2354 + * @param string $separator. Default empty.
2355 + * @param string $key the key without the added suffix.
2356 + */
2357 + $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
2721 2358
2722 - /**
2723 - * Allow for a custom separator between the attempted key and the generated suffix.
2724 - *
2725 - * @since 5.2.03
2726 - *
2727 - * @param string $separator. Default empty.
2728 - * @param string $key the key without the added suffix.
2729 - */
2730 - $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
2359 + $suffix = 2;
2360 + do {
2361 + $key_check = $key . $separator . $suffix;
2362 + ++$suffix;
2363 + } while ( in_array( $key_check, $similar_keys, true ) );
2731 2364
2732 - $suffix = 2;
2733 - do {
2734 - $key_check = $key . $separator . $suffix;
2735 - ++$suffix;
2736 - } while ( in_array( $key_check, $similar_keys, true ) );
2365 + $key = $key_check;
2366 + }//end if
2737 2367
2738 - return $key_check;
2368 + return $key;
2739 2369 }
2740 2370
2741 2371 /**
2742 2372 * Avoid trying to append to a really long key,
@@ -2743,26 +2373,20 @@
2743 2373 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2744 2374 *
2745 2375 * @param string $column
2746 2376 * @param string $key
2747 - *
2748 2377 * @return string
2749 2378 */
2750 2379 private static function maybe_truncate_key_before_appending( $column, $key ) {
2751 - if ( ! in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2752 - return $key;
2753 - }
2754 -
2755 - $max_key_length_before_truncating = 60;
2756 -
2757 - if ( strlen( $key ) > $max_key_length_before_truncating ) {
2758 - $key = substr( $key, 0, $max_key_length_before_truncating );
2759 -
2760 - if ( is_numeric( $key ) ) {
2761 - $key .= 'a';
2380 + if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2381 + $max_key_length_before_truncating = 60;
2382 + if ( strlen( $key ) > $max_key_length_before_truncating ) {
2383 + $key = substr( $key, 0, $max_key_length_before_truncating );
2384 + if ( is_numeric( $key ) ) {
2385 + $key .= 'a';
2386 + }
2762 2387 }
2763 2388 }
2764 -
2765 2389 return $key;
2766 2390 }
2767 2391
2768 2392 /**
@@ -2769,36 +2393,31 @@
2769 2393 * Possibly reset a key to avoid conflicts with column size limits.
2770 2394 *
2771 2395 * @param string $key
2772 2396 * @param string $column
2773 - *
2774 2397 * @return string either the original key value, or an empty string if the key was too long.
2775 2398 */
2776 2399 private static function maybe_clear_long_key( $key, $column ) {
2777 2400 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
2778 - return '';
2401 + $key = '';
2779 2402 }
2780 2403 return $key;
2781 2404 }
2782 2405
2783 2406 /**
2784 - * @since 6.21 This is changed from `private` to `public`.
2785 - *
2786 2407 * @param int $num_chars
2787 - *
2788 2408 * @return string
2789 2409 */
2790 - public static function generate_new_key( $num_chars ) {
2791 - $max_slug_value = 36 ** $num_chars;
2410 + private static function generate_new_key( $num_chars ) {
2411 + $max_slug_value = pow( 36, $num_chars );
2792 2412
2793 2413 // We want to have at least 2 characters in the slug.
2794 2414 $min_slug_value = 37;
2795 - return base_convert( random_int( $min_slug_value, $max_slug_value ), 10, 36 );
2415 + return base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2796 2416 }
2797 2417
2798 2418 /**
2799 2419 * @param string $key
2800 - *
2801 2420 * @return string
2802 2421 */
2803 2422 private static function prevent_numeric_and_reserved_keys( $key ) {
2804 2423 if ( is_numeric( $key ) ) {
@@ -2812,14 +2431,12 @@
2812 2431 'editlink',
2813 2432 'siteurl',
2814 2433 'evenodd',
2815 2434 );
2816 -
2817 2435 if ( in_array( $key, $not_allowed, true ) ) {
2818 2436 $key .= 'a';
2819 2437 }
2820 2438 }
2821 -
2822 2439 return $key;
2823 2440 }
2824 2441
2825 2442 /**
@@ -2838,9 +2455,9 @@
2838 2455 if ( ! $record ) {
2839 2456 return false;
2840 2457 }
2841 2458
2842 - if ( ! $post_values ) {
2459 + if ( empty( $post_values ) ) {
2843 2460 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
2844 2461 }
2845 2462
2846 2463 $values = array(
@@ -2848,9 +2465,9 @@
2848 2465 'fields' => array(),
2849 2466 );
2850 2467
2851 2468 foreach ( array( 'name', 'description' ) as $var ) {
2852 - $default_val = $record->{$var} ?? '';
2469 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2853 2470 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2854 2471 unset( $var, $default_val );
2855 2472 }
2856 2473
@@ -2868,67 +2485,46 @@
2868 2485
2869 2486 return $values;
2870 2487 }
2871 2488
2872 - /**
2873 - * @param array|string $fields
2874 - * @param object $record
2875 - * @param array $values
2876 - * @param array $args
2877 - *
2878 - * @return void
2879 - */
2880 2489 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2881 - if ( ! $fields ) {
2882 - return;
2883 - }
2884 -
2885 - foreach ( (array) $fields as $field ) {
2886 - if ( ! self::is_admin_page() ) {
2887 - // Don't prep default values on the form settings page.
2888 - $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2490 + if ( ! empty( $fields ) ) {
2491 + foreach ( (array) $fields as $field ) {
2492 + if ( ! self::is_admin_page() ) {
2493 + // Don't prep default values on the form settings page.
2494 + $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2495 + }
2496 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2497 + self::fill_field_defaults( $field, $record, $values, $args );
2889 2498 }
2890 -
2891 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2892 - self::fill_field_defaults( $field, $record, $values, $args );
2893 2499 }
2894 2500 }
2895 2501
2896 - /**
2897 - * @param object $field
2898 - * @param object $record
2899 - * @param array $values
2900 - * @param array $args
2901 - *
2902 - * @return void
2903 - */
2904 2502 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2905 2503 $post_values = $args['post_values'];
2906 2504
2907 2505 if ( $args['default'] ) {
2908 2506 $meta_value = $field->default_value;
2909 - } elseif ( $record->post_id && self::pro_is_installed() && ! empty( $field->field_options['post_field'] ) ) {
2507 + } elseif ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
2910 2508 if ( ! isset( $field->field_options['custom_field'] ) ) {
2911 2509 $field->field_options['custom_field'] = '';
2912 2510 }
2913 -
2914 - $meta_value = FrmProEntryMetaHelper::get_post_value(
2915 - $record->post_id,
2916 - $field->field_options['post_field'],
2917 - $field->field_options['custom_field'],
2918 - array(
2919 - 'truncate' => false,
2920 - 'type' => $field->type,
2921 - 'form_id' => $field->form_id,
2922 - 'field' => $field,
2923 - )
2924 - );
2511 + $meta_value = FrmProEntryMetaHelper::get_post_value(
2512 + $record->post_id,
2513 + $field->field_options['post_field'],
2514 + $field->field_options['custom_field'],
2515 + array(
2516 + 'truncate' => false,
2517 + 'type' => $field->type,
2518 + 'form_id' => $field->form_id,
2519 + 'field' => $field,
2520 + )
2521 + );
2925 2522 } else {
2926 2523 $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2927 2524 }//end if
2928 2525
2929 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2930 -
2526 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2931 2527 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2932 2528 $new_value = $post_values['item_meta'][ $field->id ];
2933 2529 self::unserialize_or_decode( $new_value );
2934 2530 } else {
@@ -2943,9 +2539,9 @@
2943 2539 $args['field_type'] = $field_type;
2944 2540
2945 2541 FrmFieldsHelper::prepare_edit_front_field( $field_array, $field, $values['id'], $args );
2946 2542
2947 - if ( empty( $field_array['unique'] ) ) {
2543 + if ( ! isset( $field_array['unique'] ) || ! $field_array['unique'] ) {
2948 2544 $field_array['unique_msg'] = '';
2949 2545 }
2950 2546
2951 2547 $field_array = array_merge( (array) $field->field_options, $field_array );
@@ -3012,21 +2608,15 @@
3012 2608 }
3013 2609
3014 2610 /**
3015 2611 * Set to POST value or default
3016 - *
3017 - * @param array $post_values
3018 - * @param array $values
3019 - *
3020 - * @return void
3021 2612 */
3022 2613 private static function fill_form_defaults( $post_values, array &$values ) {
3023 2614 $form_defaults = FrmFormsHelper::get_default_opts();
3024 2615
3025 2616 foreach ( $form_defaults as $opt => $default ) {
3026 - // phpcs:ignore Universal.Operators.StrictComparisons
3027 2617 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3028 - $values[ $opt ] = $post_values['options'][ $opt ] ?? $default;
2618 + $values[ $opt ] = $post_values && isset( $post_values['options'][ $opt ] ) ? $post_values['options'][ $opt ] : $default;
3029 2619 }
3030 2620
3031 2621 unset( $opt, $default );
3032 2622 }
@@ -3036,9 +2626,9 @@
3036 2626 }
3037 2627
3038 2628 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3039 2629 if ( ! isset( $values[ $h . '_html' ] ) ) {
3040 - $values[ $h . '_html' ] = $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h );
2630 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3041 2631 }
3042 2632 unset( $h );
3043 2633 }
3044 2634 }
@@ -3050,14 +2640,16 @@
3050 2640 *
3051 2641 * @return bool|int
3052 2642 */
3053 2643 public static function custom_style_value( $post_values ) {
3054 - if ( $post_values && isset( $post_values['options']['custom_style'] ) ) {
3055 - return absint( $post_values['options']['custom_style'] );
2644 + if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
2645 + $custom_style = absint( $post_values['options']['custom_style'] );
2646 + } else {
2647 + $frm_settings = self::get_settings();
2648 + $custom_style = ( $frm_settings->load_style !== 'none' );
3056 2649 }
3057 2650
3058 - $frm_settings = self::get_settings();
3059 - return $frm_settings->load_style !== 'none';
2651 + return $custom_style;
3060 2652 }
3061 2653
3062 2654 /**
3063 2655 * @param mixed $original_string
@@ -3063,9 +2655,8 @@
3063 2655 * @param mixed $original_string
3064 2656 * @param int|string $length
3065 2657 * @param int $minword
3066 2658 * @param string $continue
3067 - *
3068 2659 * @return string
3069 2660 */
3070 2661 public static function truncate( $original_string, $length, $minword = 3, $continue = '...' ) {
3071 2662 if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
@@ -3071,24 +2662,24 @@
3071 2662 if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
3072 2663 return '';
3073 2664 }
3074 2665
3075 - $length = (int) $length;
2666 + $length = (int) $length;
2667 + $str = wp_strip_all_tags( (string) $original_string );
2668 + $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3076 2669
3077 - if ( $length === 0 ) {
2670 + if ( $length == 0 ) {
3078 2671 return '';
3079 2672 }
3080 2673
3081 - $str = wp_strip_all_tags( (string) $original_string );
3082 - $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3083 -
3084 2674 if ( $length <= 10 ) {
3085 2675 $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3086 2676 return $sub . ( $length < $original_len ? $continue : '' );
3087 2677 }
3088 2678
3089 - $sub = '';
3090 - $len = 0;
2679 + $sub = '';
2680 + $len = 0;
2681 +
3091 2682 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3092 2683
3093 2684 if ( ! is_array( $words ) ) {
3094 2685 return $original_string;
@@ -3094,11 +2685,10 @@
3094 2685 return $original_string;
3095 2686 }
3096 2687
3097 2688 foreach ( $words as $word ) {
3098 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2689 + $part = ( $sub != '' ? ' ' : '' ) . $word;
3099 2690 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3100 -
3101 2691 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3102 2692 break;
3103 2693 }
3104 2694
@@ -3123,9 +2713,8 @@
3123 2713 * @since 6.5.4
3124 2714 *
3125 2715 * @param string $sub Current substring.
3126 2716 * @param int $length The length limit.
3127 - *
3128 2717 * @return string
3129 2718 */
3130 2719 private static function maybe_force_truncate_on_string_with_no_spaces( $sub, $length ) {
3131 2720 if ( strlen( $sub ) < $length + 50 ) {
@@ -3133,9 +2722,8 @@
3133 2722 return $sub;
3134 2723 }
3135 2724
3136 2725 $first_space = strpos( $sub, ' ', $length );
3137 -
3138 2726 if ( false !== $first_space ) {
3139 2727 // Ignore anything with spaces.
3140 2728 return $sub;
3141 2729 }
@@ -3142,18 +2730,11 @@
3142 2730
3143 2731 return substr( $sub, 0, $length + 10 );
3144 2732 }
3145 2733
3146 - /**
3147 - * @param array $function_names
3148 - * @param array $args
3149 - *
3150 - * @return mixed
3151 - */
3152 2734 public static function mb_function( $function_names, $args ) {
3153 2735 $mb_function_name = $function_names[0];
3154 2736 $function_name = $function_names[1];
3155 -
3156 2737 if ( function_exists( $mb_function_name ) ) {
3157 2738 $function_name = $mb_function_name;
3158 2739 }
3159 2740
@@ -3159,21 +2740,14 @@
3159 2740
3160 2741 return call_user_func_array( $function_name, $args );
3161 2742 }
3162 2743
3163 - /**
3164 - * @param string $date
3165 - * @param string $date_format
3166 - * @param string $time_format
3167 - *
3168 - * @return string
3169 - */
3170 2744 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3171 - if ( ! $date ) {
2745 + if ( empty( $date ) ) {
3172 2746 return $date;
3173 2747 }
3174 2748
3175 - if ( ! $date_format ) {
2749 + if ( empty( $date_format ) ) {
3176 2750 $date_format = get_option( 'date_format' );
3177 2751 }
3178 2752
3179 2753 if ( preg_match( '/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date ) && self::pro_is_installed() ) {
@@ -3181,10 +2755,10 @@
3181 2755 $date = FrmProAppHelper::convert_date( $date, $frmpro_settings->date_format, 'Y-m-d' );
3182 2756 }
3183 2757
3184 2758 $formatted = self::get_localized_date( $date_format, $date );
3185 - $do_time = gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00';
3186 2759
2760 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3187 2761 if ( $do_time ) {
3188 2762 $formatted .= self::add_time_to_date( $time_format, $date );
3189 2763 }
3190 2764
@@ -3193,35 +2767,30 @@
3193 2767
3194 2768 /**
3195 2769 * @param string $time_format
3196 2770 * @param string $date
3197 - *
3198 2771 * @return string
3199 2772 */
3200 2773 private static function add_time_to_date( $time_format, $date ) {
3201 - if ( ! $time_format ) {
2774 + if ( empty( $time_format ) ) {
3202 2775 $time_format = get_option( 'time_format' );
3203 2776 }
3204 2777
3205 2778 $trimmed_format = trim( $time_format );
3206 -
3207 - if ( $time_format && $trimmed_format ) {
3208 - return ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
2779 + $time = '';
2780 + if ( $time_format && ! empty( $trimmed_format ) ) {
2781 + $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3209 2782 }
3210 2783
3211 - return '';
2784 + return $time;
3212 2785 }
3213 2786
3214 2787 /**
3215 2788 * @since 2.0.8
3216 - *
3217 - * @param string $date_format
3218 - * @param string $date
3219 - *
3220 - * @return string
3221 2789 */
3222 2790 public static function get_localized_date( $date_format, $date ) {
3223 2791 $date = get_date_from_gmt( $date );
2792 +
3224 2793 return date_i18n( $date_format, strtotime( $date ) );
3225 2794 }
3226 2795
3227 2796 /**
@@ -3226,16 +2795,19 @@
3226 2795
3227 2796 /**
3228 2797 * Gets the time ago in words.
3229 2798 *
3230 - * @param int $from In seconds.
3231 - * @param int|string $to In seconds.
3232 - * @param int|string $levels Number of time units to include or a specific unit.
2799 + * @param int $from In seconds.
2800 + * @param int|string $to In seconds.
3233 2801 *
3234 - * @return string Time ago.
2802 + * @return string $time_ago
3235 2803 */
3236 2804 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3237 - $now = ! $to && 0 !== $to ? new DateTime() : new DateTime( '@' . $to );
2805 + if ( empty( $to ) && 0 !== $to ) {
2806 + $now = new DateTime();
2807 + } else {
2808 + $now = new DateTime( '@' . $to );
2809 + }
3238 2810 $ago = new DateTime( '@' . $from );
3239 2811
3240 2812 // Get the time difference
3241 2813 $diff_object = $now->diff( $ago );
@@ -3249,9 +2821,8 @@
3249 2821
3250 2822 if ( ! is_numeric( $levels ) ) {
3251 2823 // Show time in specified unit.
3252 2824 $levels = self::get_unit( $levels );
3253 -
3254 2825 if ( isset( $time_strings[ $levels ] ) ) {
3255 2826 $diff = array(
3256 2827 $levels => self::time_format( $levels, $diff ),
3257 2828 );
@@ -3258,14 +2829,13 @@
3258 2829 $time_strings = array(
3259 2830 $levels => $time_strings[ $levels ],
3260 2831 );
3261 2832 }
3262 -
3263 2833 $levels = 1;
3264 2834 }
3265 2835
3266 2836 foreach ( $time_strings as $k => $v ) {
3267 - if ( ! empty( $diff[ $k ] ) ) {
2837 + if ( isset( $diff[ $k ] ) && $diff[ $k ] ) {
3268 2838 $time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
3269 2839 } elseif ( isset( $diff[ $k ] ) && count( $time_strings ) === 1 ) {
3270 2840 // Account for 0.
3271 2841 $time_strings[ $k ] = $diff[ $k ] . ' ' . $v[1];
@@ -3273,21 +2843,17 @@
3273 2843 unset( $time_strings[ $k ] );
3274 2844 }
3275 2845 }
3276 2846
3277 - $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
3278 - $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2847 + $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
2848 + $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2849 + $time_ago_string = implode( ' ', $time_strings );
3279 2850
3280 - return implode( ' ', $time_strings );
2851 + return $time_ago_string;
3281 2852 }
3282 2853
3283 2854 /**
3284 2855 * @since 4.05.01
3285 - *
3286 - * @param string $unit
3287 - * @param array $diff
3288 - *
3289 - * @return int
3290 2856 */
3291 2857 private static function time_format( $unit, $diff ) {
3292 2858 $return = array(
3293 2859 'y' => 'y',
@@ -3292,14 +2858,14 @@
3292 2858 $return = array(
3293 2859 'y' => 'y',
3294 2860 'd' => 'days',
3295 2861 );
3296 -
3297 2862 if ( isset( $return[ $unit ] ) ) {
3298 2863 return $diff[ $return[ $unit ] ];
3299 2864 }
3300 2865
3301 2866 $total = $diff['days'] * self::convert_time( 'd', $unit );
2867 +
3302 2868 $times = array( 'h', 'i', 's' );
3303 2869
3304 2870 foreach ( $times as $time ) {
3305 2871 if ( ! isset( $diff[ $time ] ) ) {
@@ -3313,13 +2879,8 @@
3313 2879 }
3314 2880
3315 2881 /**
3316 2882 * @since 4.05.01
3317 - *
3318 - * @param string $from
3319 - * @param string $to
3320 - *
3321 - * @return int
3322 2883 */
3323 2884 private static function convert_time( $from, $to ) {
3324 2885 $convert = array(
3325 2886 's' => 1,
@@ -3335,26 +2896,20 @@
3335 2896 }
3336 2897
3337 2898 /**
3338 2899 * @since 4.05.01
3339 - *
3340 - * @param string $unit
3341 - *
3342 - * @return int|string
3343 2900 */
3344 2901 private static function get_unit( $unit ) {
3345 2902 $units = self::get_time_strings();
3346 -
3347 2903 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3348 2904 return $unit;
3349 2905 }
3350 2906
3351 2907 foreach ( $units as $u => $strings ) {
3352 - if ( in_array( $unit, $strings, true ) ) {
2908 + if ( in_array( $unit, $strings ) ) {
3353 2909 return $u;
3354 2910 }
3355 2911 }
3356 -
3357 2912 return 1;
3358 2913 }
3359 2914
3360 2915 /**
@@ -3361,9 +2916,8 @@
3361 2916 * Get the translatable time strings. The untranslated version is a failsafe
3362 2917 * in case languages are changing for the unit set in the shortcode.
3363 2918 *
3364 2919 * @since 2.0.20
3365 - *
3366 2920 * @return array
3367 2921 */
3368 2922 private static function get_time_strings() {
3369 2923 return array(
@@ -3410,13 +2964,12 @@
3410 2964 /**
3411 2965 * @param int $r_count
3412 2966 * @param int $current_p
3413 2967 * @param int $p_size
3414 - *
3415 2968 * @return int
3416 2969 */
3417 2970 public static function get_last_record_num( $r_count, $current_p, $p_size ) {
3418 - return $r_count < $current_p * $p_size ? $r_count : $current_p * $p_size;
2971 + return ( $r_count < $current_p * $p_size ? $r_count : $current_p * $p_size );
3419 2972 }
3420 2973
3421 2974 /**
3422 2975 * @param int $r_count
@@ -3421,13 +2974,11 @@
3421 2974 /**
3422 2975 * @param int $r_count
3423 2976 * @param int $current_p
3424 2977 * @param int $p_size
3425 - *
3426 2978 * @return int
3427 2979 */
3428 2980 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3429 - // phpcs:ignore Universal.Operators.StrictComparisons
3430 2981 if ( $current_p == 1 ) {
3431 2982 return 1;
3432 2983 }
3433 2984 return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
@@ -3433,22 +2984,17 @@
3433 2984 return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3434 2985 }
3435 2986
3436 2987 /**
3437 - * @param array $json_vars
3438 - *
3439 2988 * @return array
3440 2989 */
3441 2990 public static function json_to_array( $json_vars ) {
3442 2991 $vars = array();
3443 -
3444 2992 foreach ( $json_vars as $jv ) {
3445 2993 $jv_name = explode( '[', $jv['name'] );
3446 2994 $last = count( $jv_name ) - 1;
3447 -
3448 2995 foreach ( $jv_name as $p => $n ) {
3449 2996 $name = trim( $n, ']' );
3450 -
3451 2997 if ( ! isset( $l1 ) ) {
3452 2998 $l1 = $name;
3453 2999 }
3454 3000
@@ -3459,9 +3005,9 @@
3459 3005 if ( ! isset( $l3 ) ) {
3460 3006 $l3 = $name;
3461 3007 }
3462 3008
3463 - $this_val = $p === $last ? $jv['value'] : array();
3009 + $this_val = $p == $last ? $jv['value'] : array();
3464 3010
3465 3011 switch ( $p ) {
3466 3012 case 0:
3467 3013 $l1 = $name;
@@ -3494,15 +3040,10 @@
3494 3040
3495 3041 /**
3496 3042 * @param string $name
3497 3043 * @param string $l1
3498 - * @param mixed $val
3499 - * @param array $vars
3500 - *
3501 - * @return void
3502 3044 */
3503 3045 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3504 - // phpcs:ignore Universal.Operators.StrictComparisons
3505 3046 if ( $name == '' ) {
3506 3047 $vars[] = $val;
3507 3048 } elseif ( ! isset( $vars[ $l1 ] ) ) {
3508 3049 $vars[ $l1 ] = $val;
@@ -3508,26 +3049,19 @@
3508 3049 $vars[ $l1 ] = $val;
3509 3050 }
3510 3051 }
3511 3052
3512 - /**
3513 - * @param string $name
3514 - * @param string $class
3515 - * @param string $form_name
3516 - *
3517 - * @return void
3518 - */
3519 3053 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3520 3054 $tooltips = array(
3521 3055 'action_title' => __( 'Give this action a label for easy reference.', 'formidable' ),
3522 - 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com. [default-email] is the address set in the global "Default Email Address" settings.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3056 + 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com. [admin_email] is the address set in WP General Settings.', 'formidable' ),
3523 3057 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3524 3058 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3525 - 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3059 + 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3526 3060 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
3527 3061 /* translators: %1$s: Form name, %2$s: Date */
3528 - '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
3529 - '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
3062 + '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() ) ),
3063 + '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' ),
3530 3064 );
3531 3065
3532 3066 if ( ! isset( $tooltips[ $name ] ) ) {
3533 3067 return;
@@ -3532,9 +3066,9 @@
3532 3066 if ( ! isset( $tooltips[ $name ] ) ) {
3533 3067 return;
3534 3068 }
3535 3069
3536 - if ( 'open' === $class ) {
3070 + if ( 'open' == $class ) {
3537 3071 echo ' frm_help"';
3538 3072 } else {
3539 3073 echo ' class="frm_help"';
3540 3074 }
@@ -3540,9 +3074,9 @@
3540 3074 }
3541 3075
3542 3076 echo ' title="' . esc_attr( $tooltips[ $name ] );
3543 3077
3544 - if ( 'open' !== $class ) {
3078 + if ( 'open' != $class ) {
3545 3079 echo '"';
3546 3080 }
3547 3081 }
3548 3082
@@ -3547,28 +3081,20 @@
3547 3081 }
3548 3082
3549 3083 /**
3550 3084 * Add the current_page class to that page in the form nav
3551 - *
3552 - * @param int|string $page
3553 - * @param int|string $current_page
3554 - * @param array $action
3555 - *
3556 - * @return void
3557 3085 */
3558 3086 public static function select_current_page( $page, $current_page, $action = array() ) {
3559 - // phpcs:ignore Universal.Operators.StrictComparisons
3560 3087 if ( $current_page != $page ) {
3561 3088 return;
3562 3089 }
3563 3090
3564 3091 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3565 -
3566 3092 if ( 'lite-reports' === $frm_action ) {
3567 3093 $frm_action = 'reports';
3568 3094 }
3569 3095
3570 - if ( ! $action || ( $frm_action && in_array( $frm_action, $action, true ) ) ) {
3096 + if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3571 3097 echo ' class="current_page"';
3572 3098 }
3573 3099 }
3574 3100
@@ -3598,19 +3124,14 @@
3598 3124
3599 3125 // Add extra slashes for \r\n since WP strips them.
3600 3126 $post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
3601 3127
3602 - // Allow for &quot
3603 - return str_replace( '&quot;', '\\"', $post_content );
3128 + // allow for &quot
3129 + $post_content = str_replace( '&quot;', '\\"', $post_content );
3130 +
3131 + return $post_content;
3604 3132 }
3605 3133
3606 - /**
3607 - * @param array|string $val
3608 - * @param int|string $key
3609 - * @param array $post_content
3610 - *
3611 - * @return void
3612 - */
3613 3134 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3614 3135 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3615 3136 return;
3616 3137 }
@@ -3619,17 +3140,15 @@
3619 3140 foreach ( $val as $k1 => $v1 ) {
3620 3141 self::prepare_action_slashes( $v1, $k1, $post_content[ $key ] );
3621 3142 unset( $k1, $v1 );
3622 3143 }
3144 + } else {
3145 + // Strip all slashes so everything is the same, no matter where the value is coming from
3146 + $val = stripslashes( $val );
3623 3147
3624 - return;
3148 + // Add backslashes before double quotes and forward slashes only
3149 + $post_content[ $key ] = addcslashes( $val, '"\\/' );
3625 3150 }
3626 -
3627 - // Strip all slashes so everything is the same, no matter where the value is coming from
3628 - $val = stripslashes( $val );
3629 -
3630 - // Add backslashes before double quotes and forward slashes only
3631 - $post_content[ $key ] = addcslashes( $val, '"\\/' );
3632 3151 }
3633 3152
3634 3153 /**
3635 3154 * Check for either json or serialized data. This is temporary while transitioning
@@ -3637,9 +3156,8 @@
3637 3156 *
3638 3157 * @since 4.02.03
3639 3158 *
3640 3159 * @param array|string $value
3641 - *
3642 3160 * @return void
3643 3161 */
3644 3162 public static function unserialize_or_decode( &$value ) {
3645 3163 if ( is_array( $value ) ) {
@@ -3645,9 +3163,13 @@
3645 3163 if ( is_array( $value ) ) {
3646 3164 return;
3647 3165 }
3648 3166
3649 - $value = is_serialized( $value ) ? self::maybe_unserialize_array( $value ) : self::maybe_json_decode( $value, false );
3167 + if ( is_serialized( $value ) ) {
3168 + $value = self::maybe_unserialize_array( $value );
3169 + } else {
3170 + $value = self::maybe_json_decode( $value, false );
3171 + }
3650 3172 }
3651 3173
3652 3174 /**
3653 3175 * Safely unserialize an array if necessary.
@@ -3655,9 +3177,8 @@
3655 3177 *
3656 3178 * @since 6.2
3657 3179 *
3658 3180 * @param mixed $value
3659 - *
3660 3181 * @return mixed
3661 3182 */
3662 3183 public static function maybe_unserialize_array( $value ) {
3663 3184 if ( ! is_string( $value ) ) {
@@ -3664,15 +3185,18 @@
3664 3185 return $value;
3665 3186 }
3666 3187
3667 3188 // Since we only expect an array, skip anything that doesn't start with a:.
3668 - if ( ! is_serialized( $value ) || ! str_starts_with( $value, 'a:' ) ) {
3189 + if ( ! is_serialized( $value ) || 'a:' !== substr( $value, 0, 2 ) ) {
3669 3190 return $value;
3670 3191 }
3671 3192
3672 3193 $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
3194 + if ( is_array( $parsed ) ) {
3195 + $value = $parsed;
3196 + }
3673 3197
3674 - return is_array( $parsed ) ? $parsed : $value;
3198 + return $value;
3675 3199 }
3676 3200
3677 3201 /**
3678 3202 * Decode a JSON string.
@@ -3677,12 +3201,11 @@
3677 3201 /**
3678 3202 * Decode a JSON string.
3679 3203 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3680 3204 *
3681 - * @param array|string|null $string
3682 - * @param bool $single_to_array
3683 - *
3684 - * @return array|string|null
3205 + * @param mixed $string
3206 + * @param bool $single_to_array
3207 + * @return mixed
3685 3208 */
3686 3209 public static function maybe_json_decode( $string, $single_to_array = true ) {
3687 3210 if ( is_array( $string ) || is_null( $string ) ) {
3688 3211 return $string;
@@ -3687,19 +3210,20 @@
3687 3210 if ( is_array( $string ) || is_null( $string ) ) {
3688 3211 return $string;
3689 3212 }
3690 3213
3691 - $new_string = json_decode( $string, true );
3692 - $single_value = false;
3693 -
3694 - if ( ! $single_to_array ) {
3695 - $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3214 + $new_string = json_decode( $string, true );
3215 + if ( function_exists( 'json_last_error' ) ) {
3216 + // php 5.3+
3217 + $single_value = false;
3218 + if ( ! $single_to_array ) {
3219 + $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3220 + }
3221 + if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3222 + $string = $new_string;
3223 + }
3696 3224 }
3697 3225
3698 - if ( json_last_error() === JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3699 - return $new_string;
3700 - }
3701 -
3702 3226 return $string;
3703 3227 }
3704 3228
3705 3229 /**
@@ -3705,9 +3229,8 @@
3705 3229 /**
3706 3230 * @since 6.2.3
3707 3231 *
3708 3232 * @param string $value
3709 - *
3710 3233 * @return string
3711 3234 */
3712 3235 public static function maybe_utf8_encode( $value ) {
3713 3236 $from_format = 'ISO-8859-1';
@@ -3716,15 +3239,13 @@
3716 3239 if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
3717 3240 if ( mb_check_encoding( $value, $from_format ) ) {
3718 3241 return mb_convert_encoding( $value, $to_format, $from_format );
3719 3242 }
3720 -
3721 3243 return $value;
3722 3244 }
3723 3245
3724 3246 if ( function_exists( 'iconv' ) ) {
3725 3247 $converted = iconv( $from_format, $to_format, $value );
3726 -
3727 3248 // Value is false if $value is not ISO-8859-1.
3728 3249 if ( false !== $converted ) {
3729 3250 return $converted;
3730 3251 }
@@ -3736,12 +3257,8 @@
3736 3257 /**
3737 3258 * Reformat the json serialized array in name => value array.
3738 3259 *
3739 3260 * @since 4.02.03
3740 - *
3741 - * @param array $form
3742 - *
3743 - * @return void
3744 3261 */
3745 3262 public static function format_form_data( &$form ) {
3746 3263 $formatted = array();
3747 3264
@@ -3748,21 +3265,18 @@
3748 3265 foreach ( $form as $input ) {
3749 3266 if ( ! isset( $input['name'] ) ) {
3750 3267 continue;
3751 3268 }
3752 -
3753 3269 $key = $input['name'];
3754 -
3755 - if ( ! isset( $formatted[ $key ] ) ) {
3270 + if ( isset( $formatted[ $key ] ) ) {
3271 + if ( is_array( $formatted[ $key ] ) ) {
3272 + $formatted[ $key ][] = $input['value'];
3273 + } else {
3274 + $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
3275 + }
3276 + } else {
3756 3277 $formatted[ $key ] = $input['value'];
3757 - continue;
3758 3278 }
3759 -
3760 - if ( is_array( $formatted[ $key ] ) ) {
3761 - $formatted[ $key ][] = $input['value'];
3762 - } else {
3763 - $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
3764 - }
3765 3279 }
3766 3280
3767 3281 parse_str( http_build_query( $formatted ), $form );
3768 3282 }
@@ -3770,13 +3284,15 @@
3770 3284 /**
3771 3285 * @since 4.02.03
3772 3286 *
3773 3287 * @param array|string $value
3774 - *
3775 3288 * @return string
3776 3289 */
3777 3290 public static function maybe_json_encode( $value ) {
3778 - return is_array( $value ) ? wp_json_encode( $value ) : $value;
3291 + if ( is_array( $value ) ) {
3292 + $value = wp_json_encode( $value );
3293 + }
3294 + return $value;
3779 3295 }
3780 3296
3781 3297 /**
3782 3298 * Echo The javascript to open and highlight the Formidable menu
@@ -3783,19 +3299,18 @@
3783 3299 *
3784 3300 * @since 1.07.10
3785 3301 *
3786 3302 * @param string $post_type The name of the post type that may need to be highlighted.
3787 - *
3788 3303 * @return void
3789 3304 */
3790 3305 public static function maybe_highlight_menu( $post_type ) {
3791 3306 global $post;
3792 3307
3793 - if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] !== $post_type ) {
3308 + if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] != $post_type ) {
3794 3309 return;
3795 3310 }
3796 3311
3797 - if ( is_object( $post ) && $post->post_type !== $post_type ) {
3312 + if ( is_object( $post ) && $post->post_type != $post_type ) {
3798 3313 return;
3799 3314 }
3800 3315
3801 3316 self::load_admin_wide_js();
@@ -3807,9 +3322,8 @@
3807 3322 *
3808 3323 * @since 2.0
3809 3324 *
3810 3325 * @param bool $load
3811 - *
3812 3326 * @return void
3813 3327 */
3814 3328 public static function load_admin_wide_js( $load = true ) {
3815 3329 $version = self::plugin_version();
@@ -3820,9 +3334,9 @@
3820 3334 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3821 3335 'url' => self::plugin_url(),
3822 3336 'app_url' => 'https://formidableforms.com/',
3823 3337 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
3824 - '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
3338 + 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
3825 3339 'loading' => __( 'Loading&hellip;', 'formidable' ),
3826 3340 'nonce' => wp_create_nonce( 'frm_ajax' ),
3827 3341 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3828 3342 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
@@ -3835,9 +3349,8 @@
3835 3349 }
3836 3350
3837 3351 /**
3838 3352 * @since 2.0.9
3839 - *
3840 3353 * @return void
3841 3354 */
3842 3355 public static function load_font_style() {
3843 3356 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
@@ -3844,9 +3357,8 @@
3844 3357 }
3845 3358
3846 3359 /**
3847 3360 * @param string $location
3848 - *
3849 3361 * @return void
3850 3362 */
3851 3363 public static function localize_script( $location ) {
3852 3364 global $wp_scripts, $wp_version;
@@ -3869,9 +3381,8 @@
3869 3381 'include_resend_email' => false,
3870 3382 );
3871 3383
3872 3384 $data = $wp_scripts->get_data( 'formidable', 'data' );
3873 -
3874 3385 if ( ! $data ) {
3875 3386 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3876 3387 }
3877 3388
@@ -3878,9 +3389,9 @@
3878 3389 if ( $location === 'admin' ) {
3879 3390 $admin_script_strings = array(
3880 3391 'desc' => __( '(Click to add description)', 'formidable' ),
3881 3392 'blank' => __( '(Blank)', 'formidable' ),
3882 - 'no_label' => self::get_no_label_text(),
3393 + 'no_label' => __( '(no label)', 'formidable' ),
3883 3394 'ok' => __( 'OK', 'formidable' ),
3884 3395 'cancel' => __( 'Cancel', 'formidable' ),
3885 3396 'default_label' => __( 'Default', 'formidable' ),
3886 3397 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
@@ -3888,9 +3399,9 @@
3888 3399 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3889 3400 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3890 3401 'confirm' => __( 'Are you sure?', 'formidable' ),
3891 3402 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3892 - '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
3403 + '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' ),
3893 3404 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3894 3405 'default_unique' => FrmFieldsHelper::default_unique_msg(),
3895 3406 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3896 3407 'enter_email' => __( 'Enter Email', 'formidable' ),
@@ -3896,9 +3407,9 @@
3896 3407 'enter_email' => __( 'Enter Email', 'formidable' ),
3897 3408 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3898 3409 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3899 3410 'new_option' => __( 'New Option', 'formidable' ),
3900 - '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
3411 + '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' ),
3901 3412 'enter_password' => __( 'Enter Password', 'formidable' ),
3902 3413 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3903 3414 'import_complete' => __( 'Import Complete', 'formidable' ),
3904 3415 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
@@ -3914,11 +3425,11 @@
3914 3425 'only_one_action' => sprintf( __( 'This form action is limited to %d per form.', 'formidable' ), 1 ),
3915 3426 'edit_action_text' => __( 'Please edit the existing form action.', 'formidable' ),
3916 3427 'unsafe_params' => FrmFormsHelper::reserved_words(),
3917 3428 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3918 - '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
3429 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3919 3430 /* 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. */
3920 - '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
3431 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
3921 3432 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3922 3433 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3923 3434 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3924 3435 'install' => __( 'Install', 'formidable' ),
@@ -3939,9 +3450,9 @@
3939 3450 'holdShiftMsg' => esc_html__( 'You can hold %1$sShift%2$s on your keyboard to select multiple fields', 'formidable' ),
3940 3451 'noTitleText' => FrmFormsHelper::get_no_title_text(),
3941 3452
3942 3453 // In older versions this event listener causes the section to immediately close again
3943 - // When the h3 element is clicked. It's only required in WP 6.7+.
3454 + // when the h3 element is clicked. It's only required in WP 6.7+.
3944 3455 'requireAccordionTitleClickListener' => version_compare( $wp_version, '6.7', '>=' ),
3945 3456 );
3946 3457 /**
3947 3458 * @param array $admin_script_strings
@@ -3948,9 +3459,8 @@
3948 3459 */
3949 3460 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3950 3461
3951 3462 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3952 -
3953 3463 if ( ! $data ) {
3954 3464 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3955 3465 }
3956 3466 }//end if
@@ -3956,19 +3466,8 @@
3956 3466 }//end if
3957 3467 }
3958 3468
3959 3469 /**
3960 - * Get the no label text.
3961 - *
3962 - * @since 6.25.1
3963 - *
3964 - * @return string
3965 - */
3966 - public static function get_no_label_text() {
3967 - return __( '(no label)', 'formidable' );
3968 - }
3969 -
3970 - /**
3971 3470 * @since 6.5
3972 3471 *
3973 3472 * @return string
3974 3473 */
@@ -4010,9 +3509,8 @@
4010 3509 *
4011 3510 * @since 1.07.10
4012 3511 *
4013 3512 * @param float $min_version The version the add-on requires.
4014 - *
4015 3513 * @return void
4016 3514 */
4017 3515 public static function min_version_notice( $min_version ) {
4018 3516 $frm_version = self::plugin_version();
@@ -4022,11 +3520,11 @@
4022 3520 return;
4023 3521 }
4024 3522
4025 3523 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
4026 - 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
4027 - esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
4028 - '</div></td></tr>';
3524 + 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">' .
3525 + esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
3526 + '</div></td></tr>';
4029 3527 }
4030 3528
4031 3529 /**
4032 3530 * If Pro is far outdated, show a message.
@@ -4032,10 +3530,8 @@
4032 3530 * If Pro is far outdated, show a message.
4033 3531 *
4034 3532 * @since 4.0.01
4035 3533 *
4036 - * @param string $min_version
4037 - *
4038 3534 * @return void
4039 3535 */
4040 3536 public static function min_pro_version_notice( $min_version ) {
4041 3537 if ( ! self::is_formidable_admin() ) {
@@ -4045,14 +3541,25 @@
4045 3541
4046 3542 self::php_version_notice();
4047 3543
4048 3544 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4049 -
4050 3545 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4051 3546 return;
4052 3547 }
4053 3548
4054 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
3549 + $expired = FrmAddonsController::is_license_expired();
3550 + ?>
3551 + <div class="frm-banner-alert frm_error_style frm_previous_install">
3552 + <?php
3553 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
3554 + if ( empty( $expired ) ) {
3555 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
3556 + } else {
3557 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
3558 + }
3559 + ?>
3560 + </div>
3561 + <?php
4055 3562 }
4056 3563
4057 3564 /**
4058 3565 * If Pro is installed, check the version number.
@@ -4059,9 +3566,8 @@
4059 3566 *
4060 3567 * @since 4.0.01
4061 3568 *
4062 3569 * @param string $min_version
4063 - *
4064 3570 * @return bool
4065 3571 */
4066 3572 public static function meets_min_pro_version( $min_version ) {
4067 3573 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
@@ -4070,19 +3576,16 @@
4070 3576 /**
4071 3577 * Show a message if the PHP version is below the recommendations.
4072 3578 *
4073 3579 * @since 4.0.02
4074 - *
4075 3580 * @return void
4076 3581 */
4077 3582 private static function php_version_notice() {
4078 3583 $message = array();
4079 -
4080 3584 if ( version_compare( phpversion(), '7.0', '<' ) ) {
4081 - $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
3585 + $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' );
4082 3586 }
4083 3587
4084 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4085 3588 foreach ( $message as $m ) {
4086 3589 ?>
4087 3590 <div class="frm-banner-alert frm_error_style frm_previous_install">
4088 3591 <?php echo esc_html( $m ); ?>
@@ -4088,14 +3591,12 @@
4088 3591 <?php echo esc_html( $m ); ?>
4089 3592 </div>
4090 3593 <?php
4091 3594 }
4092 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
4093 3595 }
4094 3596
4095 3597 /**
4096 3598 * @param string $type
4097 - *
4098 3599 * @return array<string,string>
4099 3600 */
4100 3601 public static function locales( $type = 'date' ) {
4101 3602 $locales = array(
@@ -4189,12 +3690,12 @@
4189 3690 'zu' => __( 'Zulu', 'formidable' ),
4190 3691 );
4191 3692
4192 3693 if ( $type === 'captcha' ) {
4193 - // Remove the languages unavailable for the captcha
3694 + // remove the languages unavailable for the captcha
4194 3695 $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
4195 3696 } else {
4196 - // Remove the languages unavailable for the datepicker
3697 + // remove the languages unavailable for the datepicker
4197 3698 $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'mr', 'lo', 'kn', 'si', 'gu', 'bn', 'zu', 'ur', 'te', 'sw', 'am' );
4198 3699 }
4199 3700
4200 3701 $locales = array_diff_key( $locales, array_flip( $unset ) );
@@ -4205,13 +3706,14 @@
4205 3706 * @since 5.4.5 Added $args parameter with type.
4206 3707 *
4207 3708 * @param array<string,string> $locales
4208 3709 * @param array $args {
4209 - *
4210 3710 * @type string $type
4211 3711 * }
4212 3712 */
4213 - return apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3713 + $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3714 +
3715 + return $locales;
4214 3716 }
4215 3717
4216 3718 /**
4217 3719 * @return string
@@ -4218,14 +3720,12 @@
4218 3720 */
4219 3721 public static function get_menu_icon_class() {
4220 3722 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4221 3723 $settings = FrmProAppHelper::get_settings();
4222 -
4223 3724 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4224 3725 return $settings->menu_icon;
4225 3726 }
4226 3727 }
4227 -
4228 3728 return 'frmfont frm_logo_icon';
4229 3729 }
4230 3730
4231 3731 /**
@@ -4243,9 +3743,10 @@
4243 3743 * @type array $input_attrs Attributes of value input.
4244 3744 * }
4245 3745 */
4246 3746 public static function images_dropdown( $args ) {
4247 - $args = self::fill_default_images_dropdown_args( $args );
3747 + $args = self::fill_default_images_dropdown_args( $args );
3748 +
4248 3749 $input_attrs_str = self::get_images_dropdown_input_attrs( $args );
4249 3750 ob_start();
4250 3751 include self::plugin_path() . '/classes/views/shared/images-dropdown.php';
4251 3752 $output = ob_get_clean();
@@ -4266,9 +3767,8 @@
4266 3767 *
4267 3768 * @since 5.0.04
4268 3769 *
4269 3770 * @param array $args The arguments.
4270 - *
4271 3771 * @return array
4272 3772 */
4273 3773 private static function fill_default_images_dropdown_args( $args ) {
4274 3774 $defaults = array(
@@ -4281,8 +3781,14 @@
4281 3781
4282 3782 $new_args['options'] = (array) $new_args['options'];
4283 3783 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4284 3784
3785 + // Set the number of columns.
3786 + $new_args['col_class'] = ceil( 12 / count( $new_args['options'] ) );
3787 + if ( $new_args['col_class'] > 6 ) {
3788 + $new_args['col_class'] = ceil( $new_args['col_class'] / 2 );
3789 + }
3790 +
4285 3791 /**
4286 3792 * Allows modifying the arguments of images_dropdown() method.
4287 3793 *
4288 3794 * @since 5.0.04
@@ -4298,9 +3804,8 @@
4298 3804 *
4299 3805 * @since 5.0.04
4300 3806 *
4301 3807 * @param array $args The arguments.
4302 - *
4303 3808 * @return string
4304 3809 */
4305 3810 private static function get_images_dropdown_input_attrs( $args ) {
4306 3811 $input_attrs = $args['input_attrs'];
@@ -4307,9 +3812,8 @@
4307 3812 $input_attrs['type'] = 'radio';
4308 3813 $input_attrs['name'] = $args['name'];
4309 3814
4310 3815 $input_attrs_str = '';
4311 -
4312 3816 foreach ( $input_attrs as $key => $input_attr ) {
4313 3817 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4314 3818 }
4315 3819
@@ -4325,13 +3829,8 @@
4325 3829 }
4326 3830
4327 3831 /**
4328 3832 * @since 6.7.1
4329 - *
4330 - * @param array $option Option data.
4331 - * @param array $args The arguments of images_dropdown() method.
4332 - *
4333 - * @return array
4334 3833 */
4335 3834 public static function get_images_dropdown_atts( $option, $args ) {
4336 3835 $image = self::get_images_dropdown_option_image( $option, $args );
4337 3836 $classes = self::get_images_dropdown_option_classes( $option, $args );
@@ -4345,9 +3844,8 @@
4345 3844 * @since 5.0.04
4346 3845 *
4347 3846 * @param array $option Option data.
4348 3847 * @param array $args The arguments of images_dropdown() method.
4349 - *
4350 3848 * @return string
4351 3849 */
4352 3850 private static function get_images_dropdown_option_image( $option, $args ) {
4353 3851 $image = self::icon_by_class(
@@ -4376,9 +3874,8 @@
4376 3874 * @since 5.0.04
4377 3875 *
4378 3876 * @param array $option Option data.
4379 3877 * @param array $args The arguments of images_dropdown() method.
4380 - *
4381 3878 * @return string
4382 3879 */
4383 3880 private static function get_images_dropdown_option_classes( $option, $args ) {
4384 3881 $classes = '';
@@ -4406,19 +3903,17 @@
4406 3903 * @since 5.0.04
4407 3904 *
4408 3905 * @param array $option Option data.
4409 3906 * @param array $args The arguments of images_dropdown() method.
4410 - *
4411 3907 * @return string
4412 3908 */
4413 3909 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4414 3910 $html_attrs = '';
4415 -
4416 3911 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4417 3912 $html_attrs_arr = array();
4418 3913
4419 3914 foreach ( $option['custom_attrs'] as $key => $value ) {
4420 - if ( in_array( $key, array( 'type', 'class', 'data-value' ), true ) ) {
3915 + if ( in_array( $key, array( 'type', 'class', 'data-value' ) ) ) {
4421 3916 continue;
4422 3917 }
4423 3918
4424 3919 $html_attrs_arr[] = sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $value ) );
@@ -4476,9 +3971,8 @@
4476 3971 * @since 5.0.07
4477 3972 *
4478 3973 * @param array $values
4479 3974 * @param array $keys
4480 - *
4481 3975 * @return array
4482 3976 */
4483 3977 public static function maybe_filter_array( $values, $keys ) {
4484 3978 $allow_unfiltered_html = self::allow_unfiltered_html();
@@ -4503,14 +3997,13 @@
4503 3997 * @since 5.0.13
4504 3998 *
4505 3999 * @param string $value
4506 4000 * @param array|string $allowed 'all' for everything included as defaults.
4507 - *
4508 4001 * @return string
4509 4002 */
4510 4003 public static function maybe_kses( $value, $allowed = 'all' ) {
4511 4004 if ( self::should_never_allow_unfiltered_html() ) {
4512 - return self::kses( $value, $allowed );
4005 + $value = self::kses( $value, $allowed );
4513 4006 }
4514 4007 return $value;
4515 4008 }
4516 4009
@@ -4520,18 +4013,17 @@
4520 4013 * @since 6.11.2
4521 4014 *
4522 4015 * @param string $key
4523 4016 * @param string $context Either 'display' or 'update'. On update, we want to allow a few keys that are never displayed.
4524 - *
4525 4017 * @return bool
4526 4018 */
4527 4019 public static function input_key_is_safe( $key, $context = 'display' ) {
4528 4020 if ( 'update' === $context && in_array( $key, array( 'opt', 'label' ), true ) ) {
4529 4021 $safe = true;
4530 - } elseif ( str_starts_with( $key, 'data-' ) ) {
4022 + } elseif ( 0 === strpos( $key, 'data-' ) ) {
4531 4023 // Allow all data attributes.
4532 4024 $safe = true;
4533 - } elseif ( str_starts_with( $key, 'aria-' ) ) {
4025 + } elseif ( 0 === strpos( $key, 'aria-' ) ) {
4534 4026 // Allow all aria attributes.
4535 4027 $safe = true;
4536 4028 } else {
4537 4029 $safe_keys = array(
@@ -4573,9 +4065,16 @@
4573 4065
4574 4066 /**
4575 4067 * @since 5.0.16
4576 4068 *
4577 - * @param string $medium
4069 + * @return bool
4070 + */
4071 + public static function show_landing_pages() {
4072 + return self::show_new_feature( 'landing' );
4073 + }
4074 +
4075 + /**
4076 + * @since 5.0.16
4578 4077 *
4579 4078 * @return array
4580 4079 */
4581 4080 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
@@ -4583,9 +4082,8 @@
4583 4082 'medium' => $medium,
4584 4083 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4585 4084 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4586 4085 'screenshot' => 'landing.png',
4587 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
4588 4086 );
4589 4087 return self::get_upgrade_data_params( 'landing', $params );
4590 4088 }
4591 4089
@@ -4592,35 +4090,24 @@
4592 4090 /**
4593 4091 * @since 5.0.17
4594 4092 *
4595 4093 * @param string $feature
4596 - *
4597 4094 * @return bool
4598 4095 */
4599 4096 public static function show_new_feature( $feature ) {
4600 4097 $link = FrmAddonsController::install_link( $feature );
4601 -
4602 - if ( array_key_exists( 'status', $link ) || array_key_exists( 'class', $link ) ) {
4603 - return true;
4604 - }
4605 -
4606 - return 'coupons' === $feature && class_exists( 'FrmCouponsAppController' );
4098 + return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4607 4099 }
4608 4100
4609 4101 /**
4610 - * Enhances upgrade data parameters with installation link and plan requirement information.
4611 - *
4612 4102 * @since 5.0.17
4613 4103 *
4614 - * @param string $plugin The plugin slug to get installation data for.
4615 - * @param array $params Initial parameters for the upgrade data.
4616 - * @param bool $detailed Whether to include detailed information.
4617 - *
4618 - * @return array Modified parameters with installation data.
4104 + * @param string $plugin
4105 + * @param array $params
4106 + * @return array
4619 4107 */
4620 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
4108 + public static function get_upgrade_data_params( $plugin, $params ) {
4621 4109 $link = FrmAddonsController::install_link( $plugin );
4622 -
4623 4110 if ( ! $link ) {
4624 4111 return $params;
4625 4112 }
4626 4113
@@ -4626,20 +4113,15 @@
4626 4113
4627 4114 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4628 4115 $params['oneclick'] = json_encode( $link );
4629 4116 unset( $params['message'] );
4630 -
4631 4117 if ( ! isset( $params['medium'] ) ) {
4632 4118 $params['medium'] = $plugin;
4633 4119 }
4634 4120 } else {
4635 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
4121 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4636 4122 }
4637 4123
4638 - if ( $detailed ) {
4639 - $params['plugin-status'] = $link['status'] ?? '';
4640 - }
4641 -
4642 4124 return $params;
4643 4125 }
4644 4126
4645 4127 /**
@@ -4648,9 +4130,8 @@
4648 4130 *
4649 4131 * @since 5.0.17
4650 4132 *
4651 4133 * @param string $text
4652 - *
4653 4134 * @return bool
4654 4135 */
4655 4136 public static function ctype_xdigit( $text ) {
4656 4137 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4665,14 +4146,12 @@
4665 4146 * @since 5.2.01
4666 4147 */
4667 4148 public static function set_current_screen_and_hook_suffix() {
4668 4149 global $hook_suffix;
4669 -
4670 4150 if ( is_null( $hook_suffix ) ) {
4671 4151 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4672 4152 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4673 4153 }
4674 -
4675 4154 set_current_screen();
4676 4155 }
4677 4156
4678 4157 /**
@@ -4679,9 +4158,9 @@
4679 4158 * Shows pill text.
4680 4159 *
4681 4160 * @since 5.2.02
4682 4161 *
4683 - * @param string|null $text Text in the pill. Default is NEW.
4162 + * @param string $text Text in the pill. Default is NEW.
4684 4163 */
4685 4164 public static function show_pill_text( $text = null ) {
4686 4165 if ( null === $text ) {
4687 4166 $text = __( 'NEW', 'formidable' );
@@ -4694,9 +4173,8 @@
4694 4173 *
4695 4174 * @since 5.2.07
4696 4175 *
4697 4176 * @param mixed $num Number.
4698 - *
4699 4177 * @return false|int Returns `false` if the passed parameter is not number.
4700 4178 */
4701 4179 public static function count_decimals( $num ) {
4702 4180 if ( ! is_numeric( $num ) ) {
@@ -4704,9 +4182,8 @@
4704 4182 }
4705 4183
4706 4184 $num = (string) $num;
4707 4185 $parts = explode( '.', $num );
4708 -
4709 4186 if ( 1 === count( $parts ) ) {
4710 4187 return 0;
4711 4188 }
4712 4189
@@ -4788,20 +4265,17 @@
4788 4265 * @since 5.5.5
4789 4266 *
4790 4267 * @param string $url
4791 4268 * @param string $expected_extension
4792 - *
4793 4269 * @return bool
4794 4270 */
4795 4271 public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4796 - $file_is_in_expected_s3_bucket = str_starts_with( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4797 -
4272 + $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4798 4273 if ( ! $file_is_in_expected_s3_bucket ) {
4799 4274 return false;
4800 4275 }
4801 4276
4802 4277 $parsed = parse_url( $url );
4803 -
4804 4278 if ( ! is_array( $parsed ) ) {
4805 4279 // URL is malformed.
4806 4280 return false;
4807 4281 }
@@ -4807,10 +4281,14 @@
4807 4281 }
4808 4282
4809 4283 $path = $parsed['path'];
4810 4284 $ext = pathinfo( $path, PATHINFO_EXTENSION );
4811 - // The URL isn't to an XML file.
4812 - return $expected_extension === $ext;
4285 + if ( $expected_extension !== $ext ) {
4286 + // The URL isn't to an XML file.
4287 + return false;
4288 + }
4289 +
4290 + return true;
4813 4291 }
4814 4292
4815 4293 /**
4816 4294 * Display a dismissable warning message and save its dismissal state.
@@ -4818,9 +4296,8 @@
4818 4296 * @since 6.3
4819 4297 *
4820 4298 * @param string $message The warning message to display.
4821 4299 * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
4822 - *
4823 4300 * @return void
4824 4301 */
4825 4302 public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4826 4303 if ( ! $message || ! $option ) {
@@ -4863,9 +4340,8 @@
4863 4340 *
4864 4341 * @since 6.3
4865 4342 *
4866 4343 * @param string $option The unique identifier for the dismissal state of the message.
4867 - *
4868 4344 * @return void
4869 4345 */
4870 4346 public static function dismiss_warning_message( $option = '' ) {
4871 4347 self::permission_check( 'frm_change_settings' );
@@ -4871,9 +4347,9 @@
4871 4347 self::permission_check( 'frm_change_settings' );
4872 4348 check_ajax_referer( 'frm_ajax', 'nonce' );
4873 4349
4874 4350 if ( $option ) {
4875 - update_option( $option, true, false );
4351 + update_option( $option, true, 'no' );
4876 4352 }
4877 4353
4878 4354 wp_send_json_success();
4879 4355 }
@@ -4887,8 +4363,17 @@
4887 4363 * @return string
4888 4364 */
4889 4365 public static function copy_for_lite_license() {
4890 4366 $message = __( 'You\'re using Formidable Forms Lite - no license needed. Enjoy!', 'formidable' ) . ' 🙂';
4367 +
4368 + if ( is_callable( 'FrmProAddonsController::get_readable_license_type' ) && ! class_exists( 'FrmProDashboardController' ) ) {
4369 + // Manage PRO versions without PRO dashboard functionality.
4370 + $license_type = FrmProAddonsController::get_readable_license_type();
4371 + if ( 'lite' !== strtolower( $license_type ) ) {
4372 + $message = 'Formidable Pro ' . $license_type;
4373 + }
4374 + }
4375 +
4891 4376 return apply_filters( 'frm_license_type_text', $message );
4892 4377 }
4893 4378
4894 4379 /**
@@ -4894,9 +4379,8 @@
4894 4379 /**
4895 4380 * Removes scripts that are unnecessarily loaded across the pages!
4896 4381 *
4897 4382 * @since 6.9
4898 - *
4899 4383 * @return void
4900 4384 */
4901 4385 public static function dequeue_extra_global_scripts() {
4902 4386 wp_dequeue_script( 'frm-surveys-admin' );
@@ -4914,21 +4398,18 @@
4914 4398 * @return void
4915 4399 */
4916 4400 public static function tooltip_icon( $tooltip_text, $atts = array() ) {
4917 4401 $atts['title'] = $tooltip_text;
4918 -
4919 4402 if ( isset( $atts['class'] ) ) {
4920 4403 $atts['class'] .= ' frm_help';
4921 4404 } else {
4922 4405 $atts['class'] = 'frm_help';
4923 4406 }
4924 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4925 4407 ?>
4926 4408 <span <?php self::array_to_html_params( $atts, true ); ?>>
4927 4409 <?php self::icon_by_class( 'frmfont frm_tooltip_icon' ); ?>
4928 4410 </span>
4929 4411 <?php
4930 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
4931 4412 }
4932 4413
4933 4414 /**
4934 4415 * Prints errors for settings in onboarding wizard or template settings.
@@ -4949,10 +4430,8 @@
4949 4430 )
4950 4431 );
4951 4432
4952 4433 $args['class'] .= ' frm-validation-error frm-mt-xs frm_hidden';
4953 -
4954 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4955 4434 ?>
4956 4435 <span id="<?php echo esc_attr( $args['id'] ); ?>" class="<?php echo esc_attr( $args['class'] ); ?>">
4957 4436 <?php
4958 4437 if ( is_array( $args['errors'] ) ) {
@@ -4966,9 +4445,8 @@
4966 4445 }
4967 4446 ?>
4968 4447 </span>
4969 4448 <?php
4970 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
4971 4449 }
4972 4450
4973 4451 /**
4974 4452 * Check if GDPR is enabled.
@@ -4991,57 +4469,6 @@
4991 4469 */
4992 4470 public static function no_gdpr_cookies() {
4993 4471 $frm_settings = self::get_settings();
4994 4472 return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
4995 - }
4996 -
4997 - /**
4998 - * Check if a string is valid UTF-8.
4999 - *
5000 - * @since 6.24
5001 - *
5002 - * @param string $string The string to check.
5003 - *
5004 - * @return bool
5005 - */
5006 - public static function is_valid_utf8( $string ) {
5007 - // wp_is_valid_utf8 is added in WP 6.9.
5008 - if ( function_exists( 'wp_is_valid_utf8' ) ) {
5009 - return wp_is_valid_utf8( $string );
5010 - }
5011 -
5012 - // As of WP 6.9, seems_utf8 is deprecated.
5013 - return function_exists( 'seems_utf8' ) ? seems_utf8( $string ) : false;
5014 - }
5015 -
5016 - /**
5017 - * Get a documentation URL with UTM parameters and affiliate tracking.
5018 - *
5019 - * @since 6.26
5020 - *
5021 - * @param string $path The relative path to append to the base URL.
5022 - * @param string $campaign The campaign to use for UTM parameters.
5023 - * @param bool $add_kb_base Whether to prepend 'knowledgebase/' to the path. Default true.
5024 - *
5025 - * @return string The processed URL with UTM parameters and affiliate tracking.
5026 - */
5027 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5028 - $path = trim( $path, '/' );
5029 -
5030 - if ( $add_kb_base ) {
5031 - $path = 'knowledgebase/' . $path;
5032 - }
5033 -
5034 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
5035 - }
5036 -
5037 - /**
5038 - * @since 5.0.16
5039 - * @deprecated 6.26
5040 - *
5041 - * @return bool
5042 - */
5043 - public static function show_landing_pages() {
5044 - _deprecated_function( __METHOD__, '6.26' );
5045 - return true;
5046 4473 }
5047 4474 }