PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.22
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.22
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 +288 -715 6.276.22 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.27';
32 + public static $plug_version = '6.22';
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,124 +114,55 @@
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 = isset( $args['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 165 * @since 6.21
238 166 *
239 167 * @param string $cta_link
240 168 * @param array $utm
@@ -239,29 +167,26 @@
239 167 * @param string $cta_link
240 168 * @param array $utm
241 169 */
242 170 public static function maybe_add_missing_utm( $cta_link, $utm ) {
243 - $utm = self::adjust_legacy_utm_args( $utm );
244 171 $query_args = array();
245 172
246 - if ( ! str_contains( $cta_link, 'utm_source' ) ) {
247 - $query_args['utm_source'] = 'plugin';
173 + if ( false === strpos( $cta_link, 'utm_source' ) ) {
174 + $query_args['utm_source'] = 'WordPress';
248 175 }
249 176
250 - if ( ! str_contains( $cta_link, 'utm_medium' ) ) {
251 - $query_args['utm_medium'] = self::get_utm_medium();
177 + if ( false === strpos( $cta_link, 'utm_campaign' ) ) {
178 + $query_args['utm_campaign'] = 'liteplugin';
252 179 }
253 180
254 - if ( ! str_contains( $cta_link, 'utm_campaign' ) && isset( $utm['campaign'] ) ) {
255 - $query_args['utm_campaign'] = $utm['campaign'];
181 + if ( false === strpos( $cta_link, 'utm_medium' ) && isset( $utm['medium'] ) ) {
182 + $query_args['utm_medium'] = $utm['medium'];
256 183 }
257 184
258 - if ( ! str_contains( $cta_link, 'utm_content' ) && isset( $utm['content'] ) ) {
185 + if ( false === strpos( $cta_link, 'utm_content' ) && isset( $utm['content'] ) ) {
259 186 $query_args['utm_content'] = $utm['content'];
260 187 }
261 188
262 - $query_args = self::maybe_add_utm_license( $query_args, $cta_link );
263 -
264 189 return $query_args ? add_query_arg( $query_args, $cta_link ) : $cta_link;
265 190 }
266 191
267 192 /**
@@ -269,14 +194,12 @@
269 194 *
270 195 * @since 2.0
271 196 *
272 197 * @param array $args - May include the form id when values need translation.
273 - *
274 198 * @return FrmSettings $frm_settings
275 199 */
276 200 public static function get_settings( $args = array() ) {
277 201 global $frm_settings;
278 -
279 202 if ( empty( $frm_settings ) ) {
280 203 $frm_settings = new FrmSettings( $args );
281 204 } elseif ( isset( $args['current_form'] ) ) {
282 205 // If the global has already been set, allow strings to be filtered.
@@ -290,9 +213,10 @@
290 213 * @return string
291 214 */
292 215 public static function get_menu_name() {
293 216 $frm_settings = self::get_settings();
294 - return FrmAddonsController::is_license_expired() || ! self::pro_is_installed() ? 'Formidable' : $frm_settings->menu;
217 +
218 + return FrmAddonsController::is_license_expired() ? 'Formidable' : $frm_settings->menu;
295 219 }
296 220
297 221 /**
298 222 * Determine if the current branding is set to 'formidable'.
@@ -307,9 +231,9 @@
307 231 return true;
308 232 }
309 233
310 234 $menu_icon = self::get_menu_icon_class();
311 - return str_contains( $menu_icon, 'frm_logo_icon' );
235 + return strpos( $menu_icon, 'frm_logo_icon' ) !== false;
312 236 }
313 237
314 238 /**
315 239 * @since 3.05
@@ -314,9 +238,8 @@
314 238 /**
315 239 * @since 3.05
316 240 *
317 241 * @param array $atts
318 - *
319 242 * @return string
320 243 */
321 244 public static function svg_logo( $atts = array() ) {
322 245 $defaults = array(
@@ -326,14 +249,12 @@
326 249 'orange' => '#f05a24',
327 250 );
328 251 $atts = array_merge( $defaults, $atts );
329 252
330 - // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong
331 253 return '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 599.68 601.37" width="' . esc_attr( $atts['width'] ) . '" height="' . esc_attr( $atts['height'] ) . '">
332 254 <path fill="' . esc_attr( $atts['orange'] ) . '" d="M289.6 384h140v76h-140z"/>
333 255 <path fill="' . esc_attr( $atts['fill'] ) . '" d="M400.2 147h-200c-17 0-30.6 12.2-30.6 29.3V218h260v-71zM397.9 264H169.6v196h75V340H398a32.2 32.2 0 0 0 30.1-21.4 24.3 24.3 0 0 0 1.7-8.7V264zM299.8 601.4A300.3 300.3 0 0 1 0 300.7a299.8 299.8 0 1 1 511.9 212.6 297.4 297.4 0 0 1-212 88zm0-563A262 262 0 0 0 38.3 300.7a261.6 261.6 0 1 0 446.5-185.5 259.5 259.5 0 0 0-185-76.8z"/>
334 256 </svg>';
335 - // phpcs:enable SlevomatCodingStandard.Files.LineLength.LineTooLong
336 257 }
337 258
338 259 /**
339 260 * @since 4.0
@@ -338,13 +259,12 @@
338 259 /**
339 260 * @since 4.0
340 261 *
341 262 * @param array $atts
342 - *
343 263 * @return void
344 264 */
345 265 public static function show_logo( $atts = array() ) {
346 - self::kses_echo( self::svg_logo( $atts ), 'all' );
266 + echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
347 267 }
348 268
349 269 /**
350 270 * @since 4.03.02
@@ -359,11 +279,10 @@
359 279 )
360 280 );
361 281
362 282 $new_icon = apply_filters( 'frm_icon', $icon, true );
363 -
364 283 if ( $new_icon !== $icon ) {
365 - if ( str_starts_with( $new_icon, '<svg' ) ) {
284 + if ( strpos( $new_icon, '<svg' ) === 0 ) {
366 285 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
367 286 } else {
368 287 // Show nothing if it isn't an SVG.
369 288 $icon = '<div style="height:39px"></div>';
@@ -368,9 +287,9 @@
368 287 // Show nothing if it isn't an SVG.
369 288 $icon = '<div style="height:39px"></div>';
370 289 }
371 290 }
372 - self::kses_echo( $icon, 'all' );
291 + echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
373 292 }
374 293
375 294 /**
376 295 * @since 2.02.04
@@ -420,13 +339,11 @@
420 339 */
421 340 public static function is_form_builder_page( $check_for_settings = true ) {
422 341 $action = self::simple_get( 'frm_action', 'sanitize_title' );
423 342 $check_actions = array( 'edit', 'duplicate' );
424 -
425 343 if ( $check_for_settings ) {
426 344 $check_actions[] = 'settings';
427 345 }
428 -
429 346 return self::is_admin_page( 'formidable' ) && in_array( $action, $check_actions, true );
430 347 }
431 348
432 349 /**
@@ -432,15 +349,15 @@
432 349 /**
433 350 * @return bool
434 351 */
435 352 public static function is_formidable_admin() {
436 - $page = self::simple_get( 'page', 'sanitize_title' );
437 -
438 - if ( ! $page ) {
439 - return self::is_view_builder_page();
353 + $page = self::simple_get( 'page', 'sanitize_title' );
354 + $is_formidable = strpos( $page, 'formidable' ) !== false;
355 + if ( empty( $page ) ) {
356 + $is_formidable = self::is_view_builder_page();
440 357 }
441 358
442 - return str_contains( $page, 'formidable' );
359 + return $is_formidable;
443 360 }
444 361
445 362 /**
446 363 * Checks if is a list page.
@@ -447,9 +364,8 @@
447 364 *
448 365 * @since 6.19
449 366 *
450 367 * @param string $page The name of the page to check.
451 - *
452 368 * @return bool
453 369 */
454 370 public static function is_admin_list_page( $page = 'formidable' ) {
455 371 if ( 'formidable' === $page ) {
@@ -461,9 +377,8 @@
461 377 }
462 378
463 379 if ( 'formidable-entries' === $page ) {
464 380 $action = self::simple_get( 'frm_action' );
465 -
466 381 if ( ! $action || in_array( $action, self::get_entries_listing_page_form_actions(), true ) ) {
467 382 return true;
468 383 }
469 384 }
@@ -492,13 +407,11 @@
492 407 */
493 408 public static function is_admin_page( $page = 'formidable' ) {
494 409 global $pagenow;
495 410 $get_page = self::simple_get( 'page', 'sanitize_title' );
496 -
497 411 if ( $pagenow ) {
498 412 // allow this to be true during ajax load i.e. ajax form builder loading
499 413 $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
500 -
501 414 if ( $is_page ) {
502 415 return true;
503 416 }
504 417 }
@@ -516,15 +429,15 @@
516 429 */
517 430 public static function is_view_builder_page() {
518 431 global $pagenow;
519 432
520 - if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), true ) ) {
433 + if ( $pagenow !== 'post.php' && $pagenow !== 'post-new.php' && $pagenow !== 'edit.php' ) {
521 434 return false;
522 435 }
523 436
524 437 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
525 438
526 - if ( ! $post_type ) {
439 + if ( empty( $post_type ) ) {
527 440 $post_id = self::simple_get( 'post', 'absint' );
528 441 $post = get_post( $post_id );
529 442 $post_type = $post ? $post->post_type : '';
530 443 }
@@ -542,9 +455,9 @@
542 455 public static function is_preview_page() {
543 456 global $pagenow;
544 457 $action = self::simple_get( 'action', 'sanitize_title' );
545 458
546 - return $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
459 + return $pagenow && $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
547 460 }
548 461
549 462 /**
550 463 * Check for ajax except the form preview page
@@ -565,9 +478,8 @@
565 478 }
566 479
567 480 /**
568 481 * @since 2.0.8
569 - *
570 482 * @return bool
571 483 */
572 484 public static function prevent_caching() {
573 485 global $frm_vars;
@@ -585,9 +497,8 @@
585 497 $is_admin = is_admin() && ! wp_doing_ajax();
586 498
587 499 /**
588 500 * @since 6.0
589 - *
590 501 * @param bool $is_admin
591 502 */
592 503 return apply_filters( 'frm_is_admin', $is_admin );
593 504 }
@@ -602,15 +513,14 @@
602 513 *
603 514 * @return bool
604 515 */
605 516 public static function is_empty_value( $value, $empty = '' ) {
606 - return $value === array() || $value === $empty;
517 + return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
607 518 }
608 519
609 520 /**
610 521 * @param mixed $value
611 522 * @param string $empty
612 - *
613 523 * @return bool
614 524 */
615 525 public static function is_not_empty_value( $value, $empty = '' ) {
616 526 return ! self::is_empty_value( $value, $empty );
@@ -664,9 +574,8 @@
664 574 continue;
665 575 }
666 576
667 577 $key = self::get_server_value( $key );
668 -
669 578 foreach ( explode( ',', $key ) as $ip ) {
670 579 // Just to be safe.
671 580 $ip = trim( $ip );
672 581
@@ -722,26 +631,16 @@
722 631 */
723 632 return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
724 633 }
725 634
726 - /**
727 - * @param string $param
728 - * @param mixed $default
729 - * @param string $src
730 - * @param callable|string $sanitize
731 - *
732 - * @return mixed
733 - */
734 635 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
735 - if ( str_contains( $param, '[' ) ) {
636 + if ( strpos( $param, '[' ) ) {
736 637 $params = explode( '[', $param );
737 638 $param = $params[0];
738 639 }
739 640
740 641 if ( $src === 'get' ) {
741 - // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
742 - $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
743 -
642 + $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default ); // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
744 643 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
745 644 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
746 645 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
747 646 }
@@ -756,9 +655,9 @@
756 655 )
757 656 );
758 657 }
759 658
760 - if ( isset( $params ) && is_array( $value ) && $value ) {
659 + if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
761 660 foreach ( $params as $k => $p ) {
762 661 if ( ! $k || ! is_array( $value ) ) {
763 662 continue;
764 663 }
@@ -763,9 +662,9 @@
763 662 continue;
764 663 }
765 664
766 665 $p = trim( $p, ']' );
767 - $value = $value[ $p ] ?? $default;
666 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
768 667 }
769 668 }
770 669
771 670 return $value;
@@ -777,9 +676,8 @@
777 676 * @param string $param The key we are trying to access data from in $_POST.
778 677 * @param mixed $default The default if nothing is being sent.
779 678 * @param callable|string $sanitize Make sure to pass a sanitize method here. This function will NOT sanitize by default.
780 679 * @param bool $serialized
781 - *
782 680 * @return mixed
783 681 */
784 682 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
785 683 return self::get_simple_request(
@@ -830,10 +728,10 @@
830 728 'sanitize' => 'sanitize_text_field',
831 729 'serialized' => false,
832 730 );
833 731 $args = wp_parse_args( $args, $defaults );
834 - $value = $args['default'];
835 732
733 + $value = $args['default'];
836 734 if ( $args['type'] === 'get' ) {
837 735 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
838 736 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
839 737 $value = wp_unslash( $_GET[ $args['param'] ] );
@@ -841,9 +739,8 @@
841 739 } elseif ( $args['type'] === 'post' ) {
842 740 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
843 741 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
844 742 $value = wp_unslash( $_POST[ $args['param'] ] );
845 -
846 743 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
847 744 self::unserialize_or_decode( $value );
848 745 }
849 746 }
@@ -868,9 +765,9 @@
868 765 * @return string $value
869 766 */
870 767 public static function preserve_backslashes( $value ) {
871 768 // If backslashes have already been added, don't add them again
872 - if ( ! str_contains( $value, '\\\\' ) ) {
769 + if ( strpos( $value, '\\\\' ) === false ) {
873 770 $value = addslashes( $value );
874 771 }
875 772
876 773 return $value;
@@ -881,9 +778,8 @@
881 778 * If $value is an array, the sanitize function will get called for each item.
882 779 *
883 780 * @param callable $sanitize
884 781 * @param mixed $value
885 - *
886 782 * @return void
887 783 */
888 784 public static function sanitize_value( $sanitize, &$value ) {
889 785 if ( ! $sanitize ) {
@@ -896,13 +792,11 @@
896 792 }
897 793
898 794 if ( is_array( $value ) ) {
899 795 $temp_values = $value;
900 -
901 796 foreach ( $temp_values as $k => $v ) {
902 797 self::sanitize_value( $sanitize, $value[ $k ] );
903 798 }
904 -
905 799 return;
906 800 }
907 801
908 802 $value = call_user_func( $sanitize, $value );
@@ -907,17 +801,10 @@
907 801
908 802 $value = call_user_func( $sanitize, $value );
909 803 }
910 804
911 - /**
912 - * @param array $sanitize_method
913 - * @param array $values
914 - *
915 - * @return void
916 - */
917 805 public static function sanitize_request( $sanitize_method, &$values ) {
918 806 $temp_values = $values;
919 -
920 807 foreach ( $temp_values as $k => $val ) {
921 808 if ( isset( $sanitize_method[ $k ] ) ) {
922 809 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
923 810 }
@@ -927,9 +814,8 @@
927 814 /**
928 815 * @since 4.0.04
929 816 *
930 817 * @param mixed $value
931 - *
932 818 * @return void
933 819 */
934 820 public static function sanitize_with_html( &$value ) {
935 821 if ( current_user_can( 'frm_edit_entries' ) || current_user_can( 'administrator' ) ) {
@@ -974,15 +860,12 @@
974 860 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
975 861 * this MUST be done, else we'll be back to the '& entity' problem.
976 862 *
977 863 * @since 4.0.04
978 - *
979 - * @param mixed $value Value to decode, passed by reference.
980 864 */
981 865 public static function decode_specialchars( &$value ) {
982 866 if ( is_array( $value ) ) {
983 867 $temp_values = $value;
984 -
985 868 foreach ( $temp_values as $k => $v ) {
986 869 self::decode_specialchars( $value[ $k ] );
987 870 }
988 871 } else {
@@ -996,13 +879,13 @@
996 879 * Adapted from wp_specialchars_decode().
997 880 *
998 881 * @since 4.03.01
999 882 *
1000 - * @param string $string The string to prep, passed by reference.
883 + * @param string $string The string to prep.
1001 884 */
1002 885 private static function decode_amp( &$string ) {
1003 886 // Don't bother if there are no entities - saves a lot of processing
1004 - if ( ! $string || ! str_contains( $string, '&' ) ) {
887 + if ( empty( $string ) || strpos( $string, '&' ) === false ) {
1005 888 return;
1006 889 }
1007 890
1008 891 $translation = array(
@@ -1040,15 +923,16 @@
1040 923 * Sanitize the value, and allow some HTML
1041 924 *
1042 925 * @since 2.0
1043 926 *
1044 - * @param string $value The value to sanitize.
1045 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
927 + * @param string $value
928 + * @param array|string $allowed 'all' for everything included as defaults.
1046 929 *
1047 930 * @return string
1048 931 */
1049 932 public static function kses( $value, $allowed = array() ) {
1050 933 $allowed_html = self::allowed_html( $allowed );
934 +
1051 935 return wp_kses( $value, $allowed_html );
1052 936 }
1053 937
1054 938 /**
@@ -1057,9 +941,8 @@
1057 941 * @since 6.18
1058 942 *
1059 943 * @param string $value The value to sanitize and output.
1060 944 * @param array|string $allowed Allowed HTML tags and attributes.
1061 - *
1062 945 * @return void
1063 946 */
1064 947 public static function kses_echo( $value, $allowed = array() ) {
1065 948 echo self::kses( $value, $allowed ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
@@ -1070,23 +953,21 @@
1070 953 *
1071 954 * @since 5.0.13
1072 955 *
1073 956 * @param string $html
1074 - *
1075 957 * @return string
1076 958 */
1077 959 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]' );
960 + $included_button_action = false !== strpos( $html, '[button_action]' );
961 + $included_back_hook = false !== strpos( $html, '[back_hook]' );
962 + $included_draft_hook = false !== strpos( $html, '[draft_hook]' );
1081 963 add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1082 964 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1083 965 $html = self::kses( $html, 'all' );
1084 966 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1085 967 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1086 -
1087 968 if ( $included_button_action ) {
1088 - if ( str_contains( $html, '<input type="submit"' ) ) {
969 + if ( false !== strpos( $html, '<input type="submit"' ) ) {
1089 970 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1090 971 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
1091 972 } else {
1092 973 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
@@ -1092,17 +973,14 @@
1092 973 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1093 974 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1094 975 }
1095 976 }
1096 -
1097 977 if ( $included_back_hook ) {
1098 978 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1099 979 }
1100 -
1101 980 if ( $included_draft_hook ) {
1102 981 $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1103 982 }
1104 -
1105 983 return $html;
1106 984 }
1107 985
1108 986 /**
@@ -1108,9 +986,8 @@
1108 986 /**
1109 987 * @since 5.0.13
1110 988 *
1111 989 * @param array $allowed_attr
1112 - *
1113 990 * @return array
1114 991 */
1115 992 public static function allow_visibility_style( $allowed_attr ) {
1116 993 $allowed_attr[] = 'visibility';
@@ -1120,9 +997,8 @@
1120 997 /**
1121 998 * @since 5.0.13
1122 999 *
1123 1000 * @param array $allowed_html
1124 - *
1125 1001 * @return array
1126 1002 */
1127 1003 public static function add_allowed_submit_button_tags( $allowed_html ) {
1128 1004 $allowed_html['input'] = array(
@@ -1139,22 +1015,17 @@
1139 1015 }
1140 1016
1141 1017 /**
1142 1018 * @since 2.05.03
1143 - *
1144 - * @param array|string $allowed
1145 - *
1146 - * @return array
1147 1019 */
1148 1020 private static function allowed_html( $allowed ) {
1149 1021 $html = self::safe_html();
1150 1022 $allowed_html = array();
1151 -
1152 1023 if ( $allowed === 'all' ) {
1153 1024 $allowed_html = $html;
1154 - } elseif ( $allowed ) {
1025 + } elseif ( ! empty( $allowed ) ) {
1155 1026 foreach ( (array) $allowed as $a ) {
1156 - $allowed_html[ $a ] = $html[ $a ] ?? array();
1027 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1157 1028 }
1158 1029 }
1159 1030
1160 1031 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1314,16 +1185,14 @@
1314 1185 return;
1315 1186 }
1316 1187
1317 1188 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1318 -
1319 - if ( ! $action_name ) {
1189 + if ( empty( $action_name ) ) {
1320 1190 return;
1321 1191 }
1322 1192
1323 1193 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1324 -
1325 - if ( $new_action ) {
1194 + if ( ! empty( $new_action ) ) {
1326 1195 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1327 1196 }
1328 1197 }
1329 1198
@@ -1330,22 +1199,16 @@
1330 1199 /**
1331 1200 * Check the WP query for a parameter
1332 1201 *
1333 1202 * @since 2.0
1334 - *
1335 - * @param array|string $value
1336 - * @param string $param
1337 - *
1338 1203 * @return array|string
1339 1204 */
1340 1205 public static function get_query_var( $value, $param ) {
1341 - // phpcs:ignore Universal.Operators.StrictComparisons
1342 1206 if ( $value != '' ) {
1343 1207 return $value;
1344 1208 }
1345 1209
1346 1210 global $wp_query;
1347 -
1348 1211 if ( isset( $wp_query->query_vars[ $param ] ) ) {
1349 1212 $value = $wp_query->query_vars[ $param ];
1350 1213 }
1351 1214
@@ -1358,21 +1221,20 @@
1358 1221 * @since 4.0.02
1359 1222 *
1360 1223 * @param string $class
1361 1224 * @param array $atts
1362 - *
1363 1225 * @return string|null
1364 1226 */
1365 1227 public static function icon_by_class( $class, $atts = array() ) {
1366 1228 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1367 -
1368 1229 if ( isset( $atts['echo'] ) ) {
1369 1230 unset( $atts['echo'] );
1370 1231 }
1371 1232
1372 1233 $html_atts = self::array_to_html_params( $atts );
1373 - $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1374 1234
1235 + $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1236 +
1375 1237 // Replace icons that have been removed or renamed.
1376 1238 $deprecated = array(
1377 1239 'frm_clone_solid_icon' => 'frm_clone_icon',
1378 1240 'frm_keyalt_icon' => 'frm_key_icon',
@@ -1377,9 +1239,8 @@
1377 1239 'frm_clone_solid_icon' => 'frm_clone_icon',
1378 1240 'frm_keyalt_icon' => 'frm_key_icon',
1379 1241 'frm_keyalt_solid_icon' => 'frm_key_solid_icon',
1380 1242 );
1381 -
1382 1243 if ( isset( $deprecated[ $icon ] ) ) {
1383 1244 $icon = $deprecated[ $icon ];
1384 1245 $class = str_replace( $icon, $deprecated[ $icon ], $class );
1385 1246 }
@@ -1386,24 +1247,21 @@
1386 1247
1387 1248 if ( $icon === $class ) {
1388 1249 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1389 1250 } else {
1390 - $class = ! str_contains( $icon, ' ' ) ? '' : ' ' . $icon;
1391 -
1392 - if ( str_contains( $icon, ' ' ) ) {
1251 + $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
1252 + if ( strpos( $icon, ' ' ) ) {
1393 1253 $icon = explode( ' ', $icon );
1394 1254 $icon = reset( $icon );
1395 1255 }
1396 -
1397 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use href="#' . esc_attr( $icon ) . '" /></svg>';
1256 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use xlink:href="#' . esc_attr( $icon ) . '" /></svg>';
1398 1257 }
1399 1258
1400 1259 if ( $echo ) {
1401 1260 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1402 - return null;
1261 + } else {
1262 + return $icon;
1403 1263 }
1404 -
1405 - return $icon;
1406 1264 }
1407 1265
1408 1266 /**
1409 1267 * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
@@ -1410,9 +1268,8 @@
1410 1268 *
1411 1269 * @since 5.0.13
1412 1270 *
1413 1271 * @param string $icon
1414 - *
1415 1272 * @return string
1416 1273 */
1417 1274 public static function kses_icon( $icon ) {
1418 1275 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1428,15 +1285,13 @@
1428 1285 /**
1429 1286 * @since 5.0.13.1
1430 1287 *
1431 1288 * @param array $allowed_html
1432 - *
1433 1289 * @return array
1434 1290 */
1435 1291 public static function add_allowed_icon_tags( $allowed_html ) {
1436 1292 $allowed_html['svg']['data-open'] = true;
1437 1293 $allowed_html['svg']['title'] = true;
1438 - $allowed_html['svg']['tabindex'] = true;
1439 1294 return $allowed_html;
1440 1295 }
1441 1296
1442 1297 /**
@@ -1442,9 +1297,8 @@
1442 1297 /**
1443 1298 * @since 5.0.13
1444 1299 *
1445 1300 * @param array $allowed_attr
1446 - *
1447 1301 * @return array
1448 1302 */
1449 1303 public static function allow_vars_in_styles( $allowed_attr ) {
1450 1304 $allowed_attr[] = '--primary-700';
@@ -1457,9 +1311,9 @@
1457 1311 * @param bool $allow_css
1458 1312 * @param string $css_string
1459 1313 */
1460 1314 public static function allow_style( $allow_css, $css_string ) {
1461 - if ( ! $allow_css && str_starts_with( $css_string, '--primary-700:' ) ) {
1315 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-700:' ) ) {
1462 1316 $split = explode( ':', $css_string, 2 );
1463 1317 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1464 1318 }
1465 1319 return $allow_css;
@@ -1468,22 +1322,19 @@
1468 1322 /**
1469 1323 * @since 5.0.13
1470 1324 *
1471 1325 * @param string $value
1472 - *
1473 1326 * @return bool
1474 1327 */
1475 1328 private static function is_a_valid_color( $value ) {
1476 1329 $match = 0;
1477 -
1478 - if ( str_starts_with( $value, 'rgba(' ) ) {
1330 + if ( 0 === strpos( $value, 'rgba(' ) ) {
1479 1331 $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1480 - } elseif ( str_starts_with( $value, 'rgb(' ) ) {
1332 + } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1481 1333 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1482 - } elseif ( str_starts_with( $value, '#' ) ) {
1334 + } elseif ( 0 === strpos( $value, '#' ) ) {
1483 1335 $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1484 1336 }
1485 -
1486 1337 return (bool) $match;
1487 1338 }
1488 1339
1489 1340 /**
@@ -1489,9 +1340,8 @@
1489 1340 /**
1490 1341 * Include svg images.
1491 1342 *
1492 1343 * @since 4.0.02
1493 - *
1494 1344 * @return void
1495 1345 */
1496 1346 public static function include_svg() {
1497 1347 if ( self::$included_svg ) {
@@ -1510,9 +1360,8 @@
1510 1360 * @since 5.0.13 added $echo parameter.
1511 1361 *
1512 1362 * @param array $atts
1513 1363 * @param bool $echo
1514 - *
1515 1364 * @return string|void
1516 1365 */
1517 1366 public static function array_to_html_params( $atts, $echo = false ) {
1518 1367 $callback = function () use ( $atts ) {
@@ -1531,9 +1380,8 @@
1531 1380 * @since 5.0.13
1532 1381 *
1533 1382 * @param Closure $echo_function
1534 1383 * @param bool $echo
1535 - *
1536 1384 * @return string|null
1537 1385 */
1538 1386 public static function clip( $echo_function, $echo = false ) {
1539 1387 if ( ! $echo ) {
@@ -1543,9 +1391,13 @@
1543 1391 if ( is_callable( $echo_function ) ) {
1544 1392 $echo_function();
1545 1393 }
1546 1394
1547 - return $echo ? null : ob_get_clean();
1395 + if ( ! $echo ) {
1396 + $return = ob_get_contents();
1397 + ob_end_clean();
1398 + return $return;
1399 + }
1548 1400 }
1549 1401
1550 1402 /**
1551 1403 * @since 3.0
@@ -1550,18 +1402,15 @@
1550 1402 /**
1551 1403 * @since 3.0
1552 1404 *
1553 1405 * @param array $atts
1554 - *
1555 1406 * @return void
1556 1407 */
1557 1408 public static function get_admin_header( $atts ) {
1558 1409 $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1559 -
1560 1410 if ( empty( $atts['close'] ) ) {
1561 1411 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1562 1412 }
1563 -
1564 1413 if ( ! isset( $atts['import_link'] ) ) {
1565 1414 $atts['import_link'] = false;
1566 1415 }
1567 1416
@@ -1571,9 +1420,8 @@
1571 1420 /**
1572 1421 * @since 6.0
1573 1422 *
1574 1423 * @param string $type
1575 - *
1576 1424 * @return void
1577 1425 */
1578 1426 public static function import_link( $type = 'secondary' ) {
1579 1427 ?>
@@ -1588,9 +1436,8 @@
1588 1436 *
1589 1437 * @since 5.4.2
1590 1438 *
1591 1439 * @param bool $should_show_lite_upgrade
1592 - *
1593 1440 * @return void
1594 1441 */
1595 1442 public static function print_admin_banner( $should_show_lite_upgrade ) {
1596 1443 if ( ! current_user_can( 'administrator' ) ) {
@@ -1607,9 +1454,8 @@
1607 1454 <div class="frm-upgrade-bar">
1608 1455 <div class="frm-upgrade-bar-inner">
1609 1456 <?php
1610 1457 $cta_text = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_text' );
1611 -
1612 1458 if ( ! $cta_text ) {
1613 1459 $cta_text = __( 'upgrading to PRO', 'formidable' );
1614 1460 }
1615 1461
@@ -1614,13 +1460,17 @@
1614 1460 }
1615 1461
1616 1462 $upgrade_link = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_link' );
1617 1463 $utm = array(
1618 - 'campaign' => 'settings-license',
1619 - 'content' => 'lite-banner',
1464 + 'medium' => 'settings-license',
1465 + 'content' => 'lite-banner',
1620 1466 );
1621 1467
1622 - $upgrade_link = $upgrade_link ? self::maybe_add_missing_utm( $upgrade_link, $utm ) : self::admin_upgrade_link( $utm );
1468 + if ( $upgrade_link ) {
1469 + $upgrade_link = self::maybe_add_missing_utm( $upgrade_link, $utm );
1470 + } else {
1471 + $upgrade_link = self::admin_upgrade_link( $utm );
1472 + }
1623 1473
1624 1474 printf(
1625 1475 /* translators: %1$s: Start link HTML, %2$s: CTA text ("upgrading to PRO" by default), %3$s: End link HTML */
1626 1476 esc_html__( 'You\'re using Formidable Forms Lite. To unlock more features consider %1$s%2$s%3$s.', 'formidable' ),
@@ -1646,9 +1496,8 @@
1646 1496 /**
1647 1497 * Render a button for a new item (Form, Application, etc).
1648 1498 *
1649 1499 * @since 3.0
1650 - *
1651 1500 * @param array $atts {
1652 1501 * Details about the button.
1653 1502 *
1654 1503 * @type array $link_hook Custom link hook, calls do_action and exits early.
@@ -1655,9 +1504,8 @@
1655 1504 * @type string $new_link Href value, default #.
1656 1505 * @type string $class Custom class names, space separated.
1657 1506 * @type string $button_text Button text. Default "Add New".
1658 1507 * }
1659 - *
1660 1508 * @return void
1661 1509 */
1662 1510 public static function add_new_item_link( $atts ) {
1663 1511 if ( isset( $atts['link_hook'] ) ) {
@@ -1683,12 +1531,8 @@
1683 1531 }
1684 1532
1685 1533 /**
1686 1534 * @since 3.06
1687 - *
1688 - * @param array $atts
1689 - *
1690 - * @return void
1691 1535 */
1692 1536 public static function show_search_box( $atts ) {
1693 1537 $defaults = array(
1694 1538 'placeholder' => '',
@@ -1695,9 +1539,8 @@
1695 1539 'tosearch' => '',
1696 1540 'text' => __( 'Search', 'formidable' ),
1697 1541 'input_id' => '',
1698 1542 'value' => false,
1699 - 'class' => '',
1700 1543 );
1701 1544 $atts = array_merge( $defaults, $atts );
1702 1545
1703 1546 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
@@ -1704,9 +1547,8 @@
1704 1547 $atts['tosearch'] = 'frm-card';
1705 1548 }
1706 1549
1707 1550 $class = 'frm-search-input';
1708 -
1709 1551 if ( ! empty( $atts['tosearch'] ) ) {
1710 1552 $class .= ' frm-auto-search';
1711 1553 }
1712 1554
@@ -1731,13 +1573,13 @@
1731 1573 if ( ! empty( $atts['tosearch'] ) ) {
1732 1574 $input_atts['autocomplete'] = 'off';
1733 1575 }
1734 1576 ?>
1735 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1577 + <p class="frm-search">
1736 1578 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1737 1579 <?php echo esc_html( $atts['text'] ); ?>:
1738 1580 </label>
1739 - <?php self::icon_by_class( 'frmfont frm_search_icon frm_svg20' ); ?>
1581 + <span class="frmfont frm_search_icon"></span>
1740 1582 <input <?php self::array_to_html_params( $input_atts, true ); ?> />
1741 1583 <?php
1742 1584 if ( empty( $atts['tosearch'] ) ) {
1743 1585 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
@@ -1747,17 +1589,14 @@
1747 1589 <?php
1748 1590 }
1749 1591
1750 1592 /**
1751 - * @param string $type Hook type slug.
1752 - * @param object|null $object Optional related object.
1753 - *
1593 + * @param string $type
1754 1594 * @return void
1755 1595 */
1756 1596 public static function trigger_hook_load( $type, $object = null ) {
1757 1597 // Only load the form hooks once.
1758 1598 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1759 -
1760 1599 if ( ! $hooks_loaded ) {
1761 1600 do_action( 'frm_load_' . $type . '_hooks' );
1762 1601 }
1763 1602 }
@@ -1816,14 +1655,14 @@
1816 1655 * True when value is 1, true, 'true', 'yes'
1817 1656 *
1818 1657 * @since 1.07.10
1819 1658 *
1820 - * @param int|string $value The value to compare.
1659 + * @param string $value The value to compare.
1821 1660 *
1822 1661 * @return bool
1823 1662 */
1824 1663 public static function is_true( $value ) {
1825 - return true === $value || '1' === (string) $value || 'true' === $value || 'yes' === $value;
1664 + return true === $value || 1 == $value || 'true' === $value || 'yes' === $value;
1826 1665 }
1827 1666
1828 1667 /**
1829 1668 * Gets all post from a specific post type.
@@ -1831,9 +1670,8 @@
1831 1670 *
1832 1671 * @since 4.10.01 Add `$post_type` argument.
1833 1672 *
1834 1673 * @param string $post_type Post type to query. Default is `page`.
1835 - *
1836 1674 * @return WP_Post[]
1837 1675 */
1838 1676 public static function get_pages( $post_type = 'page' ) {
1839 1677 $query = array(
@@ -1852,9 +1690,8 @@
1852 1690 *
1853 1691 * @since 5.0.09
1854 1692 *
1855 1693 * @param string $post_type Post type to query. Default is `page`.
1856 - *
1857 1694 * @return array
1858 1695 */
1859 1696 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1860 1697 return FrmDb::get_results(
@@ -1879,9 +1716,10 @@
1879 1716 *
1880 1717 * @param array $args Selection arguments.
1881 1718 */
1882 1719 public static function maybe_autocomplete_pages_options( $args ) {
1883 - $args = self::preformat_selection_args( $args );
1720 + $args = self::preformat_selection_args( $args );
1721 +
1884 1722 $pages_count = wp_count_posts( $args['post_type'] );
1885 1723
1886 1724 if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1887 1725 self::wp_pages_dropdown( $args );
@@ -1928,11 +1766,11 @@
1928 1766 'value_key' => 'value',
1929 1767 'label_key' => 'label',
1930 1768 );
1931 1769
1932 - $args = wp_parse_args( $args, $defaults );
1770 + $args = wp_parse_args( $args, $defaults );
1771 +
1933 1772 $html_attrs = array();
1934 -
1935 1773 if ( ! empty( $args['name'] ) ) {
1936 1774 $html_attrs['name'] = $args['name'];
1937 1775 }
1938 1776
@@ -1946,14 +1784,13 @@
1946 1784 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
1947 1785 <?php
1948 1786 foreach ( $args['source'] as $key => $source ) :
1949 1787 $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1950 -
1951 1788 if ( ! empty( $args['truncate'] ) ) {
1952 1789 $value_label['label'] = self::truncate( $value_label['label'], $args['truncate'] );
1953 1790 }
1954 1791 ?>
1955 - <option value="<?php echo esc_attr( $value_label['value'] ); ?>" <?php selected( $value_label['value'], $args['selected'] ); ?>><?php echo esc_html( $value_label['label'] ); ?></option><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
1792 + <option value="<?php echo esc_attr( $value_label['value'] ); ?>" <?php selected( $value_label['value'], $args['selected'] ); ?>><?php echo esc_html( $value_label['label'] ); ?></option>
1956 1793 <?php endforeach; ?>
1957 1794 </select>
1958 1795 <?php
1959 1796 } else {
@@ -1958,9 +1795,8 @@
1958 1795 <?php
1959 1796 } else {
1960 1797 $options = array();
1961 1798 $autocomplete_value = '';
1962 -
1963 1799 foreach ( $args['source'] as $key => $source ) {
1964 1800 $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1965 1801
1966 1802 if ( $value_label['value'] === $args['selected'] ) {
@@ -1990,15 +1826,14 @@
1990 1826 *
1991 1827 * @param array|string $option Autocomplete option.
1992 1828 * @param string $key Array key of the option.
1993 1829 * @param array $args See {@see FrmAppHelper::maybe_autocomplete_options()}.
1994 - *
1995 1830 * @return array
1996 1831 */
1997 1832 private static function get_dropdown_value_and_label_from_option( $option, $key, $args ) {
1998 1833 if ( is_array( $option ) ) {
1999 - $value = $option[ $args['value_key'] ] ?? '';
2000 - $label = $option[ $args['label_key'] ] ?? '';
1834 + $value = isset( $option[ $args['value_key'] ] ) ? $option[ $args['value_key'] ] : '';
1835 + $label = isset( $option[ $args['label_key'] ] ) ? $option[ $args['label_key'] ] : '';
2001 1836 } else {
2002 1837 $value = $key;
2003 1838 $label = $option;
2004 1839 }
@@ -2032,14 +1867,8 @@
2032 1867 * Fill in missing parameters passed to wp_pages_dropdown().
2033 1868 * This is for reverse compatibility with switching 3 params to 1.
2034 1869 *
2035 1870 * @since 4.03.06
2036 - *
2037 - * @param string $page_id Deprecated.
2038 - * @param bool $truncate Deprecated.
2039 - * @param mixed $args
2040 - *
2041 - * @return void
2042 1871 */
2043 1872 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2044 1873 if ( ! is_array( $args ) ) {
2045 1874 $args = array(
@@ -2056,12 +1885,8 @@
2056 1885 * Filter to format args for page dropdown or autocomplete
2057 1886 *
2058 1887 * @since 4.03.06
2059 1888 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2060 - *
2061 - * @param array $args
2062 - *
2063 - * @return array
2064 1889 */
2065 1890 private static function preformat_selection_args( $args ) {
2066 1891 $defaults = array(
2067 1892 'truncate' => false,
@@ -2074,18 +1899,13 @@
2074 1899
2075 1900 return array_merge( $defaults, $args );
2076 1901 }
2077 1902
2078 - /**
2079 - * @param int $post_id
2080 - *
2081 - * @return string
2082 - */
2083 1903 public static function post_edit_link( $post_id ) {
2084 1904 $post = get_post( $post_id );
2085 -
2086 1905 if ( $post ) {
2087 1906 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1907 +
2088 1908 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2089 1909 }
2090 1910
2091 1911 return '';
@@ -2112,9 +1932,8 @@
2112 1932 * @since 5.5.3
2113 1933 * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
2114 1934 *
2115 1935 * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
2116 - *
2117 1936 * @return bool
2118 1937 */
2119 1938 public static function is_style_editor_page( $view = '' ) {
2120 1939 if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
@@ -2162,9 +1981,8 @@
2162 1981 }
2163 1982
2164 1983 /**
2165 1984 * @since 4.07
2166 - *
2167 1985 * @param array|string $selected
2168 1986 * @param string $current
2169 1987 */
2170 1988 private static function selected( $selected, $current ) {
@@ -2179,9 +1997,8 @@
2179 1997 * @param array|string $capability
2180 1998 */
2181 1999 public static function roles_options( $capability ) {
2182 2000 global $frm_vars;
2183 -
2184 2001 if ( isset( $frm_vars['editable_roles'] ) ) {
2185 2002 $editable_roles = $frm_vars['editable_roles'];
2186 2003 } else {
2187 2004 $editable_roles = get_editable_roles();
@@ -2190,9 +2007,9 @@
2190 2007
2191 2008 foreach ( $editable_roles as $role => $details ) {
2192 2009 $name = translate_user_role( $details['name'] );
2193 2010 ?>
2194 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
2011 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?> </option>
2195 2012 <?php
2196 2013 unset( $role, $details );
2197 2014 }
2198 2015 }
@@ -2202,9 +2019,8 @@
2202 2019 *
2203 2020 * @since 5.0 Parameter `$type` supports `pro_only` value.
2204 2021 *
2205 2022 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2206 - *
2207 2023 * @return array
2208 2024 */
2209 2025 public static function frm_capabilities( $type = 'auto' ) {
2210 2026 if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
@@ -2222,8 +2038,14 @@
2222 2038 * @param array<string,string> $pro_cap
2223 2039 */
2224 2040 $pro_cap = apply_filters( 'frm_pro_capabilities', $pro_cap );
2225 2041
2042 + if ( ! array_key_exists( 'frm_edit_displays', $pro_cap ) && is_callable( 'FrmProAppHelper::views_is_installed' ) && FrmProAppHelper::views_is_installed() ) {
2043 + // For backward compatibility, add the Add/Edit Views permission if Pro is not up to date.
2044 + // This was added in 6.5.4. Remove this in the future.
2045 + $pro_cap['frm_edit_displays'] = __( 'Add/Edit Views', 'formidable' );
2046 + }
2047 +
2226 2048 if ( 'pro_only' === $type ) {
2227 2049 return $pro_cap;
2228 2050 }
2229 2051
@@ -2269,18 +2091,21 @@
2269 2091 if ( $role === 'loggedin' || ! $role ) {
2270 2092 return is_user_logged_in();
2271 2093 }
2272 2094
2273 - if ( (int) $role === 1 ) {
2095 + if ( $role == 1 ) {
2274 2096 $role = 'administrator';
2275 2097 }
2276 2098
2277 - return is_user_logged_in() ? current_user_can( $role ) : false;
2099 + if ( ! is_user_logged_in() ) {
2100 + return false;
2101 + }
2102 +
2103 + return current_user_can( $role );
2278 2104 }
2279 2105
2280 2106 /**
2281 2107 * @param array|string $needed_role
2282 - *
2283 2108 * @return bool
2284 2109 */
2285 2110 public static function user_has_permission( $needed_role ) {
2286 2111 if ( is_array( $needed_role ) ) {
@@ -2294,20 +2119,18 @@
2294 2119 }
2295 2120
2296 2121 $can = self::current_user_can( $needed_role );
2297 2122
2298 - if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ), true ) ) {
2123 + if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ) ) ) {
2299 2124 return $can;
2300 2125 }
2301 2126
2302 2127 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2303 -
2304 2128 foreach ( $roles as $role ) {
2305 2129 if ( current_user_can( $role ) ) {
2306 2130 return true;
2307 2131 }
2308 -
2309 - if ( $role === $needed_role ) {
2132 + if ( $role == $needed_role ) {
2310 2133 break;
2311 2134 }
2312 2135 }
2313 2136
@@ -2328,9 +2151,8 @@
2328 2151
2329 2152 $user_id = get_current_user_id();
2330 2153 $user = new WP_User( $user_id );
2331 2154 $frm_roles = self::frm_capabilities();
2332 -
2333 2155 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2334 2156 $user->add_cap( $frm_role );
2335 2157 unset( $frm_role, $frm_role_description );
2336 2158 }
@@ -2341,9 +2163,8 @@
2341 2163 *
2342 2164 * @since 2.0.6
2343 2165 *
2344 2166 * @param string $cap
2345 - *
2346 2167 * @return void
2347 2168 */
2348 2169 public static function force_capability( $cap = 'frm_change_settings' ) {
2349 2170 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
@@ -2348,9 +2169,8 @@
2348 2169 public static function force_capability( $cap = 'frm_change_settings' ) {
2349 2170 if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
2350 2171 $role = get_role( 'administrator' );
2351 2172 $frm_roles = self::frm_capabilities();
2352 -
2353 2173 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2354 2174 $role->add_cap( $frm_role );
2355 2175 }
2356 2176 }
@@ -2362,18 +2182,15 @@
2362 2182 *
2363 2183 * @since 2.0
2364 2184 *
2365 2185 * @param string $permission
2366 - * @param string $show_message
2367 2186 */
2368 2187 public static function permission_check( $permission, $show_message = 'show' ) {
2369 2188 $permission_error = self::permission_nonce_error( $permission );
2370 -
2371 2189 if ( $permission_error !== false ) {
2372 - if ( 'hide' === $show_message ) {
2190 + if ( 'hide' == $show_message ) {
2373 2191 $permission_error = '';
2374 2192 }
2375 -
2376 2193 wp_die( esc_html( $permission_error ) );
2377 2194 }
2378 2195 }
2379 2196
@@ -2382,27 +2199,24 @@
2382 2199 *
2383 2200 * @since 2.0
2384 2201 *
2385 2202 * @param string $permission
2386 - * @param string $nonce_name
2387 - * @param string $nonce
2388 2203 *
2389 2204 * @return false|string The permission message or false if allowed
2390 2205 */
2391 2206 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
2392 - if ( $permission && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2207 + if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2393 2208 $frm_settings = self::get_settings();
2209 +
2394 2210 return $frm_settings->admin_permission;
2395 2211 }
2396 2212
2397 2213 $error = false;
2398 -
2399 - if ( ! $nonce_name ) {
2214 + if ( empty( $nonce_name ) ) {
2400 2215 return $error;
2401 2216 }
2402 2217
2403 2218 $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2404 -
2405 2219 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2406 2220 $frm_settings = self::get_settings();
2407 2221 $error = $frm_settings->admin_permission;
2408 2222 }
@@ -2409,14 +2223,8 @@
2409 2223
2410 2224 return $error;
2411 2225 }
2412 2226
2413 - /**
2414 - * @param array|string $values
2415 - * @param string $current
2416 - *
2417 - * @return void
2418 - */
2419 2227 public static function checked( $values, $current ) {
2420 2228 if ( self::check_selected( $values, $current ) ) {
2421 2229 echo ' checked="checked"';
2422 2230 }
@@ -2421,34 +2229,25 @@
2421 2229 echo ' checked="checked"';
2422 2230 }
2423 2231 }
2424 2232
2425 - /**
2426 - * @param array|string $values
2427 - * @param string $current
2428 - *
2429 - * @return bool
2430 - */
2431 2233 public static function check_selected( $values, $current ) {
2432 - $values = self::recursive_function_map( $values, 'trim' );
2433 - $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2234 + $values = self::recursive_function_map( $values, 'trim' );
2235 + $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2236 +
2434 2237 $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
2435 2238
2436 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict, Universal.Operators.StrictComparisons
2437 2239 return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2438 2240 }
2439 2241
2440 - /**
2441 - * @param array|string $value
2442 - * @param callable|string $function
2443 - *
2444 - * @return array|string
2445 - */
2446 2242 public static function recursive_function_map( $value, $function ) {
2447 2243 if ( is_array( $value ) ) {
2448 2244 $original_function = $function;
2449 - $function = count( $value ) ? explode( ', ', FrmDb::prepare_array_values( $value, $function ) ) : array( $function );
2450 -
2245 + if ( count( $value ) ) {
2246 + $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
2247 + } else {
2248 + $function = array( $function );
2249 + }
2451 2250 if ( ! self::is_assoc( $value ) ) {
2452 2251 $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2453 2252 } else {
2454 2253 foreach ( $value as $k => $v ) {
@@ -2459,9 +2258,9 @@
2459 2258 }
2460 2259 } else {
2461 2260 $value = self::maybe_update_value_if_null( $value, $function );
2462 2261 $value = call_user_func( $function, $value );
2463 - }//end if
2262 + }
2464 2263
2465 2264 return $value;
2466 2265 }
2467 2266
@@ -2468,12 +2267,10 @@
2468 2267 /**
2469 2268 * Updates value to empty string if it is null and being passed to a string function.
2470 2269 *
2471 2270 * @since 6.8.4
2472 - *
2473 2271 * @param mixed $value
2474 2272 * @param string $function
2475 - *
2476 2273 * @return mixed
2477 2274 */
2478 2275 private static function maybe_update_value_if_null( $value, $function ) {
2479 2276 if ( null === $value && in_array( $function, array( 'trim', 'strlen' ), true ) ) {
@@ -2482,13 +2279,8 @@
2482 2279
2483 2280 return $value;
2484 2281 }
2485 2282
2486 - /**
2487 - * @param array $array
2488 - *
2489 - * @return bool
2490 - */
2491 2283 public static function is_assoc( $array ) {
2492 2284 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2493 2285 }
2494 2286
@@ -2493,17 +2285,11 @@
2493 2285 }
2494 2286
2495 2287 /**
2496 2288 * Flatten a multi-dimensional array
2497 - *
2498 - * @param array $array
2499 - * @param string $keys
2500 - *
2501 - * @return array
2502 2289 */
2503 2290 public static function array_flatten( $array, $keys = 'keep' ) {
2504 2291 $return = array();
2505 -
2506 2292 foreach ( $array as $key => $value ) {
2507 2293 if ( is_array( $value ) ) {
2508 2294 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2509 2295 } elseif ( $keys === 'keep' ) {
@@ -2522,9 +2308,8 @@
2522 2308 * @since 6.16.1
2523 2309 *
2524 2310 * @param string $sep
2525 2311 * @param array $array
2526 - *
2527 2312 * @return string
2528 2313 */
2529 2314 public static function safe_implode( $sep, $array ) {
2530 2315 $array = self::array_flatten( $array );
@@ -2533,18 +2318,15 @@
2533 2318
2534 2319 /**
2535 2320 * @param string $text
2536 2321 * @param bool $is_rich_text
2537 - *
2538 2322 * @return string
2539 2323 */
2540 2324 public static function esc_textarea( $text, $is_rich_text = false ) {
2541 2325 $safe_text = str_replace( '&quot;', '"', $text );
2542 -
2543 2326 if ( ! $is_rich_text ) {
2544 2327 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2545 2328 }
2546 -
2547 2329 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2548 2330
2549 2331 /**
2550 2332 * @param string $safe_text
@@ -2556,12 +2338,8 @@
2556 2338 /**
2557 2339 * Add auto paragraphs to text areas
2558 2340 *
2559 2341 * @since 2.0
2560 - *
2561 - * @param mixed $content
2562 - *
2563 - * @return mixed
2564 2342 */
2565 2343 public static function use_wpautop( $content ) {
2566 2344 if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
2567 2345 $content = wpautop( str_replace( '<br>', '<br />', $content ) );
@@ -2569,44 +2347,33 @@
2569 2347
2570 2348 return $content;
2571 2349 }
2572 2350
2573 - /**
2574 - * Replace quotes with their HTML entities.
2575 - *
2576 - * @param string $val
2577 - *
2578 - * @return string
2579 - */
2580 2351 public static function replace_quotes( $val ) {
2581 2352 // Replace double quotes.
2582 2353 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2583 2354
2584 2355 // Replace single quotes.
2585 - return str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
2356 + $val = str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
2357 +
2358 + return $val;
2586 2359 }
2587 2360
2588 2361 /**
2589 - * @param string $handle
2590 - * @param int|string $default
2591 - *
2592 - * @return int|string
2362 + * @param string $handle
2593 2363 */
2594 2364 public static function script_version( $handle, $default = 0 ) {
2595 2365 global $wp_scripts;
2596 -
2597 2366 if ( ! $wp_scripts ) {
2598 2367 return $default;
2599 2368 }
2600 2369
2601 2370 $ver = $default;
2602 -
2603 2371 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2604 2372 return $ver;
2605 2373 }
2606 2374
2607 2375 $query = $wp_scripts->registered[ $handle ];
2608 -
2609 2376 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2610 2377 $ver = $query->ver;
2611 2378 }
2612 2379
@@ -2617,9 +2384,8 @@
2617 2384 * @since 5.0.13 added $echo param.
2618 2385 *
2619 2386 * @param string $url
2620 2387 * @param bool $echo
2621 - *
2622 2388 * @return string|null
2623 2389 */
2624 2390 public static function js_redirect( $url, $echo = false ) {
2625 2391 $callback = function () use ( $url ) {
@@ -2627,13 +2393,8 @@
2627 2393 };
2628 2394 return self::clip( $callback, $echo );
2629 2395 }
2630 2396
2631 - /**
2632 - * @param int|string $user_id
2633 - *
2634 - * @return int|string
2635 - */
2636 2397 public static function get_user_id_param( $user_id ) {
2637 2398 if ( ! $user_id || is_numeric( $user_id ) ) {
2638 2399 return $user_id;
2639 2400 }
@@ -2638,13 +2399,16 @@
2638 2399 return $user_id;
2639 2400 }
2640 2401
2641 2402 $user_id = sanitize_text_field( $user_id );
2642 -
2643 2403 if ( $user_id === 'current' ) {
2644 2404 $user_id = get_current_user_id();
2645 2405 } else {
2646 - $user = is_email( $user_id ) ? get_user_by( 'email', $user_id ) : get_user_by( 'login', $user_id );
2406 + if ( is_email( $user_id ) ) {
2407 + $user = get_user_by( 'email', $user_id );
2408 + } else {
2409 + $user = get_user_by( 'login', $user_id );
2410 + }
2647 2411
2648 2412 if ( $user ) {
2649 2413 $user_id = $user->ID;
2650 2414 }
@@ -2656,9 +2420,8 @@
2656 2420
2657 2421 /**
2658 2422 * @param string $filename
2659 2423 * @param array $atts
2660 - *
2661 2424 * @return false|string
2662 2425 */
2663 2426 public static function get_file_contents( $filename, $atts = array() ) {
2664 2427 if ( ! is_file( $filename ) ) {
@@ -2667,9 +2430,12 @@
2667 2430
2668 2431 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2669 2432 ob_start();
2670 2433 include $filename;
2671 - return ob_get_clean();
2434 + $contents = ob_get_contents();
2435 + ob_end_clean();
2436 +
2437 + return $contents;
2672 2438 }
2673 2439
2674 2440 /**
2675 2441 * @param string $name
@@ -2679,9 +2445,8 @@
2679 2445 * @param int $num_chars
2680 2446 */
2681 2447 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2682 2448 $key = '';
2683 -
2684 2449 if ( $name ) {
2685 2450 $key = sanitize_key( $name );
2686 2451 $key = self::maybe_clear_long_key( $key, $column );
2687 2452 }
@@ -2732,24 +2497,20 @@
2732 2497 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2733 2498 *
2734 2499 * @param string $column
2735 2500 * @param string $key
2736 - *
2737 2501 * @return string
2738 2502 */
2739 2503 private static function maybe_truncate_key_before_appending( $column, $key ) {
2740 2504 if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2741 2505 $max_key_length_before_truncating = 60;
2742 -
2743 2506 if ( strlen( $key ) > $max_key_length_before_truncating ) {
2744 2507 $key = substr( $key, 0, $max_key_length_before_truncating );
2745 -
2746 2508 if ( is_numeric( $key ) ) {
2747 2509 $key .= 'a';
2748 2510 }
2749 2511 }
2750 2512 }
2751 -
2752 2513 return $key;
2753 2514 }
2754 2515
2755 2516 /**
@@ -2756,9 +2517,8 @@
2756 2517 * Possibly reset a key to avoid conflicts with column size limits.
2757 2518 *
2758 2519 * @param string $key
2759 2520 * @param string $column
2760 - *
2761 2521 * @return string either the original key value, or an empty string if the key was too long.
2762 2522 */
2763 2523 private static function maybe_clear_long_key( $key, $column ) {
2764 2524 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
@@ -2770,22 +2530,20 @@
2770 2530 /**
2771 2531 * @since 6.21 This is changed from `private` to `public`.
2772 2532 *
2773 2533 * @param int $num_chars
2774 - *
2775 2534 * @return string
2776 2535 */
2777 2536 public static function generate_new_key( $num_chars ) {
2778 - $max_slug_value = 36 ** $num_chars;
2537 + $max_slug_value = pow( 36, $num_chars );
2779 2538
2780 2539 // We want to have at least 2 characters in the slug.
2781 2540 $min_slug_value = 37;
2782 - return base_convert( random_int( $min_slug_value, $max_slug_value ), 10, 36 );
2541 + return base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2783 2542 }
2784 2543
2785 2544 /**
2786 2545 * @param string $key
2787 - *
2788 2546 * @return string
2789 2547 */
2790 2548 private static function prevent_numeric_and_reserved_keys( $key ) {
2791 2549 if ( is_numeric( $key ) ) {
@@ -2799,14 +2557,12 @@
2799 2557 'editlink',
2800 2558 'siteurl',
2801 2559 'evenodd',
2802 2560 );
2803 -
2804 2561 if ( in_array( $key, $not_allowed, true ) ) {
2805 2562 $key .= 'a';
2806 2563 }
2807 2564 }
2808 -
2809 2565 return $key;
2810 2566 }
2811 2567
2812 2568 /**
@@ -2825,9 +2581,9 @@
2825 2581 if ( ! $record ) {
2826 2582 return false;
2827 2583 }
2828 2584
2829 - if ( ! $post_values ) {
2585 + if ( empty( $post_values ) ) {
2830 2586 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
2831 2587 }
2832 2588
2833 2589 $values = array(
@@ -2835,9 +2591,9 @@
2835 2591 'fields' => array(),
2836 2592 );
2837 2593
2838 2594 foreach ( array( 'name', 'description' ) as $var ) {
2839 - $default_val = $record->{$var} ?? '';
2595 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2840 2596 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2841 2597 unset( $var, $default_val );
2842 2598 }
2843 2599
@@ -2855,47 +2611,30 @@
2855 2611
2856 2612 return $values;
2857 2613 }
2858 2614
2859 - /**
2860 - * @param array|string $fields
2861 - * @param object $record
2862 - * @param array $values
2863 - * @param array $args
2864 - *
2865 - * @return void
2866 - */
2867 2615 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2868 - if ( $fields ) {
2616 + if ( ! empty( $fields ) ) {
2869 2617 foreach ( (array) $fields as $field ) {
2870 2618 if ( ! self::is_admin_page() ) {
2871 2619 // Don't prep default values on the form settings page.
2872 2620 $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2873 2621 }
2874 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2622 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2875 2623 self::fill_field_defaults( $field, $record, $values, $args );
2876 2624 }
2877 2625 }
2878 2626 }
2879 2627
2880 - /**
2881 - * @param object $field
2882 - * @param object $record
2883 - * @param array $values
2884 - * @param array $args
2885 - *
2886 - * @return void
2887 - */
2888 2628 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2889 2629 $post_values = $args['post_values'];
2890 2630
2891 2631 if ( $args['default'] ) {
2892 2632 $meta_value = $field->default_value;
2893 - } elseif ( $record->post_id && self::pro_is_installed() && ! empty( $field->field_options['post_field'] ) ) {
2633 + } elseif ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
2894 2634 if ( ! isset( $field->field_options['custom_field'] ) ) {
2895 2635 $field->field_options['custom_field'] = '';
2896 2636 }
2897 -
2898 2637 $meta_value = FrmProEntryMetaHelper::get_post_value(
2899 2638 $record->post_id,
2900 2639 $field->field_options['post_field'],
2901 2640 $field->field_options['custom_field'],
@@ -2909,10 +2648,9 @@
2909 2648 } else {
2910 2649 $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2911 2650 }//end if
2912 2651
2913 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2914 -
2652 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2915 2653 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2916 2654 $new_value = $post_values['item_meta'][ $field->id ];
2917 2655 self::unserialize_or_decode( $new_value );
2918 2656 } else {
@@ -2927,9 +2665,9 @@
2927 2665 $args['field_type'] = $field_type;
2928 2666
2929 2667 FrmFieldsHelper::prepare_edit_front_field( $field_array, $field, $values['id'], $args );
2930 2668
2931 - if ( empty( $field_array['unique'] ) ) {
2669 + if ( ! isset( $field_array['unique'] ) || ! $field_array['unique'] ) {
2932 2670 $field_array['unique_msg'] = '';
2933 2671 }
2934 2672
2935 2673 $field_array = array_merge( (array) $field->field_options, $field_array );
@@ -2996,21 +2734,15 @@
2996 2734 }
2997 2735
2998 2736 /**
2999 2737 * Set to POST value or default
3000 - *
3001 - * @param array $post_values
3002 - * @param array $values
3003 - *
3004 - * @return void
3005 2738 */
3006 2739 private static function fill_form_defaults( $post_values, array &$values ) {
3007 2740 $form_defaults = FrmFormsHelper::get_default_opts();
3008 2741
3009 2742 foreach ( $form_defaults as $opt => $default ) {
3010 - // phpcs:ignore Universal.Operators.StrictComparisons
3011 2743 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3012 - $values[ $opt ] = $post_values['options'][ $opt ] ?? $default;
2744 + $values[ $opt ] = $post_values && isset( $post_values['options'][ $opt ] ) ? $post_values['options'][ $opt ] : $default;
3013 2745 }
3014 2746
3015 2747 unset( $opt, $default );
3016 2748 }
@@ -3020,9 +2752,9 @@
3020 2752 }
3021 2753
3022 2754 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3023 2755 if ( ! isset( $values[ $h . '_html' ] ) ) {
3024 - $values[ $h . '_html' ] = $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h );
2756 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3025 2757 }
3026 2758 unset( $h );
3027 2759 }
3028 2760 }
@@ -3034,14 +2766,16 @@
3034 2766 *
3035 2767 * @return bool|int
3036 2768 */
3037 2769 public static function custom_style_value( $post_values ) {
3038 - if ( $post_values && isset( $post_values['options']['custom_style'] ) ) {
3039 - return absint( $post_values['options']['custom_style'] );
2770 + if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
2771 + $custom_style = absint( $post_values['options']['custom_style'] );
2772 + } else {
2773 + $frm_settings = self::get_settings();
2774 + $custom_style = ( $frm_settings->load_style !== 'none' );
3040 2775 }
3041 2776
3042 - $frm_settings = self::get_settings();
3043 - return $frm_settings->load_style !== 'none';
2777 + return $custom_style;
3044 2778 }
3045 2779
3046 2780 /**
3047 2781 * @param mixed $original_string
@@ -3047,9 +2781,8 @@
3047 2781 * @param mixed $original_string
3048 2782 * @param int|string $length
3049 2783 * @param int $minword
3050 2784 * @param string $continue
3051 - *
3052 2785 * @return string
3053 2786 */
3054 2787 public static function truncate( $original_string, $length, $minword = 3, $continue = '...' ) {
3055 2788 if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
@@ -3059,9 +2792,9 @@
3059 2792 $length = (int) $length;
3060 2793 $str = wp_strip_all_tags( (string) $original_string );
3061 2794 $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3062 2795
3063 - if ( $length === 0 ) {
2796 + if ( $length == 0 ) {
3064 2797 return '';
3065 2798 }
3066 2799
3067 2800 if ( $length <= 10 ) {
@@ -3068,10 +2801,11 @@
3068 2801 $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3069 2802 return $sub . ( $length < $original_len ? $continue : '' );
3070 2803 }
3071 2804
3072 - $sub = '';
3073 - $len = 0;
2805 + $sub = '';
2806 + $len = 0;
2807 +
3074 2808 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3075 2809
3076 2810 if ( ! is_array( $words ) ) {
3077 2811 return $original_string;
@@ -3077,11 +2811,10 @@
3077 2811 return $original_string;
3078 2812 }
3079 2813
3080 2814 foreach ( $words as $word ) {
3081 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2815 + $part = ( $sub != '' ? ' ' : '' ) . $word;
3082 2816 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3083 -
3084 2817 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3085 2818 break;
3086 2819 }
3087 2820
@@ -3106,9 +2839,8 @@
3106 2839 * @since 6.5.4
3107 2840 *
3108 2841 * @param string $sub Current substring.
3109 2842 * @param int $length The length limit.
3110 - *
3111 2843 * @return string
3112 2844 */
3113 2845 private static function maybe_force_truncate_on_string_with_no_spaces( $sub, $length ) {
3114 2846 if ( strlen( $sub ) < $length + 50 ) {
@@ -3116,9 +2848,8 @@
3116 2848 return $sub;
3117 2849 }
3118 2850
3119 2851 $first_space = strpos( $sub, ' ', $length );
3120 -
3121 2852 if ( false !== $first_space ) {
3122 2853 // Ignore anything with spaces.
3123 2854 return $sub;
3124 2855 }
@@ -3125,18 +2856,11 @@
3125 2856
3126 2857 return substr( $sub, 0, $length + 10 );
3127 2858 }
3128 2859
3129 - /**
3130 - * @param array $function_names
3131 - * @param array $args
3132 - *
3133 - * @return mixed
3134 - */
3135 2860 public static function mb_function( $function_names, $args ) {
3136 2861 $mb_function_name = $function_names[0];
3137 2862 $function_name = $function_names[1];
3138 -
3139 2863 if ( function_exists( $mb_function_name ) ) {
3140 2864 $function_name = $mb_function_name;
3141 2865 }
3142 2866
@@ -3142,21 +2866,14 @@
3142 2866
3143 2867 return call_user_func_array( $function_name, $args );
3144 2868 }
3145 2869
3146 - /**
3147 - * @param string $date
3148 - * @param string $date_format
3149 - * @param string $time_format
3150 - *
3151 - * @return string
3152 - */
3153 2870 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3154 - if ( ! $date ) {
2871 + if ( empty( $date ) ) {
3155 2872 return $date;
3156 2873 }
3157 2874
3158 - if ( ! $date_format ) {
2875 + if ( empty( $date_format ) ) {
3159 2876 $date_format = get_option( 'date_format' );
3160 2877 }
3161 2878
3162 2879 if ( preg_match( '/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date ) && self::pro_is_installed() ) {
@@ -3164,10 +2881,10 @@
3164 2881 $date = FrmProAppHelper::convert_date( $date, $frmpro_settings->date_format, 'Y-m-d' );
3165 2882 }
3166 2883
3167 2884 $formatted = self::get_localized_date( $date_format, $date );
3168 - $do_time = gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00';
3169 2885
2886 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3170 2887 if ( $do_time ) {
3171 2888 $formatted .= self::add_time_to_date( $time_format, $date );
3172 2889 }
3173 2890
@@ -3176,35 +2893,30 @@
3176 2893
3177 2894 /**
3178 2895 * @param string $time_format
3179 2896 * @param string $date
3180 - *
3181 2897 * @return string
3182 2898 */
3183 2899 private static function add_time_to_date( $time_format, $date ) {
3184 - if ( ! $time_format ) {
2900 + if ( empty( $time_format ) ) {
3185 2901 $time_format = get_option( 'time_format' );
3186 2902 }
3187 2903
3188 2904 $trimmed_format = trim( $time_format );
3189 -
3190 - if ( $time_format && $trimmed_format ) {
3191 - return ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
2905 + $time = '';
2906 + if ( $time_format && ! empty( $trimmed_format ) ) {
2907 + $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3192 2908 }
3193 2909
3194 - return '';
2910 + return $time;
3195 2911 }
3196 2912
3197 2913 /**
3198 2914 * @since 2.0.8
3199 - *
3200 - * @param string $date_format
3201 - * @param string $date
3202 - *
3203 - * @return string
3204 2915 */
3205 2916 public static function get_localized_date( $date_format, $date ) {
3206 2917 $date = get_date_from_gmt( $date );
2918 +
3207 2919 return date_i18n( $date_format, strtotime( $date ) );
3208 2920 }
3209 2921
3210 2922 /**
@@ -3209,16 +2921,19 @@
3209 2921
3210 2922 /**
3211 2923 * Gets the time ago in words.
3212 2924 *
3213 - * @param int $from In seconds.
3214 - * @param int|string $to In seconds.
3215 - * @param int|string $levels Number of time units to include or a specific unit.
2925 + * @param int $from In seconds.
2926 + * @param int|string $to In seconds.
3216 2927 *
3217 2928 * @return string $time_ago
3218 2929 */
3219 2930 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3220 - $now = empty( $to ) && 0 !== $to ? new DateTime() : new DateTime( '@' . $to );
2931 + if ( empty( $to ) && 0 !== $to ) {
2932 + $now = new DateTime();
2933 + } else {
2934 + $now = new DateTime( '@' . $to );
2935 + }
3221 2936 $ago = new DateTime( '@' . $from );
3222 2937
3223 2938 // Get the time difference
3224 2939 $diff_object = $now->diff( $ago );
@@ -3232,9 +2947,8 @@
3232 2947
3233 2948 if ( ! is_numeric( $levels ) ) {
3234 2949 // Show time in specified unit.
3235 2950 $levels = self::get_unit( $levels );
3236 -
3237 2951 if ( isset( $time_strings[ $levels ] ) ) {
3238 2952 $diff = array(
3239 2953 $levels => self::time_format( $levels, $diff ),
3240 2954 );
@@ -3241,14 +2955,13 @@
3241 2955 $time_strings = array(
3242 2956 $levels => $time_strings[ $levels ],
3243 2957 );
3244 2958 }
3245 -
3246 2959 $levels = 1;
3247 2960 }
3248 2961
3249 2962 foreach ( $time_strings as $k => $v ) {
3250 - if ( ! empty( $diff[ $k ] ) ) {
2963 + if ( isset( $diff[ $k ] ) && $diff[ $k ] ) {
3251 2964 $time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
3252 2965 } elseif ( isset( $diff[ $k ] ) && count( $time_strings ) === 1 ) {
3253 2966 // Account for 0.
3254 2967 $time_strings[ $k ] = $diff[ $k ] . ' ' . $v[1];
@@ -3256,21 +2969,17 @@
3256 2969 unset( $time_strings[ $k ] );
3257 2970 }
3258 2971 }
3259 2972
3260 - $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
3261 - $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2973 + $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
2974 + $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2975 + $time_ago_string = implode( ' ', $time_strings );
3262 2976
3263 - return implode( ' ', $time_strings );
2977 + return $time_ago_string;
3264 2978 }
3265 2979
3266 2980 /**
3267 2981 * @since 4.05.01
3268 - *
3269 - * @param string $unit
3270 - * @param array $diff
3271 - *
3272 - * @return int
3273 2982 */
3274 2983 private static function time_format( $unit, $diff ) {
3275 2984 $return = array(
3276 2985 'y' => 'y',
@@ -3275,14 +2984,14 @@
3275 2984 $return = array(
3276 2985 'y' => 'y',
3277 2986 'd' => 'days',
3278 2987 );
3279 -
3280 2988 if ( isset( $return[ $unit ] ) ) {
3281 2989 return $diff[ $return[ $unit ] ];
3282 2990 }
3283 2991
3284 2992 $total = $diff['days'] * self::convert_time( 'd', $unit );
2993 +
3285 2994 $times = array( 'h', 'i', 's' );
3286 2995
3287 2996 foreach ( $times as $time ) {
3288 2997 if ( ! isset( $diff[ $time ] ) ) {
@@ -3296,13 +3005,8 @@
3296 3005 }
3297 3006
3298 3007 /**
3299 3008 * @since 4.05.01
3300 - *
3301 - * @param string $from
3302 - * @param string $to
3303 - *
3304 - * @return int
3305 3009 */
3306 3010 private static function convert_time( $from, $to ) {
3307 3011 $convert = array(
3308 3012 's' => 1,
@@ -3318,26 +3022,20 @@
3318 3022 }
3319 3023
3320 3024 /**
3321 3025 * @since 4.05.01
3322 - *
3323 - * @param string $unit
3324 - *
3325 - * @return int|string
3326 3026 */
3327 3027 private static function get_unit( $unit ) {
3328 3028 $units = self::get_time_strings();
3329 -
3330 3029 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3331 3030 return $unit;
3332 3031 }
3333 3032
3334 3033 foreach ( $units as $u => $strings ) {
3335 - if ( in_array( $unit, $strings, true ) ) {
3034 + if ( in_array( $unit, $strings ) ) {
3336 3035 return $u;
3337 3036 }
3338 3037 }
3339 -
3340 3038 return 1;
3341 3039 }
3342 3040
3343 3041 /**
@@ -3344,9 +3042,8 @@
3344 3042 * Get the translatable time strings. The untranslated version is a failsafe
3345 3043 * in case languages are changing for the unit set in the shortcode.
3346 3044 *
3347 3045 * @since 2.0.20
3348 - *
3349 3046 * @return array
3350 3047 */
3351 3048 private static function get_time_strings() {
3352 3049 return array(
@@ -3393,9 +3090,8 @@
3393 3090 /**
3394 3091 * @param int $r_count
3395 3092 * @param int $current_p
3396 3093 * @param int $p_size
3397 - *
3398 3094 * @return int
3399 3095 */
3400 3096 public static function get_last_record_num( $r_count, $current_p, $p_size ) {
3401 3097 return ( $r_count < $current_p * $p_size ? $r_count : $current_p * $p_size );
@@ -3404,13 +3100,11 @@
3404 3100 /**
3405 3101 * @param int $r_count
3406 3102 * @param int $current_p
3407 3103 * @param int $p_size
3408 - *
3409 3104 * @return int
3410 3105 */
3411 3106 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3412 - // phpcs:ignore Universal.Operators.StrictComparisons
3413 3107 if ( $current_p == 1 ) {
3414 3108 return 1;
3415 3109 }
3416 3110 return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
@@ -3416,22 +3110,17 @@
3416 3110 return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3417 3111 }
3418 3112
3419 3113 /**
3420 - * @param array $json_vars
3421 - *
3422 3114 * @return array
3423 3115 */
3424 3116 public static function json_to_array( $json_vars ) {
3425 3117 $vars = array();
3426 -
3427 3118 foreach ( $json_vars as $jv ) {
3428 3119 $jv_name = explode( '[', $jv['name'] );
3429 3120 $last = count( $jv_name ) - 1;
3430 -
3431 3121 foreach ( $jv_name as $p => $n ) {
3432 3122 $name = trim( $n, ']' );
3433 -
3434 3123 if ( ! isset( $l1 ) ) {
3435 3124 $l1 = $name;
3436 3125 }
3437 3126
@@ -3442,9 +3131,9 @@
3442 3131 if ( ! isset( $l3 ) ) {
3443 3132 $l3 = $name;
3444 3133 }
3445 3134
3446 - $this_val = $p === $last ? $jv['value'] : array();
3135 + $this_val = $p == $last ? $jv['value'] : array();
3447 3136
3448 3137 switch ( $p ) {
3449 3138 case 0:
3450 3139 $l1 = $name;
@@ -3477,15 +3166,10 @@
3477 3166
3478 3167 /**
3479 3168 * @param string $name
3480 3169 * @param string $l1
3481 - * @param mixed $val
3482 - * @param array $vars
3483 - *
3484 - * @return void
3485 3170 */
3486 3171 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3487 - // phpcs:ignore Universal.Operators.StrictComparisons
3488 3172 if ( $name == '' ) {
3489 3173 $vars[] = $val;
3490 3174 } elseif ( ! isset( $vars[ $l1 ] ) ) {
3491 3175 $vars[ $l1 ] = $val;
@@ -3491,26 +3175,19 @@
3491 3175 $vars[ $l1 ] = $val;
3492 3176 }
3493 3177 }
3494 3178
3495 - /**
3496 - * @param string $name
3497 - * @param string $class
3498 - * @param string $form_name
3499 - *
3500 - * @return void
3501 - */
3502 3179 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3503 3180 $tooltips = array(
3504 3181 'action_title' => __( 'Give this action a label for easy reference.', 'formidable' ),
3505 - 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <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
3182 + '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' ),
3506 3183 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3507 3184 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3508 - '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
3185 + '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' ),
3509 3186 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
3510 3187 /* translators: %1$s: Form name, %2$s: Date */
3511 - 'email_subject' => esc_attr( sprintf( __( 'If you leave the subject blank, the default will be used: %1$s Form submitted on %2$s', 'formidable' ), $form_name, self::site_name() ) ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3512 - 'new_tab' => __( 'This option will open the link in a new browser tab. Please note that some popup blockers may prevent this from happening, in which case the link will be displayed.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3188 + '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() ) ),
3189 + 'new_tab' => __( 'This option will open the link in a new browser tab. Please note that some popup blockers may prevent this from happening, in which case the link will be displayed.', 'formidable' ),
3513 3190 );
3514 3191
3515 3192 if ( ! isset( $tooltips[ $name ] ) ) {
3516 3193 return;
@@ -3515,9 +3192,9 @@
3515 3192 if ( ! isset( $tooltips[ $name ] ) ) {
3516 3193 return;
3517 3194 }
3518 3195
3519 - if ( 'open' === $class ) {
3196 + if ( 'open' == $class ) {
3520 3197 echo ' frm_help"';
3521 3198 } else {
3522 3199 echo ' class="frm_help"';
3523 3200 }
@@ -3523,9 +3200,9 @@
3523 3200 }
3524 3201
3525 3202 echo ' title="' . esc_attr( $tooltips[ $name ] );
3526 3203
3527 - if ( 'open' !== $class ) {
3204 + if ( 'open' != $class ) {
3528 3205 echo '"';
3529 3206 }
3530 3207 }
3531 3208
@@ -3530,28 +3207,20 @@
3530 3207 }
3531 3208
3532 3209 /**
3533 3210 * Add the current_page class to that page in the form nav
3534 - *
3535 - * @param int|string $page
3536 - * @param int|string $current_page
3537 - * @param array $action
3538 - *
3539 - * @return void
3540 3211 */
3541 3212 public static function select_current_page( $page, $current_page, $action = array() ) {
3542 - // phpcs:ignore Universal.Operators.StrictComparisons
3543 3213 if ( $current_page != $page ) {
3544 3214 return;
3545 3215 }
3546 3216
3547 3217 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3548 -
3549 3218 if ( 'lite-reports' === $frm_action ) {
3550 3219 $frm_action = 'reports';
3551 3220 }
3552 3221
3553 - if ( ! $action || ( $frm_action && in_array( $frm_action, $action, true ) ) ) {
3222 + if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3554 3223 echo ' class="current_page"';
3555 3224 }
3556 3225 }
3557 3226
@@ -3582,18 +3251,13 @@
3582 3251 // Add extra slashes for \r\n since WP strips them.
3583 3252 $post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
3584 3253
3585 3254 // allow for &quot
3586 - return str_replace( '&quot;', '\\"', $post_content );
3255 + $post_content = str_replace( '&quot;', '\\"', $post_content );
3256 +
3257 + return $post_content;
3587 3258 }
3588 3259
3589 - /**
3590 - * @param array|string $val
3591 - * @param int|string $key
3592 - * @param array $post_content
3593 - *
3594 - * @return void
3595 - */
3596 3260 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3597 3261 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3598 3262 return;
3599 3263 }
@@ -3618,9 +3282,8 @@
3618 3282 *
3619 3283 * @since 4.02.03
3620 3284 *
3621 3285 * @param array|string $value
3622 - *
3623 3286 * @return void
3624 3287 */
3625 3288 public static function unserialize_or_decode( &$value ) {
3626 3289 if ( is_array( $value ) ) {
@@ -3626,9 +3289,13 @@
3626 3289 if ( is_array( $value ) ) {
3627 3290 return;
3628 3291 }
3629 3292
3630 - $value = is_serialized( $value ) ? self::maybe_unserialize_array( $value ) : self::maybe_json_decode( $value, false );
3293 + if ( is_serialized( $value ) ) {
3294 + $value = self::maybe_unserialize_array( $value );
3295 + } else {
3296 + $value = self::maybe_json_decode( $value, false );
3297 + }
3631 3298 }
3632 3299
3633 3300 /**
3634 3301 * Safely unserialize an array if necessary.
@@ -3636,9 +3303,8 @@
3636 3303 *
3637 3304 * @since 6.2
3638 3305 *
3639 3306 * @param mixed $value
3640 - *
3641 3307 * @return mixed
3642 3308 */
3643 3309 public static function maybe_unserialize_array( $value ) {
3644 3310 if ( ! is_string( $value ) ) {
@@ -3645,14 +3311,13 @@
3645 3311 return $value;
3646 3312 }
3647 3313
3648 3314 // Since we only expect an array, skip anything that doesn't start with a:.
3649 - if ( ! is_serialized( $value ) || ! str_starts_with( $value, 'a:' ) ) {
3315 + if ( ! is_serialized( $value ) || 'a:' !== substr( $value, 0, 2 ) ) {
3650 3316 return $value;
3651 3317 }
3652 3318
3653 3319 $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
3654 -
3655 3320 if ( is_array( $parsed ) ) {
3656 3321 $value = $parsed;
3657 3322 }
3658 3323
@@ -3662,12 +3327,11 @@
3662 3327 /**
3663 3328 * Decode a JSON string.
3664 3329 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3665 3330 *
3666 - * @param array|string|null $string
3667 - * @param bool $single_to_array
3668 - *
3669 - * @return array|string|null
3331 + * @param mixed $string
3332 + * @param bool $single_to_array
3333 + * @return mixed
3670 3334 */
3671 3335 public static function maybe_json_decode( $string, $single_to_array = true ) {
3672 3336 if ( is_array( $string ) || is_null( $string ) ) {
3673 3337 return $string;
@@ -3672,19 +3336,20 @@
3672 3336 if ( is_array( $string ) || is_null( $string ) ) {
3673 3337 return $string;
3674 3338 }
3675 3339
3676 - $new_string = json_decode( $string, true );
3677 - $single_value = false;
3678 -
3679 - if ( ! $single_to_array ) {
3680 - $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3340 + $new_string = json_decode( $string, true );
3341 + if ( function_exists( 'json_last_error' ) ) {
3342 + // php 5.3+
3343 + $single_value = false;
3344 + if ( ! $single_to_array ) {
3345 + $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3346 + }
3347 + if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3348 + $string = $new_string;
3349 + }
3681 3350 }
3682 3351
3683 - if ( json_last_error() === JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3684 - $string = $new_string;
3685 - }
3686 -
3687 3352 return $string;
3688 3353 }
3689 3354
3690 3355 /**
@@ -3690,9 +3355,8 @@
3690 3355 /**
3691 3356 * @since 6.2.3
3692 3357 *
3693 3358 * @param string $value
3694 - *
3695 3359 * @return string
3696 3360 */
3697 3361 public static function maybe_utf8_encode( $value ) {
3698 3362 $from_format = 'ISO-8859-1';
@@ -3701,15 +3365,13 @@
3701 3365 if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
3702 3366 if ( mb_check_encoding( $value, $from_format ) ) {
3703 3367 return mb_convert_encoding( $value, $to_format, $from_format );
3704 3368 }
3705 -
3706 3369 return $value;
3707 3370 }
3708 3371
3709 3372 if ( function_exists( 'iconv' ) ) {
3710 3373 $converted = iconv( $from_format, $to_format, $value );
3711 -
3712 3374 // Value is false if $value is not ISO-8859-1.
3713 3375 if ( false !== $converted ) {
3714 3376 return $converted;
3715 3377 }
@@ -3721,12 +3383,8 @@
3721 3383 /**
3722 3384 * Reformat the json serialized array in name => value array.
3723 3385 *
3724 3386 * @since 4.02.03
3725 - *
3726 - * @param array $form
3727 - *
3728 - * @return void
3729 3387 */
3730 3388 public static function format_form_data( &$form ) {
3731 3389 $formatted = array();
3732 3390
@@ -3733,11 +3391,9 @@
3733 3391 foreach ( $form as $input ) {
3734 3392 if ( ! isset( $input['name'] ) ) {
3735 3393 continue;
3736 3394 }
3737 -
3738 3395 $key = $input['name'];
3739 -
3740 3396 if ( isset( $formatted[ $key ] ) ) {
3741 3397 if ( is_array( $formatted[ $key ] ) ) {
3742 3398 $formatted[ $key ][] = $input['value'];
3743 3399 } else {
@@ -3754,9 +3410,8 @@
3754 3410 /**
3755 3411 * @since 4.02.03
3756 3412 *
3757 3413 * @param array|string $value
3758 - *
3759 3414 * @return string
3760 3415 */
3761 3416 public static function maybe_json_encode( $value ) {
3762 3417 if ( is_array( $value ) ) {
@@ -3770,19 +3425,18 @@
3770 3425 *
3771 3426 * @since 1.07.10
3772 3427 *
3773 3428 * @param string $post_type The name of the post type that may need to be highlighted.
3774 - *
3775 3429 * @return void
3776 3430 */
3777 3431 public static function maybe_highlight_menu( $post_type ) {
3778 3432 global $post;
3779 3433
3780 - if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] !== $post_type ) {
3434 + if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] != $post_type ) {
3781 3435 return;
3782 3436 }
3783 3437
3784 - if ( is_object( $post ) && $post->post_type !== $post_type ) {
3438 + if ( is_object( $post ) && $post->post_type != $post_type ) {
3785 3439 return;
3786 3440 }
3787 3441
3788 3442 self::load_admin_wide_js();
@@ -3794,9 +3448,8 @@
3794 3448 *
3795 3449 * @since 2.0
3796 3450 *
3797 3451 * @param bool $load
3798 - *
3799 3452 * @return void
3800 3453 */
3801 3454 public static function load_admin_wide_js( $load = true ) {
3802 3455 $version = self::plugin_version();
@@ -3807,9 +3460,9 @@
3807 3460 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3808 3461 'url' => self::plugin_url(),
3809 3462 'app_url' => 'https://formidableforms.com/',
3810 3463 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
3811 - 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3464 + 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
3812 3465 'loading' => __( 'Loading&hellip;', 'formidable' ),
3813 3466 'nonce' => wp_create_nonce( 'frm_ajax' ),
3814 3467 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3815 3468 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
@@ -3822,9 +3475,8 @@
3822 3475 }
3823 3476
3824 3477 /**
3825 3478 * @since 2.0.9
3826 - *
3827 3479 * @return void
3828 3480 */
3829 3481 public static function load_font_style() {
3830 3482 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
@@ -3831,9 +3483,8 @@
3831 3483 }
3832 3484
3833 3485 /**
3834 3486 * @param string $location
3835 - *
3836 3487 * @return void
3837 3488 */
3838 3489 public static function localize_script( $location ) {
3839 3490 global $wp_scripts, $wp_version;
@@ -3856,9 +3507,8 @@
3856 3507 'include_resend_email' => false,
3857 3508 );
3858 3509
3859 3510 $data = $wp_scripts->get_data( 'formidable', 'data' );
3860 -
3861 3511 if ( ! $data ) {
3862 3512 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3863 3513 }
3864 3514
@@ -3865,9 +3515,9 @@
3865 3515 if ( $location === 'admin' ) {
3866 3516 $admin_script_strings = array(
3867 3517 'desc' => __( '(Click to add description)', 'formidable' ),
3868 3518 'blank' => __( '(Blank)', 'formidable' ),
3869 - 'no_label' => self::get_no_label_text(),
3519 + 'no_label' => __( '(no label)', 'formidable' ),
3870 3520 'ok' => __( 'OK', 'formidable' ),
3871 3521 'cancel' => __( 'Cancel', 'formidable' ),
3872 3522 'default_label' => __( 'Default', 'formidable' ),
3873 3523 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
@@ -3875,9 +3525,9 @@
3875 3525 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3876 3526 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3877 3527 'confirm' => __( 'Are you sure?', 'formidable' ),
3878 3528 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3879 - 'conf_delete_sec' => __( 'All fields inside this Section will be deleted along with their data. Are you sure you want to delete this group of fields?', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3529 + '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' ),
3880 3530 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3881 3531 'default_unique' => FrmFieldsHelper::default_unique_msg(),
3882 3532 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3883 3533 'enter_email' => __( 'Enter Email', 'formidable' ),
@@ -3883,9 +3533,9 @@
3883 3533 'enter_email' => __( 'Enter Email', 'formidable' ),
3884 3534 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3885 3535 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3886 3536 'new_option' => __( 'New Option', 'formidable' ),
3887 - 'css_invalid_size' => __( 'In certain browsers (e.g. Firefox) text will not display correctly if the field height is too small relative to the field padding and text size. Please increase your field height or decrease your field padding.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3537 + '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' ),
3888 3538 'enter_password' => __( 'Enter Password', 'formidable' ),
3889 3539 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3890 3540 'import_complete' => __( 'Import Complete', 'formidable' ),
3891 3541 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
@@ -3901,11 +3551,11 @@
3901 3551 'only_one_action' => sprintf( __( 'This form action is limited to %d per form.', 'formidable' ), 1 ),
3902 3552 'edit_action_text' => __( 'Please edit the existing form action.', 'formidable' ),
3903 3553 'unsafe_params' => FrmFormsHelper::reserved_words(),
3904 3554 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3905 - 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3555 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3906 3556 /* Translators: %s is the name of a parameter that is a reserved word. More than one word could be listed here, though that would not be common. */
3907 - 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3557 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
3908 3558 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3909 3559 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3910 3560 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3911 3561 'install' => __( 'Install', 'formidable' ),
@@ -3935,9 +3585,8 @@
3935 3585 */
3936 3586 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3937 3587
3938 3588 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3939 -
3940 3589 if ( ! $data ) {
3941 3590 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3942 3591 }
3943 3592 }//end if
@@ -3943,19 +3592,8 @@
3943 3592 }//end if
3944 3593 }
3945 3594
3946 3595 /**
3947 - * Get the no label text.
3948 - *
3949 - * @since 6.25.1
3950 - *
3951 - * @return string
3952 - */
3953 - public static function get_no_label_text() {
3954 - return __( '(no label)', 'formidable' );
3955 - }
3956 -
3957 - /**
3958 3596 * @since 6.5
3959 3597 *
3960 3598 * @return string
3961 3599 */
@@ -3997,9 +3635,8 @@
3997 3635 *
3998 3636 * @since 1.07.10
3999 3637 *
4000 3638 * @param float $min_version The version the add-on requires.
4001 - *
4002 3639 * @return void
4003 3640 */
4004 3641 public static function min_version_notice( $min_version ) {
4005 3642 $frm_version = self::plugin_version();
@@ -4009,9 +3646,9 @@
4009 3646 return;
4010 3647 }
4011 3648
4012 3649 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
4013 - echo '<tr class="plugin-update-tr active"><th colspan="' . absint( $wp_list_table->get_column_count() ) . '" class="check-column plugin-update colspanchange"><div class="update-message">' . // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3650 + echo '<tr class="plugin-update-tr active"><th colspan="' . absint( $wp_list_table->get_column_count() ) . '" class="check-column plugin-update colspanchange"><div class="update-message">' .
4014 3651 esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
4015 3652 '</div></td></tr>';
4016 3653 }
4017 3654
@@ -4019,10 +3656,8 @@
4019 3656 * If Pro is far outdated, show a message.
4020 3657 *
4021 3658 * @since 4.0.01
4022 3659 *
4023 - * @param string $min_version
4024 - *
4025 3660 * @return void
4026 3661 */
4027 3662 public static function min_pro_version_notice( $min_version ) {
4028 3663 if ( ! self::is_formidable_admin() ) {
@@ -4032,14 +3667,25 @@
4032 3667
4033 3668 self::php_version_notice();
4034 3669
4035 3670 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4036 -
4037 3671 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4038 3672 return;
4039 3673 }
4040 3674
4041 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
3675 + $expired = FrmAddonsController::is_license_expired();
3676 + ?>
3677 + <div class="frm-banner-alert frm_error_style frm_previous_install">
3678 + <?php
3679 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
3680 + if ( empty( $expired ) ) {
3681 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
3682 + } else {
3683 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
3684 + }
3685 + ?>
3686 + </div>
3687 + <?php
4042 3688 }
4043 3689
4044 3690 /**
4045 3691 * If Pro is installed, check the version number.
@@ -4046,9 +3692,8 @@
4046 3692 *
4047 3693 * @since 4.0.01
4048 3694 *
4049 3695 * @param string $min_version
4050 - *
4051 3696 * @return bool
4052 3697 */
4053 3698 public static function meets_min_pro_version( $min_version ) {
4054 3699 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
@@ -4057,16 +3702,14 @@
4057 3702 /**
4058 3703 * Show a message if the PHP version is below the recommendations.
4059 3704 *
4060 3705 * @since 4.0.02
4061 - *
4062 3706 * @return void
4063 3707 */
4064 3708 private static function php_version_notice() {
4065 3709 $message = array();
4066 -
4067 3710 if ( version_compare( phpversion(), '7.0', '<' ) ) {
4068 - $message[] = __( 'The version of PHP on your server is too low. If this is not corrected, you may see issues with Formidable Forms. Please contact your web host and ask to be updated to PHP 7.0+.', 'formidable' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3711 + $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' );
4069 3712 }
4070 3713
4071 3714 foreach ( $message as $m ) {
4072 3715 ?>
@@ -4078,9 +3721,8 @@
4078 3721 }
4079 3722
4080 3723 /**
4081 3724 * @param string $type
4082 - *
4083 3725 * @return array<string,string>
4084 3726 */
4085 3727 public static function locales( $type = 'date' ) {
4086 3728 $locales = array(
@@ -4190,13 +3832,14 @@
4190 3832 * @since 5.4.5 Added $args parameter with type.
4191 3833 *
4192 3834 * @param array<string,string> $locales
4193 3835 * @param array $args {
4194 - *
4195 3836 * @type string $type
4196 3837 * }
4197 3838 */
4198 - return apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3839 + $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3840 +
3841 + return $locales;
4199 3842 }
4200 3843
4201 3844 /**
4202 3845 * @return string
@@ -4203,14 +3846,12 @@
4203 3846 */
4204 3847 public static function get_menu_icon_class() {
4205 3848 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4206 3849 $settings = FrmProAppHelper::get_settings();
4207 -
4208 3850 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4209 3851 return $settings->menu_icon;
4210 3852 }
4211 3853 }
4212 -
4213 3854 return 'frmfont frm_logo_icon';
4214 3855 }
4215 3856
4216 3857 /**
@@ -4228,9 +3869,10 @@
4228 3869 * @type array $input_attrs Attributes of value input.
4229 3870 * }
4230 3871 */
4231 3872 public static function images_dropdown( $args ) {
4232 - $args = self::fill_default_images_dropdown_args( $args );
3873 + $args = self::fill_default_images_dropdown_args( $args );
3874 +
4233 3875 $input_attrs_str = self::get_images_dropdown_input_attrs( $args );
4234 3876 ob_start();
4235 3877 include self::plugin_path() . '/classes/views/shared/images-dropdown.php';
4236 3878 $output = ob_get_clean();
@@ -4251,9 +3893,8 @@
4251 3893 *
4252 3894 * @since 5.0.04
4253 3895 *
4254 3896 * @param array $args The arguments.
4255 - *
4256 3897 * @return array
4257 3898 */
4258 3899 private static function fill_default_images_dropdown_args( $args ) {
4259 3900 $defaults = array(
@@ -4266,8 +3907,14 @@
4266 3907
4267 3908 $new_args['options'] = (array) $new_args['options'];
4268 3909 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4269 3910
3911 + // Set the number of columns.
3912 + $new_args['col_class'] = ceil( 12 / count( $new_args['options'] ) );
3913 + if ( $new_args['col_class'] > 6 ) {
3914 + $new_args['col_class'] = ceil( $new_args['col_class'] / 2 );
3915 + }
3916 +
4270 3917 /**
4271 3918 * Allows modifying the arguments of images_dropdown() method.
4272 3919 *
4273 3920 * @since 5.0.04
@@ -4283,9 +3930,8 @@
4283 3930 *
4284 3931 * @since 5.0.04
4285 3932 *
4286 3933 * @param array $args The arguments.
4287 - *
4288 3934 * @return string
4289 3935 */
4290 3936 private static function get_images_dropdown_input_attrs( $args ) {
4291 3937 $input_attrs = $args['input_attrs'];
@@ -4292,9 +3938,8 @@
4292 3938 $input_attrs['type'] = 'radio';
4293 3939 $input_attrs['name'] = $args['name'];
4294 3940
4295 3941 $input_attrs_str = '';
4296 -
4297 3942 foreach ( $input_attrs as $key => $input_attr ) {
4298 3943 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4299 3944 }
4300 3945
@@ -4310,13 +3955,8 @@
4310 3955 }
4311 3956
4312 3957 /**
4313 3958 * @since 6.7.1
4314 - *
4315 - * @param array $option Option data.
4316 - * @param array $args The arguments of images_dropdown() method.
4317 - *
4318 - * @return array
4319 3959 */
4320 3960 public static function get_images_dropdown_atts( $option, $args ) {
4321 3961 $image = self::get_images_dropdown_option_image( $option, $args );
4322 3962 $classes = self::get_images_dropdown_option_classes( $option, $args );
@@ -4330,9 +3970,8 @@
4330 3970 * @since 5.0.04
4331 3971 *
4332 3972 * @param array $option Option data.
4333 3973 * @param array $args The arguments of images_dropdown() method.
4334 - *
4335 3974 * @return string
4336 3975 */
4337 3976 private static function get_images_dropdown_option_image( $option, $args ) {
4338 3977 $image = self::icon_by_class(
@@ -4361,9 +4000,8 @@
4361 4000 * @since 5.0.04
4362 4001 *
4363 4002 * @param array $option Option data.
4364 4003 * @param array $args The arguments of images_dropdown() method.
4365 - *
4366 4004 * @return string
4367 4005 */
4368 4006 private static function get_images_dropdown_option_classes( $option, $args ) {
4369 4007 $classes = '';
@@ -4391,19 +4029,17 @@
4391 4029 * @since 5.0.04
4392 4030 *
4393 4031 * @param array $option Option data.
4394 4032 * @param array $args The arguments of images_dropdown() method.
4395 - *
4396 4033 * @return string
4397 4034 */
4398 4035 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4399 4036 $html_attrs = '';
4400 -
4401 4037 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4402 4038 $html_attrs_arr = array();
4403 4039
4404 4040 foreach ( $option['custom_attrs'] as $key => $value ) {
4405 - if ( in_array( $key, array( 'type', 'class', 'data-value' ), true ) ) {
4041 + if ( in_array( $key, array( 'type', 'class', 'data-value' ) ) ) {
4406 4042 continue;
4407 4043 }
4408 4044
4409 4045 $html_attrs_arr[] = sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $value ) );
@@ -4461,9 +4097,8 @@
4461 4097 * @since 5.0.07
4462 4098 *
4463 4099 * @param array $values
4464 4100 * @param array $keys
4465 - *
4466 4101 * @return array
4467 4102 */
4468 4103 public static function maybe_filter_array( $values, $keys ) {
4469 4104 $allow_unfiltered_html = self::allow_unfiltered_html();
@@ -4488,9 +4123,8 @@
4488 4123 * @since 5.0.13
4489 4124 *
4490 4125 * @param string $value
4491 4126 * @param array|string $allowed 'all' for everything included as defaults.
4492 - *
4493 4127 * @return string
4494 4128 */
4495 4129 public static function maybe_kses( $value, $allowed = 'all' ) {
4496 4130 if ( self::should_never_allow_unfiltered_html() ) {
@@ -4505,18 +4139,17 @@
4505 4139 * @since 6.11.2
4506 4140 *
4507 4141 * @param string $key
4508 4142 * @param string $context Either 'display' or 'update'. On update, we want to allow a few keys that are never displayed.
4509 - *
4510 4143 * @return bool
4511 4144 */
4512 4145 public static function input_key_is_safe( $key, $context = 'display' ) {
4513 4146 if ( 'update' === $context && in_array( $key, array( 'opt', 'label' ), true ) ) {
4514 4147 $safe = true;
4515 - } elseif ( str_starts_with( $key, 'data-' ) ) {
4148 + } elseif ( 0 === strpos( $key, 'data-' ) ) {
4516 4149 // Allow all data attributes.
4517 4150 $safe = true;
4518 - } elseif ( str_starts_with( $key, 'aria-' ) ) {
4151 + } elseif ( 0 === strpos( $key, 'aria-' ) ) {
4519 4152 // Allow all aria attributes.
4520 4153 $safe = true;
4521 4154 } else {
4522 4155 $safe_keys = array(
@@ -4558,9 +4191,16 @@
4558 4191
4559 4192 /**
4560 4193 * @since 5.0.16
4561 4194 *
4562 - * @param string $medium
4195 + * @return bool
4196 + */
4197 + public static function show_landing_pages() {
4198 + return self::show_new_feature( 'landing' );
4199 + }
4200 +
4201 + /**
4202 + * @since 5.0.16
4563 4203 *
4564 4204 * @return array
4565 4205 */
4566 4206 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
@@ -4568,9 +4208,8 @@
4568 4208 'medium' => $medium,
4569 4209 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4570 4210 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4571 4211 'screenshot' => 'landing.png',
4572 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
4573 4212 );
4574 4213 return self::get_upgrade_data_params( 'landing', $params );
4575 4214 }
4576 4215
@@ -4577,35 +4216,24 @@
4577 4216 /**
4578 4217 * @since 5.0.17
4579 4218 *
4580 4219 * @param string $feature
4581 - *
4582 4220 * @return bool
4583 4221 */
4584 4222 public static function show_new_feature( $feature ) {
4585 4223 $link = FrmAddonsController::install_link( $feature );
4586 -
4587 - if ( array_key_exists( 'status', $link ) || array_key_exists( 'class', $link ) ) {
4588 - return true;
4589 - }
4590 -
4591 - return 'coupons' === $feature && class_exists( 'FrmCouponsAppController' );
4224 + return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4592 4225 }
4593 4226
4594 4227 /**
4595 - * Enhances upgrade data parameters with installation link and plan requirement information.
4596 - *
4597 4228 * @since 5.0.17
4598 4229 *
4599 - * @param string $plugin The plugin slug to get installation data for.
4600 - * @param array $params Initial parameters for the upgrade data.
4601 - * @param bool $detailed Whether to include detailed information.
4602 - *
4603 - * @return array Modified parameters with installation data.
4230 + * @param string $plugin
4231 + * @param array $params
4232 + * @return array
4604 4233 */
4605 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
4234 + public static function get_upgrade_data_params( $plugin, $params ) {
4606 4235 $link = FrmAddonsController::install_link( $plugin );
4607 -
4608 4236 if ( ! $link ) {
4609 4237 return $params;
4610 4238 }
4611 4239
@@ -4611,20 +4239,15 @@
4611 4239
4612 4240 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4613 4241 $params['oneclick'] = json_encode( $link );
4614 4242 unset( $params['message'] );
4615 -
4616 4243 if ( ! isset( $params['medium'] ) ) {
4617 4244 $params['medium'] = $plugin;
4618 4245 }
4619 4246 } else {
4620 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
4247 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4621 4248 }
4622 4249
4623 - if ( $detailed ) {
4624 - $params['plugin-status'] = $link['status'] ?? '';
4625 - }
4626 -
4627 4250 return $params;
4628 4251 }
4629 4252
4630 4253 /**
@@ -4633,9 +4256,8 @@
4633 4256 *
4634 4257 * @since 5.0.17
4635 4258 *
4636 4259 * @param string $text
4637 - *
4638 4260 * @return bool
4639 4261 */
4640 4262 public static function ctype_xdigit( $text ) {
4641 4263 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4650,14 +4272,12 @@
4650 4272 * @since 5.2.01
4651 4273 */
4652 4274 public static function set_current_screen_and_hook_suffix() {
4653 4275 global $hook_suffix;
4654 -
4655 4276 if ( is_null( $hook_suffix ) ) {
4656 4277 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4657 4278 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4658 4279 }
4659 -
4660 4280 set_current_screen();
4661 4281 }
4662 4282
4663 4283 /**
@@ -4679,9 +4299,8 @@
4679 4299 *
4680 4300 * @since 5.2.07
4681 4301 *
4682 4302 * @param mixed $num Number.
4683 - *
4684 4303 * @return false|int Returns `false` if the passed parameter is not number.
4685 4304 */
4686 4305 public static function count_decimals( $num ) {
4687 4306 if ( ! is_numeric( $num ) ) {
@@ -4689,9 +4308,8 @@
4689 4308 }
4690 4309
4691 4310 $num = (string) $num;
4692 4311 $parts = explode( '.', $num );
4693 -
4694 4312 if ( 1 === count( $parts ) ) {
4695 4313 return 0;
4696 4314 }
4697 4315
@@ -4773,20 +4391,17 @@
4773 4391 * @since 5.5.5
4774 4392 *
4775 4393 * @param string $url
4776 4394 * @param string $expected_extension
4777 - *
4778 4395 * @return bool
4779 4396 */
4780 4397 public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4781 - $file_is_in_expected_s3_bucket = str_starts_with( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4782 -
4398 + $file_is_in_expected_s3_bucket = 0 === strpos( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4783 4399 if ( ! $file_is_in_expected_s3_bucket ) {
4784 4400 return false;
4785 4401 }
4786 4402
4787 4403 $parsed = parse_url( $url );
4788 -
4789 4404 if ( ! is_array( $parsed ) ) {
4790 4405 // URL is malformed.
4791 4406 return false;
4792 4407 }
@@ -4792,10 +4407,14 @@
4792 4407 }
4793 4408
4794 4409 $path = $parsed['path'];
4795 4410 $ext = pathinfo( $path, PATHINFO_EXTENSION );
4796 - // The URL isn't to an XML file.
4797 - return $expected_extension === $ext;
4411 + if ( $expected_extension !== $ext ) {
4412 + // The URL isn't to an XML file.
4413 + return false;
4414 + }
4415 +
4416 + return true;
4798 4417 }
4799 4418
4800 4419 /**
4801 4420 * Display a dismissable warning message and save its dismissal state.
@@ -4803,9 +4422,8 @@
4803 4422 * @since 6.3
4804 4423 *
4805 4424 * @param string $message The warning message to display.
4806 4425 * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
4807 - *
4808 4426 * @return void
4809 4427 */
4810 4428 public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4811 4429 if ( ! $message || ! $option ) {
@@ -4848,9 +4466,8 @@
4848 4466 *
4849 4467 * @since 6.3
4850 4468 *
4851 4469 * @param string $option The unique identifier for the dismissal state of the message.
4852 - *
4853 4470 * @return void
4854 4471 */
4855 4472 public static function dismiss_warning_message( $option = '' ) {
4856 4473 self::permission_check( 'frm_change_settings' );
@@ -4872,8 +4489,17 @@
4872 4489 * @return string
4873 4490 */
4874 4491 public static function copy_for_lite_license() {
4875 4492 $message = __( 'You\'re using Formidable Forms Lite - no license needed. Enjoy!', 'formidable' ) . ' 🙂';
4493 +
4494 + if ( is_callable( 'FrmProAddonsController::get_readable_license_type' ) && ! class_exists( 'FrmProDashboardController' ) ) {
4495 + // Manage PRO versions without PRO dashboard functionality.
4496 + $license_type = FrmProAddonsController::get_readable_license_type();
4497 + if ( 'lite' !== strtolower( $license_type ) ) {
4498 + $message = 'Formidable Pro ' . $license_type;
4499 + }
4500 + }
4501 +
4876 4502 return apply_filters( 'frm_license_type_text', $message );
4877 4503 }
4878 4504
4879 4505 /**
@@ -4879,9 +4505,8 @@
4879 4505 /**
4880 4506 * Removes scripts that are unnecessarily loaded across the pages!
4881 4507 *
4882 4508 * @since 6.9
4883 - *
4884 4509 * @return void
4885 4510 */
4886 4511 public static function dequeue_extra_global_scripts() {
4887 4512 wp_dequeue_script( 'frm-surveys-admin' );
@@ -4899,9 +4524,8 @@
4899 4524 * @return void
4900 4525 */
4901 4526 public static function tooltip_icon( $tooltip_text, $atts = array() ) {
4902 4527 $atts['title'] = $tooltip_text;
4903 -
4904 4528 if ( isset( $atts['class'] ) ) {
4905 4529 $atts['class'] .= ' frm_help';
4906 4530 } else {
4907 4531 $atts['class'] = 'frm_help';
@@ -4971,57 +4595,6 @@
4971 4595 */
4972 4596 public static function no_gdpr_cookies() {
4973 4597 $frm_settings = self::get_settings();
4974 4598 return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
4975 - }
4976 -
4977 - /**
4978 - * Check if a string is valid UTF-8.
4979 - *
4980 - * @since 6.24
4981 - *
4982 - * @param string $string The string to check.
4983 - *
4984 - * @return bool
4985 - */
4986 - public static function is_valid_utf8( $string ) {
4987 - // wp_is_valid_utf8 is added in WP 6.9.
4988 - if ( function_exists( 'wp_is_valid_utf8' ) ) {
4989 - return wp_is_valid_utf8( $string );
4990 - }
4991 -
4992 - // As of WP 6.9, seems_utf8 is deprecated.
4993 - return function_exists( 'seems_utf8' ) ? seems_utf8( $string ) : false;
4994 - }
4995 -
4996 - /**
4997 - * Get a documentation URL with UTM parameters and affiliate tracking.
4998 - *
4999 - * @since 6.26
5000 - *
5001 - * @param string $path The relative path to append to the base URL.
5002 - * @param string $campaign The campaign to use for UTM parameters.
5003 - * @param bool $add_kb_base Whether to prepend 'knowledgebase/' to the path. Default true.
5004 - *
5005 - * @return string The processed URL with UTM parameters and affiliate tracking.
5006 - */
5007 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5008 - $path = trim( $path, '/' );
5009 -
5010 - if ( $add_kb_base ) {
5011 - $path = 'knowledgebase/' . $path;
5012 - }
5013 -
5014 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
5015 - }
5016 -
5017 - /**
5018 - * @since 5.0.16
5019 - * @deprecated 6.26
5020 - *
5021 - * @return bool
5022 - */
5023 - public static function show_landing_pages() {
5024 - _deprecated_function( __METHOD__, '6.26' );
5025 - return true;
5026 4599 }
5027 4600 }