PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.5
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.5
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 +786 -2134 6.335.5 View file →
@@ -3,43 +3,27 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmAppHelper {
7 + public static $db_version = 98; // Version of the database we are moving to.
8 + public static $pro_db_version = 37; //deprecated
9 + public static $font_version = 7;
7 10
8 11 /**
9 - * Version of the database we are moving to.
10 - *
11 - * @var int
12 + * @var bool $added_gmt_offset_filter
12 13 */
13 - public static $db_version = 106;
14 -
15 - /**
16 - * Used by the API add-on.
17 - *
18 - * @var float
19 - */
20 - public static $font_version = 7;
21 -
22 - /**
23 - * @var bool
24 - */
25 14 private static $added_gmt_offset_filter = false;
26 15
27 16 /**
28 17 * @since 2.0
29 - *
30 - * @var string
31 18 */
32 - public static $plug_version = '6.33';
19 + public static $plug_version = '5.5';
33 20
34 21 /**
35 - * @var bool
36 - */
37 - private static $included_svg = false;
38 -
39 - /**
40 22 * @since 1.07.02
41 23 *
24 + * @param none
25 + *
42 26 * @return string The version of this plugin
43 27 */
44 28 public static function plugin_version() {
45 29 return self::$plug_version;
@@ -44,33 +28,21 @@
44 28 public static function plugin_version() {
45 29 return self::$plug_version;
46 30 }
47 31
48 - /**
49 - * @return string
50 - */
51 32 public static function plugin_folder() {
52 33 return basename( self::plugin_path() );
53 34 }
54 35
55 - /**
56 - * @return string
57 - */
58 36 public static function plugin_path() {
59 - return dirname( __DIR__, 2 );
37 + return dirname( dirname( dirname( __FILE__ ) ) );
60 38 }
61 39
62 - /**
63 - * @return string
64 - */
65 40 public static function plugin_url() {
66 - // Previously FRM_URL constant.
41 + // Prevously FRM_URL constant.
67 42 return plugins_url( '', self::plugin_path() . '/formidable.php' );
68 43 }
69 44
70 - /**
71 - * @return string
72 - */
73 45 public static function relative_plugin_url() {
74 46 return str_replace( array( 'https:', 'http:' ), '', self::plugin_url() );
75 47 }
76 48
@@ -85,9 +57,8 @@
85 57 * Get the name of this site
86 58 * Used for [sitename] shortcode
87 59 *
88 60 * @since 2.0
89 - *
90 61 * @return string
91 62 */
92 63 public static function site_name() {
93 64 return get_option( 'blogname' );
@@ -92,17 +63,11 @@
92 63 public static function site_name() {
93 64 return get_option( 'blogname' );
94 65 }
95 66
96 - /**
97 - * @param string $url
98 - *
99 - * @return string
100 - */
101 67 public static function make_affiliate_url( $url ) {
102 68 $affiliate_id = self::get_affiliate();
103 -
104 - if ( $affiliate_id ) {
69 + if ( ! empty( $affiliate_id ) ) {
105 70 $url = str_replace( array( 'http://', 'https://' ), '', $url );
106 71 $url = 'http://www.shareasale.com/r.cfm?u=' . absint( $affiliate_id ) . '&b=841990&m=64739&afftrack=plugin&urllink=' . urlencode( $url );
107 72 }
108 73
@@ -108,11 +73,8 @@
108 73
109 74 return $url;
110 75 }
111 76
112 - /**
113 - * @return int
114 - */
115 77 public static function get_affiliate() {
116 78 return absint( apply_filters( 'frm_affiliate_id', 0 ) );
117 79 }
118 80
@@ -117,167 +79,65 @@
117 79 }
118 80
119 81 /**
120 82 * @since 3.04.02
121 - *
122 - * @param array|string $args If a string is passed, it is used for the utm_campaign attribute.
83 + * @param array|string $args
123 84 * @param string $page
124 85 */
125 86 public static function admin_upgrade_link( $args, $page = '' ) {
126 - if ( $page ) {
87 + if ( empty( $page ) ) {
88 + $page = 'https://formidableforms.com/lite-upgrade/';
89 + } else {
127 90 $page = str_replace( 'https://formidableforms.com/', '', $page );
128 91 $page = 'https://formidableforms.com/' . $page;
92 + }
93 +
94 + $anchor = '';
95 + if ( is_array( $args ) ) {
96 + $medium = $args['medium'];
97 + if ( isset( $args['content'] ) ) {
98 + $content = $args['content'];
99 + }
100 + if ( isset( $args['anchor'] ) ) {
101 + $anchor = '#' . $args['anchor'];
102 + }
129 103 } else {
130 - $page = 'https://formidableforms.com/lite-upgrade/';
104 + $medium = $args;
131 105 }
132 106
133 - $args = is_array( $args ) ? self::adjust_legacy_utm_args( $args ) : array( 'campaign' => $args );
134 -
135 107 $query_args = array(
136 - 'utm_source' => 'plugin',
137 - 'utm_medium' => self::get_utm_medium(),
108 + 'utm_source' => 'WordPress',
109 + 'utm_medium' => $medium,
110 + 'utm_campaign' => 'liteplugin',
138 111 );
139 - $query_args = self::maybe_add_utm_license( $query_args );
140 112
141 - if ( isset( $args['campaign'] ) ) {
142 - $query_args['utm_campaign'] = $args['campaign'];
113 + if ( isset( $content ) ) {
114 + $query_args['utm_content'] = $content;
143 115 }
144 116
145 - if ( isset( $args['content'] ) ) {
146 - $query_args['utm_content'] = $args['content'];
147 - }
148 -
149 - if ( isset( $args['param'] ) ) {
117 + if ( is_array( $args ) && isset( $args['param'] ) ) {
150 118 $query_args['f'] = $args['param'];
151 119 }
152 120
153 - if ( ! empty( $args['plan'] ) ) {
121 + if ( is_array( $args ) && ! empty( $args['plan'] ) ) {
154 122 $query_args['plan'] = $args['plan'];
155 123 }
156 124
157 - $link = add_query_arg( $query_args, $page );
158 -
159 - if ( isset( $args['anchor'] ) ) {
160 - $link .= '#' . $args['anchor'];
161 - }
162 -
125 + $link = add_query_arg( $query_args, $page ) . $anchor;
163 126 return self::make_affiliate_url( $link );
164 127 }
165 128
166 129 /**
167 - * If medium is "pro", add an additional utm_license param with their active license type.
168 - *
169 - * @since 6.25.1
170 - *
171 - * @param array $query_args
172 - * @param string $link
173 - *
174 - * @return array
175 - */
176 - private static function maybe_add_utm_license( $query_args, $link = '' ) {
177 - $medium = $query_args['utm_medium'] ?? self::pull_medium_from_link( $link );
178 -
179 - if ( 'pro' === $medium && is_callable( 'FrmProAddonsController::get_readable_license_type' ) ) {
180 - $query_args['utm_license'] = strtolower( FrmProAddonsController::get_readable_license_type() );
181 - }
182 -
183 - return $query_args;
184 - }
185 -
186 - /**
187 - * @since 6.26
188 - *
189 - * @param string $link
190 - *
191 - * @return string
192 - */
193 - private static function pull_medium_from_link( $link ) {
194 - if ( ! $link ) {
195 - return '';
196 - }
197 -
198 - $parsed = parse_url( $link );
199 -
200 - if ( ! is_array( $parsed ) || ! isset( $parsed['query'] ) ) {
201 - return '';
202 - }
203 -
204 - $query_args = wp_parse_args( $parsed['query'] );
205 -
206 - return ! empty( $query_args['utm_medium'] ) ? $query_args['utm_medium'] : '';
207 - }
208 -
209 - /**
210 - * @since 6.25.1
211 - *
212 - * @return string
213 - */
214 - private static function get_utm_medium() {
215 - return self::pro_is_connected() ? 'pro' : 'lite';
216 - }
217 -
218 - /**
219 - * Change campaign from "liteplugin" to what we're currently using for medium.
220 - *
221 - * @since 6.25.1
222 - *
223 - * @param array $args
224 - *
225 - * @return array
226 - */
227 - private static function adjust_legacy_utm_args( $args ) {
228 - if ( isset( $args['medium'] ) ) {
229 - $args['campaign'] = $args['medium'];
230 - unset( $args['medium'] );
231 - }
232 -
233 - return $args;
234 - }
235 -
236 - /**
237 - * @since 6.21
238 - *
239 - * @param string $cta_link
240 - * @param array $utm
241 - */
242 - public static function maybe_add_missing_utm( $cta_link, $utm ) {
243 - $utm = self::adjust_legacy_utm_args( $utm );
244 - $query_args = array();
245 -
246 - if ( ! str_contains( $cta_link, 'utm_source' ) ) {
247 - $query_args['utm_source'] = 'plugin';
248 - }
249 -
250 - if ( ! str_contains( $cta_link, 'utm_medium' ) ) {
251 - $query_args['utm_medium'] = self::get_utm_medium();
252 - }
253 -
254 - if ( ! str_contains( $cta_link, 'utm_campaign' ) && isset( $utm['campaign'] ) ) {
255 - $query_args['utm_campaign'] = $utm['campaign'];
256 - }
257 -
258 - if ( ! str_contains( $cta_link, 'utm_content' ) && isset( $utm['content'] ) ) {
259 - $query_args['utm_content'] = $utm['content'];
260 - }
261 -
262 - $query_args = self::maybe_add_utm_license( $query_args, $cta_link );
263 -
264 - return $query_args ? add_query_arg( $query_args, $cta_link ) : $cta_link;
265 - }
266 -
267 - /**
268 130 * Get the Formidable settings
269 131 *
270 132 * @since 2.0
271 133 *
272 134 * @param array $args - May include the form id when values need translation.
273 - *
274 - * @return FrmSettings
135 + * @return FrmSettings $frm_setings
275 136 */
276 137 public static function get_settings( $args = array() ) {
277 138 global $frm_settings;
278 -
279 - if ( ! $frm_settings ) {
139 + if ( empty( $frm_settings ) ) {
280 140 $frm_settings = new FrmSettings( $args );
281 141 } elseif ( isset( $args['current_form'] ) ) {
282 142 // If the global has already been set, allow strings to be filtered.
283 143 $frm_settings->maybe_filter_for_form( $args );
@@ -285,41 +145,16 @@
285 145
286 146 return $frm_settings;
287 147 }
288 148
289 - /**
290 - * @return string
291 - */
292 149 public static function get_menu_name() {
293 - if ( ! self::pro_is_installed() || FrmAddonsController::is_license_expired() ) {
294 - return 'Formidable';
295 - }
150 + $frm_settings = self::get_settings();
296 151
297 - return self::get_settings()->menu;
152 + return $frm_settings->menu;
298 153 }
299 154
300 155 /**
301 - * Determine if the current branding is set to 'formidable'.
302 - * Checks the menu icon, and verifies if it matches the formidable branding.
303 - *
304 - * @since 6.4.2
305 - *
306 - * @return bool True if the menu icon is the logo, false otherwise.
307 - */
308 - public static function is_formidable_branding() {
309 - if ( ! self::pro_is_installed() ) {
310 - return true;
311 - }
312 -
313 - return str_contains( self::get_menu_icon_class(), 'frm_logo_icon' );
314 - }
315 -
316 - /**
317 156 * @since 3.05
318 - *
319 - * @param array $atts
320 - *
321 - * @return string
322 157 */
323 158 public static function svg_logo( $atts = array() ) {
324 159 $defaults = array(
325 160 'height' => 18,
@@ -328,31 +163,23 @@
328 163 'orange' => '#f05a24',
329 164 );
330 165 $atts = array_merge( $defaults, $atts );
331 166
332 - // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong
333 167 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'] ) . '">
334 168 <path fill="' . esc_attr( $atts['orange'] ) . '" d="M289.6 384h140v76h-140z"/>
335 169 <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"/>
336 170 </svg>';
337 - // phpcs:enable SlevomatCodingStandard.Files.LineLength.LineTooLong
338 171 }
339 172
340 173 /**
341 174 * @since 4.0
342 - *
343 - * @param array $atts
344 - *
345 - * @return void
346 175 */
347 176 public static function show_logo( $atts = array() ) {
348 - self::kses_echo( self::svg_logo( $atts ), 'all' );
177 + echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
349 178 }
350 179
351 180 /**
352 181 * @since 4.03.02
353 - *
354 - * @return void
355 182 */
356 183 public static function show_header_logo() {
357 184 $icon = self::svg_logo(
358 185 array(
@@ -361,11 +188,10 @@
361 188 )
362 189 );
363 190
364 191 $new_icon = apply_filters( 'frm_icon', $icon, true );
365 -
366 192 if ( $new_icon !== $icon ) {
367 - if ( str_starts_with( $new_icon, '<svg' ) ) {
193 + if ( strpos( $new_icon, '<svg' ) === 0 ) {
368 194 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
369 195 } else {
370 196 // Show nothing if it isn't an SVG.
371 197 $icon = '<div style="height:39px"></div>';
@@ -370,43 +196,26 @@
370 196 // Show nothing if it isn't an SVG.
371 197 $icon = '<div style="height:39px"></div>';
372 198 }
373 199 }
374 - self::kses_echo( $icon, 'all' );
200 + echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
375 201 }
376 202
377 203 /**
378 204 * @since 2.02.04
379 - *
380 - * @return bool
381 205 */
382 206 public static function ips_saved() {
383 207 $frm_settings = self::get_settings();
208 +
384 209 return ! $frm_settings->no_ips;
385 210 }
386 211
387 - /**
388 - * @return bool
389 - */
390 212 public static function pro_is_installed() {
391 - return (bool) apply_filters( 'frm_pro_installed', false );
213 + return apply_filters( 'frm_pro_installed', false );
392 214 }
393 215
394 216 /**
395 - * Check if the Pro plugin is installed, whether authorized or not.
396 - *
397 - * @since 6.8.3
398 - *
399 - * @return bool
400 - */
401 - public static function pro_is_included() {
402 - return function_exists( 'load_formidable_pro' );
403 - }
404 -
405 - /**
406 217 * @since 4.06.02
407 - *
408 - * @return bool
409 218 */
410 219 public static function pro_is_connected() {
411 220 global $frm_vars;
412 221 return self::pro_is_installed() && $frm_vars['pro_is_authorized'];
@@ -413,100 +222,45 @@
413 222 }
414 223
415 224 /**
416 225 * @since 4.06
417 - * @since 6.16.2 Added $check_for_settings parameter
418 - *
419 - * @param bool $check_for_settings
420 - *
421 - * @return bool
422 226 */
423 - public static function is_form_builder_page( $check_for_settings = true ) {
424 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
425 - $check_actions = array( 'edit', 'duplicate' );
426 -
427 - if ( $check_for_settings ) {
428 - $check_actions[] = 'settings';
429 - }
430 -
431 - return self::is_admin_page( 'formidable' ) && in_array( $action, $check_actions, true );
227 + public static function is_form_builder_page() {
228 + $action = self::simple_get( 'frm_action', 'sanitize_title' );
229 + return self::is_admin_page( 'formidable' ) && ( $action === 'edit' || $action === 'settings' || $action === 'duplicate' );
432 230 }
433 231
434 - /**
435 - * @return bool
436 - */
437 232 public static function is_formidable_admin() {
438 - $page = self::simple_get( 'page', 'sanitize_title' );
439 -
440 - if ( ! $page ) {
441 - return self::is_view_builder_page();
233 + $page = self::simple_get( 'page', 'sanitize_title' );
234 + $is_formidable = strpos( $page, 'formidable' ) !== false;
235 + if ( empty( $page ) ) {
236 + $is_formidable = self::is_view_builder_page();
442 237 }
443 238
444 - return str_contains( $page, 'formidable' );
239 + return $is_formidable;
445 240 }
446 241
447 242 /**
448 - * Checks if is a list page.
449 - *
450 - * @since 6.19
451 - *
452 - * @param string $page The name of the page to check.
453 - *
454 - * @return bool
455 - */
456 - public static function is_admin_list_page( $page = 'formidable' ) {
457 - if ( 'formidable' === $page ) {
458 - return self::on_form_listing_page();
459 - }
460 -
461 - if ( ! self::is_admin_page( $page ) ) {
462 - return false;
463 - }
464 -
465 - if ( 'formidable-entries' === $page ) {
466 - $action = self::simple_get( 'frm_action' );
467 -
468 - if ( ! $action || in_array( $action, self::get_entries_listing_page_form_actions(), true ) ) {
469 - return true;
470 - }
471 - }
472 -
473 - // Check edit or settings page.
474 - return ! self::simple_get( 'frm_action' );
475 - }
476 -
477 - /**
478 - * @since 6.20
479 - *
480 - * @return array<string>
481 - */
482 - private static function get_entries_listing_page_form_actions() {
483 - return array( 'list', 'destroy' );
484 - }
485 -
486 - /**
487 243 * Check for certain page in Formidable settings
488 244 *
489 245 * @since 2.0
490 246 *
491 - * @param string $page The name of the page to check.
247 + * @param string $page The name of the page to check
492 248 *
493 - * @return bool
249 + * @return boolean
494 250 */
495 251 public static function is_admin_page( $page = 'formidable' ) {
496 252 global $pagenow;
497 253 $get_page = self::simple_get( 'page', 'sanitize_title' );
498 -
499 254 if ( $pagenow ) {
500 - // Allow this to be true during ajax load i.e. ajax form builder loading
501 - $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
502 -
255 + // allow this to be true during ajax load i.e. ajax form builder loading
256 + $is_page = ( $pagenow == 'admin.php' || $pagenow == 'admin-ajax.php' ) && $get_page == $page;
503 257 if ( $is_page ) {
504 258 return true;
505 259 }
506 260 }
507 261
508 - return is_admin() && $get_page === $page;
262 + return is_admin() && $get_page == $page;
509 263 }
510 264
511 265 /**
512 266 * If the current page is for editing or creating a view.
@@ -512,23 +266,21 @@
512 266 * If the current page is for editing or creating a view.
513 267 * Returns false for the views listing page.
514 268 *
515 269 * @since 4.0
516 - *
517 - * @return bool
518 270 */
519 271 public static function is_view_builder_page() {
520 272 global $pagenow;
521 273
522 - if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), true ) ) {
274 + if ( $pagenow !== 'post.php' && $pagenow !== 'post-new.php' && $pagenow !== 'edit.php' ) {
523 275 return false;
524 276 }
525 277
526 278 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
527 279
528 - if ( ! $post_type ) {
529 - $post_id = self::simple_get( 'post', 'absint' );
530 - $post = get_post( $post_id );
280 + if ( empty( $post_type ) ) {
281 + $post_id = self::simple_get( 'post', 'absint' );
282 + $post = get_post( $post_id );
531 283 $post_type = $post ? $post->post_type : '';
532 284 }
533 285
534 286 return $post_type === 'frm_display';
@@ -538,15 +290,17 @@
538 290 * Check for the form preview page
539 291 *
540 292 * @since 2.0
541 293 *
542 - * @return bool
294 + * @param None
295 + *
296 + * @return boolean
543 297 */
544 298 public static function is_preview_page() {
545 299 global $pagenow;
546 300 $action = self::simple_get( 'action', 'sanitize_title' );
547 301
548 - return $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
302 + return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
549 303 }
550 304
551 305 /**
552 306 * Check for ajax except the form preview page
@@ -552,17 +306,16 @@
552 306 * Check for ajax except the form preview page
553 307 *
554 308 * @since 2.0
555 309 *
556 - * @return bool
310 + * @param None
311 + *
312 + * @return boolean
557 313 */
558 314 public static function doing_ajax() {
559 315 return wp_doing_ajax() && ! self::is_preview_page();
560 316 }
561 317
562 - /**
563 - * @return string
564 - */
565 318 public static function js_suffix() {
566 319 return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
567 320 }
568 321
@@ -567,14 +320,13 @@
567 320 }
568 321
569 322 /**
570 323 * @since 2.0.8
571 - *
572 - * @return bool
573 324 */
574 325 public static function prevent_caching() {
575 326 global $frm_vars;
576 - return ! empty( $frm_vars['prevent_caching'] );
327 +
328 + return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
577 329 }
578 330
579 331 /**
580 332 * Check if on an admin page
@@ -580,19 +332,14 @@
580 332 * Check if on an admin page
581 333 *
582 334 * @since 2.0
583 335 *
584 - * @return bool
336 + * @param None
337 + *
338 + * @return boolean
585 339 */
586 340 public static function is_admin() {
587 - $is_admin = is_admin() && ! wp_doing_ajax();
588 -
589 - /**
590 - * @since 6.0
591 - *
592 - * @param bool $is_admin
593 - */
594 - return apply_filters( 'frm_is_admin', $is_admin );
341 + return is_admin() && ! wp_doing_ajax();
595 342 }
596 343
597 344 /**
598 345 * Check if value contains blank value or empty array
@@ -598,23 +345,17 @@
598 345 * Check if value contains blank value or empty array
599 346 *
600 347 * @since 2.0
601 348 *
602 - * @param mixed $value Value to check.
603 - * @param string $empty
349 + * @param mixed $value - value to check
350 + * @param string
604 351 *
605 - * @return bool
352 + * @return boolean
606 353 */
607 354 public static function is_empty_value( $value, $empty = '' ) {
608 - return $value === array() || $value === $empty;
355 + return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
609 356 }
610 357
611 - /**
612 - * @param mixed $value
613 - * @param string $empty
614 - *
615 - * @return bool
616 - */
617 358 public static function is_not_empty_value( $value, $empty = '' ) {
618 359 return ! self::is_empty_value( $value, $empty );
619 360 }
620 361
@@ -631,37 +372,26 @@
631 372 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
632 373 }
633 374
634 375 /**
635 - * Get the server OS
376 + * Check for the IP address in several places
377 + * Used by [ip] shortcode
636 378 *
637 - * @since 6.4.2
638 - *
639 - * @return string
640 - */
641 - public static function get_server_os() {
642 - if ( function_exists( 'php_uname' ) ) {
643 - return php_uname( 's' );
644 - }
645 -
646 - if ( ! defined( 'PHP_OS' ) ) {
647 - return '';
648 - }
649 -
650 - // match the same response for Windows server as php_uname('s')
651 - return in_array( PHP_OS, array( 'WIN32', 'WINNT', 'Windows_NT' ), true ) ? 'Windows NT' : PHP_OS;
652 - }
653 -
654 - /**
655 - * Check for the IP address in several places (when custom headers are enabled).
656 - * Used by [ip] shortcode.
657 - *
658 379 * @return string The IP address of the current user
659 380 */
660 381 public static function get_ip_address() {
661 - $ip_options = self::should_use_custom_header_ip() ? self::get_custom_header_keys_for_ip() : array( 'REMOTE_ADDR' );
662 - $ip = '';
663 -
382 + $ip_options = array(
383 + 'HTTP_CLIENT_IP',
384 + 'HTTP_CF_CONNECTING_IP',
385 + 'HTTP_X_FORWARDED_FOR',
386 + 'HTTP_X_FORWARDED',
387 + 'HTTP_X_CLUSTER_CLIENT_IP',
388 + 'HTTP_X_REAL_IP',
389 + 'HTTP_FORWARDED_FOR',
390 + 'HTTP_FORWARDED',
391 + 'REMOTE_ADDR',
392 + );
393 + $ip = '';
664 394 foreach ( $ip_options as $key ) {
665 395 if ( ! isset( $_SERVER[ $key ] ) ) {
666 396 continue;
667 397 }
@@ -666,12 +396,10 @@
666 396 continue;
667 397 }
668 398
669 399 $key = self::get_server_value( $key );
670 -
671 400 foreach ( explode( ',', $key ) as $ip ) {
672 - // Just to be safe.
673 - $ip = trim( $ip );
401 + $ip = trim( $ip ); // just to be safe.
674 402
675 403 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
676 404 return sanitize_text_field( $ip );
677 405 }
@@ -680,70 +408,16 @@
680 408
681 409 return sanitize_text_field( $ip );
682 410 }
683 411
684 - /**
685 - * @since 6.1
686 - *
687 - * @return array
688 - */
689 - public static function get_custom_header_keys_for_ip() {
690 - return array(
691 - 'HTTP_CLIENT_IP',
692 - 'HTTP_CF_CONNECTING_IP',
693 - 'HTTP_X_FORWARDED_FOR',
694 - 'HTTP_X_FORWARDED',
695 - 'HTTP_X_CLUSTER_CLIENT_IP',
696 - 'HTTP_X_REAL_IP',
697 - 'HTTP_FORWARDED_FOR',
698 - 'HTTP_FORWARDED',
699 - 'REMOTE_ADDR',
700 - );
701 - }
702 -
703 - /**
704 - * Check if we should check every HTTP header or just $_SERVER['REMOTE_ADDR'].
705 - * The other HTTP headers can be spoofed so this isn't recommended.
706 - * But in some cases (like reverse proxies), the IP may be empty if you use $_SERVER['REMOTE_ADDR'].
707 - *
708 - * @since 6.1
709 - *
710 - * @return bool
711 - */
712 - private static function should_use_custom_header_ip() {
713 - $settings = self::get_settings();
714 - $should_use_custom_header_ip = ! $settings->no_ips && $settings->custom_header_ip;
715 -
716 - /**
717 - * Filter whether to check spoofable HTTP headers.
718 - * This uses the custom_header_ip setting, but it is hidden if the GDPR option is also on.
719 - * As the IP is still checked for blacklist checks, someone with the GDPR option may still want to enable this when behind a reverse proxy.
720 - *
721 - * @since 6.1
722 - *
723 - * @param bool $should_use_custom_header_ip
724 - */
725 - return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
726 - }
727 -
728 - /**
729 - * @param string $param
730 - * @param mixed $default
731 - * @param string $src
732 - * @param callable|string $sanitize
733 - *
734 - * @return mixed
735 - */
736 412 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
737 - if ( str_contains( $param, '[' ) ) {
413 + if ( strpos( $param, '[' ) ) {
738 414 $params = explode( '[', $param );
739 415 $param = $params[0];
740 416 }
741 417
742 418 if ( $src === 'get' ) {
743 - // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
744 - $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
745 -
419 + $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
746 420 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
747 421 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
748 422 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
749 423 }
@@ -758,41 +432,29 @@
758 432 )
759 433 );
760 434 }
761 435
762 - if ( ! isset( $params ) || ! is_array( $value ) || ! $value ) {
763 - return $value;
764 - }
436 + if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
437 + foreach ( $params as $k => $p ) {
438 + if ( ! $k || ! is_array( $value ) ) {
439 + continue;
440 + }
765 441
766 - foreach ( $params as $k => $p ) {
767 - if ( ! $k || ! is_array( $value ) ) {
768 - continue;
442 + $p = trim( $p, ']' );
443 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
769 444 }
770 -
771 - $p = trim( $p, ']' );
772 - $value = $value[ $p ] ?? $default;
773 445 }
774 446
775 447 return $value;
776 448 }
777 449
778 - /**
779 - * Get a value from $_POST data.
780 - *
781 - * @param string $param The key we are trying to access data from in $_POST.
782 - * @param mixed $default The default if nothing is being sent.
783 - * @param callable|string $sanitize Make sure to pass a sanitize method here. This function will NOT sanitize by default.
784 - * @param bool $serialized
785 - *
786 - * @return mixed
787 - */
788 450 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
789 451 return self::get_simple_request(
790 452 array(
791 - 'type' => 'post',
792 - 'param' => $param,
793 - 'default' => $default,
794 - 'sanitize' => $sanitize,
453 + 'type' => 'post',
454 + 'param' => $param,
455 + 'default' => $default,
456 + 'sanitize' => $sanitize,
795 457 'serialized' => $serialized,
796 458 )
797 459 );
798 460 }
@@ -803,9 +465,9 @@
803 465 * @param string $param
804 466 * @param string $sanitize
805 467 * @param string $default
806 468 *
807 - * @return array|int|string
469 + * @return string|array
808 470 */
809 471 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
810 472 return self::get_simple_request(
811 473 array(
@@ -823,38 +485,39 @@
823 485 * @since 2.0.6
824 486 *
825 487 * @param array $args
826 488 *
827 - * @return array|string
489 + * @return string|array
828 490 */
829 491 public static function get_simple_request( $args ) {
830 492 $defaults = array(
831 - 'param' => '',
832 - 'default' => '',
833 - 'type' => 'get',
834 - 'sanitize' => 'sanitize_text_field',
493 + 'param' => '',
494 + 'default' => '',
495 + 'type' => 'get',
496 + 'sanitize' => 'sanitize_text_field',
835 497 'serialized' => false,
836 498 );
837 499 $args = wp_parse_args( $args, $defaults );
838 - $value = $args['default'];
839 500
840 - if ( $args['type'] === 'get' ) {
501 + $value = $args['default'];
502 + if ( $args['type'] == 'get' ) {
841 503 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
842 504 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
843 505 $value = wp_unslash( $_GET[ $args['param'] ] );
844 506 }
845 - } elseif ( $args['type'] === 'post' ) {
507 + } elseif ( $args['type'] == 'post' ) {
846 508 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
847 509 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
848 510 $value = wp_unslash( $_POST[ $args['param'] ] );
849 -
850 511 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
851 512 self::unserialize_or_decode( $value );
852 513 }
853 514 }
854 - } elseif ( isset( $_REQUEST[ $args['param'] ] ) ) {
855 - // phpcs:ignore phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
856 - $value = wp_unslash( $_REQUEST[ $args['param'] ] );
515 + } else {
516 + if ( isset( $_REQUEST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
517 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
518 + $value = wp_unslash( $_REQUEST[ $args['param'] ] );
519 + }
857 520 }
858 521
859 522 self::sanitize_value( $args['sanitize'], $value );
860 523
@@ -867,56 +530,34 @@
867 530 * @since 2.0.8
868 531 *
869 532 * @param string $value
870 533 *
871 - * @return string Value.
534 + * @return string $value
872 535 */
873 536 public static function preserve_backslashes( $value ) {
874 537 // If backslashes have already been added, don't add them again
875 - return str_contains( $value, '\\\\' ) ? $value : addslashes( $value );
538 + if ( strpos( $value, '\\\\' ) === false ) {
539 + $value = addslashes( $value );
540 + }
541 +
542 + return $value;
876 543 }
877 544
878 - /**
879 - * Sanitize a value in-place.
880 - * If $value is an array, the sanitize function will get called for each item.
881 - *
882 - * @param callable $sanitize
883 - * @param mixed $value
884 - *
885 - * @return void
886 - */
887 545 public static function sanitize_value( $sanitize, &$value ) {
888 - if ( ! $sanitize ) {
889 - return;
890 - }
891 -
892 - if ( is_object( $value ) ) {
893 - $value = '';
894 - return;
895 - }
896 -
897 - if ( is_array( $value ) ) {
898 - $temp_values = $value;
899 -
900 - foreach ( $temp_values as $k => $v ) {
901 - self::sanitize_value( $sanitize, $value[ $k ] );
546 + if ( ! empty( $sanitize ) ) {
547 + if ( is_array( $value ) ) {
548 + $temp_values = $value;
549 + foreach ( $temp_values as $k => $v ) {
550 + self::sanitize_value( $sanitize, $value[ $k ] );
551 + }
552 + } else {
553 + $value = call_user_func( $sanitize, $value );
902 554 }
903 -
904 - return;
905 555 }
906 -
907 - $value = call_user_func( $sanitize, $value );
908 556 }
909 557
910 - /**
911 - * @param array $sanitize_method
912 - * @param array $values
913 - *
914 - * @return void
915 - */
916 558 public static function sanitize_request( $sanitize_method, &$values ) {
917 559 $temp_values = $values;
918 -
919 560 foreach ( $temp_values as $k => $val ) {
920 561 if ( isset( $sanitize_method[ $k ] ) ) {
921 562 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
922 563 }
@@ -924,68 +565,23 @@
924 565 }
925 566
926 567 /**
927 568 * @since 4.0.04
928 - *
929 - * @param mixed $value
930 - *
931 - * @return void
932 569 */
933 570 public static function sanitize_with_html( &$value ) {
934 - if ( current_user_can( 'frm_edit_entries' ) || current_user_can( 'administrator' ) ) {
935 - // Only strip unsafe HTML like scripts for a privileged user submitting a form.
936 - self::sanitize_value( 'wp_kses_post', $value );
937 - } else {
938 - self::sanitize_value( self::class . '::strip_most_html', $value );
939 - }
571 + self::sanitize_value( 'wp_kses_post', $value );
940 572 self::decode_specialchars( $value );
941 573 }
942 574
943 575 /**
944 - * Allow only a small set of very basic HTML for unprivileged users.
945 - *
946 - * @since 6.7.1
947 - *
948 - * @param string $value
949 - */
950 - public static function strip_most_html( $value ) {
951 - if ( '' === $value ) {
952 - return $value;
953 - }
954 -
955 - $allowed_html = array(
956 - 'b' => array(),
957 - 'br' => array(),
958 - 'strong' => array(),
959 - 'p' => array(),
960 - 'i' => array(),
961 - 'ul' => array(),
962 - 'ol' => array(),
963 - 'li' => array(),
964 - );
965 -
966 - /**
967 - * @since 6.7.1
968 - *
969 - * @param array $allowed_html
970 - */
971 - $allowed_html = apply_filters( 'frm_allowed_form_input_html', $allowed_html );
972 -
973 - return wp_kses( $value, $allowed_html );
974 - }
975 -
976 - /**
977 576 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
978 577 * this MUST be done, else we'll be back to the '& entity' problem.
979 578 *
980 579 * @since 4.0.04
981 - *
982 - * @param mixed $value Value to decode, passed by reference.
983 580 */
984 581 public static function decode_specialchars( &$value ) {
985 582 if ( is_array( $value ) ) {
986 583 $temp_values = $value;
987 -
988 584 foreach ( $temp_values as $k => $v ) {
989 585 self::decode_specialchars( $value[ $k ] );
990 586 }
991 587 } else {
@@ -999,13 +595,13 @@
999 595 * Adapted from wp_specialchars_decode().
1000 596 *
1001 597 * @since 4.03.01
1002 598 *
1003 - * @param string $string The string to prep, passed by reference.
599 + * @param string $string The string to prep.
1004 600 */
1005 601 private static function decode_amp( &$string ) {
1006 602 // Don't bother if there are no entities - saves a lot of processing
1007 - if ( ! $string || ! str_contains( $string, '&' ) ) {
603 + if ( empty( $string ) || strpos( $string, '&' ) === false ) {
1008 604 return;
1009 605 }
1010 606
1011 607 $translation = array(
@@ -1011,12 +607,10 @@
1011 607 $translation = array(
1012 608 '&quot;' => '"',
1013 609 '&#034;' => '"',
1014 610 '&#x22;' => '"',
1015 - // The space preserves the HTML.
1016 - '&lt; ' => '< ',
1017 - // The space preserves the HTML.
1018 - '&#060; ' => '< ',
611 + '&lt; ' => '< ', // The space preserves the HTML.
612 + '&#060; ' => '< ', // The space preserves the HTML.
1019 613 '&gt;' => '>',
1020 614 '&#062;' => '>',
1021 615 '&amp;' => '&',
1022 616 '&#038;' => '&',
@@ -1043,29 +637,17 @@
1043 637 * Sanitize the value, and allow some HTML
1044 638 *
1045 639 * @since 2.0
1046 640 *
1047 - * @param string $value The value to sanitize.
1048 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
641 + * @param string $value
642 + * @param array|string $allowed 'all' for everything included as defaults
1049 643 *
1050 644 * @return string
1051 645 */
1052 646 public static function kses( $value, $allowed = array() ) {
1053 - return wp_kses( $value, self::allowed_html( $allowed ) );
1054 - }
647 + $allowed_html = self::allowed_html( $allowed );
1055 648
1056 - /**
1057 - * Sanitizes and echoes a given value.
1058 - *
1059 - * @since 6.18
1060 - *
1061 - * @param string $value The value to sanitize and output.
1062 - * @param array|string $allowed Allowed HTML tags and attributes.
1063 - *
1064 - * @return void
1065 - */
1066 - public static function kses_echo( $value, $allowed = array() ) {
1067 - echo self::kses( $value, $allowed ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
649 + return wp_kses( $value, $allowed_html );
1068 650 }
1069 651
1070 652 /**
1071 653 * The regular kses function strips [button_action] from submit button HTML.
@@ -1072,23 +654,21 @@
1072 654 *
1073 655 * @since 5.0.13
1074 656 *
1075 657 * @param string $html
1076 - *
1077 658 * @return string
1078 659 */
1079 660 public static function kses_submit_button( $html ) {
1080 - $included_button_action = str_contains( $html, '[button_action]' );
1081 - $included_back_hook = str_contains( $html, '[back_hook]' );
1082 - $included_draft_hook = str_contains( $html, '[draft_hook]' );
661 + $included_button_action = false !== strpos( $html, '[button_action]' );
662 + $included_back_hook = false !== strpos( $html, '[back_hook]' );
663 + $included_draft_hook = false !== strpos( $html, '[draft_hook]' );
1083 664 add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1084 665 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1085 666 $html = self::kses( $html, 'all' );
1086 667 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1087 668 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1088 -
1089 669 if ( $included_button_action ) {
1090 - if ( str_contains( $html, '<input type="submit"' ) ) {
670 + if ( false !== strpos( $html, '<input type="submit"' ) ) {
1091 671 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1092 672 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
1093 673 } else {
1094 674 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
@@ -1094,17 +674,14 @@
1094 674 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1095 675 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1096 676 }
1097 677 }
1098 -
1099 678 if ( $included_back_hook ) {
1100 679 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1101 680 }
1102 -
1103 681 if ( $included_draft_hook ) {
1104 - return str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
682 + $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1105 683 }
1106 -
1107 684 return $html;
1108 685 }
1109 686
1110 687 /**
@@ -1110,9 +687,8 @@
1110 687 /**
1111 688 * @since 5.0.13
1112 689 *
1113 690 * @param array $allowed_attr
1114 - *
1115 691 * @return array
1116 692 */
1117 693 public static function allow_visibility_style( $allowed_attr ) {
1118 694 $allowed_attr[] = 'visibility';
@@ -1122,9 +698,8 @@
1122 698 /**
1123 699 * @since 5.0.13
1124 700 *
1125 701 * @param array $allowed_html
1126 - *
1127 702 * @return array
1128 703 */
1129 704 public static function add_allowed_submit_button_tags( $allowed_html ) {
1130 705 $allowed_html['input'] = array(
@@ -1141,22 +716,17 @@
1141 716 }
1142 717
1143 718 /**
1144 719 * @since 2.05.03
1145 - *
1146 - * @param array|string $allowed
1147 - *
1148 - * @return array
1149 720 */
1150 721 private static function allowed_html( $allowed ) {
1151 722 $html = self::safe_html();
1152 723 $allowed_html = array();
1153 -
1154 724 if ( $allowed === 'all' ) {
1155 725 $allowed_html = $html;
1156 - } elseif ( $allowed ) {
726 + } elseif ( ! empty( $allowed ) ) {
1157 727 foreach ( (array) $allowed as $a ) {
1158 - $allowed_html[ $a ] = $html[ $a ] ?? array();
728 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1159 729 }
1160 730 }
1161 731
1162 732 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1163,10 +733,8 @@
1163 733 }
1164 734
1165 735 /**
1166 736 * @since 2.05.03
1167 - *
1168 - * @return array
1169 737 */
1170 738 private static function safe_html() {
1171 739 $allow_class = array(
1172 740 'class' => true,
@@ -1173,9 +741,9 @@
1173 741 'id' => true,
1174 742 );
1175 743
1176 744 return array(
1177 - 'a' => array(
745 + 'a' => array(
1178 746 'class' => true,
1179 747 'href' => true,
1180 748 'id' => true,
1181 749 'rel' => true,
@@ -1244,16 +812,16 @@
1244 812 'cite' => true,
1245 813 'title' => true,
1246 814 ),
1247 815 'rect' => array(
1248 - 'class' => true,
1249 - 'fill' => true,
1250 - 'height' => true,
1251 - 'width' => true,
1252 - 'x' => true,
1253 - 'y' => true,
1254 - 'rx' => true,
1255 - 'stroke' => true,
816 + 'class' => true,
817 + 'fill' => true,
818 + 'height' => true,
819 + 'width' => true,
820 + 'x' => true,
821 + 'y' => true,
822 + 'rx' => true,
823 + 'stroke' => true,
1256 824 'stroke-opacity' => true,
1257 825 'stroke-width' => true,
1258 826 ),
1259 827 'section' => $allow_class,
@@ -1288,9 +856,9 @@
1288 856 'xlink:href' => true,
1289 857 ),
1290 858 'ul' => $allow_class,
1291 859 'label' => array(
1292 - 'for' => true,
860 + 'for' => true,
1293 861 'class' => true,
1294 862 'id' => true,
1295 863 ),
1296 864 'button' => array(
@@ -1299,13 +867,8 @@
1299 867 ),
1300 868 'legend' => array(
1301 869 'class' => true,
1302 870 ),
1303 - 'option' => array(
1304 - 'class' => true,
1305 - 'value' => true,
1306 - 'selected' => true,
1307 - ),
1308 871 );
1309 872 }
1310 873
1311 874 /**
@@ -1313,21 +876,19 @@
1313 876 *
1314 877 * @since 2.0
1315 878 */
1316 879 public static function remove_get_action() {
1317 - if ( empty( $_GET ) ) {
880 + if ( ! isset( $_GET ) ) {
1318 881 return;
1319 882 }
1320 883
1321 884 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1322 -
1323 - if ( ! $action_name ) {
885 + if ( empty( $action_name ) ) {
1324 886 return;
1325 887 }
1326 888
1327 889 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1328 -
1329 - if ( $new_action ) {
890 + if ( ! empty( $new_action ) ) {
1330 891 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1331 892 }
1332 893 }
1333 894
@@ -1334,23 +895,21 @@
1334 895 /**
1335 896 * Check the WP query for a parameter
1336 897 *
1337 898 * @since 2.0
1338 - *
1339 - * @param array|string $value
1340 - * @param string $param
1341 - *
1342 - * @return array|string
899 + * @return string|array
1343 900 */
1344 901 public static function get_query_var( $value, $param ) {
1345 - // phpcs:ignore Universal.Operators.StrictComparisons
1346 902 if ( $value != '' ) {
1347 903 return $value;
1348 904 }
1349 905
1350 906 global $wp_query;
907 + if ( isset( $wp_query->query_vars[ $param ] ) ) {
908 + $value = $wp_query->query_vars[ $param ];
909 + }
1351 910
1352 - return $wp_query->query_vars[ $param ] ?? $value;
911 + return $value;
1353 912 }
1354 913
1355 914 /**
1356 915 * Try to show the SVG if possible. Otherwise, use the font icon.
@@ -1355,55 +914,38 @@
1355 914 /**
1356 915 * Try to show the SVG if possible. Otherwise, use the font icon.
1357 916 *
1358 917 * @since 4.0.02
1359 - *
1360 918 * @param string $class
1361 919 * @param array $atts
1362 - *
1363 - * @return string|null
1364 920 */
1365 921 public static function icon_by_class( $class, $atts = array() ) {
1366 922 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1367 -
1368 923 if ( isset( $atts['echo'] ) ) {
1369 924 unset( $atts['echo'] );
1370 925 }
1371 926
1372 927 $html_atts = self::array_to_html_params( $atts );
1373 - $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1374 928
1375 - // Replace icons that have been removed or renamed.
1376 - $deprecated = array(
1377 - 'frm_clone_solid_icon' => 'frm_clone_icon',
1378 - 'frm_keyalt_icon' => 'frm_key_icon',
1379 - 'frm_keyalt_solid_icon' => 'frm_key_solid_icon',
1380 - );
1381 -
1382 - if ( isset( $deprecated[ $icon ] ) ) {
1383 - $icon = $deprecated[ $icon ];
1384 - $class = str_replace( $icon, $deprecated[ $icon ], $class );
1385 - }
1386 -
929 + $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1387 930 if ( $icon === $class ) {
1388 931 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1389 932 } else {
1390 - $class = str_contains( $icon, ' ' ) ? ' ' . $icon : '';
1391 -
1392 - if ( str_contains( $icon, ' ' ) ) {
933 + $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
934 + if ( strpos( $icon, ' ' ) ) {
1393 935 $icon = explode( ' ', $icon );
1394 936 $icon = reset( $icon );
1395 937 }
1396 -
1397 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use href="#' . esc_attr( $icon ) . '" /></svg>';
938 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
939 + <use xlink:href="#' . esc_attr( $icon ) . '" />
940 + </svg>';
1398 941 }
1399 942
1400 943 if ( $echo ) {
1401 944 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1402 - return null;
945 + } else {
946 + return $icon;
1403 947 }
1404 -
1405 - return $icon;
1406 948 }
1407 949
1408 950 /**
1409 951 * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
@@ -1410,9 +952,8 @@
1410 952 *
1411 953 * @since 5.0.13
1412 954 *
1413 955 * @param string $icon
1414 - *
1415 956 * @return string
1416 957 */
1417 958 public static function kses_icon( $icon ) {
1418 959 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1428,15 +969,13 @@
1428 969 /**
1429 970 * @since 5.0.13.1
1430 971 *
1431 972 * @param array $allowed_html
1432 - *
1433 973 * @return array
1434 974 */
1435 975 public static function add_allowed_icon_tags( $allowed_html ) {
1436 976 $allowed_html['svg']['data-open'] = true;
1437 977 $allowed_html['svg']['title'] = true;
1438 - $allowed_html['svg']['tabindex'] = true;
1439 978 return $allowed_html;
1440 979 }
1441 980
1442 981 /**
@@ -1442,13 +981,12 @@
1442 981 /**
1443 982 * @since 5.0.13
1444 983 *
1445 984 * @param array $allowed_attr
1446 - *
1447 985 * @return array
1448 986 */
1449 987 public static function allow_vars_in_styles( $allowed_attr ) {
1450 - $allowed_attr[] = '--primary-700';
988 + $allowed_attr[] = '--primary-hover';
1451 989 return $allowed_attr;
1452 990 }
1453 991
1454 992 /**
@@ -1457,9 +995,9 @@
1457 995 * @param bool $allow_css
1458 996 * @param string $css_string
1459 997 */
1460 998 public static function allow_style( $allow_css, $css_string ) {
1461 - if ( ! $allow_css && str_starts_with( $css_string, '--primary-700:' ) ) {
999 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-hover:' ) ) {
1462 1000 $split = explode( ':', $css_string, 2 );
1463 1001 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1464 1002 }
1465 1003 return $allow_css;
@@ -1468,22 +1006,19 @@
1468 1006 /**
1469 1007 * @since 5.0.13
1470 1008 *
1471 1009 * @param string $value
1472 - *
1473 1010 * @return bool
1474 1011 */
1475 1012 private static function is_a_valid_color( $value ) {
1476 1013 $match = 0;
1477 -
1478 - if ( str_starts_with( $value, 'rgba(' ) ) {
1014 + if ( 0 === strpos( $value, 'rgba(' ) ) {
1479 1015 $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(' ) ) {
1016 + } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1481 1017 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1482 - } elseif ( str_starts_with( $value, '#' ) ) {
1018 + } elseif ( 0 === strpos( $value, '#' ) ) {
1483 1019 $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1484 1020 }
1485 -
1486 1021 return (bool) $match;
1487 1022 }
1488 1023
1489 1024 /**
@@ -1489,19 +1024,11 @@
1489 1024 /**
1490 1025 * Include svg images.
1491 1026 *
1492 1027 * @since 4.0.02
1493 - *
1494 - * @return void
1495 1028 */
1496 1029 public static function include_svg() {
1497 - if ( self::$included_svg ) {
1498 - return;
1499 - }
1500 -
1501 - // Use readfile instead of include_once because of a default security rule in Snuffleupagus.
1502 - readfile( self::plugin_path() . '/images/icons.svg' );
1503 - self::$included_svg = true;
1030 + include_once self::plugin_path() . '/images/icons.svg';
1504 1031 }
1505 1032
1506 1033 /**
1507 1034 * Convert an associative array to HTML values.
@@ -1510,20 +1037,17 @@
1510 1037 * @since 5.0.13 added $echo parameter.
1511 1038 *
1512 1039 * @param array $atts
1513 1040 * @param bool $echo
1514 - *
1515 1041 * @return string|void
1516 1042 */
1517 1043 public static function array_to_html_params( $atts, $echo = false ) {
1518 - $callback = function () use ( $atts ) {
1519 - if ( ! $atts ) {
1520 - return;
1044 + $callback = function() use ( $atts ) {
1045 + if ( $atts ) {
1046 + foreach ( $atts as $key => $value ) {
1047 + echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1048 + }
1521 1049 }
1522 -
1523 - foreach ( $atts as $key => $value ) {
1524 - echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1525 - }
1526 1050 };
1527 1051 return self::clip( $callback, $echo );
1528 1052 }
1529 1053
@@ -1533,12 +1057,9 @@
1533 1057 * @since 5.0.13
1534 1058 *
1535 1059 * @param Closure $echo_function
1536 1060 * @param bool $echo
1537 - *
1538 - * @return string|null
1539 - *
1540 - * @psalm-return ($echo is true ? null : string)
1061 + * @return string|void
1541 1062 */
1542 1063 public static function clip( $echo_function, $echo = false ) {
1543 1064 if ( ! $echo ) {
1544 1065 ob_start();
@@ -1543,60 +1064,38 @@
1543 1064 if ( ! $echo ) {
1544 1065 ob_start();
1545 1066 }
1546 1067
1547 - if ( is_callable( $echo_function ) ) {
1548 - $echo_function();
1068 + $echo_function();
1069 +
1070 + if ( ! $echo ) {
1071 + $return = ob_get_contents();
1072 + ob_end_clean();
1073 + return $return;
1549 1074 }
1550 -
1551 - return $echo ? null : ob_get_clean();
1552 1075 }
1553 1076
1554 1077 /**
1555 1078 * @since 3.0
1556 - *
1557 - * @param array $atts
1558 - *
1559 - * @return void
1560 1079 */
1561 1080 public static function get_admin_header( $atts ) {
1562 - $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1563 -
1564 - if ( empty( $atts['close'] ) ) {
1081 + $has_nav = ( isset( $atts['form'] ) && ! empty( $atts['form'] ) && ( ! isset( $atts['is_template'] ) || ! $atts['is_template'] ) );
1082 + if ( ! isset( $atts['close'] ) || empty( $atts['close'] ) ) {
1565 1083 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1566 1084 }
1567 -
1568 1085 if ( ! isset( $atts['import_link'] ) ) {
1569 1086 $atts['import_link'] = false;
1570 1087 }
1571 1088
1572 - include self::plugin_path() . '/classes/views/shared/admin-header.php';
1089 + include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1573 1090 }
1574 1091
1575 1092 /**
1576 - * @since 6.0
1577 - *
1578 - * @param string $type
1579 - *
1580 - * @return void
1581 - */
1582 - public static function import_link( $type = 'secondary' ) {
1583 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1584 - ?>
1585 - <a href="<?php echo esc_url( admin_url( 'admin.php?page=formidable-import' ) ); ?>" class="button frm-button-<?php echo esc_attr( $type ); ?> frm_animate_bg">
1586 - <?php esc_html_e( 'Import', 'formidable' ); ?>
1587 - </a>
1588 - <?php
1589 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1590 - }
1591 -
1592 - /**
1593 1093 * Print applicable admin banner.
1594 1094 *
1595 1095 * @since 5.4.2
1596 1096 *
1597 1097 * @param bool $should_show_lite_upgrade
1598 - *
1599 1098 * @return void
1600 1099 */
1601 1100 public static function print_admin_banner( $should_show_lite_upgrade ) {
1602 1101 if ( ! current_user_can( 'administrator' ) ) {
@@ -1603,44 +1102,19 @@
1603 1102 FrmInbox::maybe_show_banner();
1604 1103 return;
1605 1104 }
1606 1105
1607 - if ( FrmSalesApi::maybe_show_banner() || self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1106 + if ( self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1608 1107 // Print license warning or inbox banner and exit if either prints.
1609 1108 // And exit before printing the upgrade bar if it shouldn't be shown.
1610 1109 return;
1611 1110 }
1612 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1613 1111 ?>
1614 1112 <div class="frm-upgrade-bar">
1615 - <div class="frm-upgrade-bar-inner">
1616 - <?php
1617 - $cta_text = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_text' );
1618 -
1619 - if ( ! $cta_text ) {
1620 - $cta_text = __( 'upgrading to PRO', 'formidable' );
1621 - }
1622 -
1623 - $upgrade_link = FrmSalesApi::get_best_sale_value( 'lite_banner_cta_link' );
1624 - $utm = array(
1625 - 'campaign' => 'settings-license',
1626 - 'content' => 'lite-banner',
1627 - );
1628 -
1629 - $upgrade_link = $upgrade_link ? self::maybe_add_missing_utm( $upgrade_link, $utm ) : self::admin_upgrade_link( $utm );
1630 -
1631 - printf(
1632 - /* translators: %1$s: Start link HTML, %2$s: CTA text ("upgrading to PRO" by default), %3$s: End link HTML */
1633 - esc_html__( 'You\'re using Formidable Forms Lite. To unlock more features consider %1$s%2$s%3$s.', 'formidable' ),
1634 - '<a href="' . esc_url( $upgrade_link ) . '">',
1635 - esc_html( $cta_text ),
1636 - '</a>'
1637 - );
1638 - ?>
1639 - </div>
1113 + <span>You're using Formidable Forms Lite. To unlock more features consider</span>
1114 + <a href="<?php echo esc_url( self::admin_upgrade_link( 'top-bar' ) ); ?>" target="_blank" rel="noopener">upgrading to Pro</a>.
1640 1115 </div>
1641 1116 <?php
1642 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1643 1117 }
1644 1118
1645 1119 /**
1646 1120 * @since 5.4.2
@@ -1654,18 +1128,14 @@
1654 1128 /**
1655 1129 * Render a button for a new item (Form, Application, etc).
1656 1130 *
1657 1131 * @since 3.0
1658 - *
1659 1132 * @param array $atts {
1660 - * Details about the button.
1661 - *
1662 1133 * @type array $link_hook Custom link hook, calls do_action and exits early.
1663 1134 * @type string $new_link Href value, default #.
1664 1135 * @type string $class Custom class names, space separated.
1665 1136 * @type string $button_text Button text. Default "Add New".
1666 1137 * }
1667 - *
1668 1138 * @return void
1669 1139 */
1670 1140 public static function add_new_item_link( $atts ) {
1671 1141 if ( isset( $atts['link_hook'] ) ) {
@@ -1672,16 +1142,20 @@
1672 1142 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1673 1143 return;
1674 1144 }
1675 1145
1676 - if ( empty( $atts['new_link'] ) && empty( $atts['create_form'] ) && empty( $atts['class'] ) ) {
1146 + if ( empty( $atts['new_link'] ) && empty( $atts['trigger_new_form_modal'] ) && empty( $atts['class'] ) ) {
1677 1147 // Do not render a button if none of these attributes are set.
1678 1148 return;
1679 1149 }
1680 1150
1681 1151 $href = ! empty( $atts['new_link'] ) ? esc_url( $atts['new_link'] ) : '#';
1682 - $class = 'button button-primary frm-button-primary';
1152 + $class = 'button button-primary frm-button-primary frm-with-plus';
1683 1153
1154 + if ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1155 + $class .= ' frm-trigger-new-form-modal';
1156 + }
1157 +
1684 1158 if ( ! empty( $atts['class'] ) ) {
1685 1159 $class .= ' ' . $atts['class'];
1686 1160 }
1687 1161
@@ -1691,12 +1165,8 @@
1691 1165 }
1692 1166
1693 1167 /**
1694 1168 * @since 3.06
1695 - *
1696 - * @param array $atts
1697 - *
1698 - * @return void
1699 1169 */
1700 1170 public static function show_search_box( $atts ) {
1701 1171 $defaults = array(
1702 1172 'placeholder' => '',
@@ -1702,12 +1172,10 @@
1702 1172 'placeholder' => '',
1703 1173 'tosearch' => '',
1704 1174 'text' => __( 'Search', 'formidable' ),
1705 1175 'input_id' => '',
1706 - 'value' => false,
1707 - 'class' => '',
1708 1176 );
1709 - $atts = array_merge( $defaults, $atts );
1177 + $atts = array_merge( $defaults, $atts );
1710 1178
1711 1179 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
1712 1180 $atts['tosearch'] = 'frm-card';
1713 1181 }
@@ -1712,9 +1180,8 @@
1712 1180 $atts['tosearch'] = 'frm-card';
1713 1181 }
1714 1182
1715 1183 $class = 'frm-search-input';
1716 -
1717 1184 if ( ! empty( $atts['tosearch'] ) ) {
1718 1185 $class .= ' frm-auto-search';
1719 1186 }
1720 1187
@@ -1719,35 +1186,21 @@
1719 1186 }
1720 1187
1721 1188 $input_id = $atts['input_id'] . '-search-input';
1722 1189
1723 - $input_atts = array(
1724 - 'type' => 'search',
1725 - 'id' => $input_id,
1726 - 'name' => 's',
1727 - 'placeholder' => $atts['placeholder'],
1728 - 'class' => $class,
1729 - 'data-tosearch' => $atts['tosearch'],
1730 - );
1731 -
1732 - if ( is_string( $atts['value'] ) ) {
1733 - $input_atts['value'] = $atts['value'];
1734 - } elseif ( isset( $_REQUEST['s'] ) ) {
1735 - // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
1736 - $input_atts['value'] = wp_unslash( $_REQUEST['s'] );
1737 - }
1738 -
1739 - if ( ! empty( $atts['tosearch'] ) ) {
1740 - $input_atts['autocomplete'] = 'off';
1741 - }
1742 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1743 1190 ?>
1744 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1191 + <p class="frm-search">
1745 1192 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1746 1193 <?php echo esc_html( $atts['text'] ); ?>:
1747 1194 </label>
1748 - <?php self::icon_by_class( 'frmfont frm_search_icon frm_svg20' ); ?>
1749 - <input <?php self::array_to_html_params( $input_atts, true ); ?> />
1195 + <span class="frmfont frm_search_icon"></span>
1196 + <input type="search" id="<?php echo esc_attr( $input_id ); ?>" name="s"
1197 + value="<?php _admin_search_query(); ?>" placeholder="<?php echo esc_attr( $atts['placeholder'] ); ?>"
1198 + class="<?php echo esc_attr( $class ); ?>" data-tosearch="<?php echo esc_attr( $atts['tosearch'] ); ?>"
1199 + <?php if ( ! empty( $atts['tosearch'] ) ) { ?>
1200 + autocomplete="off"
1201 + <?php } ?>
1202 + />
1750 1203 <?php
1751 1204 if ( empty( $atts['tosearch'] ) ) {
1752 1205 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
1753 1206 }
@@ -1753,21 +1206,16 @@
1753 1206 }
1754 1207 ?>
1755 1208 </p>
1756 1209 <?php
1757 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1758 1210 }
1759 1211
1760 1212 /**
1761 - * @param string $type Hook type slug.
1762 - * @param object|null $object Optional related object.
1763 - *
1764 - * @return void
1213 + * @param string $type
1765 1214 */
1766 1215 public static function trigger_hook_load( $type, $object = null ) {
1767 1216 // Only load the form hooks once.
1768 1217 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1769 -
1770 1218 if ( ! $hooks_loaded ) {
1771 1219 do_action( 'frm_load_' . $type . '_hooks' );
1772 1220 }
1773 1221 }
@@ -1772,14 +1220,11 @@
1772 1220 }
1773 1221 }
1774 1222
1775 1223 /**
1776 - * Save all front-end js scripts into a single file.
1777 - * And save an additional single file of all front-end Stripe JS scripts.
1224 + * Save all front-end js scripts into a single file
1778 1225 *
1779 1226 * @since 3.0
1780 - *
1781 - * @return void
1782 1227 */
1783 1228 public static function save_combined_js() {
1784 1229 $file_atts = apply_filters(
1785 1230 'frm_js_location',
@@ -1792,34 +1237,10 @@
1792 1237
1793 1238 $files = array(
1794 1239 self::plugin_path() . '/js/formidable.min.js',
1795 1240 );
1796 - /**
1797 - * @param array $files
1798 - */
1799 1241 $files = apply_filters( 'frm_combined_js_files', $files );
1800 1242 $new_file->combine_files( $files );
1801 -
1802 - // Create the minified Stripe Script.
1803 - $file_atts = apply_filters(
1804 - 'frm_stripe_js_location',
1805 - array(
1806 - 'file_name' => 'frmstrp.min.js',
1807 - 'new_file_path' => self::plugin_path() . '/js',
1808 - )
1809 - );
1810 - $new_file = new FrmCreateFile( $file_atts );
1811 - $files = array(
1812 - FrmStrpLiteAppHelper::plugin_path() . 'js/frmstrp.min.js',
1813 - );
1814 -
1815 - /**
1816 - * @since 6.5
1817 - *
1818 - * @param array $files
1819 - */
1820 - $files = apply_filters( 'frm_stripe_combined_js_files', $files );
1821 - $new_file->combine_files( $files );
1822 1243 }
1823 1244
1824 1245 /**
1825 1246 * Check a value from a shortcode to see if true or false.
@@ -1826,14 +1247,14 @@
1826 1247 * True when value is 1, true, 'true', 'yes'
1827 1248 *
1828 1249 * @since 1.07.10
1829 1250 *
1830 - * @param bool|int|string $value The value to compare.
1251 + * @param string $value The value to compare
1831 1252 *
1832 - * @return bool
1253 + * @return boolean True or False
1833 1254 */
1834 1255 public static function is_true( $value ) {
1835 - return true === $value || '1' === (string) $value || 'true' === $value || 'yes' === $value;
1256 + return ( true === $value || 1 == $value || 'true' == $value || 'yes' == $value );
1836 1257 }
1837 1258
1838 1259 /**
1839 1260 * Gets all post from a specific post type.
@@ -1841,9 +1262,8 @@
1841 1262 *
1842 1263 * @since 4.10.01 Add `$post_type` argument.
1843 1264 *
1844 1265 * @param string $post_type Post type to query. Default is `page`.
1845 - *
1846 1266 * @return WP_Post[]
1847 1267 */
1848 1268 public static function get_pages( $post_type = 'page' ) {
1849 1269 $query = array(
@@ -1862,9 +1282,8 @@
1862 1282 *
1863 1283 * @since 5.0.09
1864 1284 *
1865 1285 * @param string $post_type Post type to query. Default is `page`.
1866 - *
1867 1286 * @return array
1868 1287 */
1869 1288 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1870 1289 return FrmDb::get_results(
@@ -1889,12 +1308,13 @@
1889 1308 *
1890 1309 * @param array $args Selection arguments.
1891 1310 */
1892 1311 public static function maybe_autocomplete_pages_options( $args ) {
1893 - $args = self::preformat_selection_args( $args );
1312 + $args = self::preformat_selection_args( $args );
1313 +
1894 1314 $pages_count = wp_count_posts( $args['post_type'] );
1895 1315
1896 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1316 + if ( $pages_count->publish <= 50 ) {
1897 1317 self::wp_pages_dropdown( $args );
1898 1318 return;
1899 1319 }
1900 1320
@@ -1900,9 +1320,9 @@
1900 1320
1901 1321 wp_enqueue_script( 'jquery-ui-autocomplete' );
1902 1322
1903 1323 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1904 - $title = '';
1324 + $title = '';
1905 1325
1906 1326 if ( $selected ) {
1907 1327 $title = get_the_title( $selected );
1908 1328 }
@@ -1918,119 +1338,18 @@
1918 1338 <?php
1919 1339 }
1920 1340
1921 1341 /**
1922 - * Maybe show an HTML select or autocomplete input based on the number of options.
1923 - *
1924 - * @since 6.21
1925 - *
1926 - * @param array $args Args. See the method for details.
1342 + * @param array $args
1343 + * @param string $page_id Deprecated.
1344 + * @param boolean $truncate Deprecated.
1927 1345 */
1928 - public static function maybe_autocomplete_options( $args ) {
1929 - $defaults = array(
1930 - 'truncate' => false,
1931 - 'placeholder' => ' ',
1932 - 'name' => '',
1933 - 'id' => '',
1934 - 'selected' => '',
1935 - 'source' => array(),
1936 - 'dropdown_limit' => 50,
1937 - 'autocomplete_placeholder' => __( 'Select an option', 'formidable' ),
1938 - 'value_key' => 'value',
1939 - 'label_key' => 'label',
1940 - );
1941 -
1942 - $args = wp_parse_args( $args, $defaults );
1943 - $html_attrs = array();
1944 -
1945 - if ( ! empty( $args['name'] ) ) {
1946 - $html_attrs['name'] = $args['name'];
1947 - }
1948 -
1949 - if ( ! empty( $args['id'] ) ) {
1950 - $html_attrs['id'] = $args['id'];
1951 - }
1952 -
1953 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1954 - if ( count( $args['source'] ) <= $args['dropdown_limit'] ) {
1955 - ?>
1956 - <select <?php self::array_to_html_params( $html_attrs, true ); ?>>
1957 - <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
1958 - <?php
1959 - foreach ( $args['source'] as $key => $source ) :
1960 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1961 -
1962 - if ( ! empty( $args['truncate'] ) ) {
1963 - $value_label['label'] = self::truncate( $value_label['label'], $args['truncate'] );
1964 - }
1965 - ?>
1966 - <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 ?>
1967 - <?php endforeach; ?>
1968 - </select>
1969 - <?php
1970 - return;
1971 - }
1972 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1973 -
1974 - $options = array();
1975 - $autocomplete_value = '';
1976 -
1977 - foreach ( $args['source'] as $key => $source ) {
1978 - $value_label = self::get_dropdown_value_and_label_from_option( $source, $key, $args );
1979 -
1980 - if ( $value_label['value'] === $args['selected'] ) {
1981 - $autocomplete_value = $value_label['label'];
1982 - }
1983 -
1984 - $options[] = $value_label;
1985 - }
1986 -
1987 - $html_attrs['type'] = 'hidden';
1988 - $html_attrs['class'] = 'frm_autocomplete_value_input';
1989 - $html_attrs['value'] = $args['selected'];
1990 - ?>
1991 - <input type="text" class="frm-custom-search"
1992 - data-source="<?php echo esc_attr( wp_json_encode( $options ) ); ?>"
1993 - placeholder="<?php echo esc_attr( $args['autocomplete_placeholder'] ); ?>"
1994 - value="<?php echo esc_attr( $autocomplete_value ); ?>" />
1995 - <input <?php self::array_to_html_params( $html_attrs, true ); ?> />
1996 - <?php
1997 - }
1998 -
1999 - /**
2000 - * Gets dropdown value and label from autodropdown option.
2001 - *
2002 - * @since 6.21
2003 - *
2004 - * @param array|string $option Autocomplete option.
2005 - * @param string $key Array key of the option.
2006 - * @param array $args See {@see FrmAppHelper::maybe_autocomplete_options()}.
2007 - *
2008 - * @return array
2009 - */
2010 - private static function get_dropdown_value_and_label_from_option( $option, $key, $args ) {
2011 - if ( is_array( $option ) ) {
2012 - $value = $option[ $args['value_key'] ] ?? '';
2013 - $label = $option[ $args['label_key'] ] ?? '';
2014 - } else {
2015 - $value = $key;
2016 - $label = $option;
2017 - }
2018 -
2019 - return compact( 'value', 'label' );
2020 - }
2021 -
2022 - /**
2023 - * @param array $args
2024 - * @param string $page_id Deprecated.
2025 - * @param bool $truncate Deprecated.
2026 - */
2027 1346 public static function wp_pages_dropdown( $args = array(), $page_id = '', $truncate = false ) {
2028 1347 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2029 1348
2030 1349 $pages = self::get_post_ids_and_titles( $args['post_type'] );
2031 1350 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
2032 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1351 +
2033 1352 ?>
2034 1353 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2035 1354 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2036 1355 <?php foreach ( $pages as $page ) { ?>
@@ -2039,9 +1358,8 @@
2039 1358 </option>
2040 1359 <?php } ?>
2041 1360 </select>
2042 1361 <?php
2043 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2044 1362 }
2045 1363
2046 1364 /**
2047 1365 * Fill in missing parameters passed to wp_pages_dropdown().
@@ -2047,14 +1365,8 @@
2047 1365 * Fill in missing parameters passed to wp_pages_dropdown().
2048 1366 * This is for reverse compatibility with switching 3 params to 1.
2049 1367 *
2050 1368 * @since 4.03.06
2051 - *
2052 - * @param string $page_id Deprecated.
2053 - * @param bool $truncate Deprecated.
2054 - * @param mixed $args
2055 - *
2056 - * @return void
2057 1369 */
2058 1370 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2059 1371 if ( ! is_array( $args ) ) {
2060 1372 $args = array(
@@ -2071,20 +1383,16 @@
2071 1383 * Filter to format args for page dropdown or autocomplete
2072 1384 *
2073 1385 * @since 4.03.06
2074 1386 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2075 - *
2076 - * @param array $args
2077 - *
2078 - * @return array
2079 1387 */
2080 1388 private static function preformat_selection_args( $args ) {
2081 1389 $defaults = array(
2082 - 'truncate' => false,
2083 - 'placeholder' => ' ',
2084 - 'field_name' => '',
2085 - 'page_id' => '',
2086 - 'post_type' => 'page',
1390 + 'truncate' => false,
1391 + 'placeholder' => ' ',
1392 + 'field_name' => '',
1393 + 'page_id' => '',
1394 + 'post_type' => 'page',
2087 1395 'autocomplete_placeholder' => __( 'Select a Page', 'formidable' ),
2088 1396 );
2089 1397
2090 1398 return array_merge( $defaults, $args );
@@ -2089,18 +1397,14 @@
2089 1397
2090 1398 return array_merge( $defaults, $args );
2091 1399 }
2092 1400
2093 - /**
2094 - * @param int $post_id
2095 - *
2096 - * @return string
2097 - */
2098 1401 public static function post_edit_link( $post_id ) {
2099 1402 $post = get_post( $post_id );
2100 -
2101 1403 if ( $post ) {
2102 1404 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1405 + $post_url = self::maybe_full_screen_link( $post_url );
1406 +
2103 1407 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2104 1408 }
2105 1409
2106 1410 return '';
@@ -2113,75 +1417,45 @@
2113 1417 *
2114 1418 * @return bool
2115 1419 */
2116 1420 public static function is_full_screen() {
2117 - return self::is_form_builder_page() || self::is_style_editor_page() || self::is_full_screen_view_builder_page();
1421 + return self::is_form_builder_page() ||
1422 + self::is_admin_page( 'formidable-styles' ) ||
1423 + self::is_admin_page( 'formidable-styles2' ) ||
1424 + self::simple_get( 'frm-full', 'absint' ) ||
1425 + self::is_view_builder_page();
2118 1426 }
2119 1427
2120 1428 /**
2121 - * Check if user is on the style editor or its alternative URL.
2122 - * The first URL is a submenu "Styles" in the Formidable menu /wp-admin/admin.php?page=formidable-styles.
2123 - * The alternative URL is linked as a submenu "Forms" item of the Appearance menu /wp-admin/themes.php?page=formidable-styles2.
2124 - *
2125 - * @since 5.5.3
2126 - * @since 6.0 Added the $view parameter. Previously there was only a 'edit' view.
2127 - *
2128 - * @param string $view Supports 'edit', 'list', and ''. If '', both 'edit' and 'list' will match.
2129 - *
2130 - * @return bool
1429 + * @since 4.0
2131 1430 */
2132 - public static function is_style_editor_page( $view = '' ) {
2133 - if ( ! self::is_admin_page( 'formidable-styles' ) && ! self::is_admin_page( 'formidable-styles2' ) ) {
2134 - return false;
1431 + public static function maybe_full_screen_link( $link ) {
1432 + $is_full = self::simple_get( 'frm-full', 'absint' );
1433 + if ( $is_full && ! empty( $link ) && $link !== '#' ) {
1434 + $link .= '&frm-full=1';
2135 1435 }
2136 -
2137 - if ( ! in_array( $view, array( 'list', 'edit' ), true ) ) {
2138 - return true;
2139 - }
2140 -
2141 - $action = self::simple_get( 'frm_action' );
2142 - $is_edit_mode = 'edit' === $action || ( ! $action && ! self::simple_get( 'id' ) && ! self::simple_get( 'form' ) );
2143 -
2144 - if ( ! $is_edit_mode && class_exists( 'FrmProStylesController' ) && in_array( $action, array( 'new_style', 'duplicate' ), true ) ) {
2145 - $is_edit_mode = true;
2146 - }
2147 -
2148 - $checking_for_edit_mode = 'edit' === $view;
2149 -
2150 - return $is_edit_mode === $checking_for_edit_mode;
1436 + return $link;
2151 1437 }
2152 1438
2153 1439 /**
2154 - * @since 5.5.3
2155 - *
2156 - * @return bool
1440 + * @param string $field_name
1441 + * @param string|array $capability
1442 + * @param string $multiple 'single' and 'multiple'
2157 1443 */
2158 - private static function is_full_screen_view_builder_page() {
2159 - return self::is_admin_page( 'formidable-views-editor' );
2160 - }
2161 -
2162 - /**
2163 - * @param string $field_name
2164 - * @param array|string $capability
2165 - * @param string $multiple 'single' and 'multiple'.
2166 - */
2167 1444 public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
2168 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
2169 1445 ?>
2170 1446 <select name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $field_name ); ?>"
2171 - <?php echo 'multiple' === $multiple ? 'multiple="multiple"' : ''; ?>
1447 + <?php echo ( 'multiple' === $multiple ) ? 'multiple="multiple"' : ''; ?>
2172 1448 class="frm_multiselect">
2173 1449 <?php self::roles_options( $capability ); ?>
2174 1450 </select>
2175 1451 <?php
2176 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2177 1452 }
2178 1453
2179 1454 /**
2180 1455 * @since 4.07
2181 - *
2182 1456 * @param array|string $selected
2183 - * @param string $current
1457 + * @param string $current
2184 1458 */
2185 1459 private static function selected( $selected, $current ) {
2186 1460 if ( is_callable( 'FrmProAppHelper::selected' ) ) {
2187 1461 FrmProAppHelper::selected( $selected, $current );
@@ -2190,13 +1464,12 @@
2190 1464 }
2191 1465 }
2192 1466
2193 1467 /**
2194 - * @param array|string $capability
1468 + * @param string|array $capability
2195 1469 */
2196 1470 public static function roles_options( $capability ) {
2197 1471 global $frm_vars;
2198 -
2199 1472 if ( isset( $frm_vars['editable_roles'] ) ) {
2200 1473 $editable_roles = $frm_vars['editable_roles'];
2201 1474 } else {
2202 1475 $editable_roles = get_editable_roles();
@@ -2205,9 +1478,9 @@
2205 1478
2206 1479 foreach ( $editable_roles as $role => $details ) {
2207 1480 $name = translate_user_role( $details['name'] );
2208 1481 ?>
2209 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
1482 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_attr( $name ); ?> </option>
2210 1483 <?php
2211 1484 unset( $role, $details );
2212 1485 }
2213 1486 }
@@ -2217,9 +1490,8 @@
2217 1490 *
2218 1491 * @since 5.0 Parameter `$type` supports `pro_only` value.
2219 1492 *
2220 1493 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2221 - *
2222 1494 * @return array
2223 1495 */
2224 1496 public static function frm_capabilities( $type = 'auto' ) {
2225 1497 if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
@@ -2229,8 +1501,9 @@
2229 1501 $pro_cap = array(
2230 1502 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
2231 1503 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
2232 1504 'frm_view_reports' => __( 'View Reports', 'formidable' ),
1505 + 'frm_edit_displays' => __( 'Add/Edit Views', 'formidable' ),
2233 1506 );
2234 1507 /**
2235 1508 * @since 5.3.1
2236 1509 *
@@ -2253,9 +1526,9 @@
2253 1526 * @return array<string,string>
2254 1527 */
2255 1528 private static function get_lite_capabilities() {
2256 1529 return array(
2257 - 'frm_view_forms' => __( 'View Forms List', 'formidable' ),
1530 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
2258 1531 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
2259 1532 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
2260 1533 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
2261 1534 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
@@ -2284,18 +1557,21 @@
2284 1557 if ( $role === 'loggedin' || ! $role ) {
2285 1558 return is_user_logged_in();
2286 1559 }
2287 1560
2288 - if ( (int) $role === 1 ) {
1561 + if ( $role == 1 ) {
2289 1562 $role = 'administrator';
2290 1563 }
2291 1564
2292 - return is_user_logged_in() ? current_user_can( $role ) : false;
1565 + if ( ! is_user_logged_in() ) {
1566 + return false;
1567 + }
1568 +
1569 + return current_user_can( $role );
2293 1570 }
2294 1571
2295 1572 /**
2296 - * @param array|string $needed_role
2297 - *
1573 + * @param string|array $needed_role
2298 1574 * @return bool
2299 1575 */
2300 1576 public static function user_has_permission( $needed_role ) {
2301 1577 if ( is_array( $needed_role ) ) {
@@ -2309,20 +1585,18 @@
2309 1585 }
2310 1586
2311 1587 $can = self::current_user_can( $needed_role );
2312 1588
2313 - if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ), true ) ) {
1589 + if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ) ) ) {
2314 1590 return $can;
2315 1591 }
2316 1592
2317 1593 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2318 -
2319 1594 foreach ( $roles as $role ) {
2320 1595 if ( current_user_can( $role ) ) {
2321 1596 return true;
2322 1597 }
2323 -
2324 - if ( $role === $needed_role ) {
1598 + if ( $role == $needed_role ) {
2325 1599 break;
2326 1600 }
2327 1601 }
2328 1602
@@ -2340,11 +1614,11 @@
2340 1614 if ( ! current_user_can( 'administrator' ) || current_user_can( 'frm_view_forms' ) ) {
2341 1615 return;
2342 1616 }
2343 1617
2344 - $user = new WP_User( get_current_user_id() );
1618 + $user_id = get_current_user_id();
1619 + $user = new WP_User( $user_id );
2345 1620 $frm_roles = self::frm_capabilities();
2346 -
2347 1621 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2348 1622 $user->add_cap( $frm_role );
2349 1623 unset( $frm_role, $frm_role_description );
2350 1624 }
@@ -2353,47 +1627,35 @@
2353 1627 /**
2354 1628 * Make sure admins have permission to see the menu items
2355 1629 *
2356 1630 * @since 2.0.6
2357 - *
2358 - * @param string $cap
2359 - *
2360 - * @return void
2361 1631 */
2362 1632 public static function force_capability( $cap = 'frm_change_settings' ) {
2363 - if ( ! current_user_can( 'administrator' ) || current_user_can( $cap ) ) {
2364 - return;
1633 + if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
1634 + $role = get_role( 'administrator' );
1635 + $frm_roles = self::frm_capabilities();
1636 + foreach ( $frm_roles as $frm_role => $frm_role_description ) {
1637 + $role->add_cap( $frm_role );
1638 + }
2365 1639 }
2366 -
2367 - $role = get_role( 'administrator' );
2368 - $frm_roles = self::frm_capabilities();
2369 -
2370 - foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2371 - $role->add_cap( $frm_role );
2372 - }
2373 1640 }
2374 1641
2375 1642 /**
2376 - * Check if the user has permission for action.
1643 + * Check if the user has permision for action.
2377 1644 * Return permission message and stop the action if no permission
2378 1645 *
2379 1646 * @since 2.0
2380 1647 *
2381 1648 * @param string $permission
2382 - * @param string $show_message
2383 1649 */
2384 1650 public static function permission_check( $permission, $show_message = 'show' ) {
2385 1651 $permission_error = self::permission_nonce_error( $permission );
2386 -
2387 - if ( $permission_error === false ) {
2388 - return;
1652 + if ( $permission_error !== false ) {
1653 + if ( 'hide' == $show_message ) {
1654 + $permission_error = '';
1655 + }
1656 + wp_die( esc_html( $permission_error ) );
2389 1657 }
2390 -
2391 - if ( 'hide' === $show_message ) {
2392 - $permission_error = '';
2393 - }
2394 -
2395 - wp_die( esc_html( $permission_error ) );
2396 1658 }
2397 1659
2398 1660 /**
2399 1661 * Check user permission and nonce
@@ -2400,27 +1662,24 @@
2400 1662 *
2401 1663 * @since 2.0
2402 1664 *
2403 1665 * @param string $permission
2404 - * @param string $nonce_name
2405 - * @param string $nonce
2406 1666 *
2407 1667 * @return false|string The permission message or false if allowed
2408 1668 */
2409 1669 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
2410 - if ( $permission && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
1670 + if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2411 1671 $frm_settings = self::get_settings();
1672 +
2412 1673 return $frm_settings->admin_permission;
2413 1674 }
2414 1675
2415 1676 $error = false;
2416 -
2417 - if ( ! $nonce_name ) {
1677 + if ( empty( $nonce_name ) ) {
2418 1678 return $error;
2419 1679 }
2420 1680
2421 - $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2422 -
1681 + $nonce_value = ( $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2423 1682 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2424 1683 $frm_settings = self::get_settings();
2425 1684 $error = $frm_settings->admin_permission;
2426 1685 }
@@ -2427,14 +1686,8 @@
2427 1686
2428 1687 return $error;
2429 1688 }
2430 1689
2431 - /**
2432 - * @param array|string $values
2433 - * @param string $current
2434 - *
2435 - * @return void
2436 - */
2437 1690 public static function checked( $values, $current ) {
2438 1691 if ( self::check_selected( $values, $current ) ) {
2439 1692 echo ' checked="checked"';
2440 1693 }
@@ -2439,74 +1692,40 @@
2439 1692 echo ' checked="checked"';
2440 1693 }
2441 1694 }
2442 1695
2443 - /**
2444 - * @param array|string $values
2445 - * @param string|null $current
2446 - *
2447 - * @return bool
2448 - */
2449 1696 public static function check_selected( $values, $current ) {
2450 1697 $values = self::recursive_function_map( $values, 'trim' );
2451 1698 $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2452 - $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
1699 + $current = htmlspecialchars_decode( trim( $current ) );
2453 1700
2454 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict, Universal.Operators.StrictComparisons
2455 - return is_array( $values ) ? in_array( $current, $values ) : $values == $current;
1701 + return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2456 1702 }
2457 1703
2458 - /**
2459 - * @param array|string $value
2460 - * @param callable|string $function
2461 - *
2462 - * @return array|string
2463 - */
2464 1704 public static function recursive_function_map( $value, $function ) {
2465 1705 if ( is_array( $value ) ) {
2466 1706 $original_function = $function;
2467 - $function = count( $value ) ? explode( ', ', FrmDb::prepare_array_values( $value, $function ) ) : array( $function );
2468 -
2469 - if ( self::is_assoc( $value ) ) {
1707 + if ( count( $value ) ) {
1708 + $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
1709 + } else {
1710 + $function = array( $function );
1711 + }
1712 + if ( ! self::is_assoc( $value ) ) {
1713 + $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
1714 + } else {
2470 1715 foreach ( $value as $k => $v ) {
2471 1716 if ( ! is_array( $v ) ) {
2472 1717 $value[ $k ] = call_user_func( $original_function, $v );
2473 1718 }
2474 1719 }
2475 - } else {
2476 - $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2477 1720 }
2478 1721 } else {
2479 - $value = self::maybe_update_value_if_null( $value, $function );
2480 1722 $value = call_user_func( $function, $value );
2481 - }//end if
2482 -
2483 - return $value;
2484 - }
2485 -
2486 - /**
2487 - * Updates value to empty string if it is null and being passed to a string function.
2488 - *
2489 - * @since 6.8.4
2490 - *
2491 - * @param mixed $value
2492 - * @param string $function
2493 - *
2494 - * @return mixed
2495 - */
2496 - private static function maybe_update_value_if_null( $value, $function ) {
2497 - if ( null === $value && in_array( $function, array( 'trim', 'strlen' ), true ) ) {
2498 - return '';
2499 1723 }
2500 1724
2501 1725 return $value;
2502 1726 }
2503 1727
2504 - /**
2505 - * @param array $array
2506 - *
2507 - * @return bool
2508 - */
2509 1728 public static function is_assoc( $array ) {
2510 1729 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2511 1730 }
2512 1731
@@ -2511,24 +1730,20 @@
2511 1730 }
2512 1731
2513 1732 /**
2514 1733 * Flatten a multi-dimensional array
2515 - *
2516 - * @param array $array
2517 - * @param string $keys
2518 - *
2519 - * @return array
2520 1734 */
2521 1735 public static function array_flatten( $array, $keys = 'keep' ) {
2522 1736 $return = array();
2523 -
2524 1737 foreach ( $array as $key => $value ) {
2525 1738 if ( is_array( $value ) ) {
2526 1739 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2527 - } elseif ( $keys === 'keep' ) {
2528 - $return[ $key ] = $value;
2529 1740 } else {
2530 - $return[] = $value;
1741 + if ( $keys == 'keep' ) {
1742 + $return[ $key ] = $value;
1743 + } else {
1744 + $return[] = $value;
1745 + }
2531 1746 }
2532 1747 }
2533 1748
2534 1749 return $return;
@@ -2533,43 +1748,16 @@
2533 1748
2534 1749 return $return;
2535 1750 }
2536 1751
2537 - /**
2538 - * Flatten an array before imploding it to avoid Array to string conversion warnings.
2539 - *
2540 - * @since 6.16.1
2541 - *
2542 - * @param string $sep
2543 - * @param array $array
2544 - *
2545 - * @return string
2546 - */
2547 - public static function safe_implode( $sep, $array ) {
2548 - $array = self::array_flatten( $array );
2549 - return implode( $sep, $array );
2550 - }
2551 -
2552 - /**
2553 - * @param string $text
2554 - * @param bool $is_rich_text
2555 - *
2556 - * @return string
2557 - */
2558 1752 public static function esc_textarea( $text, $is_rich_text = false ) {
2559 1753 $safe_text = str_replace( '&quot;', '"', $text );
2560 -
2561 1754 if ( ! $is_rich_text ) {
2562 1755 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2563 1756 }
2564 -
2565 1757 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2566 1758
2567 - /**
2568 - * @param string $safe_text
2569 - * @param string $text
2570 - */
2571 - return (string) apply_filters( 'esc_textarea', $safe_text, $text );
1759 + return apply_filters( 'esc_textarea', $safe_text, $text );
2572 1760 }
2573 1761
2574 1762 /**
2575 1763 * Add auto paragraphs to text areas
@@ -2574,59 +1762,44 @@
2574 1762 /**
2575 1763 * Add auto paragraphs to text areas
2576 1764 *
2577 1765 * @since 2.0
2578 - *
2579 - * @param mixed $content
2580 - *
2581 - * @return mixed
2582 1766 */
2583 1767 public static function use_wpautop( $content ) {
2584 - if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
2585 - return wpautop( str_replace( '<br>', '<br />', $content ) );
1768 + if ( apply_filters( 'frm_use_wpautop', true ) && ! is_array( $content ) ) {
1769 + $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2586 1770 }
2587 1771
2588 1772 return $content;
2589 1773 }
2590 1774
2591 - /**
2592 - * Replace quotes with their HTML entities.
2593 - *
2594 - * @param string $val
2595 - *
2596 - * @return string
2597 - */
2598 1775 public static function replace_quotes( $val ) {
2599 1776 // Replace double quotes.
2600 1777 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2601 1778
2602 1779 // Replace single quotes.
2603 - return str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
1780 + $val = str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
1781 +
1782 + return $val;
2604 1783 }
2605 1784
2606 1785 /**
2607 - * @param string $handle
2608 - * @param int|string $default
2609 - *
2610 - * @return int|string
1786 + * @param string $handle
2611 1787 */
2612 1788 public static function script_version( $handle, $default = 0 ) {
2613 1789 global $wp_scripts;
2614 -
2615 1790 if ( ! $wp_scripts ) {
2616 1791 return $default;
2617 1792 }
2618 1793
2619 1794 $ver = $default;
2620 -
2621 1795 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2622 1796 return $ver;
2623 1797 }
2624 1798
2625 1799 $query = $wp_scripts->registered[ $handle ];
2626 -
2627 1800 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2628 - return $query->ver;
1801 + $ver = $query->ver;
2629 1802 }
2630 1803
2631 1804 return $ver;
2632 1805 }
@@ -2635,23 +1808,17 @@
2635 1808 * @since 5.0.13 added $echo param.
2636 1809 *
2637 1810 * @param string $url
2638 1811 * @param bool $echo
2639 - *
2640 - * @return string|null
1812 + * @return string|void
2641 1813 */
2642 1814 public static function js_redirect( $url, $echo = false ) {
2643 - $callback = function () use ( $url ) {
1815 + $callback = function() use ( $url ) {
2644 1816 echo '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
2645 1817 };
2646 1818 return self::clip( $callback, $echo );
2647 1819 }
2648 1820
2649 - /**
2650 - * @param int|string $user_id
2651 - *
2652 - * @return int|string
2653 - */
2654 1821 public static function get_user_id_param( $user_id ) {
2655 1822 if ( ! $user_id || is_numeric( $user_id ) ) {
2656 1823 return $user_id;
2657 1824 }
@@ -2656,13 +1823,16 @@
2656 1823 return $user_id;
2657 1824 }
2658 1825
2659 1826 $user_id = sanitize_text_field( $user_id );
2660 -
2661 - if ( $user_id === 'current' ) {
1827 + if ( $user_id == 'current' ) {
2662 1828 $user_id = get_current_user_id();
2663 1829 } else {
2664 - $user = is_email( $user_id ) ? get_user_by( 'email', $user_id ) : get_user_by( 'login', $user_id );
1830 + if ( is_email( $user_id ) ) {
1831 + $user = get_user_by( 'email', $user_id );
1832 + } else {
1833 + $user = get_user_by( 'login', $user_id );
1834 + }
2665 1835
2666 1836 if ( $user ) {
2667 1837 $user_id = $user->ID;
2668 1838 }
@@ -2671,14 +1841,8 @@
2671 1841
2672 1842 return $user_id;
2673 1843 }
2674 1844
2675 - /**
2676 - * @param string $filename
2677 - * @param array $atts
2678 - *
2679 - * @return false|string
2680 - */
2681 1845 public static function get_file_contents( $filename, $atts = array() ) {
2682 1846 if ( ! is_file( $filename ) ) {
2683 1847 return false;
2684 1848 }
@@ -2684,10 +1848,13 @@
2684 1848 }
2685 1849
2686 1850 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2687 1851 ob_start();
2688 - include $filename;
2689 - return ob_get_clean();
1852 + include( $filename );
1853 + $contents = ob_get_contents();
1854 + ob_end_clean();
1855 +
1856 + return $contents;
2690 1857 }
2691 1858
2692 1859 /**
2693 1860 * @param string $name
@@ -2697,9 +1864,8 @@
2697 1864 * @param int $num_chars
2698 1865 */
2699 1866 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2700 1867 $key = '';
2701 -
2702 1868 if ( $name ) {
2703 1869 $key = sanitize_key( $name );
2704 1870 $key = self::maybe_clear_long_key( $key, $column );
2705 1871 }
@@ -2719,31 +1885,31 @@
2719 1885 $column
2720 1886 );
2721 1887
2722 1888 // Create a unique field id if it has already been used.
2723 - if ( ! in_array( $key, $similar_keys, true ) ) {
2724 - return $key;
2725 - }
1889 + if ( in_array( $key, $similar_keys, true ) ) {
1890 + $key = self::maybe_truncate_key_before_appending( $column, $key );
2726 1891
2727 - $key = self::maybe_truncate_key_before_appending( $column, $key );
1892 + /**
1893 + * Allow for a custom separator between the attempted key and the generated suffix.
1894 + *
1895 + * @since 5.2.03
1896 + *
1897 + * @param string $separator. Default empty.
1898 + * @param string $key the key without the added suffix.
1899 + */
1900 + $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
2728 1901
2729 - /**
2730 - * Allow for a custom separator between the attempted key and the generated suffix.
2731 - *
2732 - * @since 5.2.03
2733 - *
2734 - * @param string $separator. Default empty.
2735 - * @param string $key the key without the added suffix.
2736 - */
2737 - $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
1902 + $suffix = 2;
1903 + do {
1904 + $key_check = $key . $separator . $suffix;
1905 + ++$suffix;
1906 + } while ( in_array( $key_check, $similar_keys, true ) );
2738 1907
2739 - $suffix = 2;
2740 - do {
2741 - $key_check = $key . $separator . $suffix;
2742 - ++$suffix;
2743 - } while ( in_array( $key_check, $similar_keys, true ) );
1908 + $key = $key_check;
1909 + }
2744 1910
2745 - return $key_check;
1911 + return $key;
2746 1912 }
2747 1913
2748 1914 /**
2749 1915 * Avoid trying to append to a really long key,
@@ -2750,26 +1916,20 @@
2750 1916 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2751 1917 *
2752 1918 * @param string $column
2753 1919 * @param string $key
2754 - *
2755 1920 * @return string
2756 1921 */
2757 1922 private static function maybe_truncate_key_before_appending( $column, $key ) {
2758 - if ( ! in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2759 - return $key;
2760 - }
2761 -
2762 - $max_key_length_before_truncating = 60;
2763 -
2764 - if ( strlen( $key ) > $max_key_length_before_truncating ) {
2765 - $key = substr( $key, 0, $max_key_length_before_truncating );
2766 -
2767 - if ( is_numeric( $key ) ) {
2768 - $key .= 'a';
1923 + if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
1924 + $max_key_length_before_truncating = 60;
1925 + if ( strlen( $key ) > $max_key_length_before_truncating ) {
1926 + $key = substr( $key, 0, $max_key_length_before_truncating );
1927 + if ( is_numeric( $key ) ) {
1928 + $key .= 'a';
1929 + }
2769 1930 }
2770 1931 }
2771 -
2772 1932 return $key;
2773 1933 }
2774 1934
2775 1935 /**
@@ -2776,36 +1936,29 @@
2776 1936 * Possibly reset a key to avoid conflicts with column size limits.
2777 1937 *
2778 1938 * @param string $key
2779 1939 * @param string $column
2780 - *
2781 1940 * @return string either the original key value, or an empty string if the key was too long.
2782 1941 */
2783 1942 private static function maybe_clear_long_key( $key, $column ) {
2784 1943 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
2785 - return '';
1944 + $key = '';
2786 1945 }
2787 1946 return $key;
2788 1947 }
2789 1948
2790 1949 /**
2791 - * @since 6.21 This is changed from `private` to `public`.
2792 - *
2793 1950 * @param int $num_chars
2794 - *
2795 1951 * @return string
2796 1952 */
2797 - public static function generate_new_key( $num_chars ) {
2798 - $max_slug_value = 36 ** $num_chars;
2799 -
2800 - // We want to have at least 2 characters in the slug.
2801 - $min_slug_value = 37;
2802 - return base_convert( random_int( $min_slug_value, $max_slug_value ), 10, 36 );
1953 + private static function generate_new_key( $num_chars ) {
1954 + $max_slug_value = pow( 36, $num_chars );
1955 + $min_slug_value = 37; // we want to have at least 2 characters in the slug
1956 + return base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2803 1957 }
2804 1958
2805 1959 /**
2806 1960 * @param string $key
2807 - *
2808 1961 * @return string
2809 1962 */
2810 1963 private static function prevent_numeric_and_reserved_keys( $key ) {
2811 1964 if ( is_numeric( $key ) ) {
@@ -2819,14 +1972,12 @@
2819 1972 'editlink',
2820 1973 'siteurl',
2821 1974 'evenodd',
2822 1975 );
2823 -
2824 1976 if ( in_array( $key, $not_allowed, true ) ) {
2825 1977 $key .= 'a';
2826 1978 }
2827 1979 }
2828 -
2829 1980 return $key;
2830 1981 }
2831 1982
2832 1983 /**
@@ -2831,16 +1982,11 @@
2831 1982
2832 1983 /**
2833 1984 * Editing a Form or Entry
2834 1985 *
2835 - * @param object $record
2836 - * @param string $table
2837 - * @param array|string $fields
2838 - * @param bool $default
2839 - * @param array $post_values
2840 - * @param array $args
1986 + * @param string $table
2841 1987 *
2842 - * @return array|bool
1988 + * @return bool|array
2843 1989 */
2844 1990 public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
2845 1991 if ( ! $record ) {
2846 1992 return false;
@@ -2845,9 +1991,9 @@
2845 1991 if ( ! $record ) {
2846 1992 return false;
2847 1993 }
2848 1994
2849 - if ( ! $post_values ) {
1995 + if ( empty( $post_values ) ) {
2850 1996 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
2851 1997 }
2852 1998
2853 1999 $values = array(
@@ -2855,9 +2001,9 @@
2855 2001 'fields' => array(),
2856 2002 );
2857 2003
2858 2004 foreach ( array( 'name', 'description' ) as $var ) {
2859 - $default_val = $record->{$var} ?? '';
2005 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2860 2006 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2861 2007 unset( $var, $default_val );
2862 2008 }
2863 2009
@@ -2875,67 +2021,48 @@
2875 2021
2876 2022 return $values;
2877 2023 }
2878 2024
2879 - /**
2880 - * @param array|string $fields
2881 - * @param object $record
2882 - * @param array $values
2883 - * @param array $args
2884 - *
2885 - * @return void
2886 - */
2887 2025 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2888 - if ( ! $fields ) {
2889 - return;
2890 - }
2891 -
2892 - foreach ( (array) $fields as $field ) {
2893 - if ( ! self::is_admin_page() ) {
2894 - // Don't prep default values on the form settings page.
2895 - $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2026 + if ( ! empty( $fields ) ) {
2027 + foreach ( (array) $fields as $field ) {
2028 + if ( ! self::is_admin_page() ) {
2029 + // Don't prep default values on the form settings page.
2030 + $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
2031 + }
2032 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
2033 + self::fill_field_defaults( $field, $record, $values, $args );
2896 2034 }
2897 -
2898 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2899 - self::fill_field_defaults( $field, $record, $values, $args );
2900 2035 }
2901 2036 }
2902 2037
2903 - /**
2904 - * @param object $field
2905 - * @param object $record
2906 - * @param array $values
2907 - * @param array $args
2908 - *
2909 - * @return void
2910 - */
2911 2038 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2912 2039 $post_values = $args['post_values'];
2913 2040
2914 2041 if ( $args['default'] ) {
2915 2042 $meta_value = $field->default_value;
2916 - } elseif ( $record->post_id && self::pro_is_installed() && ! empty( $field->field_options['post_field'] ) ) {
2917 - if ( ! isset( $field->field_options['custom_field'] ) ) {
2918 - $field->field_options['custom_field'] = '';
2043 + } else {
2044 + if ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
2045 + if ( ! isset( $field->field_options['custom_field'] ) ) {
2046 + $field->field_options['custom_field'] = '';
2047 + }
2048 + $meta_value = FrmProEntryMetaHelper::get_post_value(
2049 + $record->post_id,
2050 + $field->field_options['post_field'],
2051 + $field->field_options['custom_field'],
2052 + array(
2053 + 'truncate' => false,
2054 + 'type' => $field->type,
2055 + 'form_id' => $field->form_id,
2056 + 'field' => $field,
2057 + )
2058 + );
2059 + } else {
2060 + $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2919 2061 }
2062 + }
2920 2063
2921 - $meta_value = FrmProEntryMetaHelper::get_post_value(
2922 - $record->post_id,
2923 - $field->field_options['post_field'],
2924 - $field->field_options['custom_field'],
2925 - array(
2926 - 'truncate' => false,
2927 - 'type' => $field->type,
2928 - 'form_id' => $field->form_id,
2929 - 'field' => $field,
2930 - )
2931 - );
2932 - } else {
2933 - $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2934 - }//end if
2935 -
2936 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2937 -
2064 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2938 2065 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2939 2066 $new_value = $post_values['item_meta'][ $field->id ];
2940 2067 self::unserialize_or_decode( $new_value );
2941 2068 } else {
@@ -2950,9 +2077,9 @@
2950 2077 $args['field_type'] = $field_type;
2951 2078
2952 2079 FrmFieldsHelper::prepare_edit_front_field( $field_array, $field, $values['id'], $args );
2953 2080
2954 - if ( empty( $field_array['unique'] ) ) {
2081 + if ( ! isset( $field_array['unique'] ) || ! $field_array['unique'] ) {
2955 2082 $field_array['unique_msg'] = '';
2956 2083 }
2957 2084
2958 2085 $field_array = array_merge( (array) $field->field_options, $field_array );
@@ -2981,15 +2108,12 @@
2981 2108 );
2982 2109 }
2983 2110
2984 2111 /**
2985 - * @param object $record
2986 2112 * @param string $table
2987 - * @param array $post_values
2988 - * @param array $values
2989 2113 */
2990 2114 private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
2991 - if ( $table === 'entries' ) {
2115 + if ( $table == 'entries' ) {
2992 2116 $form = $record->form_id;
2993 2117 FrmForm::maybe_get_form( $form );
2994 2118 } else {
2995 2119 $form = $record;
@@ -3019,21 +2143,15 @@
3019 2143 }
3020 2144
3021 2145 /**
3022 2146 * Set to POST value or default
3023 - *
3024 - * @param array $post_values
3025 - * @param array $values
3026 - *
3027 - * @return void
3028 2147 */
3029 2148 private static function fill_form_defaults( $post_values, array &$values ) {
3030 2149 $form_defaults = FrmFormsHelper::get_default_opts();
3031 2150
3032 2151 foreach ( $form_defaults as $opt => $default ) {
3033 - // phpcs:ignore Universal.Operators.StrictComparisons
3034 2152 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3035 - $values[ $opt ] = $post_values['options'][ $opt ] ?? $default;
2153 + $values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
3036 2154 }
3037 2155
3038 2156 unset( $opt, $default );
3039 2157 }
@@ -3043,9 +2161,9 @@
3043 2161 }
3044 2162
3045 2163 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3046 2164 if ( ! isset( $values[ $h . '_html' ] ) ) {
3047 - $values[ $h . '_html' ] = $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h );
2165 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3048 2166 }
3049 2167 unset( $h );
3050 2168 }
3051 2169 }
@@ -3054,70 +2172,46 @@
3054 2172 * @since 2.2.10
3055 2173 *
3056 2174 * @param array $post_values
3057 2175 *
3058 - * @return bool|int
2176 + * @return boolean|int
3059 2177 */
3060 2178 public static function custom_style_value( $post_values ) {
3061 - if ( $post_values && isset( $post_values['options']['custom_style'] ) ) {
3062 - return absint( $post_values['options']['custom_style'] );
2179 + if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
2180 + $custom_style = absint( $post_values['options']['custom_style'] );
2181 + } else {
2182 + $frm_settings = self::get_settings();
2183 + $custom_style = ( $frm_settings->load_style != 'none' );
3063 2184 }
3064 2185
3065 - $frm_settings = self::get_settings();
3066 - return $frm_settings->load_style !== 'none';
2186 + return $custom_style;
3067 2187 }
3068 2188
3069 - /**
3070 - * Truncate a string.
3071 - *
3072 - * Note: By default, this function will allow for a few additional characters more than $length.
3073 - * If a string has no spaces, it allows up to 50 additional characters. To force a true length limit,
3074 - * use $force_length_limit = true.
3075 - *
3076 - * @param mixed $original_string
3077 - * @param int|string $length
3078 - * @param int $minword
3079 - * @param string $continue
3080 - * @param bool $force_length_limit Force the final string to never exceed the length limit.
3081 - *
3082 - * @return string
3083 - */
3084 - public static function truncate( $original_string, $length, $minword = 3, $continue = '...', $force_length_limit = false ) {
3085 - if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
2189 + public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
2190 + if ( is_array( $str ) ) {
3086 2191 return '';
3087 2192 }
3088 2193
3089 - $length = (int) $length;
2194 + $length = (int) $length;
2195 + $str = wp_strip_all_tags( $str );
2196 + $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3090 2197
3091 - if ( $length === 0 ) {
2198 + if ( $length == 0 ) {
3092 2199 return '';
3093 - }
3094 -
3095 - $str = wp_strip_all_tags( (string) $original_string );
3096 - $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3097 -
3098 - if ( $length <= 10 ) {
2200 + } elseif ( $length <= 10 ) {
3099 2201 $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3100 2202
3101 - if ( $force_length_limit ) {
3102 - return $sub;
3103 - }
2203 + return $sub . ( ( $length < $original_len ) ? $continue : '' );
2204 + }
3104 2205
3105 - return $sub . ( $length < $original_len ? $continue : '' );
3106 - }
2206 + $sub = '';
2207 + $len = 0;
3107 2208
3108 - $sub = '';
3109 - $len = 0;
3110 2209 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3111 2210
3112 - if ( ! is_array( $words ) ) {
3113 - return $original_string;
3114 - }
3115 -
3116 2211 foreach ( $words as $word ) {
3117 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2212 + $part = ( ( $sub != '' ) ? ' ' : '' ) . $word;
3118 2213 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3119 -
3120 2214 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3121 2215 break;
3122 2216 }
3123 2217
@@ -3130,72 +2224,14 @@
3130 2224
3131 2225 unset( $total_len, $word );
3132 2226 }
3133 2227
3134 - $sub = self::maybe_force_truncate_on_string_with_no_spaces( $sub, $length, $force_length_limit );
3135 -
3136 - if ( $force_length_limit ) {
3137 - // Ensure the final string doesn't exceed the length limit.
3138 - $final_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub ) );
3139 -
3140 - if ( $final_len > $length ) {
3141 - return self::mb_function( array( 'mb_substr', 'substr' ), array( $sub, 0, $length ) );
3142 - }
3143 -
3144 - return $sub;
3145 - }
3146 -
3147 - return $sub . ( $len < $original_len ? $continue : '' );
2228 + return $sub . ( ( $len < $original_len ) ? $continue : '' );
3148 2229 }
3149 2230
3150 - /**
3151 - * If the string is still too long because there may not have been any spaces, force truncate.
3152 - *
3153 - * @since 6.5.4
3154 - *
3155 - * @param string $sub Current substring.
3156 - * @param int $length The length limit.
3157 - * @param bool $force_length_limit Force the string to not exceed the length limit.
3158 - *
3159 - * @return string
3160 - */
3161 - private static function maybe_force_truncate_on_string_with_no_spaces( $sub, $length, $force_length_limit = false ) {
3162 - if ( ! $force_length_limit ) {
3163 - if ( strlen( $sub ) < $length + 50 ) {
3164 - // If the string isn't way over the limit, leave it.
3165 - return $sub;
3166 - }
3167 -
3168 - $first_space = strpos( $sub, ' ', $length );
3169 -
3170 - if ( false !== $first_space ) {
3171 - // Ignore anything with spaces.
3172 - return $sub;
3173 - }
3174 -
3175 - return substr( $sub, 0, $length + 10 );
3176 - }
3177 -
3178 - // When force_length_limit is true, ensure the string doesn't exceed the length.
3179 - $final_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub ) );
3180 -
3181 - if ( $final_len > $length ) {
3182 - return self::mb_function( array( 'mb_substr', 'substr' ), array( $sub, 0, $length ) );
3183 - }
3184 -
3185 - return $sub;
3186 - }
3187 -
3188 - /**
3189 - * @param array $function_names
3190 - * @param array $args
3191 - *
3192 - * @return mixed
3193 - */
3194 2231 public static function mb_function( $function_names, $args ) {
3195 2232 $mb_function_name = $function_names[0];
3196 2233 $function_name = $function_names[1];
3197 -
3198 2234 if ( function_exists( $mb_function_name ) ) {
3199 2235 $function_name = $mb_function_name;
3200 2236 }
3201 2237
@@ -3201,21 +2237,14 @@
3201 2237
3202 2238 return call_user_func_array( $function_name, $args );
3203 2239 }
3204 2240
3205 - /**
3206 - * @param string $date
3207 - * @param string $date_format
3208 - * @param string $time_format
3209 - *
3210 - * @return string
3211 - */
3212 2241 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3213 - if ( ! $date ) {
2242 + if ( empty( $date ) ) {
3214 2243 return $date;
3215 2244 }
3216 2245
3217 - if ( ! $date_format ) {
2246 + if ( empty( $date_format ) ) {
3218 2247 $date_format = get_option( 'date_format' );
3219 2248 }
3220 2249
3221 2250 if ( preg_match( '/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date ) && self::pro_is_installed() ) {
@@ -3223,10 +2252,10 @@
3223 2252 $date = FrmProAppHelper::convert_date( $date, $frmpro_settings->date_format, 'Y-m-d' );
3224 2253 }
3225 2254
3226 2255 $formatted = self::get_localized_date( $date_format, $date );
3227 - $do_time = gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00';
3228 2256
2257 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3229 2258 if ( $do_time ) {
3230 2259 $formatted .= self::add_time_to_date( $time_format, $date );
3231 2260 }
3232 2261
@@ -3232,52 +2261,45 @@
3232 2261
3233 2262 return $formatted;
3234 2263 }
3235 2264
3236 - /**
3237 - * @param string $time_format
3238 - * @param string $date
3239 - *
3240 - * @return string
3241 - */
3242 2265 private static function add_time_to_date( $time_format, $date ) {
3243 - if ( ! $time_format ) {
2266 + if ( empty( $time_format ) ) {
3244 2267 $time_format = get_option( 'time_format' );
3245 2268 }
3246 2269
3247 2270 $trimmed_format = trim( $time_format );
3248 -
3249 - if ( $time_format && $trimmed_format ) {
3250 - return ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
2271 + $time = '';
2272 + if ( $time_format && ! empty( $trimmed_format ) ) {
2273 + $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3251 2274 }
3252 2275
3253 - return '';
2276 + return $time;
3254 2277 }
3255 2278
3256 2279 /**
3257 2280 * @since 2.0.8
3258 - *
3259 - * @param string $date_format
3260 - * @param string $date
3261 - *
3262 - * @return string
3263 2281 */
3264 2282 public static function get_localized_date( $date_format, $date ) {
3265 2283 $date = get_date_from_gmt( $date );
2284 +
3266 2285 return date_i18n( $date_format, strtotime( $date ) );
3267 2286 }
3268 2287
3269 2288 /**
3270 - * Gets the time ago in words.
2289 + * Gets the time ago in words
3271 2290 *
3272 - * @param int $from In seconds.
3273 - * @param int|string $to In seconds.
3274 - * @param int|string $levels Number of time units to include or a specific unit.
2291 + * @param int $from in seconds
2292 + * @param int|string $to in seconds
3275 2293 *
3276 - * @return string Time ago.
2294 + * @return string $time_ago
3277 2295 */
3278 2296 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3279 - $now = ! $to && 0 !== $to ? new DateTime() : new DateTime( '@' . $to );
2297 + if ( empty( $to ) ) {
2298 + $now = new DateTime();
2299 + } else {
2300 + $now = new DateTime( '@' . $to );
2301 + }
3280 2302 $ago = new DateTime( '@' . $from );
3281 2303
3282 2304 // Get the time difference
3283 2305 $diff_object = $now->diff( $ago );
@@ -3283,9 +2305,9 @@
3283 2305 $diff_object = $now->diff( $ago );
3284 2306 $diff = get_object_vars( $diff_object );
3285 2307
3286 2308 // Add week amount and update day amount
3287 - $diff['w'] = floor( $diff['d'] / 7 );
2309 + $diff['w'] = floor( $diff['d'] / 7 );
3288 2310 $diff['d'] -= $diff['w'] * 7;
3289 2311
3290 2312 $time_strings = self::get_time_strings();
3291 2313
@@ -3291,11 +2313,10 @@
3291 2313
3292 2314 if ( ! is_numeric( $levels ) ) {
3293 2315 // Show time in specified unit.
3294 2316 $levels = self::get_unit( $levels );
3295 -
3296 2317 if ( isset( $time_strings[ $levels ] ) ) {
3297 - $diff = array(
2318 + $diff = array(
3298 2319 $levels => self::time_format( $levels, $diff ),
3299 2320 );
3300 2321 $time_strings = array(
3301 2322 $levels => $time_strings[ $levels ],
@@ -3300,14 +2321,13 @@
3300 2321 $time_strings = array(
3301 2322 $levels => $time_strings[ $levels ],
3302 2323 );
3303 2324 }
3304 -
3305 2325 $levels = 1;
3306 2326 }
3307 2327
3308 2328 foreach ( $time_strings as $k => $v ) {
3309 - if ( ! empty( $diff[ $k ] ) ) {
2329 + if ( isset( $diff[ $k ] ) && $diff[ $k ] ) {
3310 2330 $time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
3311 2331 } elseif ( isset( $diff[ $k ] ) && count( $time_strings ) === 1 ) {
3312 2332 // Account for 0.
3313 2333 $time_strings[ $k ] = $diff[ $k ] . ' ' . $v[1];
@@ -3315,21 +2335,17 @@
3315 2335 unset( $time_strings[ $k ] );
3316 2336 }
3317 2337 }
3318 2338
3319 - $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
3320 - $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2339 + $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
2340 + $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2341 + $time_ago_string = implode( ' ', $time_strings );
3321 2342
3322 - return implode( ' ', $time_strings );
2343 + return $time_ago_string;
3323 2344 }
3324 2345
3325 2346 /**
3326 2347 * @since 4.05.01
3327 - *
3328 - * @param string $unit
3329 - * @param array $diff
3330 - *
3331 - * @return int
3332 2348 */
3333 2349 private static function time_format( $unit, $diff ) {
3334 2350 $return = array(
3335 2351 'y' => 'y',
@@ -3334,14 +2350,14 @@
3334 2350 $return = array(
3335 2351 'y' => 'y',
3336 2352 'd' => 'days',
3337 2353 );
3338 -
3339 2354 if ( isset( $return[ $unit ] ) ) {
3340 2355 return $diff[ $return[ $unit ] ];
3341 2356 }
3342 2357
3343 2358 $total = $diff['days'] * self::convert_time( 'd', $unit );
2359 +
3344 2360 $times = array( 'h', 'i', 's' );
3345 2361
3346 2362 foreach ( $times as $time ) {
3347 2363 if ( ! isset( $diff[ $time ] ) ) {
@@ -3355,13 +2371,8 @@
3355 2371 }
3356 2372
3357 2373 /**
3358 2374 * @since 4.05.01
3359 - *
3360 - * @param string $from
3361 - * @param string $to
3362 - *
3363 - * @return int
3364 2375 */
3365 2376 private static function convert_time( $from, $to ) {
3366 2377 $convert = array(
3367 2378 's' => 1,
@@ -3377,35 +2388,28 @@
3377 2388 }
3378 2389
3379 2390 /**
3380 2391 * @since 4.05.01
3381 - *
3382 - * @param string $unit
3383 - *
3384 - * @return int|string
3385 2392 */
3386 2393 private static function get_unit( $unit ) {
3387 2394 $units = self::get_time_strings();
3388 -
3389 2395 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3390 2396 return $unit;
3391 2397 }
3392 2398
3393 2399 foreach ( $units as $u => $strings ) {
3394 - if ( in_array( $unit, $strings, true ) ) {
2400 + if ( in_array( $unit, $strings ) ) {
3395 2401 return $u;
3396 2402 }
3397 2403 }
3398 -
3399 2404 return 1;
3400 2405 }
3401 2406
3402 2407 /**
3403 2408 * Get the translatable time strings. The untranslated version is a failsafe
3404 - * in case languages are changing for the unit set in the shortcode.
2409 + * in case langauges are changing for the unit set in the shortcode.
3405 2410 *
3406 2411 * @since 2.0.20
3407 - *
3408 2412 * @return array
3409 2413 */
3410 2414 private static function get_time_strings() {
3411 2415 return array(
@@ -3449,48 +2453,35 @@
3449 2453
3450 2454 // Pagination Methods.
3451 2455
3452 2456 /**
3453 - * @param int $r_count
3454 - * @param int $current_p
3455 - * @param int $p_size
3456 - *
3457 - * @return int
2457 + * @param integer $current_p
3458 2458 */
3459 2459 public static function get_last_record_num( $r_count, $current_p, $p_size ) {
3460 - return $r_count < $current_p * $p_size ? $r_count : $current_p * $p_size;
2460 + return ( ( $r_count < ( $current_p * $p_size ) ) ? $r_count : ( $current_p * $p_size ) );
3461 2461 }
3462 2462
3463 2463 /**
3464 - * @param int $r_count
3465 - * @param int $current_p
3466 - * @param int $p_size
3467 - *
3468 - * @return int
2464 + * @param integer $current_p
3469 2465 */
3470 2466 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3471 - // phpcs:ignore Universal.Operators.StrictComparisons
3472 2467 if ( $current_p == 1 ) {
3473 2468 return 1;
2469 + } else {
2470 + return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
3474 2471 }
3475 - return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3476 2472 }
3477 2473
3478 2474 /**
3479 - * @param array $json_vars
3480 - *
3481 2475 * @return array
3482 2476 */
3483 2477 public static function json_to_array( $json_vars ) {
3484 2478 $vars = array();
3485 -
3486 2479 foreach ( $json_vars as $jv ) {
3487 2480 $jv_name = explode( '[', $jv['name'] );
3488 2481 $last = count( $jv_name ) - 1;
3489 -
3490 2482 foreach ( $jv_name as $p => $n ) {
3491 2483 $name = trim( $n, ']' );
3492 -
3493 2484 if ( ! isset( $l1 ) ) {
3494 2485 $l1 = $name;
3495 2486 }
3496 2487
@@ -3501,9 +2492,9 @@
3501 2492 if ( ! isset( $l3 ) ) {
3502 2493 $l3 = $name;
3503 2494 }
3504 2495
3505 - $this_val = $p === $last ? $jv['value'] : array();
2496 + $this_val = ( $p == $last ) ? $jv['value'] : array();
3506 2497
3507 2498 switch ( $p ) {
3508 2499 case 0:
3509 2500 $l1 = $name;
@@ -3525,12 +2516,12 @@
3525 2516 self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
3526 2517 }
3527 2518
3528 2519 unset( $this_val, $n );
3529 - }//end foreach
2520 + }
3530 2521
3531 2522 unset( $last, $jv );
3532 - }//end foreach
2523 + }
3533 2524
3534 2525 return $vars;
3535 2526 }
3536 2527
@@ -3536,15 +2527,10 @@
3536 2527
3537 2528 /**
3538 2529 * @param string $name
3539 2530 * @param string $l1
3540 - * @param mixed $val
3541 - * @param array $vars
3542 - *
3543 - * @return void
3544 2531 */
3545 2532 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3546 - // phpcs:ignore Universal.Operators.StrictComparisons
3547 2533 if ( $name == '' ) {
3548 2534 $vars[] = $val;
3549 2535 } elseif ( ! isset( $vars[ $l1 ] ) ) {
3550 2536 $vars[ $l1 ] = $val;
@@ -3550,26 +2536,18 @@
3550 2536 $vars[ $l1 ] = $val;
3551 2537 }
3552 2538 }
3553 2539
3554 - /**
3555 - * @param string $name
3556 - * @param string $class
3557 - * @param string $form_name
3558 - *
3559 - * @return void
3560 - */
3561 2540 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3562 2541 $tooltips = array(
3563 2542 'action_title' => __( 'Give this action a label for easy reference.', 'formidable' ),
3564 - '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
2543 + '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' ),
3565 2544 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3566 2545 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <name@email.com> or name@email.com.', 'formidable' ),
3567 - '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
2546 + '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' ),
3568 2547 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <john@example.com> or john@example.com.', 'formidable' ),
3569 2548 /* translators: %1$s: Form name, %2$s: Date */
3570 - '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
3571 - '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
2549 + '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() ) ),
3572 2550 );
3573 2551
3574 2552 if ( ! isset( $tooltips[ $name ] ) ) {
3575 2553 return;
@@ -3574,9 +2552,9 @@
3574 2552 if ( ! isset( $tooltips[ $name ] ) ) {
3575 2553 return;
3576 2554 }
3577 2555
3578 - if ( 'open' === $class ) {
2556 + if ( 'open' == $class ) {
3579 2557 echo ' frm_help"';
3580 2558 } else {
3581 2559 echo ' class="frm_help"';
3582 2560 }
@@ -3582,9 +2560,9 @@
3582 2560 }
3583 2561
3584 2562 echo ' title="' . esc_attr( $tooltips[ $name ] );
3585 2563
3586 - if ( 'open' !== $class ) {
2564 + if ( 'open' != $class ) {
3587 2565 echo '"';
3588 2566 }
3589 2567 }
3590 2568
@@ -3589,28 +2567,20 @@
3589 2567 }
3590 2568
3591 2569 /**
3592 2570 * Add the current_page class to that page in the form nav
3593 - *
3594 - * @param int|string $page
3595 - * @param int|string $current_page
3596 - * @param array $action
3597 - *
3598 - * @return void
3599 2571 */
3600 2572 public static function select_current_page( $page, $current_page, $action = array() ) {
3601 - // phpcs:ignore Universal.Operators.StrictComparisons
3602 2573 if ( $current_page != $page ) {
3603 2574 return;
3604 2575 }
3605 2576
3606 2577 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3607 -
3608 2578 if ( 'lite-reports' === $frm_action ) {
3609 2579 $frm_action = 'reports';
3610 2580 }
3611 2581
3612 - if ( ! $action || ( $frm_action && in_array( $frm_action, $action, true ) ) ) {
2582 + if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3613 2583 echo ' class="current_page"';
3614 2584 }
3615 2585 }
3616 2586
@@ -3640,19 +2610,14 @@
3640 2610
3641 2611 // Add extra slashes for \r\n since WP strips them.
3642 2612 $post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
3643 2613
3644 - // Allow for &quot
3645 - return str_replace( '&quot;', '\\"', $post_content );
2614 + // allow for &quot
2615 + $post_content = str_replace( '&quot;', '\\"', $post_content );
2616 +
2617 + return $post_content;
3646 2618 }
3647 2619
3648 - /**
3649 - * @param array|string $val
3650 - * @param int|string $key
3651 - * @param array $post_content
3652 - *
3653 - * @return void
3654 - */
3655 2620 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3656 2621 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3657 2622 return;
3658 2623 }
@@ -3661,28 +2626,22 @@
3661 2626 foreach ( $val as $k1 => $v1 ) {
3662 2627 self::prepare_action_slashes( $v1, $k1, $post_content[ $key ] );
3663 2628 unset( $k1, $v1 );
3664 2629 }
2630 + } else {
2631 + // Strip all slashes so everything is the same, no matter where the value is coming from
2632 + $val = stripslashes( $val );
3665 2633
3666 - return;
2634 + // Add backslashes before double quotes and forward slashes only
2635 + $post_content[ $key ] = addcslashes( $val, '"\\/' );
3667 2636 }
3668 -
3669 - // Strip all slashes so everything is the same, no matter where the value is coming from
3670 - $val = stripslashes( $val );
3671 -
3672 - // Add backslashes before double quotes and forward slashes only
3673 - $post_content[ $key ] = addcslashes( $val, '"\\/' );
3674 2637 }
3675 2638
3676 2639 /**
3677 - * Check for either json or serialized data. This is temporary while transitioning
2640 + * Check for either json or serilized data. This is temporary while transitioning
3678 2641 * all data to json.
3679 2642 *
3680 2643 * @since 4.02.03
3681 - *
3682 - * @param array|string $value
3683 - *
3684 - * @return void
3685 2644 */
3686 2645 public static function unserialize_or_decode( &$value ) {
3687 2646 if ( is_array( $value ) ) {
3688 2647 return;
@@ -3687,34 +2646,13 @@
3687 2646 if ( is_array( $value ) ) {
3688 2647 return;
3689 2648 }
3690 2649
3691 - $value = is_serialized( $value ) ? self::maybe_unserialize_array( $value ) : self::maybe_json_decode( $value, false );
3692 - }
3693 -
3694 - /**
3695 - * Safely unserialize an array if necessary.
3696 - * This function doesn't actually use unserialize. The string is parsed instead.
3697 - *
3698 - * @since 6.2
3699 - *
3700 - * @param mixed $value
3701 - *
3702 - * @return mixed
3703 - */
3704 - public static function maybe_unserialize_array( $value ) {
3705 - if ( ! is_string( $value ) ) {
3706 - return $value;
2650 + if ( is_serialized( $value ) ) {
2651 + $value = maybe_unserialize( $value );
2652 + } else {
2653 + $value = self::maybe_json_decode( $value, false );
3707 2654 }
3708 -
3709 - // Since we only expect an array, skip anything that doesn't start with a:.
3710 - if ( ! is_serialized( $value ) || ! str_starts_with( $value, 'a:' ) ) {
3711 - return $value;
3712 - }
3713 -
3714 - $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
3715 -
3716 - return is_array( $parsed ) ? $parsed : $value;
3717 2655 }
3718 2656
3719 2657 /**
3720 2658 * Decode a JSON string.
@@ -3719,12 +2657,11 @@
3719 2657 /**
3720 2658 * Decode a JSON string.
3721 2659 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3722 2660 *
3723 - * @param array|string|null $string
3724 - * @param bool $single_to_array
3725 - *
3726 - * @return array|string|null
2661 + * @param mixed $string
2662 + * @param bool $single_to_array
2663 + * @return mixed
3727 2664 */
3728 2665 public static function maybe_json_decode( $string, $single_to_array = true ) {
3729 2666 if ( is_array( $string ) || is_null( $string ) ) {
3730 2667 return $string;
@@ -3729,51 +2666,21 @@
3729 2666 if ( is_array( $string ) || is_null( $string ) ) {
3730 2667 return $string;
3731 2668 }
3732 2669
3733 - $new_string = json_decode( $string, true );
3734 - $single_value = false;
3735 -
3736 - if ( ! $single_to_array ) {
3737 - $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3738 - }
3739 -
3740 - if ( json_last_error() === JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3741 - return $new_string;
3742 - }
3743 -
3744 - return $string;
3745 - }
3746 -
3747 - /**
3748 - * @since 6.2.3
3749 - *
3750 - * @param string $value
3751 - *
3752 - * @return string
3753 - */
3754 - public static function maybe_utf8_encode( $value ) {
3755 - $from_format = 'ISO-8859-1';
3756 - $to_format = 'UTF-8';
3757 -
3758 - if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
3759 - if ( mb_check_encoding( $value, $from_format ) ) {
3760 - return mb_convert_encoding( $value, $to_format, $from_format );
2670 + $new_string = json_decode( $string, true );
2671 + if ( function_exists( 'json_last_error' ) ) {
2672 + // php 5.3+
2673 + $single_value = false;
2674 + if ( ! $single_to_array ) {
2675 + $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3761 2676 }
3762 -
3763 - return $value;
3764 - }
3765 -
3766 - if ( function_exists( 'iconv' ) ) {
3767 - $converted = iconv( $from_format, $to_format, $value );
3768 -
3769 - // Value is false if $value is not ISO-8859-1.
3770 - if ( false !== $converted ) {
3771 - return $converted;
2677 + if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
2678 + $string = $new_string;
3772 2679 }
3773 2680 }
3774 2681
3775 - return $value;
2682 + return $string;
3776 2683 }
3777 2684
3778 2685 /**
3779 2686 * Reformat the json serialized array in name => value array.
@@ -3778,12 +2685,8 @@
3778 2685 /**
3779 2686 * Reformat the json serialized array in name => value array.
3780 2687 *
3781 2688 * @since 4.02.03
3782 - *
3783 - * @param array $form
3784 - *
3785 - * @return void
3786 2689 */
3787 2690 public static function format_form_data( &$form ) {
3788 2691 $formatted = array();
3789 2692
@@ -3790,21 +2693,18 @@
3790 2693 foreach ( $form as $input ) {
3791 2694 if ( ! isset( $input['name'] ) ) {
3792 2695 continue;
3793 2696 }
3794 -
3795 2697 $key = $input['name'];
3796 -
3797 - if ( ! isset( $formatted[ $key ] ) ) {
2698 + if ( isset( $formatted[ $key ] ) ) {
2699 + if ( is_array( $formatted[ $key ] ) ) {
2700 + $formatted[ $key ][] = $input['value'];
2701 + } else {
2702 + $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
2703 + }
2704 + } else {
3798 2705 $formatted[ $key ] = $input['value'];
3799 - continue;
3800 2706 }
3801 -
3802 - if ( is_array( $formatted[ $key ] ) ) {
3803 - $formatted[ $key ][] = $input['value'];
3804 - } else {
3805 - $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
3806 - }
3807 2707 }
3808 2708
3809 2709 parse_str( http_build_query( $formatted ), $form );
3810 2710 }
@@ -3810,34 +2710,30 @@
3810 2710 }
3811 2711
3812 2712 /**
3813 2713 * @since 4.02.03
3814 - *
3815 - * @param array|string $value
3816 - *
3817 - * @return string
3818 2714 */
3819 2715 public static function maybe_json_encode( $value ) {
3820 - return is_array( $value ) ? wp_json_encode( $value ) : $value;
2716 + if ( is_array( $value ) ) {
2717 + $value = wp_json_encode( $value );
2718 + }
2719 + return $value;
3821 2720 }
3822 2721
3823 2722 /**
3824 - * Echo The javascript to open and highlight the Formidable menu
3825 - *
3826 2723 * @since 1.07.10
3827 2724 *
3828 - * @param string $post_type The name of the post type that may need to be highlighted.
3829 - *
3830 - * @return void
2725 + * @param string $post_type The name of the post type that may need to be highlighted
2726 + * echo The javascript to open and highlight the Formidable menu
3831 2727 */
3832 2728 public static function maybe_highlight_menu( $post_type ) {
3833 2729 global $post;
3834 2730
3835 - if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] !== $post_type ) {
2731 + if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] != $post_type ) {
3836 2732 return;
3837 2733 }
3838 2734
3839 - if ( is_object( $post ) && $post->post_type !== $post_type ) {
2735 + if ( is_object( $post ) && $post->post_type != $post_type ) {
3840 2736 return;
3841 2737 }
3842 2738
3843 2739 self::load_admin_wide_js();
@@ -3847,15 +2743,12 @@
3847 2743 /**
3848 2744 * Load the JS file on non-Formidable pages in the admin area
3849 2745 *
3850 2746 * @since 2.0
3851 - *
3852 - * @param bool $load
3853 - *
3854 - * @return void
3855 2747 */
3856 2748 public static function load_admin_wide_js( $load = true ) {
3857 - wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), self::plugin_version() );
2749 + $version = self::plugin_version();
2750 + wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
3858 2751
3859 2752 $global_strings = array(
3860 2753 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
3861 2754 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
@@ -3861,13 +2754,12 @@
3861 2754 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3862 2755 'url' => self::plugin_url(),
3863 2756 'app_url' => 'https://formidableforms.com/',
3864 2757 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
3865 - '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
2758 + 'canAccessApplicationDashboard' => current_user_can( is_callable( 'FrmProApplicationsHelper::get_required_templates_capability' ) ? FrmProApplicationsHelper::get_required_templates_capability() : 'frm_edit_forms' ),
3866 2759 'loading' => __( 'Loading&hellip;', 'formidable' ),
3867 2760 'nonce' => wp_create_nonce( 'frm_ajax' ),
3868 2761 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3869 - 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
3870 2762 );
3871 2763 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
3872 2764
3873 2765 if ( $load ) {
@@ -3876,10 +2768,8 @@
3876 2768 }
3877 2769
3878 2770 /**
3879 2771 * @since 2.0.9
3880 - *
3881 - * @return void
3882 2772 */
3883 2773 public static function load_font_style() {
3884 2774 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
3885 2775 }
@@ -3885,224 +2775,99 @@
3885 2775 }
3886 2776
3887 2777 /**
3888 2778 * @param string $location
3889 - *
3890 - * @return void
3891 2779 */
3892 2780 public static function localize_script( $location ) {
3893 - global $wp_scripts, $wp_version;
2781 + global $wp_scripts;
3894 2782
2783 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2784 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2785 +
3895 2786 $script_strings = array(
3896 - 'ajax_url' => esc_url_raw( self::get_ajax_url() ),
3897 - 'images_url' => self::plugin_url() . '/images',
3898 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
3899 - 'remove' => __( 'Remove', 'formidable' ),
3900 - 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
3901 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
3902 - 'id' => __( 'ID', 'formidable' ),
3903 - 'no_results' => __( 'No results match', 'formidable' ),
3904 - 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
3905 - 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
3906 - 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
3907 - 'focus_first_error' => self::should_focus_first_error(),
3908 - 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3909 - // We need to keep this setting for a few versions because Pro checks for this.
3910 - 'include_resend_email' => false,
2787 + 'ajax_url' => $ajax_url,
2788 + 'images_url' => self::plugin_url() . '/images',
2789 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2790 + 'remove' => __( 'Remove', 'formidable' ),
2791 + 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
2792 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2793 + 'id' => __( 'ID', 'formidable' ),
2794 + 'no_results' => __( 'No results match', 'formidable' ),
2795 + 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
2796 + 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
2797 + 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
2798 + 'focus_first_error' => self::should_focus_first_error(),
2799 + 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3911 2800 );
3912 2801
3913 2802 $data = $wp_scripts->get_data( 'formidable', 'data' );
3914 -
3915 - if ( ! $data ) {
2803 + if ( empty( $data ) ) {
3916 2804 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3917 2805 }
3918 2806
3919 - if ( $location === 'admin' ) {
2807 + if ( $location == 'admin' ) {
2808 + $frm_settings = self::get_settings();
3920 2809 $admin_script_strings = array(
3921 - 'desc' => __( '(Click to add description)', 'formidable' ),
3922 - 'blank' => __( '(Blank)', 'formidable' ),
3923 - 'no_label' => self::get_no_label_text(),
3924 - 'ok' => __( 'OK', 'formidable' ),
3925 - 'cancel' => __( 'Cancel', 'formidable' ),
3926 - 'default_label' => __( 'Default', 'formidable' ),
3927 - 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
3928 - 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
3929 - 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3930 - 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3931 - 'confirm' => __( 'Are you sure?', 'formidable' ),
3932 - 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3933 - '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
3934 - 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3935 - 'default_unique' => FrmFieldsHelper::default_unique_msg(),
3936 - 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3937 - 'enter_email' => __( 'Enter Email', 'formidable' ),
3938 - 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3939 - 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3940 - 'new_option' => __( 'New Option', 'formidable' ),
3941 - '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
3942 - 'enter_password' => __( 'Enter Password', 'formidable' ),
3943 - 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3944 - 'import_complete' => __( 'Import Complete', 'formidable' ),
3945 - 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
3946 - 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
3947 - 'private_label' => __( 'Private', 'formidable' ),
3948 - 'jquery_ui_url' => '',
3949 - 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
3950 - 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
3951 - 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
3952 - 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
3953 - 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
3954 - /* translators: %d is the number of allowed actions per form */
3955 - 'only_one_action' => sprintf( __( 'This form action is limited to %d per form.', 'formidable' ), 1 ),
3956 - 'edit_action_text' => __( 'Please edit the existing form action.', 'formidable' ),
3957 - 'only_one_payment_action' => __( 'This form already has a payment action, and is currently limited to a single payment action.', 'formidable' ),
3958 - 'only_one_stripe_action' => __( 'This form already has a payment action. Multiple Stripe actions are available when using the Stripe add-on, available for Formidable Business licenses and higher.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
3959 - 'unsafe_params' => FrmFormsHelper::reserved_words(),
2810 + 'desc' => __( '(Click to add description)', 'formidable' ),
2811 + 'blank' => __( '(Blank)', 'formidable' ),
2812 + 'no_label' => __( '(no label)', 'formidable' ),
2813 + 'saving' => esc_attr( __( 'Saving', 'formidable' ) ),
2814 + 'saved' => esc_attr( __( 'Saved', 'formidable' ) ),
2815 + 'ok' => __( 'OK', 'formidable' ),
2816 + 'cancel' => __( 'Cancel', 'formidable' ),
2817 + 'default_label' => __( 'Default', 'formidable' ),
2818 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
2819 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
2820 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
2821 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
2822 + 'caution' => __( 'Heads up', 'formidable' ),
2823 + 'confirm' => __( 'Are you sure?', 'formidable' ),
2824 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
2825 + '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' ),
2826 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
2827 + 'default_unique' => $frm_settings->unique_msg,
2828 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
2829 + 'enter_email' => __( 'Enter Email', 'formidable' ),
2830 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
2831 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
2832 + 'new_option' => __( 'New Option', 'formidable' ),
2833 + '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' ),
2834 + 'enter_password' => __( 'Enter Password', 'formidable' ),
2835 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
2836 + 'import_complete' => __( 'Import Complete', 'formidable' ),
2837 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
2838 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
2839 + 'private_label' => __( 'Private', 'formidable' ),
2840 + 'jquery_ui_url' => '',
2841 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
2842 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
2843 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
2844 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
2845 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
2846 + 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
2847 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3960 2848 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3961 - '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
2849 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3962 2850 /* 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. */
3963 - '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
3964 - 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3965 - 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3966 - 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3967 - 'install' => __( 'Install', 'formidable' ),
3968 - 'active' => __( 'Active', 'formidable' ),
3969 - 'installed' => __( 'Installed', 'formidable' ),
3970 - 'not_installed' => __( 'Not Installed', 'formidable' ),
3971 - 'select_a_field' => __( 'Select a Field', 'formidable' ),
3972 - 'no_items_found' => __( 'No items found.', 'formidable' ),
3973 - 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3974 -
3975 - // Deprecated in 6.0.
3976 - 'saving' => '',
3977 -
3978 - // Deprecated in 6.0.
3979 - 'saved' => '',
3980 -
3981 - // translators: %1$s: HTML open tag, %2$s: HTML end tag.
3982 - 'holdShiftMsg' => esc_html__( 'You can hold %1$sShift%2$s on your keyboard to select multiple fields', 'formidable' ),
3983 - 'noTitleText' => FrmFormsHelper::get_no_title_text(),
3984 -
3985 - // In older versions this event listener causes the section to immediately close again
3986 - // When the h3 element is clicked. It's only required in WP 6.7+.
3987 - 'requireAccordionTitleClickListener' => version_compare( $wp_version, '6.7', '>=' ),
2851 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
2852 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
2853 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
2854 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
2855 + 'install' => __( 'Install', 'formidable' ),
2856 + 'active' => __( 'Active', 'formidable' ),
2857 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
2858 + 'no_items_found' => __( 'No items found.', 'formidable' ),
3988 2859 );
3989 -
3990 - self::add_form_builder_modal_data( $admin_script_strings );
3991 -
3992 - /**
3993 - * @param array $admin_script_strings
3994 - */
3995 2860 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3996 2861
3997 2862 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3998 -
3999 - if ( ! $data ) {
2863 + if ( empty( $data ) ) {
4000 2864 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
4001 2865 }
4002 - }//end if
4003 - }
4004 -
4005 - /**
4006 - * @param array $admin_script_strings
4007 - *
4008 - * @return void
4009 - */
4010 - private static function add_form_builder_modal_data( &$admin_script_strings ) {
4011 - if ( ! self::is_form_builder_page() || self::pro_is_installed() ) {
4012 - return;
4013 2866 }
4014 -
4015 - $stripe_connected = FrmStrpLiteConnectHelper::at_least_one_mode_is_setup();
4016 - $square_connected = FrmSquareLiteConnectHelper::at_least_one_mode_is_setup();
4017 - $paypal_connected = FrmPayPalLiteConnectHelper::at_least_one_mode_is_setup();
4018 - $gateway_connected = $stripe_connected || $square_connected || $paypal_connected;
4019 - $payments_settings_url = FrmStrpLiteAppController::get_payments_settings_url();
4020 -
4021 - if ( ! $gateway_connected ) {
4022 - // This modal shows when user clicks on one of the pricing fields and no payment gateways configured.
4023 - $admin_script_strings['paymentsSettingsModal'] = array(
4024 - 'title' => __( 'Setup a Payment Gateway first', 'formidable' ),
4025 - 'msg' => __( 'To use the payment fields, please install and configure a payment gateway in your account settings.', 'formidable' ),
4026 - 'closeText' => __( 'Close', 'formidable' ),
4027 - 'actionUrl' => $payments_settings_url,
4028 - 'actionText' => __( 'Go to Payment Settings', 'formidable' ),
4029 - 'noCenter' => true,
4030 - );
4031 - }
4032 -
4033 - // This modal shows on load once after upgrading the plugin.
4034 - $show_pricing_fields_modal = get_option( 'frm_show_pricing_fields_modal' );
4035 -
4036 - if ( ! $show_pricing_fields_modal ) {
4037 - return;
4038 - }
4039 -
4040 - $admin_script_strings['pricingFieldsModal'] = array(
4041 - 'title' => esc_html__( 'Start Accepting Payments Today!', 'formidable' ),
4042 - 'img' => esc_url( self::plugin_url() . '/images/upsell/pricing-fields.png' ),
4043 - 'noCenter' => true,
4044 - );
4045 -
4046 - if ( $gateway_connected ) {
4047 - $gateway_texts = array();
4048 -
4049 - if ( $stripe_connected ) {
4050 - $gateway_texts['stripe'] = esc_html__( 'Stripe', 'formidable' );
4051 - }
4052 -
4053 - if ( $square_connected ) {
4054 - $gateway_texts['square'] = esc_html__( 'Square', 'formidable' );
4055 - }
4056 -
4057 - if ( $paypal_connected ) {
4058 - $gateway_texts['paypal'] = esc_html__( 'PayPal', 'formidable' );
4059 - }
4060 -
4061 - $admin_script_strings['pricingFieldsModal']['msg'] = sprintf(
4062 - // translators: %s: Stripe, Square, or PayPal.
4063 - esc_html__( 'You already have %s connected, so these have already been unlocked.', 'formidable' ),
4064 - esc_html( implode( ' ' . esc_html__( 'and', 'formidable' ) . ' ', $gateway_texts ) )
4065 - );
4066 - } else {
4067 - $admin_script_strings['pricingFieldsModal']['closeText'] = __( 'I\'ll do it later!', 'formidable' );
4068 - $admin_script_strings['pricingFieldsModal']['actionText'] = __( 'Setup Payments Now', 'formidable' );
4069 - $admin_script_strings['pricingFieldsModal']['actionUrl'] = $payments_settings_url;
4070 - // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
4071 - $admin_script_strings['pricingFieldsModal']['msg'] = __( 'We\'ve unlocked Product, Quantity, and Total fields for Lite users! You can now transform your forms into checkout pages. To start collecting revenue, simply connect your preferred payment gateway (Stripe, Square, or PayPal) in your settings.', 'formidable' );
4072 - }//end if
4073 -
4074 - delete_option( 'frm_show_pricing_fields_modal' );
4075 2867 }
4076 2868
4077 2869 /**
4078 - * Get the no label text.
4079 - *
4080 - * @since 6.25.1
4081 - *
4082 - * @return string
4083 - */
4084 - public static function get_no_label_text() {
4085 - return __( '(no label)', 'formidable' );
4086 - }
4087 -
4088 - /**
4089 - * @since 6.5
4090 - *
4091 - * @return string
4092 - */
4093 - public static function get_ajax_url() {
4094 - $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
4095 -
4096 - /**
4097 - * @since 2.0.13
4098 - *
4099 - * @param string $ajax_url
4100 - */
4101 - return apply_filters( 'frm_ajax_url', $ajax_url );
4102 - }
4103 -
4104 - /**
4105 2870 * Returns whether or not the first errored input should be auto-focused (default true).
4106 2871 *
4107 2872 * @since 5.2.05
4108 2873 *
@@ -4127,11 +2892,9 @@
4127 2892 * Echo the message on the plugins listing page
4128 2893 *
4129 2894 * @since 1.07.10
4130 2895 *
4131 - * @param float $min_version The version the add-on requires.
4132 - *
4133 - * @return void
2896 + * @param float $min_version The version the add-on requires
4134 2897 */
4135 2898 public static function min_version_notice( $min_version ) {
4136 2899 $frm_version = self::plugin_version();
4137 2900
@@ -4140,11 +2903,11 @@
4140 2903 return;
4141 2904 }
4142 2905
4143 2906 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
4144 - 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
4145 - esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
4146 - '</div></td></tr>';
2907 + 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">' .
2908 + esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
2909 + '</div></td></tr>';
4147 2910 }
4148 2911
4149 2912 /**
4150 2913 * If Pro is far outdated, show a message.
@@ -4150,10 +2913,8 @@
4150 2913 * If Pro is far outdated, show a message.
4151 2914 *
4152 2915 * @since 4.0.01
4153 2916 *
4154 - * @param string $min_version
4155 - *
4156 2917 * @return void
4157 2918 */
4158 2919 public static function min_pro_version_notice( $min_version ) {
4159 2920 if ( ! self::is_formidable_admin() ) {
@@ -4163,14 +2924,26 @@
4163 2924
4164 2925 self::php_version_notice();
4165 2926
4166 2927 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4167 -
4168 2928 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4169 2929 return;
4170 2930 }
4171 2931
4172 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
2932 + $pro_version = FrmProDb::$plug_version;
2933 + $expired = FrmAddonsController::is_license_expired();
2934 + ?>
2935 + <div class="error frm_previous_install">
2936 + <?php
2937 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
2938 + if ( empty( $expired ) ) {
2939 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
2940 + } else {
2941 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
2942 + }
2943 + ?>
2944 + </div>
2945 + <?php
4173 2946 }
4174 2947
4175 2948 /**
4176 2949 * If Pro is installed, check the version number.
@@ -4175,12 +2948,8 @@
4175 2948 /**
4176 2949 * If Pro is installed, check the version number.
4177 2950 *
4178 2951 * @since 4.0.01
4179 - *
4180 - * @param string $min_version
4181 - *
4182 - * @return bool
4183 2952 */
4184 2953 public static function meets_min_pro_version( $min_version ) {
4185 2954 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4186 2955 }
@@ -4185,35 +2954,35 @@
4185 2954 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4186 2955 }
4187 2956
4188 2957 /**
4189 - * Show a message if the PHP version is below the recommendations.
2958 + * Show a message if the browser or PHP version is below the recommendations.
4190 2959 *
4191 2960 * @since 4.0.02
4192 - *
4193 - * @return void
4194 2961 */
4195 2962 private static function php_version_notice() {
4196 2963 $message = array();
2964 + if ( version_compare( phpversion(), '5.6', '<' ) ) {
2965 + $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' );
2966 + }
4197 2967
4198 - if ( version_compare( phpversion(), '7.0', '<' ) ) {
4199 - $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
2968 + $browser = self::get_server_value( 'HTTP_USER_AGENT' );
2969 + $is_ie = strpos( $browser, 'MSIE' ) !== false;
2970 + if ( $is_ie ) {
2971 + $message[] = __( 'You are using an outdated browser that is not compatible with Formidable Forms. Please update to a more current browser (we recommend Chrome).', 'formidable' );
4200 2972 }
4201 2973
4202 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4203 2974 foreach ( $message as $m ) {
4204 2975 ?>
4205 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2976 + <div class="error frm_previous_install">
4206 2977 <?php echo esc_html( $m ); ?>
4207 2978 </div>
4208 2979 <?php
4209 2980 }
4210 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
4211 2981 }
4212 2982
4213 2983 /**
4214 2984 * @param string $type
4215 - *
4216 2985 * @return array<string,string>
4217 2986 */
4218 2987 public static function locales( $type = 'date' ) {
4219 2988 $locales = array(
@@ -4307,12 +3076,12 @@
4307 3076 'zu' => __( 'Zulu', 'formidable' ),
4308 3077 );
4309 3078
4310 3079 if ( $type === 'captcha' ) {
4311 - // Remove the languages unavailable for the captcha
3080 + // remove the languages unavailable for the captcha
4312 3081 $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
4313 3082 } else {
4314 - // Remove the languages unavailable for the datepicker
3083 + // remove the languages unavailable for the datepicker
4315 3084 $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419', 'mr', 'lo', 'kn', 'si', 'gu', 'bn', 'zu', 'ur', 'te', 'sw', 'am' );
4316 3085 }
4317 3086
4318 3087 $locales = array_diff_key( $locales, array_flip( $unset ) );
@@ -4323,27 +3092,32 @@
4323 3092 * @since 5.4.5 Added $args parameter with type.
4324 3093 *
4325 3094 * @param array<string,string> $locales
4326 3095 * @param array $args {
4327 - *
4328 3096 * @type string $type
4329 3097 * }
4330 3098 */
4331 - return apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3099 + $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3100 +
3101 + return $locales;
4332 3102 }
4333 3103
4334 3104 /**
4335 - * @return string
3105 + * Output HTML containing reference text for accessibility
3106 + *
3107 + * @deprecated 5.1
4336 3108 */
3109 + public static function multiselect_accessibility() {
3110 + _deprecated_function( __METHOD__, '5.1' );
3111 + }
3112 +
4337 3113 public static function get_menu_icon_class() {
4338 3114 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4339 3115 $settings = FrmProAppHelper::get_settings();
4340 -
4341 3116 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4342 3117 return $settings->menu_icon;
4343 3118 }
4344 3119 }
4345 -
4346 3120 return 'frmfont frm_logo_icon';
4347 3121 }
4348 3122
4349 3123 /**
@@ -4361,9 +3135,10 @@
4361 3135 * @type array $input_attrs Attributes of value input.
4362 3136 * }
4363 3137 */
4364 3138 public static function images_dropdown( $args ) {
4365 - $args = self::fill_default_images_dropdown_args( $args );
3139 + $args = self::fill_default_images_dropdown_args( $args );
3140 +
4366 3141 $input_attrs_str = self::get_images_dropdown_input_attrs( $args );
4367 3142 ob_start();
4368 3143 include self::plugin_path() . '/classes/views/shared/images-dropdown.php';
4369 3144 $output = ob_get_clean();
@@ -4384,9 +3159,8 @@
4384 3159 *
4385 3160 * @since 5.0.04
4386 3161 *
4387 3162 * @param array $args The arguments.
4388 - *
4389 3163 * @return array
4390 3164 */
4391 3165 private static function fill_default_images_dropdown_args( $args ) {
4392 3166 $defaults = array(
@@ -4399,8 +3173,14 @@
4399 3173
4400 3174 $new_args['options'] = (array) $new_args['options'];
4401 3175 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4402 3176
3177 + // Set the number of columns.
3178 + $new_args['col_class'] = ceil( 12 / count( $new_args['options'] ) );
3179 + if ( $new_args['col_class'] > 6 ) {
3180 + $new_args['col_class'] = ceil( $new_args['col_class'] / 2 );
3181 + }
3182 +
4403 3183 /**
4404 3184 * Allows modifying the arguments of images_dropdown() method.
4405 3185 *
4406 3186 * @since 5.0.04
@@ -4416,9 +3196,8 @@
4416 3196 *
4417 3197 * @since 5.0.04
4418 3198 *
4419 3199 * @param array $args The arguments.
4420 - *
4421 3200 * @return string
4422 3201 */
4423 3202 private static function get_images_dropdown_input_attrs( $args ) {
4424 3203 $input_attrs = $args['input_attrs'];
@@ -4425,9 +3204,8 @@
4425 3204 $input_attrs['type'] = 'radio';
4426 3205 $input_attrs['name'] = $args['name'];
4427 3206
4428 3207 $input_attrs_str = '';
4429 -
4430 3208 foreach ( $input_attrs as $key => $input_attr ) {
4431 3209 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4432 3210 }
4433 3211
@@ -4442,23 +3220,8 @@
4442 3220 return apply_filters( 'frm_images_dropdown_input_attrs', $input_attrs_str, $args );
4443 3221 }
4444 3222
4445 3223 /**
4446 - * @since 6.7.1
4447 - *
4448 - * @param array $option Option data.
4449 - * @param array $args The arguments of images_dropdown() method.
4450 - *
4451 - * @return array
4452 - */
4453 - public static function get_images_dropdown_atts( $option, $args ) {
4454 - $image = self::get_images_dropdown_option_image( $option, $args );
4455 - $classes = self::get_images_dropdown_option_classes( $option, $args );
4456 - $custom_attrs = self::get_images_dropdown_option_html_attrs( $option, $args );
4457 - return compact( 'image', 'classes', 'custom_attrs' );
4458 - }
4459 -
4460 - /**
4461 3224 * Gets the image of each option in images_dropdown() method.
4462 3225 *
4463 3226 * @since 5.0.04
4464 3227 *
@@ -4463,9 +3226,8 @@
4463 3226 * @since 5.0.04
4464 3227 *
4465 3228 * @param array $option Option data.
4466 3229 * @param array $args The arguments of images_dropdown() method.
4467 - *
4468 3230 * @return string
4469 3231 */
4470 3232 private static function get_images_dropdown_option_image( $option, $args ) {
4471 3233 $image = self::icon_by_class(
@@ -4470,9 +3232,9 @@
4470 3232 private static function get_images_dropdown_option_image( $option, $args ) {
4471 3233 $image = self::icon_by_class(
4472 3234 'frmfont ' . $option['svg'],
4473 3235 array(
4474 - 'echo' => false,
3236 + 'echo' => false,
4475 3237 )
4476 3238 );
4477 3239
4478 3240 $args['option'] = $option;
@@ -4494,9 +3256,8 @@
4494 3256 * @since 5.0.04
4495 3257 *
4496 3258 * @param array $option Option data.
4497 3259 * @param array $args The arguments of images_dropdown() method.
4498 - *
4499 3260 * @return string
4500 3261 */
4501 3262 private static function get_images_dropdown_option_classes( $option, $args ) {
4502 3263 $classes = '';
@@ -4524,19 +3285,17 @@
4524 3285 * @since 5.0.04
4525 3286 *
4526 3287 * @param array $option Option data.
4527 3288 * @param array $args The arguments of images_dropdown() method.
4528 - *
4529 3289 * @return string
4530 3290 */
4531 3291 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4532 3292 $html_attrs = '';
4533 -
4534 3293 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4535 3294 $html_attrs_arr = array();
4536 3295
4537 3296 foreach ( $option['custom_attrs'] as $key => $value ) {
4538 - if ( in_array( $key, array( 'type', 'class', 'data-value' ), true ) ) {
3297 + if ( in_array( $key, array( 'type', 'class', 'data-value' ) ) ) {
4539 3298 continue;
4540 3299 }
4541 3300
4542 3301 $html_attrs_arr[] = sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $value ) );
@@ -4594,13 +3353,14 @@
4594 3353 * @since 5.0.07
4595 3354 *
4596 3355 * @param array $values
4597 3356 * @param array $keys
4598 - *
4599 3357 * @return array
4600 3358 */
4601 3359 public static function maybe_filter_array( $values, $keys ) {
4602 - if ( self::allow_unfiltered_html() ) {
3360 + $allow_unfiltered_html = self::allow_unfiltered_html();
3361 +
3362 + if ( $allow_unfiltered_html ) {
4603 3363 return $values;
4604 3364 }
4605 3365
4606 3366 foreach ( $keys as $key ) {
@@ -4612,87 +3372,36 @@
4612 3372 return $values;
4613 3373 }
4614 3374
4615 3375 /**
4616 - * Some back end fields allow privileged users to add scripts.
3376 + * Some back end fields allow privleged users to add scripts.
4617 3377 * A site that uses the DISALLOW_UNFILTERED_HTML always remove scripts on echo.
4618 3378 *
4619 3379 * @since 5.0.13
4620 3380 *
4621 3381 * @param string $value
4622 - * @param array|string $allowed 'all' for everything included as defaults.
4623 - *
3382 + * @param array|string $allowed 'all' for everything included as defaults
4624 3383 * @return string
4625 3384 */
4626 3385 public static function maybe_kses( $value, $allowed = 'all' ) {
4627 3386 if ( self::should_never_allow_unfiltered_html() ) {
4628 - return self::kses( $value, $allowed );
3387 + $value = self::kses( $value, $allowed );
4629 3388 }
4630 3389 return $value;
4631 3390 }
4632 3391
4633 3392 /**
4634 - * Check if an option attribute used in an [input] shortcode is safe.
3393 + * @since 5.0.16
4635 3394 *
4636 - * @since 6.11.2
4637 - *
4638 - * @param string $key
4639 - * @param string $context Either 'display' or 'update'. On update, we want to allow a few keys that are never displayed.
4640 - *
4641 3395 * @return bool
4642 3396 */
4643 - public static function input_key_is_safe( $key, $context = 'display' ) {
4644 - if ( 'update' === $context && in_array( $key, array( 'opt', 'label' ), true ) ) {
4645 - $safe = true;
4646 - } elseif ( str_starts_with( $key, 'data-' ) ) {
4647 - // Allow all data attributes.
4648 - $safe = true;
4649 - } elseif ( str_starts_with( $key, 'aria-' ) ) {
4650 - // Allow all aria attributes.
4651 - $safe = true;
4652 - } else {
4653 - $safe_keys = array(
4654 - 'class',
4655 - 'required',
4656 - 'title',
4657 - 'placeholder',
4658 - 'value',
4659 - 'readonly',
4660 - 'disabled',
4661 - 'size',
4662 - 'maxlength',
4663 - 'min',
4664 - 'max',
4665 - 'pattern',
4666 - 'step',
4667 - 'autofocus',
4668 - 'width',
4669 - 'height',
4670 - 'autocomplete',
4671 - 'tabindex',
4672 - 'role',
4673 - 'style',
4674 - );
4675 - $safe = in_array( $key, $safe_keys, true );
4676 - }//end if
4677 -
4678 - /**
4679 - * Filter the $safe value so additional keys can be allowed or disallowed.
4680 - *
4681 - * @since 6.11.2
4682 - *
4683 - * @param bool $safe True if the key is considered safe.
4684 - * @param string $key
4685 - * @param string $context Either 'display' or 'update'.
4686 - */
4687 - return (bool) apply_filters( 'frm_input_key_is_safe', $safe, $key, $context );
3397 + public static function show_landing_pages() {
3398 + return self::show_new_feature( 'landing' );
4688 3399 }
4689 3400
4690 3401 /**
4691 3402 * @since 5.0.16
4692 3403 *
4693 - * @param string $medium
4694 - *
4695 3404 * @return array
4696 3405 */
4697 3406 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
4698 3407 $params = array(
@@ -4699,9 +3408,8 @@
4699 3408 'medium' => $medium,
4700 3409 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4701 3410 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4702 3411 'screenshot' => 'landing.png',
4703 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
4704 3412 );
4705 3413 return self::get_upgrade_data_params( 'landing', $params );
4706 3414 }
4707 3415
@@ -4707,10 +3415,20 @@
4707 3415
4708 3416 /**
4709 3417 * @since 5.0.17
4710 3418 *
4711 - * @param string $feature
3419 + * @param string $plugin
3420 + * @return string|false
3421 + */
3422 + private static function get_plan_required( $plugin ) {
3423 + $link = FrmAddonsController::install_link( $plugin );
3424 + return FrmFormsHelper::get_plan_required( $link );
3425 + }
3426 +
3427 + /**
3428 + * @since 5.0.17
4712 3429 *
3430 + * @param string
4713 3431 * @return bool
4714 3432 */
4715 3433 public static function show_new_feature( $feature ) {
4716 3434 $link = FrmAddonsController::install_link( $feature );
@@ -4717,21 +3435,16 @@
4717 3435 return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4718 3436 }
4719 3437
4720 3438 /**
4721 - * Enhances upgrade data parameters with installation link and plan requirement information.
4722 - *
4723 3439 * @since 5.0.17
4724 3440 *
4725 - * @param string $plugin The plugin slug to get installation data for.
4726 - * @param array $params Initial parameters for the upgrade data.
4727 - * @param bool $detailed Whether to include detailed information.
4728 - *
4729 - * @return array Modified parameters with installation data.
3441 + * @param string $plugin
3442 + * @param array $params
3443 + * @return array
4730 3444 */
4731 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
3445 + public static function get_upgrade_data_params( $plugin, $params ) {
4732 3446 $link = FrmAddonsController::install_link( $plugin );
4733 -
4734 3447 if ( ! $link ) {
4735 3448 return $params;
4736 3449 }
4737 3450
@@ -4737,20 +3450,15 @@
4737 3450
4738 3451 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4739 3452 $params['oneclick'] = json_encode( $link );
4740 3453 unset( $params['message'] );
4741 -
4742 3454 if ( ! isset( $params['medium'] ) ) {
4743 3455 $params['medium'] = $plugin;
4744 3456 }
4745 3457 } else {
4746 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
3458 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4747 3459 }
4748 3460
4749 - if ( $detailed ) {
4750 - $params['plugin-status'] = $link['status'] ?? '';
4751 - }
4752 -
4753 3461 return $params;
4754 3462 }
4755 3463
4756 3464 /**
@@ -4759,9 +3467,8 @@
4759 3467 *
4760 3468 * @since 5.0.17
4761 3469 *
4762 3470 * @param string $text
4763 - *
4764 3471 * @return bool
4765 3472 */
4766 3473 public static function ctype_xdigit( $text ) {
4767 3474 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4776,14 +3483,12 @@
4776 3483 * @since 5.2.01
4777 3484 */
4778 3485 public static function set_current_screen_and_hook_suffix() {
4779 3486 global $hook_suffix;
4780 -
4781 3487 if ( is_null( $hook_suffix ) ) {
4782 3488 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4783 3489 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4784 3490 }
4785 -
4786 3491 set_current_screen();
4787 3492 }
4788 3493
4789 3494 /**
@@ -4790,15 +3495,15 @@
4790 3495 * Shows pill text.
4791 3496 *
4792 3497 * @since 5.2.02
4793 3498 *
4794 - * @param string|null $text Text in the pill. Default is NEW.
3499 + * @param string $text Text in the pill. Default is NEW.
4795 3500 */
4796 3501 public static function show_pill_text( $text = null ) {
4797 3502 if ( null === $text ) {
4798 3503 $text = __( 'NEW', 'formidable' );
4799 3504 }
4800 - echo '<span class="frm-meta-tag frm-new-pill">' . esc_html( $text ) . '</span>';
3505 + echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
4801 3506 }
4802 3507
4803 3508 /**
4804 3509 * Count the number of decimals digits.
@@ -4805,10 +3510,9 @@
4805 3510 *
4806 3511 * @since 5.2.07
4807 3512 *
4808 3513 * @param mixed $num Number.
4809 - *
4810 - * @return false|int Returns `false` if the passed parameter is not number.
3514 + * @return int|false Returns `false` if the passed parameter is not number.
4811 3515 */
4812 3516 public static function count_decimals( $num ) {
4813 3517 if ( ! is_numeric( $num ) ) {
4814 3518 return false;
@@ -4815,9 +3519,8 @@
4815 3519 }
4816 3520
4817 3521 $num = (string) $num;
4818 3522 $parts = explode( '.', $num );
4819 -
4820 3523 if ( 1 === count( $parts ) ) {
4821 3524 return 0;
4822 3525 }
4823 3526
@@ -4840,9 +3543,9 @@
4840 3543 }
4841 3544
4842 3545 add_filter(
4843 3546 'option_gmt_offset',
4844 - function ( $offset ) {
3547 + function( $offset ) {
4845 3548 if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
4846 3549 // Leave a valid value alone.
4847 3550 return $offset;
4848 3551 }
@@ -4892,272 +3595,221 @@
4892 3595 return get_plugins();
4893 3596 }
4894 3597
4895 3598 /**
4896 - * Make sure that the file we're trying to load is in fact the expected file type, and that it's coming from our S3 bucket.
4897 - * This is to make sure that the URL can't be exploited for a SSRF attack.
4898 - *
4899 - * @since 5.5.5
4900 - *
4901 - * @param string $url
4902 - * @param string $expected_extension
4903 - *
4904 - * @return bool
3599 + * @since 4.08
3600 + * @deprecated 4.09.01
4905 3601 */
4906 - public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4907 - $file_is_in_expected_s3_bucket = str_starts_with( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
4908 -
4909 - if ( ! $file_is_in_expected_s3_bucket ) {
4910 - return false;
3602 + public static function expiring_message() {
3603 + _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3604 + if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3605 + FrmProAddonsController::expiring_message();
4911 3606 }
4912 -
4913 - $parsed = parse_url( $url );
4914 -
4915 - if ( ! is_array( $parsed ) ) {
4916 - // URL is malformed.
4917 - return false;
4918 - }
4919 -
4920 - $path = $parsed['path'];
4921 - $ext = pathinfo( $path, PATHINFO_EXTENSION );
4922 - // The URL isn't to an XML file.
4923 - return $expected_extension === $ext;
4924 3607 }
4925 3608
4926 3609 /**
4927 - * Display a dismissable warning message and save its dismissal state.
3610 + * Use the WP 4.7 wp_doing_ajax function
4928 3611 *
4929 - * @since 6.3
4930 - *
4931 - * @param string $message The warning message to display.
4932 - * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
4933 - *
4934 - * @return void
3612 + * @since 2.05.07
3613 + * @deprecated 4.04.04
4935 3614 */
4936 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4937 - if ( ! $message || ! $option ) {
4938 - return;
4939 - }
3615 + public static function wp_doing_ajax() {
3616 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3617 + return wp_doing_ajax();
3618 + }
4940 3619
4941 - $ajax_callback = function () use ( $option ) {
4942 - self::dismiss_warning_message( $option );
4943 - };
4944 -
4945 - // We're handling JS codes with `doJsonPost` and it adds 'frm_' to the beginning of the action.
4946 - // To prevent any issues, we add 'frm_' from the beginning of the action.
4947 - add_action( 'wp_ajax_frm_' . $option, $ajax_callback );
4948 -
4949 - add_filter(
4950 - 'frm_message_list',
4951 - function ( $show_messages ) use ( $message, $option ) {
4952 - if ( get_option( $option, false ) ) {
4953 - return $show_messages;
4954 - }
4955 -
4956 - $dismiss_icon = self::icon_by_class(
4957 - 'frmfont frm_close_icon',
4958 - array(
4959 - 'aria-label' => _x( 'Dismiss', 'warning message: close icon label', 'formidable' ),
4960 - 'echo' => false,
4961 - )
4962 - );
4963 -
4964 - $show_messages[] = $message;
4965 - $show_messages[] = '<span class="frm-warning-dismiss frmsvg" data-action="' . esc_attr( $option ) . '">' . $dismiss_icon . '</span>';
4966 -
4967 - return $show_messages;
4968 - }
4969 - );
3620 + /**
3621 + * @deprecated 4.0
3622 + */
3623 + public static function insert_opt_html( $args ) {
3624 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3625 + FrmFormsHelper::insert_opt_html( $args );
4970 3626 }
4971 3627
4972 3628 /**
4973 - * Dismiss a warning message and update the dismissal state.
3629 + * Used to filter shortcode in text widgets
4974 3630 *
4975 - * @since 6.3
4976 - *
4977 - * @param string $option The unique identifier for the dismissal state of the message.
4978 - *
4979 - * @return void
3631 + * @deprecated 2.5.4
3632 + * @codeCoverageIgnore
4980 3633 */
4981 - public static function dismiss_warning_message( $option = '' ) {
4982 - self::permission_check( 'frm_change_settings' );
4983 - check_ajax_referer( 'frm_ajax', 'nonce' );
3634 + public static function widget_text_filter_callback( $matches ) {
3635 + return FrmDeprecated::widget_text_filter_callback( $matches );
3636 + }
4984 3637
4985 - if ( $option ) {
4986 - update_option( $option, true, false );
4987 - }
4988 -
4989 - wp_send_json_success();
3638 + /**
3639 + * @deprecated 3.01
3640 + * @codeCoverageIgnore
3641 + */
3642 + public static function sanitize_array( &$values ) {
3643 + FrmDeprecated::sanitize_array( $values );
4990 3644 }
4991 3645
4992 3646 /**
4993 - * Lite license copy.
4994 - * Used in FrmDashboardController & FrmSettingsController
3647 + * @param array $settings
3648 + * @param string $group
4995 3649 *
4996 - * @since 6.8
4997 - *
4998 - * @return string
3650 + * @since 2.0.6
3651 + * @deprecated 2.05.06
3652 + * @codeCoverageIgnore
4999 3653 */
5000 - public static function copy_for_lite_license() {
5001 - $message = __( 'You\'re using Formidable Forms Lite - no license needed. Enjoy!', 'formidable' ) . ' 🙂';
5002 - return apply_filters( 'frm_license_type_text', $message );
3654 + public static function save_settings( $settings, $group ) {
3655 + return FrmDeprecated::save_settings( $settings, $group );
5003 3656 }
5004 3657
5005 3658 /**
5006 - * Removes scripts that are unnecessarily loaded across the pages!
5007 - *
5008 - * @since 6.9
5009 - *
5010 - * @return void
3659 + * @since 2.0.4
3660 + * @deprecated 2.05.06
3661 + * @codeCoverageIgnore
5011 3662 */
5012 - public static function dequeue_extra_global_scripts() {
5013 - wp_dequeue_script( 'frm-surveys-admin' );
5014 - wp_dequeue_script( 'frm-quizzes-form-action' );
3663 + public static function save_json_post( $settings ) {
3664 + return FrmDeprecated::save_json_post( $settings );
5015 3665 }
5016 3666
5017 3667 /**
5018 - * Shows tooltip icon.
3668 + * @since 2.0
3669 + * @deprecated 2.05.06
3670 + * @codeCoverageIgnore
5019 3671 *
5020 - * @since 6.12
3672 + * @param string $cache_key The unique name for this cache
3673 + * @param string $group The name of the cache group
3674 + * @param string $query If blank, don't run a db call
3675 + * @param string $type The wpdb function to use with this query
5021 3676 *
5022 - * @param string $tooltip_text Tooltip text.
5023 - * @param array $atts Tooltip wrapper HTML attributes.
5024 - *
5025 - * @return void
3677 + * @return mixed $results The cache or query results
5026 3678 */
5027 - public static function tooltip_icon( $tooltip_text, $atts = array() ) {
5028 - $atts['title'] = $tooltip_text;
3679 + public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
3680 + return FrmDeprecated::check_cache( $cache_key, $group, $query, $type, $time );
3681 + }
5029 3682
5030 - if ( isset( $atts['class'] ) ) {
5031 - $atts['class'] .= ' frm_help';
5032 - } else {
5033 - $atts['class'] = 'frm_help';
5034 - }
5035 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
5036 - ?>
5037 - <span <?php self::array_to_html_params( $atts, true ); ?>>
5038 - <?php self::icon_by_class( 'frmfont frm_tooltip_icon' ); ?>
5039 - </span>
5040 - <?php
5041 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
3683 + /**
3684 + * @deprecated 2.05.06
3685 + * @codeCoverageIgnore
3686 + */
3687 + public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
3688 + return FrmDeprecated::set_cache( $cache_key, $results, $group, $time );
5042 3689 }
5043 3690
5044 3691 /**
5045 - * Prints errors for settings in onboarding wizard or template settings.
5046 - *
5047 - * @since 6.15
5048 - *
5049 - * @param array $args Args.
5050 - *
5051 - * @return void
3692 + * @deprecated 2.05.06
3693 + * @codeCoverageIgnore
5052 3694 */
5053 - public static function print_setting_error( $args ) {
5054 - $args = wp_parse_args(
5055 - $args,
5056 - array(
5057 - 'id' => '',
5058 - 'errors' => array(),
5059 - 'class' => '',
5060 - )
5061 - );
3695 + public static function add_key_to_group_cache( $key, $group ) {
3696 + FrmDeprecated::add_key_to_group_cache( $key, $group );
3697 + }
5062 3698
5063 - $args['class'] .= ' frm-validation-error frm-mt-xs frm_hidden';
3699 + /**
3700 + * @deprecated 2.05.06
3701 + * @codeCoverageIgnore
3702 + */
3703 + public static function get_group_cached_keys( $group ) {
3704 + return FrmDeprecated::get_group_cached_keys( $group );
3705 + }
5064 3706
5065 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
5066 - ?>
5067 - <span id="<?php echo esc_attr( $args['id'] ); ?>" class="<?php echo esc_attr( $args['class'] ); ?>">
5068 - <?php
5069 - if ( is_array( $args['errors'] ) ) {
5070 - foreach ( $args['errors'] as $key => $msg ) {
5071 - ?>
5072 - <span frm-error="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $msg ); ?></span>
5073 - <?php
5074 - }
5075 - } else {
5076 - echo '<span>' . esc_html( $args['errors'] ) . '</span>';
5077 - }
5078 - ?>
5079 - </span>
5080 - <?php
5081 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
3707 + /**
3708 + * @since 2.0
3709 + * @deprecated 2.05.06
3710 + * @codeCoverageIgnore
3711 + * @return mixed The cached value or false
3712 + */
3713 + public static function check_cache_and_transient( $cache_key ) {
3714 + return FrmDeprecated::check_cache( $cache_key );
5082 3715 }
5083 3716
5084 3717 /**
5085 - * Check if GDPR is enabled.
3718 + * @since 2.0
3719 + * @deprecated 2.05.06
3720 + * @codeCoverageIgnore
5086 3721 *
5087 - * @since 6.19
3722 + * @param string $cache_key
3723 + */
3724 + public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
3725 + FrmDeprecated::delete_cache_and_transient( $cache_key, $group );
3726 + }
3727 +
3728 + /**
3729 + * @since 2.0
3730 + * @deprecated 2.05.06
3731 + * @codeCoverageIgnore
5088 3732 *
5089 - * @return bool
3733 + * @param string $group The name of the cache group
5090 3734 */
5091 - public static function is_gdpr_enabled() {
5092 - $frm_settings = self::get_settings();
5093 - return $frm_settings->enable_gdpr || $frm_settings->no_ips || $frm_settings->custom_header_ip || $frm_settings->no_gdpr_cookies;
3735 + public static function cache_delete_group( $group ) {
3736 + FrmDeprecated::cache_delete_group( $group );
5094 3737 }
5095 3738
5096 3739 /**
5097 - * Check if GDPR cookies are disabled.
3740 + * @since 1.07.10
3741 + * @deprecated 2.05.06
3742 + * @codeCoverageIgnore
5098 3743 *
5099 - * @since 6.19
3744 + * @param string $term The value to escape
5100 3745 *
5101 - * @return bool
3746 + * @return string The escaped value
5102 3747 */
5103 - public static function no_gdpr_cookies() {
5104 - $frm_settings = self::get_settings();
5105 - return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
3748 + public static function esc_like( $term ) {
3749 + return FrmDeprecated::esc_like( $term );
5106 3750 }
5107 3751
5108 3752 /**
5109 - * Check if a string is valid UTF-8.
3753 + * @param string $order_query
5110 3754 *
5111 - * @since 6.24
5112 - *
5113 - * @param string|null $string The string to check.
5114 - *
5115 - * @return bool
3755 + * @deprecated 2.05.06
3756 + * @codeCoverageIgnore
5116 3757 */
5117 - public static function is_valid_utf8( $string ) {
5118 - if ( is_null( $string ) ) {
5119 - // Return true so we do not attempt to change encoding on a null value.
5120 - return true;
5121 - }
3758 + public static function esc_order( $order_query ) {
3759 + return FrmDeprecated::esc_order( $order_query );
3760 + }
5122 3761
5123 - // wp_is_valid_utf8 is added in WP 6.9.
5124 - if ( function_exists( 'wp_is_valid_utf8' ) ) {
5125 - return wp_is_valid_utf8( $string );
5126 - }
5127 -
5128 - // As of WP 6.9, seems_utf8 is deprecated.
5129 - return function_exists( 'seems_utf8' ) ? seems_utf8( $string ) : false;
3762 + /**
3763 + * @deprecated 2.05.06
3764 + * @codeCoverageIgnore
3765 + */
3766 + public static function esc_order_by( &$order_by ) {
3767 + FrmDeprecated::esc_order_by( $order_by );
5130 3768 }
5131 3769
5132 3770 /**
5133 - * Get a documentation URL with UTM parameters and affiliate tracking.
3771 + * @param string $limit
5134 3772 *
5135 - * @since 6.26
5136 - *
5137 - * @param string $path The relative path to append to the base URL.
5138 - * @param string $campaign The campaign to use for UTM parameters.
5139 - * @param bool $add_kb_base Whether to prepend 'knowledgebase/' to the path. Default true.
5140 - *
5141 - * @return string The processed URL with UTM parameters and affiliate tracking.
3773 + * @deprecated 2.05.06
3774 + * @codeCoverageIgnore
5142 3775 */
5143 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5144 - $path = trim( $path, '/' );
3776 + public static function esc_limit( $limit ) {
3777 + return FrmDeprecated::esc_limit( $limit );
3778 + }
5145 3779
5146 - if ( $add_kb_base ) {
5147 - $path = 'knowledgebase/' . $path;
5148 - }
3780 + /**
3781 + * @since 2.0
3782 + * @deprecated 2.05.06
3783 + * @codeCoverageIgnore
3784 + */
3785 + public static function prepare_array_values( $array, $type = '%s' ) {
3786 + return FrmDeprecated::prepare_array_values( $array, $type );
3787 + }
5149 3788
5150 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
3789 + /**
3790 + * @deprecated 2.05.06
3791 + * @codeCoverageIgnore
3792 + */
3793 + public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
3794 + return FrmDeprecated::prepend_and_or_where( $starts_with, $where );
5151 3795 }
5152 3796
5153 3797 /**
5154 - * @since 5.0.16
5155 - * @deprecated 6.26
3798 + * @since 2.0
3799 + * @deprecated 5.0.13
5156 3800 *
5157 - * @return bool
3801 + * @return string The base Google APIS url for the current version of jQuery UI
5158 3802 */
5159 - public static function show_landing_pages() {
5160 - _deprecated_function( __METHOD__, '6.26' );
5161 - return true;
3803 + public static function jquery_ui_base_url() {
3804 + _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3805 + return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
3806 + }
3807 +
3808 + /**
3809 + * @since 4.07
3810 + * @deprecated x.x
3811 + */
3812 + public static function renewal_message() {
3813 + _deprecated_function( __METHOD__, 'x.x', 'FrmProAddonsController::renewal_message' );
5162 3814 }
5163 3815 }