PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.4.5
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.4.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 +779 -2033 6.29 → 5.4.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 = 104;
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.29';
19 + public static $plug_version = '5.4.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,42 +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 - $menu_icon = self::get_menu_icon_class();
314 - return str_contains( $menu_icon, 'frm_logo_icon' );
315 - }
316 -
317 - /**
318 156 * @since 3.05
319 - *
320 - * @param array $atts
321 - *
322 - * @return string
323 157 */
324 158 public static function svg_logo( $atts = array() ) {
325 159 $defaults = array(
326 160 'height' => 18,
@@ -329,31 +163,23 @@
329 163 'orange' => '#f05a24',
330 164 );
331 165 $atts = array_merge( $defaults, $atts );
332 166
333 - // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong
334 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'] ) . '">
335 168 <path fill="' . esc_attr( $atts['orange'] ) . '" d="M289.6 384h140v76h-140z"/>
336 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"/>
337 170 </svg>';
338 - // phpcs:enable SlevomatCodingStandard.Files.LineLength.LineTooLong
339 171 }
340 172
341 173 /**
342 174 * @since 4.0
343 - *
344 - * @param array $atts
345 - *
346 - * @return void
347 175 */
348 176 public static function show_logo( $atts = array() ) {
349 - self::kses_echo( self::svg_logo( $atts ), 'all' );
177 + echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
350 178 }
351 179
352 180 /**
353 181 * @since 4.03.02
354 - *
355 - * @return void
356 182 */
357 183 public static function show_header_logo() {
358 184 $icon = self::svg_logo(
359 185 array(
@@ -362,11 +188,10 @@
362 188 )
363 189 );
364 190
365 191 $new_icon = apply_filters( 'frm_icon', $icon, true );
366 -
367 192 if ( $new_icon !== $icon ) {
368 - if ( str_starts_with( $new_icon, '<svg' ) ) {
193 + if ( strpos( $new_icon, '<svg' ) === 0 ) {
369 194 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
370 195 } else {
371 196 // Show nothing if it isn't an SVG.
372 197 $icon = '<div style="height:39px"></div>';
@@ -371,43 +196,26 @@
371 196 // Show nothing if it isn't an SVG.
372 197 $icon = '<div style="height:39px"></div>';
373 198 }
374 199 }
375 - self::kses_echo( $icon, 'all' );
200 + echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
376 201 }
377 202
378 203 /**
379 204 * @since 2.02.04
380 - *
381 - * @return bool
382 205 */
383 206 public static function ips_saved() {
384 207 $frm_settings = self::get_settings();
208 +
385 209 return ! $frm_settings->no_ips;
386 210 }
387 211
388 - /**
389 - * @return bool
390 - */
391 212 public static function pro_is_installed() {
392 - return (bool) apply_filters( 'frm_pro_installed', false );
213 + return apply_filters( 'frm_pro_installed', false );
393 214 }
394 215
395 216 /**
396 - * Check if the Pro plugin is installed, whether authorized or not.
397 - *
398 - * @since 6.8.3
399 - *
400 - * @return bool
401 - */
402 - public static function pro_is_included() {
403 - return function_exists( 'load_formidable_pro' );
404 - }
405 -
406 - /**
407 217 * @since 4.06.02
408 - *
409 - * @return bool
410 218 */
411 219 public static function pro_is_connected() {
412 220 global $frm_vars;
413 221 return self::pro_is_installed() && $frm_vars['pro_is_authorized'];
@@ -414,100 +222,45 @@
414 222 }
415 223
416 224 /**
417 225 * @since 4.06
418 - * @since 6.16.2 Added $check_for_settings parameter
419 - *
420 - * @param bool $check_for_settings
421 - *
422 - * @return bool
423 226 */
424 - public static function is_form_builder_page( $check_for_settings = true ) {
425 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
426 - $check_actions = array( 'edit', 'duplicate' );
427 -
428 - if ( $check_for_settings ) {
429 - $check_actions[] = 'settings';
430 - }
431 -
432 - 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' );
433 230 }
434 231
435 - /**
436 - * @return bool
437 - */
438 232 public static function is_formidable_admin() {
439 - $page = self::simple_get( 'page', 'sanitize_title' );
440 -
441 - if ( ! $page ) {
442 - return self::is_view_builder_page();
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();
443 237 }
444 238
445 - return str_contains( $page, 'formidable' );
239 + return $is_formidable;
446 240 }
447 241
448 242 /**
449 - * Checks if is a list page.
450 - *
451 - * @since 6.19
452 - *
453 - * @param string $page The name of the page to check.
454 - *
455 - * @return bool
456 - */
457 - public static function is_admin_list_page( $page = 'formidable' ) {
458 - if ( 'formidable' === $page ) {
459 - return self::on_form_listing_page();
460 - }
461 -
462 - if ( ! self::is_admin_page( $page ) ) {
463 - return false;
464 - }
465 -
466 - if ( 'formidable-entries' === $page ) {
467 - $action = self::simple_get( 'frm_action' );
468 -
469 - if ( ! $action || in_array( $action, self::get_entries_listing_page_form_actions(), true ) ) {
470 - return true;
471 - }
472 - }
473 -
474 - // Check edit or settings page.
475 - return ! self::simple_get( 'frm_action' );
476 - }
477 -
478 - /**
479 - * @since 6.20
480 - *
481 - * @return array<string>
482 - */
483 - private static function get_entries_listing_page_form_actions() {
484 - return array( 'list', 'destroy' );
485 - }
486 -
487 - /**
488 243 * Check for certain page in Formidable settings
489 244 *
490 245 * @since 2.0
491 246 *
492 - * @param string $page The name of the page to check.
247 + * @param string $page The name of the page to check
493 248 *
494 - * @return bool
249 + * @return boolean
495 250 */
496 251 public static function is_admin_page( $page = 'formidable' ) {
497 252 global $pagenow;
498 253 $get_page = self::simple_get( 'page', 'sanitize_title' );
499 -
500 254 if ( $pagenow ) {
501 - // Allow this to be true during ajax load i.e. ajax form builder loading
502 - $is_page = ( $pagenow === 'admin.php' || $pagenow === 'admin-ajax.php' ) && $get_page === $page;
503 -
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;
504 257 if ( $is_page ) {
505 258 return true;
506 259 }
507 260 }
508 261
509 - return is_admin() && $get_page === $page;
262 + return is_admin() && $get_page == $page;
510 263 }
511 264
512 265 /**
513 266 * If the current page is for editing or creating a view.
@@ -513,23 +266,21 @@
513 266 * If the current page is for editing or creating a view.
514 267 * Returns false for the views listing page.
515 268 *
516 269 * @since 4.0
517 - *
518 - * @return bool
519 270 */
520 271 public static function is_view_builder_page() {
521 272 global $pagenow;
522 273
523 - 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' ) {
524 275 return false;
525 276 }
526 277
527 278 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
528 279
529 - if ( ! $post_type ) {
530 - $post_id = self::simple_get( 'post', 'absint' );
531 - $post = get_post( $post_id );
280 + if ( empty( $post_type ) ) {
281 + $post_id = self::simple_get( 'post', 'absint' );
282 + $post = get_post( $post_id );
532 283 $post_type = $post ? $post->post_type : '';
533 284 }
534 285
535 286 return $post_type === 'frm_display';
@@ -539,15 +290,17 @@
539 290 * Check for the form preview page
540 291 *
541 292 * @since 2.0
542 293 *
543 - * @return bool
294 + * @param None
295 + *
296 + * @return boolean
544 297 */
545 298 public static function is_preview_page() {
546 299 global $pagenow;
547 300 $action = self::simple_get( 'action', 'sanitize_title' );
548 301
549 - return $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
302 + return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
550 303 }
551 304
552 305 /**
553 306 * Check for ajax except the form preview page
@@ -553,17 +306,16 @@
553 306 * Check for ajax except the form preview page
554 307 *
555 308 * @since 2.0
556 309 *
557 - * @return bool
310 + * @param None
311 + *
312 + * @return boolean
558 313 */
559 314 public static function doing_ajax() {
560 315 return wp_doing_ajax() && ! self::is_preview_page();
561 316 }
562 317
563 - /**
564 - * @return string
565 - */
566 318 public static function js_suffix() {
567 319 return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
568 320 }
569 321
@@ -568,14 +320,13 @@
568 320 }
569 321
570 322 /**
571 323 * @since 2.0.8
572 - *
573 - * @return bool
574 324 */
575 325 public static function prevent_caching() {
576 326 global $frm_vars;
577 - return ! empty( $frm_vars['prevent_caching'] );
327 +
328 + return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
578 329 }
579 330
580 331 /**
581 332 * Check if on an admin page
@@ -581,19 +332,14 @@
581 332 * Check if on an admin page
582 333 *
583 334 * @since 2.0
584 335 *
585 - * @return bool
336 + * @param None
337 + *
338 + * @return boolean
586 339 */
587 340 public static function is_admin() {
588 - $is_admin = is_admin() && ! wp_doing_ajax();
589 -
590 - /**
591 - * @since 6.0
592 - *
593 - * @param bool $is_admin
594 - */
595 - return apply_filters( 'frm_is_admin', $is_admin );
341 + return is_admin() && ! wp_doing_ajax();
596 342 }
597 343
598 344 /**
599 345 * Check if value contains blank value or empty array
@@ -599,23 +345,17 @@
599 345 * Check if value contains blank value or empty array
600 346 *
601 347 * @since 2.0
602 348 *
603 - * @param mixed $value Value to check.
604 - * @param string $empty
349 + * @param mixed $value - value to check
350 + * @param string
605 351 *
606 - * @return bool
352 + * @return boolean
607 353 */
608 354 public static function is_empty_value( $value, $empty = '' ) {
609 - return $value === array() || $value === $empty;
355 + return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
610 356 }
611 357
612 - /**
613 - * @param mixed $value
614 - * @param string $empty
615 - *
616 - * @return bool
617 - */
618 358 public static function is_not_empty_value( $value, $empty = '' ) {
619 359 return ! self::is_empty_value( $value, $empty );
620 360 }
621 361
@@ -632,37 +372,26 @@
632 372 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
633 373 }
634 374
635 375 /**
636 - * Get the server OS
376 + * Check for the IP address in several places
377 + * Used by [ip] shortcode
637 378 *
638 - * @since 6.4.2
639 - *
640 - * @return string
641 - */
642 - public static function get_server_os() {
643 - if ( function_exists( 'php_uname' ) ) {
644 - return php_uname( 's' );
645 - }
646 -
647 - if ( ! defined( 'PHP_OS' ) ) {
648 - return '';
649 - }
650 -
651 - // match the same response for Windows server as php_uname('s')
652 - return in_array( PHP_OS, array( 'WIN32', 'WINNT', 'Windows_NT' ), true ) ? 'Windows NT' : PHP_OS;
653 - }
654 -
655 - /**
656 - * Check for the IP address in several places (when custom headers are enabled).
657 - * Used by [ip] shortcode.
658 - *
659 379 * @return string The IP address of the current user
660 380 */
661 381 public static function get_ip_address() {
662 - $ip_options = self::should_use_custom_header_ip() ? self::get_custom_header_keys_for_ip() : array( 'REMOTE_ADDR' );
663 - $ip = '';
664 -
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 = '';
665 394 foreach ( $ip_options as $key ) {
666 395 if ( ! isset( $_SERVER[ $key ] ) ) {
667 396 continue;
668 397 }
@@ -667,12 +396,10 @@
667 396 continue;
668 397 }
669 398
670 399 $key = self::get_server_value( $key );
671 -
672 400 foreach ( explode( ',', $key ) as $ip ) {
673 - // Just to be safe.
674 - $ip = trim( $ip );
401 + $ip = trim( $ip ); // just to be safe.
675 402
676 403 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
677 404 return sanitize_text_field( $ip );
678 405 }
@@ -681,70 +408,16 @@
681 408
682 409 return sanitize_text_field( $ip );
683 410 }
684 411
685 - /**
686 - * @since 6.1
687 - *
688 - * @return array
689 - */
690 - public static function get_custom_header_keys_for_ip() {
691 - return array(
692 - 'HTTP_CLIENT_IP',
693 - 'HTTP_CF_CONNECTING_IP',
694 - 'HTTP_X_FORWARDED_FOR',
695 - 'HTTP_X_FORWARDED',
696 - 'HTTP_X_CLUSTER_CLIENT_IP',
697 - 'HTTP_X_REAL_IP',
698 - 'HTTP_FORWARDED_FOR',
699 - 'HTTP_FORWARDED',
700 - 'REMOTE_ADDR',
701 - );
702 - }
703 -
704 - /**
705 - * Check if we should check every HTTP header or just $_SERVER['REMOTE_ADDR'].
706 - * The other HTTP headers can be spoofed so this isn't recommended.
707 - * But in some cases (like reverse proxies), the IP may be empty if you use $_SERVER['REMOTE_ADDR'].
708 - *
709 - * @since 6.1
710 - *
711 - * @return bool
712 - */
713 - private static function should_use_custom_header_ip() {
714 - $settings = self::get_settings();
715 - $should_use_custom_header_ip = ! $settings->no_ips && $settings->custom_header_ip;
716 -
717 - /**
718 - * Filter whether to check spoofable HTTP headers.
719 - * This uses the custom_header_ip setting, but it is hidden if the GDPR option is also on.
720 - * 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.
721 - *
722 - * @since 6.1
723 - *
724 - * @param bool $should_use_custom_header_ip
725 - */
726 - return apply_filters( 'frm_use_custom_header_ip', $should_use_custom_header_ip );
727 - }
728 -
729 - /**
730 - * @param string $param
731 - * @param mixed $default
732 - * @param string $src
733 - * @param callable|string $sanitize
734 - *
735 - * @return mixed
736 - */
737 412 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
738 - if ( str_contains( $param, '[' ) ) {
413 + if ( strpos( $param, '[' ) ) {
739 414 $params = explode( '[', $param );
740 415 $param = $params[0];
741 416 }
742 417
743 418 if ( $src === 'get' ) {
744 - // phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
745 - $value = isset( $_POST[ $param ] ) ? wp_unslash( $_POST[ $param ] ) : ( isset( $_GET[ $param ] ) ? wp_unslash( $_GET[ $param ] ) : $default );
746 -
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
747 420 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
748 421 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
749 422 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
750 423 }
@@ -759,41 +432,29 @@
759 432 )
760 433 );
761 434 }
762 435
763 - if ( ! isset( $params ) || ! is_array( $value ) || ! $value ) {
764 - return $value;
765 - }
436 + if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
437 + foreach ( $params as $k => $p ) {
438 + if ( ! $k || ! is_array( $value ) ) {
439 + continue;
440 + }
766 441
767 - foreach ( $params as $k => $p ) {
768 - if ( ! $k || ! is_array( $value ) ) {
769 - continue;
442 + $p = trim( $p, ']' );
443 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
770 444 }
771 -
772 - $p = trim( $p, ']' );
773 - $value = $value[ $p ] ?? $default;
774 445 }
775 446
776 447 return $value;
777 448 }
778 449
779 - /**
780 - * Get a value from $_POST data.
781 - *
782 - * @param string $param The key we are trying to access data from in $_POST.
783 - * @param mixed $default The default if nothing is being sent.
784 - * @param callable|string $sanitize Make sure to pass a sanitize method here. This function will NOT sanitize by default.
785 - * @param bool $serialized
786 - *
787 - * @return mixed
788 - */
789 450 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
790 451 return self::get_simple_request(
791 452 array(
792 - 'type' => 'post',
793 - 'param' => $param,
794 - 'default' => $default,
795 - 'sanitize' => $sanitize,
453 + 'type' => 'post',
454 + 'param' => $param,
455 + 'default' => $default,
456 + 'sanitize' => $sanitize,
796 457 'serialized' => $serialized,
797 458 )
798 459 );
799 460 }
@@ -804,9 +465,9 @@
804 465 * @param string $param
805 466 * @param string $sanitize
806 467 * @param string $default
807 468 *
808 - * @return array|int|string
469 + * @return string|array
809 470 */
810 471 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
811 472 return self::get_simple_request(
812 473 array(
@@ -824,38 +485,39 @@
824 485 * @since 2.0.6
825 486 *
826 487 * @param array $args
827 488 *
828 - * @return array|string
489 + * @return string|array
829 490 */
830 491 public static function get_simple_request( $args ) {
831 492 $defaults = array(
832 - 'param' => '',
833 - 'default' => '',
834 - 'type' => 'get',
835 - 'sanitize' => 'sanitize_text_field',
493 + 'param' => '',
494 + 'default' => '',
495 + 'type' => 'get',
496 + 'sanitize' => 'sanitize_text_field',
836 497 'serialized' => false,
837 498 );
838 499 $args = wp_parse_args( $args, $defaults );
839 - $value = $args['default'];
840 500
841 - if ( $args['type'] === 'get' ) {
501 + $value = $args['default'];
502 + if ( $args['type'] == 'get' ) {
842 503 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
843 504 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
844 505 $value = wp_unslash( $_GET[ $args['param'] ] );
845 506 }
846 - } elseif ( $args['type'] === 'post' ) {
507 + } elseif ( $args['type'] == 'post' ) {
847 508 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
848 509 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
849 510 $value = wp_unslash( $_POST[ $args['param'] ] );
850 -
851 511 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
852 512 self::unserialize_or_decode( $value );
853 513 }
854 514 }
855 - } elseif ( isset( $_REQUEST[ $args['param'] ] ) ) {
856 - // phpcs:ignore phpcs:ignore WordPress.Security.NonceVerification.Missing, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
857 - $value = wp_unslash( $_REQUEST[ $args['param'] ] );
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 + }
858 520 }
859 521
860 522 self::sanitize_value( $args['sanitize'], $value );
861 523
@@ -868,56 +530,34 @@
868 530 * @since 2.0.8
869 531 *
870 532 * @param string $value
871 533 *
872 - * @return string Value.
534 + * @return string $value
873 535 */
874 536 public static function preserve_backslashes( $value ) {
875 537 // If backslashes have already been added, don't add them again
876 - return str_contains( $value, '\\\\' ) ? $value : addslashes( $value );
538 + if ( strpos( $value, '\\\\' ) === false ) {
539 + $value = addslashes( $value );
540 + }
541 +
542 + return $value;
877 543 }
878 544
879 - /**
880 - * Sanitize a value in-place.
881 - * If $value is an array, the sanitize function will get called for each item.
882 - *
883 - * @param callable $sanitize
884 - * @param mixed $value
885 - *
886 - * @return void
887 - */
888 545 public static function sanitize_value( $sanitize, &$value ) {
889 - if ( ! $sanitize ) {
890 - return;
891 - }
892 -
893 - if ( is_object( $value ) ) {
894 - $value = '';
895 - return;
896 - }
897 -
898 - if ( is_array( $value ) ) {
899 - $temp_values = $value;
900 -
901 - foreach ( $temp_values as $k => $v ) {
902 - 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 );
903 554 }
904 -
905 - return;
906 555 }
907 -
908 - $value = call_user_func( $sanitize, $value );
909 556 }
910 557
911 - /**
912 - * @param array $sanitize_method
913 - * @param array $values
914 - *
915 - * @return void
916 - */
917 558 public static function sanitize_request( $sanitize_method, &$values ) {
918 559 $temp_values = $values;
919 -
920 560 foreach ( $temp_values as $k => $val ) {
921 561 if ( isset( $sanitize_method[ $k ] ) ) {
922 562 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
923 563 }
@@ -925,68 +565,23 @@
925 565 }
926 566
927 567 /**
928 568 * @since 4.0.04
929 - *
930 - * @param mixed $value
931 - *
932 - * @return void
933 569 */
934 570 public static function sanitize_with_html( &$value ) {
935 - if ( current_user_can( 'frm_edit_entries' ) || current_user_can( 'administrator' ) ) {
936 - // Only strip unsafe HTML like scripts for a privileged user submitting a form.
937 - self::sanitize_value( 'wp_kses_post', $value );
938 - } else {
939 - self::sanitize_value( self::class . '::strip_most_html', $value );
940 - }
571 + self::sanitize_value( 'wp_kses_post', $value );
941 572 self::decode_specialchars( $value );
942 573 }
943 574
944 575 /**
945 - * Allow only a small set of very basic HTML for unprivileged users.
946 - *
947 - * @since 6.7.1
948 - *
949 - * @param string $value
950 - */
951 - public static function strip_most_html( $value ) {
952 - if ( '' === $value ) {
953 - return $value;
954 - }
955 -
956 - $allowed_html = array(
957 - 'b' => array(),
958 - 'br' => array(),
959 - 'strong' => array(),
960 - 'p' => array(),
961 - 'i' => array(),
962 - 'ul' => array(),
963 - 'ol' => array(),
964 - 'li' => array(),
965 - );
966 -
967 - /**
968 - * @since 6.7.1
969 - *
970 - * @param array $allowed_html
971 - */
972 - $allowed_html = apply_filters( 'frm_allowed_form_input_html', $allowed_html );
973 -
974 - return wp_kses( $value, $allowed_html );
975 - }
976 -
977 - /**
978 576 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
979 577 * this MUST be done, else we'll be back to the '& entity' problem.
980 578 *
981 579 * @since 4.0.04
982 - *
983 - * @param mixed $value Value to decode, passed by reference.
984 580 */
985 581 public static function decode_specialchars( &$value ) {
986 582 if ( is_array( $value ) ) {
987 583 $temp_values = $value;
988 -
989 584 foreach ( $temp_values as $k => $v ) {
990 585 self::decode_specialchars( $value[ $k ] );
991 586 }
992 587 } else {
@@ -1000,13 +595,13 @@
1000 595 * Adapted from wp_specialchars_decode().
1001 596 *
1002 597 * @since 4.03.01
1003 598 *
1004 - * @param string $string The string to prep, passed by reference.
599 + * @param string $string The string to prep.
1005 600 */
1006 601 private static function decode_amp( &$string ) {
1007 602 // Don't bother if there are no entities - saves a lot of processing
1008 - if ( ! $string || ! str_contains( $string, '&' ) ) {
603 + if ( empty( $string ) || strpos( $string, '&' ) === false ) {
1009 604 return;
1010 605 }
1011 606
1012 607 $translation = array(
@@ -1012,12 +607,10 @@
1012 607 $translation = array(
1013 608 '&quot;' => '"',
1014 609 '&#034;' => '"',
1015 610 '&#x22;' => '"',
1016 - // The space preserves the HTML.
1017 - '&lt; ' => '< ',
1018 - // The space preserves the HTML.
1019 - '&#060; ' => '< ',
611 + '&lt; ' => '< ', // The space preserves the HTML.
612 + '&#060; ' => '< ', // The space preserves the HTML.
1020 613 '&gt;' => '>',
1021 614 '&#062;' => '>',
1022 615 '&amp;' => '&',
1023 616 '&#038;' => '&',
@@ -1044,53 +637,38 @@
1044 637 * Sanitize the value, and allow some HTML
1045 638 *
1046 639 * @since 2.0
1047 640 *
1048 - * @param string $value The value to sanitize.
1049 - * @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
1050 643 *
1051 644 * @return string
1052 645 */
1053 646 public static function kses( $value, $allowed = array() ) {
1054 647 $allowed_html = self::allowed_html( $allowed );
648 +
1055 649 return wp_kses( $value, $allowed_html );
1056 650 }
1057 651
1058 652 /**
1059 - * Sanitizes and echoes a given value.
1060 - *
1061 - * @since 6.18
1062 - *
1063 - * @param string $value The value to sanitize and output.
1064 - * @param array|string $allowed Allowed HTML tags and attributes.
1065 - *
1066 - * @return void
1067 - */
1068 - public static function kses_echo( $value, $allowed = array() ) {
1069 - echo self::kses( $value, $allowed ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1070 - }
1071 -
1072 - /**
1073 653 * The regular kses function strips [button_action] from submit button HTML.
1074 654 *
1075 655 * @since 5.0.13
1076 656 *
1077 657 * @param string $html
1078 - *
1079 658 * @return string
1080 659 */
1081 660 public static function kses_submit_button( $html ) {
1082 - $included_button_action = str_contains( $html, '[button_action]' );
1083 - $included_back_hook = str_contains( $html, '[back_hook]' );
1084 - $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]' );
1085 664 add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1086 665 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1087 666 $html = self::kses( $html, 'all' );
1088 667 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1089 668 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1090 -
1091 669 if ( $included_button_action ) {
1092 - if ( str_contains( $html, '<input type="submit"' ) ) {
670 + if ( false !== strpos( $html, '<input type="submit"' ) ) {
1093 671 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1094 672 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
1095 673 } else {
1096 674 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
@@ -1096,17 +674,14 @@
1096 674 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1097 675 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1098 676 }
1099 677 }
1100 -
1101 678 if ( $included_back_hook ) {
1102 679 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1103 680 }
1104 -
1105 681 if ( $included_draft_hook ) {
1106 - 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 );
1107 683 }
1108 -
1109 684 return $html;
1110 685 }
1111 686
1112 687 /**
@@ -1112,9 +687,8 @@
1112 687 /**
1113 688 * @since 5.0.13
1114 689 *
1115 690 * @param array $allowed_attr
1116 - *
1117 691 * @return array
1118 692 */
1119 693 public static function allow_visibility_style( $allowed_attr ) {
1120 694 $allowed_attr[] = 'visibility';
@@ -1124,9 +698,8 @@
1124 698 /**
1125 699 * @since 5.0.13
1126 700 *
1127 701 * @param array $allowed_html
1128 - *
1129 702 * @return array
1130 703 */
1131 704 public static function add_allowed_submit_button_tags( $allowed_html ) {
1132 705 $allowed_html['input'] = array(
@@ -1143,22 +716,17 @@
1143 716 }
1144 717
1145 718 /**
1146 719 * @since 2.05.03
1147 - *
1148 - * @param array|string $allowed
1149 - *
1150 - * @return array
1151 720 */
1152 721 private static function allowed_html( $allowed ) {
1153 722 $html = self::safe_html();
1154 723 $allowed_html = array();
1155 -
1156 724 if ( $allowed === 'all' ) {
1157 725 $allowed_html = $html;
1158 - } elseif ( $allowed ) {
726 + } elseif ( ! empty( $allowed ) ) {
1159 727 foreach ( (array) $allowed as $a ) {
1160 - $allowed_html[ $a ] = $html[ $a ] ?? array();
728 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1161 729 }
1162 730 }
1163 731
1164 732 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1165,10 +733,8 @@
1165 733 }
1166 734
1167 735 /**
1168 736 * @since 2.05.03
1169 - *
1170 - * @return array
1171 737 */
1172 738 private static function safe_html() {
1173 739 $allow_class = array(
1174 740 'class' => true,
@@ -1175,9 +741,9 @@
1175 741 'id' => true,
1176 742 );
1177 743
1178 744 return array(
1179 - 'a' => array(
745 + 'a' => array(
1180 746 'class' => true,
1181 747 'href' => true,
1182 748 'id' => true,
1183 749 'rel' => true,
@@ -1246,16 +812,16 @@
1246 812 'cite' => true,
1247 813 'title' => true,
1248 814 ),
1249 815 'rect' => array(
1250 - 'class' => true,
1251 - 'fill' => true,
1252 - 'height' => true,
1253 - 'width' => true,
1254 - 'x' => true,
1255 - 'y' => true,
1256 - 'rx' => true,
1257 - '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,
1258 824 'stroke-opacity' => true,
1259 825 'stroke-width' => true,
1260 826 ),
1261 827 'section' => $allow_class,
@@ -1290,9 +856,9 @@
1290 856 'xlink:href' => true,
1291 857 ),
1292 858 'ul' => $allow_class,
1293 859 'label' => array(
1294 - 'for' => true,
860 + 'for' => true,
1295 861 'class' => true,
1296 862 'id' => true,
1297 863 ),
1298 864 'button' => array(
@@ -1301,13 +867,8 @@
1301 867 ),
1302 868 'legend' => array(
1303 869 'class' => true,
1304 870 ),
1305 - 'option' => array(
1306 - 'class' => true,
1307 - 'value' => true,
1308 - 'selected' => true,
1309 - ),
1310 871 );
1311 872 }
1312 873
1313 874 /**
@@ -1315,21 +876,19 @@
1315 876 *
1316 877 * @since 2.0
1317 878 */
1318 879 public static function remove_get_action() {
1319 - if ( empty( $_GET ) ) {
880 + if ( ! isset( $_GET ) ) {
1320 881 return;
1321 882 }
1322 883
1323 884 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1324 -
1325 - if ( ! $action_name ) {
885 + if ( empty( $action_name ) ) {
1326 886 return;
1327 887 }
1328 888
1329 889 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1330 -
1331 - if ( $new_action ) {
890 + if ( ! empty( $new_action ) ) {
1332 891 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1333 892 }
1334 893 }
1335 894
@@ -1336,23 +895,21 @@
1336 895 /**
1337 896 * Check the WP query for a parameter
1338 897 *
1339 898 * @since 2.0
1340 - *
1341 - * @param array|string $value
1342 - * @param string $param
1343 - *
1344 - * @return array|string
899 + * @return string|array
1345 900 */
1346 901 public static function get_query_var( $value, $param ) {
1347 - // phpcs:ignore Universal.Operators.StrictComparisons
1348 902 if ( $value != '' ) {
1349 903 return $value;
1350 904 }
1351 905
1352 906 global $wp_query;
907 + if ( isset( $wp_query->query_vars[ $param ] ) ) {
908 + $value = $wp_query->query_vars[ $param ];
909 + }
1353 910
1354 - return $wp_query->query_vars[ $param ] ?? $value;
911 + return $value;
1355 912 }
1356 913
1357 914 /**
1358 915 * Try to show the SVG if possible. Otherwise, use the font icon.
@@ -1357,55 +914,38 @@
1357 914 /**
1358 915 * Try to show the SVG if possible. Otherwise, use the font icon.
1359 916 *
1360 917 * @since 4.0.02
1361 - *
1362 918 * @param string $class
1363 919 * @param array $atts
1364 - *
1365 - * @return string|null
1366 920 */
1367 921 public static function icon_by_class( $class, $atts = array() ) {
1368 922 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1369 -
1370 923 if ( isset( $atts['echo'] ) ) {
1371 924 unset( $atts['echo'] );
1372 925 }
1373 926
1374 927 $html_atts = self::array_to_html_params( $atts );
1375 - $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1376 928
1377 - // Replace icons that have been removed or renamed.
1378 - $deprecated = array(
1379 - 'frm_clone_solid_icon' => 'frm_clone_icon',
1380 - 'frm_keyalt_icon' => 'frm_key_icon',
1381 - 'frm_keyalt_solid_icon' => 'frm_key_solid_icon',
1382 - );
1383 -
1384 - if ( isset( $deprecated[ $icon ] ) ) {
1385 - $icon = $deprecated[ $icon ];
1386 - $class = str_replace( $icon, $deprecated[ $icon ], $class );
1387 - }
1388 -
929 + $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1389 930 if ( $icon === $class ) {
1390 931 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1391 932 } else {
1392 - $class = str_contains( $icon, ' ' ) ? ' ' . $icon : '';
1393 -
1394 - if ( str_contains( $icon, ' ' ) ) {
933 + $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
934 + if ( strpos( $icon, ' ' ) ) {
1395 935 $icon = explode( ' ', $icon );
1396 936 $icon = reset( $icon );
1397 937 }
1398 -
1399 - $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>';
1400 941 }
1401 942
1402 943 if ( $echo ) {
1403 944 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1404 - return null;
945 + } else {
946 + return $icon;
1405 947 }
1406 -
1407 - return $icon;
1408 948 }
1409 949
1410 950 /**
1411 951 * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
@@ -1412,9 +952,8 @@
1412 952 *
1413 953 * @since 5.0.13
1414 954 *
1415 955 * @param string $icon
1416 - *
1417 956 * @return string
1418 957 */
1419 958 public static function kses_icon( $icon ) {
1420 959 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1430,15 +969,13 @@
1430 969 /**
1431 970 * @since 5.0.13.1
1432 971 *
1433 972 * @param array $allowed_html
1434 - *
1435 973 * @return array
1436 974 */
1437 975 public static function add_allowed_icon_tags( $allowed_html ) {
1438 976 $allowed_html['svg']['data-open'] = true;
1439 977 $allowed_html['svg']['title'] = true;
1440 - $allowed_html['svg']['tabindex'] = true;
1441 978 return $allowed_html;
1442 979 }
1443 980
1444 981 /**
@@ -1444,13 +981,12 @@
1444 981 /**
1445 982 * @since 5.0.13
1446 983 *
1447 984 * @param array $allowed_attr
1448 - *
1449 985 * @return array
1450 986 */
1451 987 public static function allow_vars_in_styles( $allowed_attr ) {
1452 - $allowed_attr[] = '--primary-700';
988 + $allowed_attr[] = '--primary-hover';
1453 989 return $allowed_attr;
1454 990 }
1455 991
1456 992 /**
@@ -1459,9 +995,9 @@
1459 995 * @param bool $allow_css
1460 996 * @param string $css_string
1461 997 */
1462 998 public static function allow_style( $allow_css, $css_string ) {
1463 - if ( ! $allow_css && str_starts_with( $css_string, '--primary-700:' ) ) {
999 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-hover:' ) ) {
1464 1000 $split = explode( ':', $css_string, 2 );
1465 1001 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1466 1002 }
1467 1003 return $allow_css;
@@ -1470,22 +1006,19 @@
1470 1006 /**
1471 1007 * @since 5.0.13
1472 1008 *
1473 1009 * @param string $value
1474 - *
1475 1010 * @return bool
1476 1011 */
1477 1012 private static function is_a_valid_color( $value ) {
1478 1013 $match = 0;
1479 -
1480 - if ( str_starts_with( $value, 'rgba(' ) ) {
1014 + if ( 0 === strpos( $value, 'rgba(' ) ) {
1481 1015 $match = preg_match( '/^rgba\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3}),\s*(\d*(?:\.\d+)?)\)$/', $value );
1482 - } elseif ( str_starts_with( $value, 'rgb(' ) ) {
1016 + } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1483 1017 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1484 - } elseif ( str_starts_with( $value, '#' ) ) {
1018 + } elseif ( 0 === strpos( $value, '#' ) ) {
1485 1019 $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1486 1020 }
1487 -
1488 1021 return (bool) $match;
1489 1022 }
1490 1023
1491 1024 /**
@@ -1491,19 +1024,11 @@
1491 1024 /**
1492 1025 * Include svg images.
1493 1026 *
1494 1027 * @since 4.0.02
1495 - *
1496 - * @return void
1497 1028 */
1498 1029 public static function include_svg() {
1499 - if ( self::$included_svg ) {
1500 - return;
1501 - }
1502 -
1503 - // Use readfile instead of include_once because of a default security rule in Snuffleupagus.
1504 - readfile( self::plugin_path() . '/images/icons.svg' );
1505 - self::$included_svg = true;
1030 + include_once self::plugin_path() . '/images/icons.svg';
1506 1031 }
1507 1032
1508 1033 /**
1509 1034 * Convert an associative array to HTML values.
@@ -1512,20 +1037,17 @@
1512 1037 * @since 5.0.13 added $echo parameter.
1513 1038 *
1514 1039 * @param array $atts
1515 1040 * @param bool $echo
1516 - *
1517 1041 * @return string|void
1518 1042 */
1519 1043 public static function array_to_html_params( $atts, $echo = false ) {
1520 - $callback = function () use ( $atts ) {
1521 - if ( ! $atts ) {
1522 - return;
1044 + $callback = function() use ( $atts ) {
1045 + if ( $atts ) {
1046 + foreach ( $atts as $key => $value ) {
1047 + echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1048 + }
1523 1049 }
1524 -
1525 - foreach ( $atts as $key => $value ) {
1526 - echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1527 - }
1528 1050 };
1529 1051 return self::clip( $callback, $echo );
1530 1052 }
1531 1053
@@ -1535,10 +1057,9 @@
1535 1057 * @since 5.0.13
1536 1058 *
1537 1059 * @param Closure $echo_function
1538 1060 * @param bool $echo
1539 - *
1540 - * @return string|null
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
@@ -2343,9 +1617,8 @@
2343 1617
2344 1618 $user_id = get_current_user_id();
2345 1619 $user = new WP_User( $user_id );
2346 1620 $frm_roles = self::frm_capabilities();
2347 -
2348 1621 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2349 1622 $user->add_cap( $frm_role );
2350 1623 unset( $frm_role, $frm_role_description );
2351 1624 }
@@ -2354,47 +1627,35 @@
2354 1627 /**
2355 1628 * Make sure admins have permission to see the menu items
2356 1629 *
2357 1630 * @since 2.0.6
2358 - *
2359 - * @param string $cap
2360 - *
2361 - * @return void
2362 1631 */
2363 1632 public static function force_capability( $cap = 'frm_change_settings' ) {
2364 - if ( ! current_user_can( 'administrator' ) || current_user_can( $cap ) ) {
2365 - 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 + }
2366 1639 }
2367 -
2368 - $role = get_role( 'administrator' );
2369 - $frm_roles = self::frm_capabilities();
2370 -
2371 - foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2372 - $role->add_cap( $frm_role );
2373 - }
2374 1640 }
2375 1641
2376 1642 /**
2377 - * Check if the user has permission for action.
1643 + * Check if the user has permision for action.
2378 1644 * Return permission message and stop the action if no permission
2379 1645 *
2380 1646 * @since 2.0
2381 1647 *
2382 1648 * @param string $permission
2383 - * @param string $show_message
2384 1649 */
2385 1650 public static function permission_check( $permission, $show_message = 'show' ) {
2386 1651 $permission_error = self::permission_nonce_error( $permission );
2387 -
2388 - if ( $permission_error === false ) {
2389 - return;
1652 + if ( $permission_error !== false ) {
1653 + if ( 'hide' == $show_message ) {
1654 + $permission_error = '';
1655 + }
1656 + wp_die( esc_html( $permission_error ) );
2390 1657 }
2391 -
2392 - if ( 'hide' === $show_message ) {
2393 - $permission_error = '';
2394 - }
2395 -
2396 - wp_die( esc_html( $permission_error ) );
2397 1658 }
2398 1659
2399 1660 /**
2400 1661 * Check user permission and nonce
@@ -2401,27 +1662,24 @@
2401 1662 *
2402 1663 * @since 2.0
2403 1664 *
2404 1665 * @param string $permission
2405 - * @param string $nonce_name
2406 - * @param string $nonce
2407 1666 *
2408 1667 * @return false|string The permission message or false if allowed
2409 1668 */
2410 1669 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
2411 - if ( $permission && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
1670 + if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2412 1671 $frm_settings = self::get_settings();
1672 +
2413 1673 return $frm_settings->admin_permission;
2414 1674 }
2415 1675
2416 1676 $error = false;
2417 -
2418 - if ( ! $nonce_name ) {
1677 + if ( empty( $nonce_name ) ) {
2419 1678 return $error;
2420 1679 }
2421 1680
2422 - $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2423 -
1681 + $nonce_value = ( $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2424 1682 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2425 1683 $frm_settings = self::get_settings();
2426 1684 $error = $frm_settings->admin_permission;
2427 1685 }
@@ -2428,14 +1686,8 @@
2428 1686
2429 1687 return $error;
2430 1688 }
2431 1689
2432 - /**
2433 - * @param array|string $values
2434 - * @param string $current
2435 - *
2436 - * @return void
2437 - */
2438 1690 public static function checked( $values, $current ) {
2439 1691 if ( self::check_selected( $values, $current ) ) {
2440 1692 echo ' checked="checked"';
2441 1693 }
@@ -2440,74 +1692,40 @@
2440 1692 echo ' checked="checked"';
2441 1693 }
2442 1694 }
2443 1695
2444 - /**
2445 - * @param array|string $values
2446 - * @param string|null $current
2447 - *
2448 - * @return bool
2449 - */
2450 1696 public static function check_selected( $values, $current ) {
2451 1697 $values = self::recursive_function_map( $values, 'trim' );
2452 1698 $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2453 - $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
1699 + $current = htmlspecialchars_decode( trim( $current ) );
2454 1700
2455 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict, Universal.Operators.StrictComparisons
2456 - return is_array( $values ) ? in_array( $current, $values ) : $values == $current;
1701 + return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2457 1702 }
2458 1703
2459 - /**
2460 - * @param array|string $value
2461 - * @param callable|string $function
2462 - *
2463 - * @return array|string
2464 - */
2465 1704 public static function recursive_function_map( $value, $function ) {
2466 1705 if ( is_array( $value ) ) {
2467 1706 $original_function = $function;
2468 - $function = count( $value ) ? explode( ', ', FrmDb::prepare_array_values( $value, $function ) ) : array( $function );
2469 -
2470 - 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 {
2471 1715 foreach ( $value as $k => $v ) {
2472 1716 if ( ! is_array( $v ) ) {
2473 1717 $value[ $k ] = call_user_func( $original_function, $v );
2474 1718 }
2475 1719 }
2476 - } else {
2477 - $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2478 1720 }
2479 1721 } else {
2480 - $value = self::maybe_update_value_if_null( $value, $function );
2481 1722 $value = call_user_func( $function, $value );
2482 - }//end if
2483 -
2484 - return $value;
2485 - }
2486 -
2487 - /**
2488 - * Updates value to empty string if it is null and being passed to a string function.
2489 - *
2490 - * @since 6.8.4
2491 - *
2492 - * @param mixed $value
2493 - * @param string $function
2494 - *
2495 - * @return mixed
2496 - */
2497 - private static function maybe_update_value_if_null( $value, $function ) {
2498 - if ( null === $value && in_array( $function, array( 'trim', 'strlen' ), true ) ) {
2499 - return '';
2500 1723 }
2501 1724
2502 1725 return $value;
2503 1726 }
2504 1727
2505 - /**
2506 - * @param array $array
2507 - *
2508 - * @return bool
2509 - */
2510 1728 public static function is_assoc( $array ) {
2511 1729 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2512 1730 }
2513 1731
@@ -2512,24 +1730,20 @@
2512 1730 }
2513 1731
2514 1732 /**
2515 1733 * Flatten a multi-dimensional array
2516 - *
2517 - * @param array $array
2518 - * @param string $keys
2519 - *
2520 - * @return array
2521 1734 */
2522 1735 public static function array_flatten( $array, $keys = 'keep' ) {
2523 1736 $return = array();
2524 -
2525 1737 foreach ( $array as $key => $value ) {
2526 1738 if ( is_array( $value ) ) {
2527 1739 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2528 - } elseif ( $keys === 'keep' ) {
2529 - $return[ $key ] = $value;
2530 1740 } else {
2531 - $return[] = $value;
1741 + if ( $keys == 'keep' ) {
1742 + $return[ $key ] = $value;
1743 + } else {
1744 + $return[] = $value;
1745 + }
2532 1746 }
2533 1747 }
2534 1748
2535 1749 return $return;
@@ -2534,43 +1748,16 @@
2534 1748
2535 1749 return $return;
2536 1750 }
2537 1751
2538 - /**
2539 - * Flatten an array before imploding it to avoid Array to string conversion warnings.
2540 - *
2541 - * @since 6.16.1
2542 - *
2543 - * @param string $sep
2544 - * @param array $array
2545 - *
2546 - * @return string
2547 - */
2548 - public static function safe_implode( $sep, $array ) {
2549 - $array = self::array_flatten( $array );
2550 - return implode( $sep, $array );
2551 - }
2552 -
2553 - /**
2554 - * @param string $text
2555 - * @param bool $is_rich_text
2556 - *
2557 - * @return string
2558 - */
2559 1752 public static function esc_textarea( $text, $is_rich_text = false ) {
2560 1753 $safe_text = str_replace( '&quot;', '"', $text );
2561 -
2562 1754 if ( ! $is_rich_text ) {
2563 1755 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2564 1756 }
2565 -
2566 1757 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2567 1758
2568 - /**
2569 - * @param string $safe_text
2570 - * @param string $text
2571 - */
2572 - return (string) apply_filters( 'esc_textarea', $safe_text, $text );
1759 + return apply_filters( 'esc_textarea', $safe_text, $text );
2573 1760 }
2574 1761
2575 1762 /**
2576 1763 * Add auto paragraphs to text areas
@@ -2575,59 +1762,44 @@
2575 1762 /**
2576 1763 * Add auto paragraphs to text areas
2577 1764 *
2578 1765 * @since 2.0
2579 - *
2580 - * @param mixed $content
2581 - *
2582 - * @return mixed
2583 1766 */
2584 1767 public static function use_wpautop( $content ) {
2585 - if ( apply_filters( 'frm_use_wpautop', true ) && is_string( $content ) ) {
2586 - 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 ) );
2587 1770 }
2588 1771
2589 1772 return $content;
2590 1773 }
2591 1774
2592 - /**
2593 - * Replace quotes with their HTML entities.
2594 - *
2595 - * @param string $val
2596 - *
2597 - * @return string
2598 - */
2599 1775 public static function replace_quotes( $val ) {
2600 1776 // Replace double quotes.
2601 1777 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2602 1778
2603 1779 // Replace single quotes.
2604 - 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;
2605 1783 }
2606 1784
2607 1785 /**
2608 - * @param string $handle
2609 - * @param int|string $default
2610 - *
2611 - * @return int|string
1786 + * @param string $handle
2612 1787 */
2613 1788 public static function script_version( $handle, $default = 0 ) {
2614 1789 global $wp_scripts;
2615 -
2616 1790 if ( ! $wp_scripts ) {
2617 1791 return $default;
2618 1792 }
2619 1793
2620 1794 $ver = $default;
2621 -
2622 1795 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2623 1796 return $ver;
2624 1797 }
2625 1798
2626 1799 $query = $wp_scripts->registered[ $handle ];
2627 -
2628 1800 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2629 - return $query->ver;
1801 + $ver = $query->ver;
2630 1802 }
2631 1803
2632 1804 return $ver;
2633 1805 }
@@ -2636,23 +1808,17 @@
2636 1808 * @since 5.0.13 added $echo param.
2637 1809 *
2638 1810 * @param string $url
2639 1811 * @param bool $echo
2640 - *
2641 - * @return string|null
1812 + * @return string|void
2642 1813 */
2643 1814 public static function js_redirect( $url, $echo = false ) {
2644 - $callback = function () use ( $url ) {
1815 + $callback = function() use ( $url ) {
2645 1816 echo '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
2646 1817 };
2647 1818 return self::clip( $callback, $echo );
2648 1819 }
2649 1820
2650 - /**
2651 - * @param int|string $user_id
2652 - *
2653 - * @return int|string
2654 - */
2655 1821 public static function get_user_id_param( $user_id ) {
2656 1822 if ( ! $user_id || is_numeric( $user_id ) ) {
2657 1823 return $user_id;
2658 1824 }
@@ -2657,13 +1823,16 @@
2657 1823 return $user_id;
2658 1824 }
2659 1825
2660 1826 $user_id = sanitize_text_field( $user_id );
2661 -
2662 - if ( $user_id === 'current' ) {
1827 + if ( $user_id == 'current' ) {
2663 1828 $user_id = get_current_user_id();
2664 1829 } else {
2665 - $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 + }
2666 1835
2667 1836 if ( $user ) {
2668 1837 $user_id = $user->ID;
2669 1838 }
@@ -2672,14 +1841,8 @@
2672 1841
2673 1842 return $user_id;
2674 1843 }
2675 1844
2676 - /**
2677 - * @param string $filename
2678 - * @param array $atts
2679 - *
2680 - * @return false|string
2681 - */
2682 1845 public static function get_file_contents( $filename, $atts = array() ) {
2683 1846 if ( ! is_file( $filename ) ) {
2684 1847 return false;
2685 1848 }
@@ -2685,10 +1848,13 @@
2685 1848 }
2686 1849
2687 1850 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2688 1851 ob_start();
2689 - include $filename;
2690 - return ob_get_clean();
1852 + include( $filename );
1853 + $contents = ob_get_contents();
1854 + ob_end_clean();
1855 +
1856 + return $contents;
2691 1857 }
2692 1858
2693 1859 /**
2694 1860 * @param string $name
@@ -2698,9 +1864,8 @@
2698 1864 * @param int $num_chars
2699 1865 */
2700 1866 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2701 1867 $key = '';
2702 -
2703 1868 if ( $name ) {
2704 1869 $key = sanitize_key( $name );
2705 1870 $key = self::maybe_clear_long_key( $key, $column );
2706 1871 }
@@ -2720,31 +1885,31 @@
2720 1885 $column
2721 1886 );
2722 1887
2723 1888 // Create a unique field id if it has already been used.
2724 - if ( ! in_array( $key, $similar_keys, true ) ) {
2725 - return $key;
2726 - }
1889 + if ( in_array( $key, $similar_keys, true ) ) {
1890 + $key = self::maybe_truncate_key_before_appending( $column, $key );
2727 1891
2728 - $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 );
2729 1901
2730 - /**
2731 - * Allow for a custom separator between the attempted key and the generated suffix.
2732 - *
2733 - * @since 5.2.03
2734 - *
2735 - * @param string $separator. Default empty.
2736 - * @param string $key the key without the added suffix.
2737 - */
2738 - $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 ) );
2739 1907
2740 - $suffix = 2;
2741 - do {
2742 - $key_check = $key . $separator . $suffix;
2743 - ++$suffix;
2744 - } while ( in_array( $key_check, $similar_keys, true ) );
1908 + $key = $key_check;
1909 + }
2745 1910
2746 - return $key_check;
1911 + return $key;
2747 1912 }
2748 1913
2749 1914 /**
2750 1915 * Avoid trying to append to a really long key,
@@ -2751,26 +1916,20 @@
2751 1916 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2752 1917 *
2753 1918 * @param string $column
2754 1919 * @param string $key
2755 - *
2756 1920 * @return string
2757 1921 */
2758 1922 private static function maybe_truncate_key_before_appending( $column, $key ) {
2759 - if ( ! in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
2760 - return $key;
2761 - }
2762 -
2763 - $max_key_length_before_truncating = 60;
2764 -
2765 - if ( strlen( $key ) > $max_key_length_before_truncating ) {
2766 - $key = substr( $key, 0, $max_key_length_before_truncating );
2767 -
2768 - if ( is_numeric( $key ) ) {
2769 - $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 + }
2770 1930 }
2771 1931 }
2772 -
2773 1932 return $key;
2774 1933 }
2775 1934
2776 1935 /**
@@ -2777,36 +1936,29 @@
2777 1936 * Possibly reset a key to avoid conflicts with column size limits.
2778 1937 *
2779 1938 * @param string $key
2780 1939 * @param string $column
2781 - *
2782 1940 * @return string either the original key value, or an empty string if the key was too long.
2783 1941 */
2784 1942 private static function maybe_clear_long_key( $key, $column ) {
2785 1943 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
2786 - return '';
1944 + $key = '';
2787 1945 }
2788 1946 return $key;
2789 1947 }
2790 1948
2791 1949 /**
2792 - * @since 6.21 This is changed from `private` to `public`.
2793 - *
2794 1950 * @param int $num_chars
2795 - *
2796 1951 * @return string
2797 1952 */
2798 - public static function generate_new_key( $num_chars ) {
2799 - $max_slug_value = 36 ** $num_chars;
2800 -
2801 - // We want to have at least 2 characters in the slug.
2802 - $min_slug_value = 37;
2803 - 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 );
2804 1957 }
2805 1958
2806 1959 /**
2807 1960 * @param string $key
2808 - *
2809 1961 * @return string
2810 1962 */
2811 1963 private static function prevent_numeric_and_reserved_keys( $key ) {
2812 1964 if ( is_numeric( $key ) ) {
@@ -2820,14 +1972,12 @@
2820 1972 'editlink',
2821 1973 'siteurl',
2822 1974 'evenodd',
2823 1975 );
2824 -
2825 1976 if ( in_array( $key, $not_allowed, true ) ) {
2826 1977 $key .= 'a';
2827 1978 }
2828 1979 }
2829 -
2830 1980 return $key;
2831 1981 }
2832 1982
2833 1983 /**
@@ -2832,16 +1982,11 @@
2832 1982
2833 1983 /**
2834 1984 * Editing a Form or Entry
2835 1985 *
2836 - * @param object $record
2837 - * @param string $table
2838 - * @param array|string $fields
2839 - * @param bool $default
2840 - * @param array $post_values
2841 - * @param array $args
1986 + * @param string $table
2842 1987 *
2843 - * @return array|bool
1988 + * @return bool|array
2844 1989 */
2845 1990 public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
2846 1991 if ( ! $record ) {
2847 1992 return false;
@@ -2846,9 +1991,9 @@
2846 1991 if ( ! $record ) {
2847 1992 return false;
2848 1993 }
2849 1994
2850 - if ( ! $post_values ) {
1995 + if ( empty( $post_values ) ) {
2851 1996 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
2852 1997 }
2853 1998
2854 1999 $values = array(
@@ -2856,9 +2001,9 @@
2856 2001 'fields' => array(),
2857 2002 );
2858 2003
2859 2004 foreach ( array( 'name', 'description' ) as $var ) {
2860 - $default_val = $record->{$var} ?? '';
2005 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2861 2006 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2862 2007 unset( $var, $default_val );
2863 2008 }
2864 2009
@@ -2876,67 +2021,48 @@
2876 2021
2877 2022 return $values;
2878 2023 }
2879 2024
2880 - /**
2881 - * @param array|string $fields
2882 - * @param object $record
2883 - * @param array $values
2884 - * @param array $args
2885 - *
2886 - * @return void
2887 - */
2888 2025 private static function prepare_field_arrays( $fields, $record, array &$values, $args ) {
2889 - if ( ! $fields ) {
2890 - return;
2891 - }
2892 -
2893 - foreach ( (array) $fields as $field ) {
2894 - if ( ! self::is_admin_page() ) {
2895 - // Don't prep default values on the form settings page.
2896 - $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 );
2897 2034 }
2898 -
2899 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2900 - self::fill_field_defaults( $field, $record, $values, $args );
2901 2035 }
2902 2036 }
2903 2037
2904 - /**
2905 - * @param object $field
2906 - * @param object $record
2907 - * @param array $values
2908 - * @param array $args
2909 - *
2910 - * @return void
2911 - */
2912 2038 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2913 2039 $post_values = $args['post_values'];
2914 2040
2915 2041 if ( $args['default'] ) {
2916 2042 $meta_value = $field->default_value;
2917 - } elseif ( $record->post_id && self::pro_is_installed() && ! empty( $field->field_options['post_field'] ) ) {
2918 - if ( ! isset( $field->field_options['custom_field'] ) ) {
2919 - $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 );
2920 2061 }
2062 + }
2921 2063
2922 - $meta_value = FrmProEntryMetaHelper::get_post_value(
2923 - $record->post_id,
2924 - $field->field_options['post_field'],
2925 - $field->field_options['custom_field'],
2926 - array(
2927 - 'truncate' => false,
2928 - 'type' => $field->type,
2929 - 'form_id' => $field->form_id,
2930 - 'field' => $field,
2931 - )
2932 - );
2933 - } else {
2934 - $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2935 - }//end if
2936 -
2937 - $field_type = $post_values['field_options'][ 'type_' . $field->id ] ?? $field->type;
2938 -
2064 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2939 2065 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2940 2066 $new_value = $post_values['item_meta'][ $field->id ];
2941 2067 self::unserialize_or_decode( $new_value );
2942 2068 } else {
@@ -2951,9 +2077,9 @@
2951 2077 $args['field_type'] = $field_type;
2952 2078
2953 2079 FrmFieldsHelper::prepare_edit_front_field( $field_array, $field, $values['id'], $args );
2954 2080
2955 - if ( empty( $field_array['unique'] ) ) {
2081 + if ( ! isset( $field_array['unique'] ) || ! $field_array['unique'] ) {
2956 2082 $field_array['unique_msg'] = '';
2957 2083 }
2958 2084
2959 2085 $field_array = array_merge( (array) $field->field_options, $field_array );
@@ -2982,15 +2108,12 @@
2982 2108 );
2983 2109 }
2984 2110
2985 2111 /**
2986 - * @param object $record
2987 2112 * @param string $table
2988 - * @param array $post_values
2989 - * @param array $values
2990 2113 */
2991 2114 private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
2992 - if ( $table === 'entries' ) {
2115 + if ( $table == 'entries' ) {
2993 2116 $form = $record->form_id;
2994 2117 FrmForm::maybe_get_form( $form );
2995 2118 } else {
2996 2119 $form = $record;
@@ -3020,21 +2143,15 @@
3020 2143 }
3021 2144
3022 2145 /**
3023 2146 * Set to POST value or default
3024 - *
3025 - * @param array $post_values
3026 - * @param array $values
3027 - *
3028 - * @return void
3029 2147 */
3030 2148 private static function fill_form_defaults( $post_values, array &$values ) {
3031 2149 $form_defaults = FrmFormsHelper::get_default_opts();
3032 2150
3033 2151 foreach ( $form_defaults as $opt => $default ) {
3034 - // phpcs:ignore Universal.Operators.StrictComparisons
3035 2152 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3036 - $values[ $opt ] = $post_values['options'][ $opt ] ?? $default;
2153 + $values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
3037 2154 }
3038 2155
3039 2156 unset( $opt, $default );
3040 2157 }
@@ -3044,9 +2161,9 @@
3044 2161 }
3045 2162
3046 2163 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3047 2164 if ( ! isset( $values[ $h . '_html' ] ) ) {
3048 - $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 ) );
3049 2166 }
3050 2167 unset( $h );
3051 2168 }
3052 2169 }
@@ -3055,58 +2172,46 @@
3055 2172 * @since 2.2.10
3056 2173 *
3057 2174 * @param array $post_values
3058 2175 *
3059 - * @return bool|int
2176 + * @return boolean|int
3060 2177 */
3061 2178 public static function custom_style_value( $post_values ) {
3062 - if ( $post_values && isset( $post_values['options']['custom_style'] ) ) {
3063 - 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' );
3064 2184 }
3065 2185
3066 - $frm_settings = self::get_settings();
3067 - return $frm_settings->load_style !== 'none';
2186 + return $custom_style;
3068 2187 }
3069 2188
3070 - /**
3071 - * @param mixed $original_string
3072 - * @param int|string $length
3073 - * @param int $minword
3074 - * @param string $continue
3075 - *
3076 - * @return string
3077 - */
3078 - public static function truncate( $original_string, $length, $minword = 3, $continue = '...' ) {
3079 - if ( ! is_string( $original_string ) && ! is_int( $original_string ) ) {
2189 + public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
2190 + if ( is_array( $str ) ) {
3080 2191 return '';
3081 2192 }
3082 2193
3083 - $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 ) );
3084 2197
3085 - if ( $length === 0 ) {
2198 + if ( $length == 0 ) {
3086 2199 return '';
2200 + } elseif ( $length <= 10 ) {
2201 + $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
2202 +
2203 + return $sub . ( ( $length < $original_len ) ? $continue : '' );
3087 2204 }
3088 2205
3089 - $str = wp_strip_all_tags( (string) $original_string );
3090 - $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
2206 + $sub = '';
2207 + $len = 0;
3091 2208
3092 - if ( $length <= 10 ) {
3093 - $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
3094 - return $sub . ( $length < $original_len ? $continue : '' );
3095 - }
3096 -
3097 - $sub = '';
3098 - $len = 0;
3099 2209 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3100 2210
3101 - if ( ! is_array( $words ) ) {
3102 - return $original_string;
3103 - }
3104 -
3105 2211 foreach ( $words as $word ) {
3106 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2212 + $part = ( ( $sub != '' ) ? ' ' : '' ) . $word;
3107 2213 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3108 -
3109 2214 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3110 2215 break;
3111 2216 }
3112 2217
@@ -3119,49 +2224,14 @@
3119 2224
3120 2225 unset( $total_len, $word );
3121 2226 }
3122 2227
3123 - $sub = self::maybe_force_truncate_on_string_with_no_spaces( $sub, $length );
3124 -
3125 - return $sub . ( $len < $original_len ? $continue : '' );
2228 + return $sub . ( ( $len < $original_len ) ? $continue : '' );
3126 2229 }
3127 2230
3128 - /**
3129 - * If the string is still too long because there may not have been any spaces, force truncate.
3130 - *
3131 - * @since 6.5.4
3132 - *
3133 - * @param string $sub Current substring.
3134 - * @param int $length The length limit.
3135 - *
3136 - * @return string
3137 - */
3138 - private static function maybe_force_truncate_on_string_with_no_spaces( $sub, $length ) {
3139 - if ( strlen( $sub ) < $length + 50 ) {
3140 - // If the string isn't way over the limit, leave it.
3141 - return $sub;
3142 - }
3143 -
3144 - $first_space = strpos( $sub, ' ', $length );
3145 -
3146 - if ( false !== $first_space ) {
3147 - // Ignore anything with spaces.
3148 - return $sub;
3149 - }
3150 -
3151 - return substr( $sub, 0, $length + 10 );
3152 - }
3153 -
3154 - /**
3155 - * @param array $function_names
3156 - * @param array $args
3157 - *
3158 - * @return mixed
3159 - */
3160 2231 public static function mb_function( $function_names, $args ) {
3161 2232 $mb_function_name = $function_names[0];
3162 2233 $function_name = $function_names[1];
3163 -
3164 2234 if ( function_exists( $mb_function_name ) ) {
3165 2235 $function_name = $mb_function_name;
3166 2236 }
3167 2237
@@ -3167,21 +2237,14 @@
3167 2237
3168 2238 return call_user_func_array( $function_name, $args );
3169 2239 }
3170 2240
3171 - /**
3172 - * @param string $date
3173 - * @param string $date_format
3174 - * @param string $time_format
3175 - *
3176 - * @return string
3177 - */
3178 2241 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3179 - if ( ! $date ) {
2242 + if ( empty( $date ) ) {
3180 2243 return $date;
3181 2244 }
3182 2245
3183 - if ( ! $date_format ) {
2246 + if ( empty( $date_format ) ) {
3184 2247 $date_format = get_option( 'date_format' );
3185 2248 }
3186 2249
3187 2250 if ( preg_match( '/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date ) && self::pro_is_installed() ) {
@@ -3189,10 +2252,10 @@
3189 2252 $date = FrmProAppHelper::convert_date( $date, $frmpro_settings->date_format, 'Y-m-d' );
3190 2253 }
3191 2254
3192 2255 $formatted = self::get_localized_date( $date_format, $date );
3193 - $do_time = gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00';
3194 2256
2257 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3195 2258 if ( $do_time ) {
3196 2259 $formatted .= self::add_time_to_date( $time_format, $date );
3197 2260 }
3198 2261
@@ -3198,52 +2261,45 @@
3198 2261
3199 2262 return $formatted;
3200 2263 }
3201 2264
3202 - /**
3203 - * @param string $time_format
3204 - * @param string $date
3205 - *
3206 - * @return string
3207 - */
3208 2265 private static function add_time_to_date( $time_format, $date ) {
3209 - if ( ! $time_format ) {
2266 + if ( empty( $time_format ) ) {
3210 2267 $time_format = get_option( 'time_format' );
3211 2268 }
3212 2269
3213 2270 $trimmed_format = trim( $time_format );
3214 -
3215 - if ( $time_format && $trimmed_format ) {
3216 - 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 );
3217 2274 }
3218 2275
3219 - return '';
2276 + return $time;
3220 2277 }
3221 2278
3222 2279 /**
3223 2280 * @since 2.0.8
3224 - *
3225 - * @param string $date_format
3226 - * @param string $date
3227 - *
3228 - * @return string
3229 2281 */
3230 2282 public static function get_localized_date( $date_format, $date ) {
3231 2283 $date = get_date_from_gmt( $date );
2284 +
3232 2285 return date_i18n( $date_format, strtotime( $date ) );
3233 2286 }
3234 2287
3235 2288 /**
3236 - * Gets the time ago in words.
2289 + * Gets the time ago in words
3237 2290 *
3238 - * @param int $from In seconds.
3239 - * @param int|string $to In seconds.
3240 - * @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
3241 2293 *
3242 - * @return string Time ago.
2294 + * @return string $time_ago
3243 2295 */
3244 2296 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3245 - $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 + }
3246 2302 $ago = new DateTime( '@' . $from );
3247 2303
3248 2304 // Get the time difference
3249 2305 $diff_object = $now->diff( $ago );
@@ -3249,9 +2305,9 @@
3249 2305 $diff_object = $now->diff( $ago );
3250 2306 $diff = get_object_vars( $diff_object );
3251 2307
3252 2308 // Add week amount and update day amount
3253 - $diff['w'] = floor( $diff['d'] / 7 );
2309 + $diff['w'] = floor( $diff['d'] / 7 );
3254 2310 $diff['d'] -= $diff['w'] * 7;
3255 2311
3256 2312 $time_strings = self::get_time_strings();
3257 2313
@@ -3257,11 +2313,10 @@
3257 2313
3258 2314 if ( ! is_numeric( $levels ) ) {
3259 2315 // Show time in specified unit.
3260 2316 $levels = self::get_unit( $levels );
3261 -
3262 2317 if ( isset( $time_strings[ $levels ] ) ) {
3263 - $diff = array(
2318 + $diff = array(
3264 2319 $levels => self::time_format( $levels, $diff ),
3265 2320 );
3266 2321 $time_strings = array(
3267 2322 $levels => $time_strings[ $levels ],
@@ -3266,14 +2321,13 @@
3266 2321 $time_strings = array(
3267 2322 $levels => $time_strings[ $levels ],
3268 2323 );
3269 2324 }
3270 -
3271 2325 $levels = 1;
3272 2326 }
3273 2327
3274 2328 foreach ( $time_strings as $k => $v ) {
3275 - if ( ! empty( $diff[ $k ] ) ) {
2329 + if ( isset( $diff[ $k ] ) && $diff[ $k ] ) {
3276 2330 $time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
3277 2331 } elseif ( isset( $diff[ $k ] ) && count( $time_strings ) === 1 ) {
3278 2332 // Account for 0.
3279 2333 $time_strings[ $k ] = $diff[ $k ] . ' ' . $v[1];
@@ -3281,21 +2335,17 @@
3281 2335 unset( $time_strings[ $k ] );
3282 2336 }
3283 2337 }
3284 2338
3285 - $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
3286 - $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 );
3287 2342
3288 - return implode( ' ', $time_strings );
2343 + return $time_ago_string;
3289 2344 }
3290 2345
3291 2346 /**
3292 2347 * @since 4.05.01
3293 - *
3294 - * @param string $unit
3295 - * @param array $diff
3296 - *
3297 - * @return int
3298 2348 */
3299 2349 private static function time_format( $unit, $diff ) {
3300 2350 $return = array(
3301 2351 'y' => 'y',
@@ -3300,14 +2350,14 @@
3300 2350 $return = array(
3301 2351 'y' => 'y',
3302 2352 'd' => 'days',
3303 2353 );
3304 -
3305 2354 if ( isset( $return[ $unit ] ) ) {
3306 2355 return $diff[ $return[ $unit ] ];
3307 2356 }
3308 2357
3309 2358 $total = $diff['days'] * self::convert_time( 'd', $unit );
2359 +
3310 2360 $times = array( 'h', 'i', 's' );
3311 2361
3312 2362 foreach ( $times as $time ) {
3313 2363 if ( ! isset( $diff[ $time ] ) ) {
@@ -3321,13 +2371,8 @@
3321 2371 }
3322 2372
3323 2373 /**
3324 2374 * @since 4.05.01
3325 - *
3326 - * @param string $from
3327 - * @param string $to
3328 - *
3329 - * @return int
3330 2375 */
3331 2376 private static function convert_time( $from, $to ) {
3332 2377 $convert = array(
3333 2378 's' => 1,
@@ -3343,35 +2388,28 @@
3343 2388 }
3344 2389
3345 2390 /**
3346 2391 * @since 4.05.01
3347 - *
3348 - * @param string $unit
3349 - *
3350 - * @return int|string
3351 2392 */
3352 2393 private static function get_unit( $unit ) {
3353 2394 $units = self::get_time_strings();
3354 -
3355 2395 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3356 2396 return $unit;
3357 2397 }
3358 2398
3359 2399 foreach ( $units as $u => $strings ) {
3360 - if ( in_array( $unit, $strings, true ) ) {
2400 + if ( in_array( $unit, $strings ) ) {
3361 2401 return $u;
3362 2402 }
3363 2403 }
3364 -
3365 2404 return 1;
3366 2405 }
3367 2406
3368 2407 /**
3369 2408 * Get the translatable time strings. The untranslated version is a failsafe
3370 - * 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.
3371 2410 *
3372 2411 * @since 2.0.20
3373 - *
3374 2412 * @return array
3375 2413 */
3376 2414 private static function get_time_strings() {
3377 2415 return array(
@@ -3415,48 +2453,35 @@
3415 2453
3416 2454 // Pagination Methods.
3417 2455
3418 2456 /**
3419 - * @param int $r_count
3420 - * @param int $current_p
3421 - * @param int $p_size
3422 - *
3423 - * @return int
2457 + * @param integer $current_p
3424 2458 */
3425 2459 public static function get_last_record_num( $r_count, $current_p, $p_size ) {
3426 - 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 ) );
3427 2461 }
3428 2462
3429 2463 /**
3430 - * @param int $r_count
3431 - * @param int $current_p
3432 - * @param int $p_size
3433 - *
3434 - * @return int
2464 + * @param integer $current_p
3435 2465 */
3436 2466 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3437 - // phpcs:ignore Universal.Operators.StrictComparisons
3438 2467 if ( $current_p == 1 ) {
3439 2468 return 1;
2469 + } else {
2470 + return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
3440 2471 }
3441 - return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3442 2472 }
3443 2473
3444 2474 /**
3445 - * @param array $json_vars
3446 - *
3447 2475 * @return array
3448 2476 */
3449 2477 public static function json_to_array( $json_vars ) {
3450 2478 $vars = array();
3451 -
3452 2479 foreach ( $json_vars as $jv ) {
3453 2480 $jv_name = explode( '[', $jv['name'] );
3454 2481 $last = count( $jv_name ) - 1;
3455 -
3456 2482 foreach ( $jv_name as $p => $n ) {
3457 2483 $name = trim( $n, ']' );
3458 -
3459 2484 if ( ! isset( $l1 ) ) {
3460 2485 $l1 = $name;
3461 2486 }
3462 2487
@@ -3467,9 +2492,9 @@
3467 2492 if ( ! isset( $l3 ) ) {
3468 2493 $l3 = $name;
3469 2494 }
3470 2495
3471 - $this_val = $p === $last ? $jv['value'] : array();
2496 + $this_val = ( $p == $last ) ? $jv['value'] : array();
3472 2497
3473 2498 switch ( $p ) {
3474 2499 case 0:
3475 2500 $l1 = $name;
@@ -3491,12 +2516,12 @@
3491 2516 self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
3492 2517 }
3493 2518
3494 2519 unset( $this_val, $n );
3495 - }//end foreach
2520 + }
3496 2521
3497 2522 unset( $last, $jv );
3498 - }//end foreach
2523 + }
3499 2524
3500 2525 return $vars;
3501 2526 }
3502 2527
@@ -3502,15 +2527,10 @@
3502 2527
3503 2528 /**
3504 2529 * @param string $name
3505 2530 * @param string $l1
3506 - * @param mixed $val
3507 - * @param array $vars
3508 - *
3509 - * @return void
3510 2531 */
3511 2532 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3512 - // phpcs:ignore Universal.Operators.StrictComparisons
3513 2533 if ( $name == '' ) {
3514 2534 $vars[] = $val;
3515 2535 } elseif ( ! isset( $vars[ $l1 ] ) ) {
3516 2536 $vars[ $l1 ] = $val;
@@ -3516,26 +2536,18 @@
3516 2536 $vars[ $l1 ] = $val;
3517 2537 }
3518 2538 }
3519 2539
3520 - /**
3521 - * @param string $name
3522 - * @param string $class
3523 - * @param string $form_name
3524 - *
3525 - * @return void
3526 - */
3527 2540 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3528 2541 $tooltips = array(
3529 2542 'action_title' => __( 'Give this action a label for easy reference.', 'formidable' ),
3530 - 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected]. [default-email] is the address set in the global "Default Email Address" settings.', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2543 + 'email_to' => __( 'Add one or more recipient addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected]. [admin_email] is the address set in WP General Settings.', 'formidable' ),
3531 2544 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
3532 2545 'bcc' => __( 'Add BCC addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
3533 - 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <[email protected]> or [email protected].', 'formidable' ), // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
2546 + 'reply_to' => __( 'If you would like a different reply to address than the "from" address, add a single address here. FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
3534 2547 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <[email protected]> or [email protected].', 'formidable' ),
3535 2548 /* translators: %1$s: Form name, %2$s: Date */
3536 - '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
3537 - '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() ) ),
3538 2550 );
3539 2551
3540 2552 if ( ! isset( $tooltips[ $name ] ) ) {
3541 2553 return;
@@ -3540,9 +2552,9 @@
3540 2552 if ( ! isset( $tooltips[ $name ] ) ) {
3541 2553 return;
3542 2554 }
3543 2555
3544 - if ( 'open' === $class ) {
2556 + if ( 'open' == $class ) {
3545 2557 echo ' frm_help"';
3546 2558 } else {
3547 2559 echo ' class="frm_help"';
3548 2560 }
@@ -3548,9 +2560,9 @@
3548 2560 }
3549 2561
3550 2562 echo ' title="' . esc_attr( $tooltips[ $name ] );
3551 2563
3552 - if ( 'open' !== $class ) {
2564 + if ( 'open' != $class ) {
3553 2565 echo '"';
3554 2566 }
3555 2567 }
3556 2568
@@ -3555,28 +2567,20 @@
3555 2567 }
3556 2568
3557 2569 /**
3558 2570 * Add the current_page class to that page in the form nav
3559 - *
3560 - * @param int|string $page
3561 - * @param int|string $current_page
3562 - * @param array $action
3563 - *
3564 - * @return void
3565 2571 */
3566 2572 public static function select_current_page( $page, $current_page, $action = array() ) {
3567 - // phpcs:ignore Universal.Operators.StrictComparisons
3568 2573 if ( $current_page != $page ) {
3569 2574 return;
3570 2575 }
3571 2576
3572 2577 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3573 -
3574 2578 if ( 'lite-reports' === $frm_action ) {
3575 2579 $frm_action = 'reports';
3576 2580 }
3577 2581
3578 - if ( ! $action || ( $frm_action && in_array( $frm_action, $action, true ) ) ) {
2582 + if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3579 2583 echo ' class="current_page"';
3580 2584 }
3581 2585 }
3582 2586
@@ -3606,19 +2610,14 @@
3606 2610
3607 2611 // Add extra slashes for \r\n since WP strips them.
3608 2612 $post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
3609 2613
3610 - // Allow for &quot
3611 - return str_replace( '&quot;', '\\"', $post_content );
2614 + // allow for &quot
2615 + $post_content = str_replace( '&quot;', '\\"', $post_content );
2616 +
2617 + return $post_content;
3612 2618 }
3613 2619
3614 - /**
3615 - * @param array|string $val
3616 - * @param int|string $key
3617 - * @param array $post_content
3618 - *
3619 - * @return void
3620 - */
3621 2620 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3622 2621 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3623 2622 return;
3624 2623 }
@@ -3627,28 +2626,22 @@
3627 2626 foreach ( $val as $k1 => $v1 ) {
3628 2627 self::prepare_action_slashes( $v1, $k1, $post_content[ $key ] );
3629 2628 unset( $k1, $v1 );
3630 2629 }
2630 + } else {
2631 + // Strip all slashes so everything is the same, no matter where the value is coming from
2632 + $val = stripslashes( $val );
3631 2633
3632 - return;
2634 + // Add backslashes before double quotes and forward slashes only
2635 + $post_content[ $key ] = addcslashes( $val, '"\\/' );
3633 2636 }
3634 -
3635 - // Strip all slashes so everything is the same, no matter where the value is coming from
3636 - $val = stripslashes( $val );
3637 -
3638 - // Add backslashes before double quotes and forward slashes only
3639 - $post_content[ $key ] = addcslashes( $val, '"\\/' );
3640 2637 }
3641 2638
3642 2639 /**
3643 - * 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
3644 2641 * all data to json.
3645 2642 *
3646 2643 * @since 4.02.03
3647 - *
3648 - * @param array|string $value
3649 - *
3650 - * @return void
3651 2644 */
3652 2645 public static function unserialize_or_decode( &$value ) {
3653 2646 if ( is_array( $value ) ) {
3654 2647 return;
@@ -3653,34 +2646,13 @@
3653 2646 if ( is_array( $value ) ) {
3654 2647 return;
3655 2648 }
3656 2649
3657 - $value = is_serialized( $value ) ? self::maybe_unserialize_array( $value ) : self::maybe_json_decode( $value, false );
3658 - }
3659 -
3660 - /**
3661 - * Safely unserialize an array if necessary.
3662 - * This function doesn't actually use unserialize. The string is parsed instead.
3663 - *
3664 - * @since 6.2
3665 - *
3666 - * @param mixed $value
3667 - *
3668 - * @return mixed
3669 - */
3670 - public static function maybe_unserialize_array( $value ) {
3671 - if ( ! is_string( $value ) ) {
3672 - return $value;
2650 + if ( is_serialized( $value ) ) {
2651 + $value = maybe_unserialize( $value );
2652 + } else {
2653 + $value = self::maybe_json_decode( $value, false );
3673 2654 }
3674 -
3675 - // Since we only expect an array, skip anything that doesn't start with a:.
3676 - if ( ! is_serialized( $value ) || ! str_starts_with( $value, 'a:' ) ) {
3677 - return $value;
3678 - }
3679 -
3680 - $parsed = FrmSerializedStringParserHelper::get()->parse( $value );
3681 -
3682 - return is_array( $parsed ) ? $parsed : $value;
3683 2655 }
3684 2656
3685 2657 /**
3686 2658 * Decode a JSON string.
@@ -3685,12 +2657,11 @@
3685 2657 /**
3686 2658 * Decode a JSON string.
3687 2659 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3688 2660 *
3689 - * @param array|string|null $string
3690 - * @param bool $single_to_array
3691 - *
3692 - * @return array|string|null
2661 + * @param mixed $string
2662 + * @param bool $single_to_array
2663 + * @return mixed
3693 2664 */
3694 2665 public static function maybe_json_decode( $string, $single_to_array = true ) {
3695 2666 if ( is_array( $string ) || is_null( $string ) ) {
3696 2667 return $string;
@@ -3695,51 +2666,21 @@
3695 2666 if ( is_array( $string ) || is_null( $string ) ) {
3696 2667 return $string;
3697 2668 }
3698 2669
3699 - $new_string = json_decode( $string, true );
3700 - $single_value = false;
3701 -
3702 - if ( ! $single_to_array ) {
3703 - $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3704 - }
3705 -
3706 - if ( json_last_error() === JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
3707 - return $new_string;
3708 - }
3709 -
3710 - return $string;
3711 - }
3712 -
3713 - /**
3714 - * @since 6.2.3
3715 - *
3716 - * @param string $value
3717 - *
3718 - * @return string
3719 - */
3720 - public static function maybe_utf8_encode( $value ) {
3721 - $from_format = 'ISO-8859-1';
3722 - $to_format = 'UTF-8';
3723 -
3724 - if ( function_exists( 'mb_check_encoding' ) && function_exists( 'mb_convert_encoding' ) ) {
3725 - if ( mb_check_encoding( $value, $from_format ) ) {
3726 - 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] );
3727 2676 }
3728 -
3729 - return $value;
3730 - }
3731 -
3732 - if ( function_exists( 'iconv' ) ) {
3733 - $converted = iconv( $from_format, $to_format, $value );
3734 -
3735 - // Value is false if $value is not ISO-8859-1.
3736 - if ( false !== $converted ) {
3737 - return $converted;
2677 + if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
2678 + $string = $new_string;
3738 2679 }
3739 2680 }
3740 2681
3741 - return $value;
2682 + return $string;
3742 2683 }
3743 2684
3744 2685 /**
3745 2686 * Reformat the json serialized array in name => value array.
@@ -3744,12 +2685,8 @@
3744 2685 /**
3745 2686 * Reformat the json serialized array in name => value array.
3746 2687 *
3747 2688 * @since 4.02.03
3748 - *
3749 - * @param array $form
3750 - *
3751 - * @return void
3752 2689 */
3753 2690 public static function format_form_data( &$form ) {
3754 2691 $formatted = array();
3755 2692
@@ -3756,21 +2693,18 @@
3756 2693 foreach ( $form as $input ) {
3757 2694 if ( ! isset( $input['name'] ) ) {
3758 2695 continue;
3759 2696 }
3760 -
3761 2697 $key = $input['name'];
3762 -
3763 - 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 {
3764 2705 $formatted[ $key ] = $input['value'];
3765 - continue;
3766 2706 }
3767 -
3768 - if ( is_array( $formatted[ $key ] ) ) {
3769 - $formatted[ $key ][] = $input['value'];
3770 - } else {
3771 - $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
3772 - }
3773 2707 }
3774 2708
3775 2709 parse_str( http_build_query( $formatted ), $form );
3776 2710 }
@@ -3776,34 +2710,30 @@
3776 2710 }
3777 2711
3778 2712 /**
3779 2713 * @since 4.02.03
3780 - *
3781 - * @param array|string $value
3782 - *
3783 - * @return string
3784 2714 */
3785 2715 public static function maybe_json_encode( $value ) {
3786 - return is_array( $value ) ? wp_json_encode( $value ) : $value;
2716 + if ( is_array( $value ) ) {
2717 + $value = wp_json_encode( $value );
2718 + }
2719 + return $value;
3787 2720 }
3788 2721
3789 2722 /**
3790 - * Echo The javascript to open and highlight the Formidable menu
3791 - *
3792 2723 * @since 1.07.10
3793 2724 *
3794 - * @param string $post_type The name of the post type that may need to be highlighted.
3795 - *
3796 - * @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
3797 2727 */
3798 2728 public static function maybe_highlight_menu( $post_type ) {
3799 2729 global $post;
3800 2730
3801 - if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] !== $post_type ) {
2731 + if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] != $post_type ) {
3802 2732 return;
3803 2733 }
3804 2734
3805 - if ( is_object( $post ) && $post->post_type !== $post_type ) {
2735 + if ( is_object( $post ) && $post->post_type != $post_type ) {
3806 2736 return;
3807 2737 }
3808 2738
3809 2739 self::load_admin_wide_js();
@@ -3813,12 +2743,8 @@
3813 2743 /**
3814 2744 * Load the JS file on non-Formidable pages in the admin area
3815 2745 *
3816 2746 * @since 2.0
3817 - *
3818 - * @param bool $load
3819 - *
3820 - * @return void
3821 2747 */
3822 2748 public static function load_admin_wide_js( $load = true ) {
3823 2749 $version = self::plugin_version();
3824 2750 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
@@ -3828,13 +2754,12 @@
3828 2754 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3829 2755 'url' => self::plugin_url(),
3830 2756 'app_url' => 'https://formidableforms.com/',
3831 2757 'applicationsUrl' => admin_url( 'admin.php?page=formidable-applications' ),
3832 - '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' ),
3833 2759 'loading' => __( 'Loading&hellip;', 'formidable' ),
3834 2760 'nonce' => wp_create_nonce( 'frm_ajax' ),
3835 2761 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3836 - 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
3837 2762 );
3838 2763 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
3839 2764
3840 2765 if ( $load ) {
@@ -3843,10 +2768,8 @@
3843 2768 }
3844 2769
3845 2770 /**
3846 2771 * @since 2.0.9
3847 - *
3848 - * @return void
3849 2772 */
3850 2773 public static function load_font_style() {
3851 2774 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
3852 2775 }
@@ -3852,147 +2775,99 @@
3852 2775 }
3853 2776
3854 2777 /**
3855 2778 * @param string $location
3856 - *
3857 - * @return void
3858 2779 */
3859 2780 public static function localize_script( $location ) {
3860 - global $wp_scripts, $wp_version;
2781 + global $wp_scripts;
3861 2782
2783 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2784 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2785 +
3862 2786 $script_strings = array(
3863 - 'ajax_url' => esc_url_raw( self::get_ajax_url() ),
3864 - 'images_url' => self::plugin_url() . '/images',
3865 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
3866 - 'remove' => __( 'Remove', 'formidable' ),
3867 - 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
3868 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
3869 - 'id' => __( 'ID', 'formidable' ),
3870 - 'no_results' => __( 'No results match', 'formidable' ),
3871 - 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
3872 - 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
3873 - 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
3874 - 'focus_first_error' => self::should_focus_first_error(),
3875 - 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3876 - // We need to keep this setting for a few versions because Pro checks for this.
3877 - '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(),
3878 2800 );
3879 2801
3880 2802 $data = $wp_scripts->get_data( 'formidable', 'data' );
3881 -
3882 - if ( ! $data ) {
2803 + if ( empty( $data ) ) {
3883 2804 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3884 2805 }
3885 2806
3886 - if ( $location === 'admin' ) {
2807 + if ( $location == 'admin' ) {
2808 + $frm_settings = self::get_settings();
3887 2809 $admin_script_strings = array(
3888 - 'desc' => __( '(Click to add description)', 'formidable' ),
3889 - 'blank' => __( '(Blank)', 'formidable' ),
3890 - 'no_label' => self::get_no_label_text(),
3891 - 'ok' => __( 'OK', 'formidable' ),
3892 - 'cancel' => __( 'Cancel', 'formidable' ),
3893 - 'default_label' => __( 'Default', 'formidable' ),
3894 - 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
3895 - 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
3896 - 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
3897 - 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
3898 - 'confirm' => __( 'Are you sure?', 'formidable' ),
3899 - 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
3900 - '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
3901 - 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
3902 - 'default_unique' => FrmFieldsHelper::default_unique_msg(),
3903 - 'default_conf' => __( 'The entered values do not match', 'formidable' ),
3904 - 'enter_email' => __( 'Enter Email', 'formidable' ),
3905 - 'confirm_email' => __( 'Confirm Email', 'formidable' ),
3906 - 'conditional_text' => __( 'Conditional content here', 'formidable' ),
3907 - 'new_option' => __( 'New Option', 'formidable' ),
3908 - '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
3909 - 'enter_password' => __( 'Enter Password', 'formidable' ),
3910 - 'confirm_password' => __( 'Confirm Password', 'formidable' ),
3911 - 'import_complete' => __( 'Import Complete', 'formidable' ),
3912 - 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
3913 - 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
3914 - 'private_label' => __( 'Private', 'formidable' ),
3915 - 'jquery_ui_url' => '',
3916 - 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
3917 - 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
3918 - 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
3919 - 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
3920 - 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
3921 - /* translators: %d is the number of allowed actions per form */
3922 - 'only_one_action' => sprintf( __( 'This form action is limited to %d per form.', 'formidable' ), 1 ),
3923 - 'edit_action_text' => __( 'Please edit the existing form action.', 'formidable' ),
3924 - '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(),
3925 2848 /* Translators: %s is the name of a Detail Page Slug that is a reserved word.*/
3926 - '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' ), '****' ),
3927 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. */
3928 - '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
3929 - 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
3930 - 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
3931 - 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
3932 - 'install' => __( 'Install', 'formidable' ),
3933 - 'active' => __( 'Active', 'formidable' ),
3934 - 'installed' => __( 'Installed', 'formidable' ),
3935 - 'not_installed' => __( 'Not Installed', 'formidable' ),
3936 - 'select_a_field' => __( 'Select a Field', 'formidable' ),
3937 - 'no_items_found' => __( 'No items found.', 'formidable' ),
3938 - 'field_already_used' => __( 'Oops. You have already used that field.', 'formidable' ),
3939 -
3940 - // Deprecated in 6.0.
3941 - 'saving' => '',
3942 -
3943 - // Deprecated in 6.0.
3944 - 'saved' => '',
3945 -
3946 - // translators: %1$s: HTML open tag, %2$s: HTML end tag.
3947 - 'holdShiftMsg' => esc_html__( 'You can hold %1$sShift%2$s on your keyboard to select multiple fields', 'formidable' ),
3948 - 'noTitleText' => FrmFormsHelper::get_no_title_text(),
3949 -
3950 - // In older versions this event listener causes the section to immediately close again
3951 - // When the h3 element is clicked. It's only required in WP 6.7+.
3952 - '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' ),
3953 2859 );
3954 - /**
3955 - * @param array $admin_script_strings
3956 - */
3957 2860 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3958 2861
3959 2862 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3960 -
3961 - if ( ! $data ) {
2863 + if ( empty( $data ) ) {
3962 2864 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3963 2865 }
3964 - }//end if
2866 + }
3965 2867 }
3966 2868
3967 2869 /**
3968 - * Get the no label text.
3969 - *
3970 - * @since 6.25.1
3971 - *
3972 - * @return string
3973 - */
3974 - public static function get_no_label_text() {
3975 - return __( '(no label)', 'formidable' );
3976 - }
3977 -
3978 - /**
3979 - * @since 6.5
3980 - *
3981 - * @return string
3982 - */
3983 - public static function get_ajax_url() {
3984 - $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
3985 -
3986 - /**
3987 - * @since 2.0.13
3988 - *
3989 - * @param string $ajax_url
3990 - */
3991 - return apply_filters( 'frm_ajax_url', $ajax_url );
3992 - }
3993 -
3994 - /**
3995 2870 * Returns whether or not the first errored input should be auto-focused (default true).
3996 2871 *
3997 2872 * @since 5.2.05
3998 2873 *
@@ -4017,11 +2892,9 @@
4017 2892 * Echo the message on the plugins listing page
4018 2893 *
4019 2894 * @since 1.07.10
4020 2895 *
4021 - * @param float $min_version The version the add-on requires.
4022 - *
4023 - * @return void
2896 + * @param float $min_version The version the add-on requires
4024 2897 */
4025 2898 public static function min_version_notice( $min_version ) {
4026 2899 $frm_version = self::plugin_version();
4027 2900
@@ -4030,11 +2903,11 @@
4030 2903 return;
4031 2904 }
4032 2905
4033 2906 $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
4034 - 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
4035 - esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
4036 - '</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>';
4037 2910 }
4038 2911
4039 2912 /**
4040 2913 * If Pro is far outdated, show a message.
@@ -4040,10 +2913,8 @@
4040 2913 * If Pro is far outdated, show a message.
4041 2914 *
4042 2915 * @since 4.0.01
4043 2916 *
4044 - * @param string $min_version
4045 - *
4046 2917 * @return void
4047 2918 */
4048 2919 public static function min_pro_version_notice( $min_version ) {
4049 2920 if ( ! self::is_formidable_admin() ) {
@@ -4053,14 +2924,26 @@
4053 2924
4054 2925 self::php_version_notice();
4055 2926
4056 2927 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4057 -
4058 2928 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4059 2929 return;
4060 2930 }
4061 2931
4062 - 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
4063 2946 }
4064 2947
4065 2948 /**
4066 2949 * If Pro is installed, check the version number.
@@ -4065,12 +2948,8 @@
4065 2948 /**
4066 2949 * If Pro is installed, check the version number.
4067 2950 *
4068 2951 * @since 4.0.01
4069 - *
4070 - * @param string $min_version
4071 - *
4072 - * @return bool
4073 2952 */
4074 2953 public static function meets_min_pro_version( $min_version ) {
4075 2954 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4076 2955 }
@@ -4075,35 +2954,35 @@
4075 2954 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4076 2955 }
4077 2956
4078 2957 /**
4079 - * 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.
4080 2959 *
4081 2960 * @since 4.0.02
4082 - *
4083 - * @return void
4084 2961 */
4085 2962 private static function php_version_notice() {
4086 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 + }
4087 2967
4088 - if ( version_compare( phpversion(), '7.0', '<' ) ) {
4089 - $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' );
4090 2972 }
4091 2973
4092 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4093 2974 foreach ( $message as $m ) {
4094 2975 ?>
4095 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2976 + <div class="error frm_previous_install">
4096 2977 <?php echo esc_html( $m ); ?>
4097 2978 </div>
4098 2979 <?php
4099 2980 }
4100 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
4101 2981 }
4102 2982
4103 2983 /**
4104 2984 * @param string $type
4105 - *
4106 2985 * @return array<string,string>
4107 2986 */
4108 2987 public static function locales( $type = 'date' ) {
4109 2988 $locales = array(
@@ -4197,12 +3076,12 @@
4197 3076 'zu' => __( 'Zulu', 'formidable' ),
4198 3077 );
4199 3078
4200 3079 if ( $type === 'captcha' ) {
4201 - // Remove the languages unavailable for the captcha
3080 + // remove the languages unavailable for the captcha
4202 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' );
4203 3082 } else {
4204 - // Remove the languages unavailable for the datepicker
3083 + // remove the languages unavailable for the datepicker
4205 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' );
4206 3085 }
4207 3086
4208 3087 $locales = array_diff_key( $locales, array_flip( $unset ) );
@@ -4209,31 +3088,36 @@
4209 3088
4210 3089 /**
4211 3090 * Filter available locale options.
4212 3091 *
4213 - * @since 5.4.5 Added $args parameter with type.
3092 + * @since x.x Added $args parameter with type.
4214 3093 *
4215 3094 * @param array<string,string> $locales
4216 3095 * @param array $args {
4217 - *
4218 3096 * @type string $type
4219 3097 * }
4220 3098 */
4221 - return apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3099 + $locales = apply_filters( 'frm_locales', $locales, compact( 'type' ) );
3100 +
3101 + return $locales;
4222 3102 }
4223 3103
4224 3104 /**
4225 - * @return string
3105 + * Output HTML containing reference text for accessibility
3106 + *
3107 + * @deprecated 5.1
4226 3108 */
3109 + public static function multiselect_accessibility() {
3110 + _deprecated_function( __METHOD__, '5.1' );
3111 + }
3112 +
4227 3113 public static function get_menu_icon_class() {
4228 3114 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4229 3115 $settings = FrmProAppHelper::get_settings();
4230 -
4231 3116 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4232 3117 return $settings->menu_icon;
4233 3118 }
4234 3119 }
4235 -
4236 3120 return 'frmfont frm_logo_icon';
4237 3121 }
4238 3122
4239 3123 /**
@@ -4251,9 +3135,10 @@
4251 3135 * @type array $input_attrs Attributes of value input.
4252 3136 * }
4253 3137 */
4254 3138 public static function images_dropdown( $args ) {
4255 - $args = self::fill_default_images_dropdown_args( $args );
3139 + $args = self::fill_default_images_dropdown_args( $args );
3140 +
4256 3141 $input_attrs_str = self::get_images_dropdown_input_attrs( $args );
4257 3142 ob_start();
4258 3143 include self::plugin_path() . '/classes/views/shared/images-dropdown.php';
4259 3144 $output = ob_get_clean();
@@ -4274,9 +3159,8 @@
4274 3159 *
4275 3160 * @since 5.0.04
4276 3161 *
4277 3162 * @param array $args The arguments.
4278 - *
4279 3163 * @return array
4280 3164 */
4281 3165 private static function fill_default_images_dropdown_args( $args ) {
4282 3166 $defaults = array(
@@ -4289,8 +3173,14 @@
4289 3173
4290 3174 $new_args['options'] = (array) $new_args['options'];
4291 3175 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4292 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 +
4293 3183 /**
4294 3184 * Allows modifying the arguments of images_dropdown() method.
4295 3185 *
4296 3186 * @since 5.0.04
@@ -4306,9 +3196,8 @@
4306 3196 *
4307 3197 * @since 5.0.04
4308 3198 *
4309 3199 * @param array $args The arguments.
4310 - *
4311 3200 * @return string
4312 3201 */
4313 3202 private static function get_images_dropdown_input_attrs( $args ) {
4314 3203 $input_attrs = $args['input_attrs'];
@@ -4315,9 +3204,8 @@
4315 3204 $input_attrs['type'] = 'radio';
4316 3205 $input_attrs['name'] = $args['name'];
4317 3206
4318 3207 $input_attrs_str = '';
4319 -
4320 3208 foreach ( $input_attrs as $key => $input_attr ) {
4321 3209 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4322 3210 }
4323 3211
@@ -4332,23 +3220,8 @@
4332 3220 return apply_filters( 'frm_images_dropdown_input_attrs', $input_attrs_str, $args );
4333 3221 }
4334 3222
4335 3223 /**
4336 - * @since 6.7.1
4337 - *
4338 - * @param array $option Option data.
4339 - * @param array $args The arguments of images_dropdown() method.
4340 - *
4341 - * @return array
4342 - */
4343 - public static function get_images_dropdown_atts( $option, $args ) {
4344 - $image = self::get_images_dropdown_option_image( $option, $args );
4345 - $classes = self::get_images_dropdown_option_classes( $option, $args );
4346 - $custom_attrs = self::get_images_dropdown_option_html_attrs( $option, $args );
4347 - return compact( 'image', 'classes', 'custom_attrs' );
4348 - }
4349 -
4350 - /**
4351 3224 * Gets the image of each option in images_dropdown() method.
4352 3225 *
4353 3226 * @since 5.0.04
4354 3227 *
@@ -4353,9 +3226,8 @@
4353 3226 * @since 5.0.04
4354 3227 *
4355 3228 * @param array $option Option data.
4356 3229 * @param array $args The arguments of images_dropdown() method.
4357 - *
4358 3230 * @return string
4359 3231 */
4360 3232 private static function get_images_dropdown_option_image( $option, $args ) {
4361 3233 $image = self::icon_by_class(
@@ -4360,9 +3232,9 @@
4360 3232 private static function get_images_dropdown_option_image( $option, $args ) {
4361 3233 $image = self::icon_by_class(
4362 3234 'frmfont ' . $option['svg'],
4363 3235 array(
4364 - 'echo' => false,
3236 + 'echo' => false,
4365 3237 )
4366 3238 );
4367 3239
4368 3240 $args['option'] = $option;
@@ -4384,9 +3256,8 @@
4384 3256 * @since 5.0.04
4385 3257 *
4386 3258 * @param array $option Option data.
4387 3259 * @param array $args The arguments of images_dropdown() method.
4388 - *
4389 3260 * @return string
4390 3261 */
4391 3262 private static function get_images_dropdown_option_classes( $option, $args ) {
4392 3263 $classes = '';
@@ -4414,19 +3285,17 @@
4414 3285 * @since 5.0.04
4415 3286 *
4416 3287 * @param array $option Option data.
4417 3288 * @param array $args The arguments of images_dropdown() method.
4418 - *
4419 3289 * @return string
4420 3290 */
4421 3291 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4422 3292 $html_attrs = '';
4423 -
4424 3293 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4425 3294 $html_attrs_arr = array();
4426 3295
4427 3296 foreach ( $option['custom_attrs'] as $key => $value ) {
4428 - if ( in_array( $key, array( 'type', 'class', 'data-value' ), true ) ) {
3297 + if ( in_array( $key, array( 'type', 'class', 'data-value' ) ) ) {
4429 3298 continue;
4430 3299 }
4431 3300
4432 3301 $html_attrs_arr[] = sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $value ) );
@@ -4484,9 +3353,8 @@
4484 3353 * @since 5.0.07
4485 3354 *
4486 3355 * @param array $values
4487 3356 * @param array $keys
4488 - *
4489 3357 * @return array
4490 3358 */
4491 3359 public static function maybe_filter_array( $values, $keys ) {
4492 3360 $allow_unfiltered_html = self::allow_unfiltered_html();
@@ -4504,87 +3372,36 @@
4504 3372 return $values;
4505 3373 }
4506 3374
4507 3375 /**
4508 - * Some back end fields allow privileged users to add scripts.
3376 + * Some back end fields allow privleged users to add scripts.
4509 3377 * A site that uses the DISALLOW_UNFILTERED_HTML always remove scripts on echo.
4510 3378 *
4511 3379 * @since 5.0.13
4512 3380 *
4513 3381 * @param string $value
4514 - * @param array|string $allowed 'all' for everything included as defaults.
4515 - *
3382 + * @param array|string $allowed 'all' for everything included as defaults
4516 3383 * @return string
4517 3384 */
4518 3385 public static function maybe_kses( $value, $allowed = 'all' ) {
4519 3386 if ( self::should_never_allow_unfiltered_html() ) {
4520 - return self::kses( $value, $allowed );
3387 + $value = self::kses( $value, $allowed );
4521 3388 }
4522 3389 return $value;
4523 3390 }
4524 3391
4525 3392 /**
4526 - * Check if an option attribute used in an [input] shortcode is safe.
3393 + * @since 5.0.16
4527 3394 *
4528 - * @since 6.11.2
4529 - *
4530 - * @param string $key
4531 - * @param string $context Either 'display' or 'update'. On update, we want to allow a few keys that are never displayed.
4532 - *
4533 3395 * @return bool
4534 3396 */
4535 - public static function input_key_is_safe( $key, $context = 'display' ) {
4536 - if ( 'update' === $context && in_array( $key, array( 'opt', 'label' ), true ) ) {
4537 - $safe = true;
4538 - } elseif ( str_starts_with( $key, 'data-' ) ) {
4539 - // Allow all data attributes.
4540 - $safe = true;
4541 - } elseif ( str_starts_with( $key, 'aria-' ) ) {
4542 - // Allow all aria attributes.
4543 - $safe = true;
4544 - } else {
4545 - $safe_keys = array(
4546 - 'class',
4547 - 'required',
4548 - 'title',
4549 - 'placeholder',
4550 - 'value',
4551 - 'readonly',
4552 - 'disabled',
4553 - 'size',
4554 - 'maxlength',
4555 - 'min',
4556 - 'max',
4557 - 'pattern',
4558 - 'step',
4559 - 'autofocus',
4560 - 'width',
4561 - 'height',
4562 - 'autocomplete',
4563 - 'tabindex',
4564 - 'role',
4565 - 'style',
4566 - );
4567 - $safe = in_array( $key, $safe_keys, true );
4568 - }//end if
4569 -
4570 - /**
4571 - * Filter the $safe value so additional keys can be allowed or disallowed.
4572 - *
4573 - * @since 6.11.2
4574 - *
4575 - * @param bool $safe True if the key is considered safe.
4576 - * @param string $key
4577 - * @param string $context Either 'display' or 'update'.
4578 - */
4579 - 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' );
4580 3399 }
4581 3400
4582 3401 /**
4583 3402 * @since 5.0.16
4584 3403 *
4585 - * @param string $medium
4586 - *
4587 3404 * @return array
4588 3405 */
4589 3406 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
4590 3407 $params = array(
@@ -4591,9 +3408,8 @@
4591 3408 'medium' => $medium,
4592 3409 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4593 3410 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4594 3411 'screenshot' => 'landing.png',
4595 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
4596 3412 );
4597 3413 return self::get_upgrade_data_params( 'landing', $params );
4598 3414 }
4599 3415
@@ -4599,36 +3415,36 @@
4599 3415
4600 3416 /**
4601 3417 * @since 5.0.17
4602 3418 *
4603 - * @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
4604 3429 *
3430 + * @param string
4605 3431 * @return bool
4606 3432 */
4607 3433 public static function show_new_feature( $feature ) {
4608 3434 $link = FrmAddonsController::install_link( $feature );
4609 -
4610 - if ( array_key_exists( 'status', $link ) || array_key_exists( 'class', $link ) ) {
4611 - return true;
4612 - }
4613 -
4614 - return 'coupons' === $feature && class_exists( 'FrmCouponsAppController' );
3435 + return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4615 3436 }
4616 3437
4617 3438 /**
4618 - * Enhances upgrade data parameters with installation link and plan requirement information.
4619 - *
4620 3439 * @since 5.0.17
4621 3440 *
4622 - * @param string $plugin The plugin slug to get installation data for.
4623 - * @param array $params Initial parameters for the upgrade data.
4624 - * @param bool $detailed Whether to include detailed information.
4625 - *
4626 - * @return array Modified parameters with installation data.
3441 + * @param string $plugin
3442 + * @param array $params
3443 + * @return array
4627 3444 */
4628 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
3445 + public static function get_upgrade_data_params( $plugin, $params ) {
4629 3446 $link = FrmAddonsController::install_link( $plugin );
4630 -
4631 3447 if ( ! $link ) {
4632 3448 return $params;
4633 3449 }
4634 3450
@@ -4634,20 +3450,15 @@
4634 3450
4635 3451 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4636 3452 $params['oneclick'] = json_encode( $link );
4637 3453 unset( $params['message'] );
4638 -
4639 3454 if ( ! isset( $params['medium'] ) ) {
4640 3455 $params['medium'] = $plugin;
4641 3456 }
4642 3457 } else {
4643 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
3458 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4644 3459 }
4645 3460
4646 - if ( $detailed ) {
4647 - $params['plugin-status'] = $link['status'] ?? '';
4648 - }
4649 -
4650 3461 return $params;
4651 3462 }
4652 3463
4653 3464 /**
@@ -4656,9 +3467,8 @@
4656 3467 *
4657 3468 * @since 5.0.17
4658 3469 *
4659 3470 * @param string $text
4660 - *
4661 3471 * @return bool
4662 3472 */
4663 3473 public static function ctype_xdigit( $text ) {
4664 3474 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4673,14 +3483,12 @@
4673 3483 * @since 5.2.01
4674 3484 */
4675 3485 public static function set_current_screen_and_hook_suffix() {
4676 3486 global $hook_suffix;
4677 -
4678 3487 if ( is_null( $hook_suffix ) ) {
4679 3488 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4680 3489 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4681 3490 }
4682 -
4683 3491 set_current_screen();
4684 3492 }
4685 3493
4686 3494 /**
@@ -4687,15 +3495,15 @@
4687 3495 * Shows pill text.
4688 3496 *
4689 3497 * @since 5.2.02
4690 3498 *
4691 - * @param string|null $text Text in the pill. Default is NEW.
3499 + * @param string $text Text in the pill. Default is NEW.
4692 3500 */
4693 3501 public static function show_pill_text( $text = null ) {
4694 3502 if ( null === $text ) {
4695 3503 $text = __( 'NEW', 'formidable' );
4696 3504 }
4697 - echo '<span class="frm-meta-tag frm-new-pill">' . esc_html( $text ) . '</span>';
3505 + echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
4698 3506 }
4699 3507
4700 3508 /**
4701 3509 * Count the number of decimals digits.
@@ -4702,10 +3510,9 @@
4702 3510 *
4703 3511 * @since 5.2.07
4704 3512 *
4705 3513 * @param mixed $num Number.
4706 - *
4707 - * @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.
4708 3515 */
4709 3516 public static function count_decimals( $num ) {
4710 3517 if ( ! is_numeric( $num ) ) {
4711 3518 return false;
@@ -4712,9 +3519,8 @@
4712 3519 }
4713 3520
4714 3521 $num = (string) $num;
4715 3522 $parts = explode( '.', $num );
4716 -
4717 3523 if ( 1 === count( $parts ) ) {
4718 3524 return 0;
4719 3525 }
4720 3526
@@ -4737,9 +3543,9 @@
4737 3543 }
4738 3544
4739 3545 add_filter(
4740 3546 'option_gmt_offset',
4741 - function ( $offset ) {
3547 + function( $offset ) {
4742 3548 if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
4743 3549 // Leave a valid value alone.
4744 3550 return $offset;
4745 3551 }
@@ -4775,281 +3581,221 @@
4775 3581 return array( 'list', 'trash', 'untrash', 'destroy' );
4776 3582 }
4777 3583
4778 3584 /**
4779 - * Safely call get_plugins, importing the required files if they are not yet loaded.
4780 - *
4781 - * @since 5.5
4782 - *
4783 - * @return array
3585 + * @since 4.08
3586 + * @deprecated 4.09.01
4784 3587 */
4785 - public static function get_plugins() {
4786 - if ( ! function_exists( 'get_plugins' ) ) {
4787 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
3588 + public static function expiring_message() {
3589 + _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3590 + if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3591 + FrmProAddonsController::expiring_message();
4788 3592 }
4789 - return get_plugins();
4790 3593 }
4791 3594
4792 3595 /**
4793 - * 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.
4794 - * This is to make sure that the URL can't be exploited for a SSRF attack.
3596 + * Use the WP 4.7 wp_doing_ajax function
4795 3597 *
4796 - * @since 5.5.5
4797 - *
4798 - * @param string $url
4799 - * @param string $expected_extension
4800 - *
4801 - * @return bool
3598 + * @since 2.05.07
3599 + * @deprecated 4.04.04
4802 3600 */
4803 - public static function validate_url_is_in_s3_bucket( $url, $expected_extension ) {
4804 - $file_is_in_expected_s3_bucket = str_starts_with( $url, 'https://s3.amazonaws.com/fp.strategy11.com' );
3601 + public static function wp_doing_ajax() {
3602 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3603 + return wp_doing_ajax();
3604 + }
4805 3605
4806 - if ( ! $file_is_in_expected_s3_bucket ) {
4807 - return false;
4808 - }
3606 + /**
3607 + * @deprecated 4.0
3608 + */
3609 + public static function insert_opt_html( $args ) {
3610 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3611 + FrmFormsHelper::insert_opt_html( $args );
3612 + }
4809 3613
4810 - $parsed = parse_url( $url );
3614 + /**
3615 + * Used to filter shortcode in text widgets
3616 + *
3617 + * @deprecated 2.5.4
3618 + * @codeCoverageIgnore
3619 + */
3620 + public static function widget_text_filter_callback( $matches ) {
3621 + return FrmDeprecated::widget_text_filter_callback( $matches );
3622 + }
4811 3623
4812 - if ( ! is_array( $parsed ) ) {
4813 - // URL is malformed.
4814 - return false;
4815 - }
4816 -
4817 - $path = $parsed['path'];
4818 - $ext = pathinfo( $path, PATHINFO_EXTENSION );
4819 - // The URL isn't to an XML file.
4820 - return $expected_extension === $ext;
3624 + /**
3625 + * @deprecated 3.01
3626 + * @codeCoverageIgnore
3627 + */
3628 + public static function sanitize_array( &$values ) {
3629 + FrmDeprecated::sanitize_array( $values );
4821 3630 }
4822 3631
4823 3632 /**
4824 - * Display a dismissable warning message and save its dismissal state.
3633 + * @param array $settings
3634 + * @param string $group
4825 3635 *
4826 - * @since 6.3
4827 - *
4828 - * @param string $message The warning message to display.
4829 - * @param string $option The unique identifier for the dismissal state of the message and the WP Ajax action.
4830 - *
4831 - * @return void
3636 + * @since 2.0.6
3637 + * @deprecated 2.05.06
3638 + * @codeCoverageIgnore
4832 3639 */
4833 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4834 - if ( ! $message || ! $option ) {
4835 - return;
4836 - }
3640 + public static function save_settings( $settings, $group ) {
3641 + return FrmDeprecated::save_settings( $settings, $group );
3642 + }
4837 3643
4838 - $ajax_callback = function () use ( $option ) {
4839 - self::dismiss_warning_message( $option );
4840 - };
4841 -
4842 - // We're handling JS codes with `doJsonPost` and it adds 'frm_' to the beginning of the action.
4843 - // To prevent any issues, we add 'frm_' from the beginning of the action.
4844 - add_action( 'wp_ajax_frm_' . $option, $ajax_callback );
4845 -
4846 - add_filter(
4847 - 'frm_message_list',
4848 - function ( $show_messages ) use ( $message, $option ) {
4849 - if ( get_option( $option, false ) ) {
4850 - return $show_messages;
4851 - }
4852 -
4853 - $dismiss_icon = self::icon_by_class(
4854 - 'frmfont frm_close_icon',
4855 - array(
4856 - 'aria-label' => _x( 'Dismiss', 'warning message: close icon label', 'formidable' ),
4857 - 'echo' => false,
4858 - )
4859 - );
4860 -
4861 - $show_messages[] = $message;
4862 - $show_messages[] = '<span class="frm-warning-dismiss frmsvg" data-action="' . esc_attr( $option ) . '">' . $dismiss_icon . '</span>';
4863 -
4864 - return $show_messages;
4865 - }
4866 - );
3644 + /**
3645 + * @since 2.0.4
3646 + * @deprecated 2.05.06
3647 + * @codeCoverageIgnore
3648 + */
3649 + public static function save_json_post( $settings ) {
3650 + return FrmDeprecated::save_json_post( $settings );
4867 3651 }
4868 3652
4869 3653 /**
4870 - * Dismiss a warning message and update the dismissal state.
3654 + * @since 2.0
3655 + * @deprecated 2.05.06
3656 + * @codeCoverageIgnore
4871 3657 *
4872 - * @since 6.3
3658 + * @param string $cache_key The unique name for this cache
3659 + * @param string $group The name of the cache group
3660 + * @param string $query If blank, don't run a db call
3661 + * @param string $type The wpdb function to use with this query
4873 3662 *
4874 - * @param string $option The unique identifier for the dismissal state of the message.
4875 - *
4876 - * @return void
3663 + * @return mixed $results The cache or query results
4877 3664 */
4878 - public static function dismiss_warning_message( $option = '' ) {
4879 - self::permission_check( 'frm_change_settings' );
4880 - check_ajax_referer( 'frm_ajax', 'nonce' );
3665 + public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
3666 + return FrmDeprecated::check_cache( $cache_key, $group, $query, $type, $time );
3667 + }
4881 3668
4882 - if ( $option ) {
4883 - update_option( $option, true, false );
4884 - }
3669 + /**
3670 + * @deprecated 2.05.06
3671 + * @codeCoverageIgnore
3672 + */
3673 + public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
3674 + return FrmDeprecated::set_cache( $cache_key, $results, $group, $time );
3675 + }
4885 3676
4886 - wp_send_json_success();
3677 + /**
3678 + * @deprecated 2.05.06
3679 + * @codeCoverageIgnore
3680 + */
3681 + public static function add_key_to_group_cache( $key, $group ) {
3682 + FrmDeprecated::add_key_to_group_cache( $key, $group );
4887 3683 }
4888 3684
4889 3685 /**
4890 - * Lite license copy.
4891 - * Used in FrmDashboardController & FrmSettingsController
4892 - *
4893 - * @since 6.8
4894 - *
4895 - * @return string
3686 + * @deprecated 2.05.06
3687 + * @codeCoverageIgnore
4896 3688 */
4897 - public static function copy_for_lite_license() {
4898 - $message = __( 'You\'re using Formidable Forms Lite - no license needed. Enjoy!', 'formidable' ) . ' 🙂';
4899 - return apply_filters( 'frm_license_type_text', $message );
3689 + public static function get_group_cached_keys( $group ) {
3690 + return FrmDeprecated::get_group_cached_keys( $group );
4900 3691 }
4901 3692
4902 3693 /**
4903 - * Removes scripts that are unnecessarily loaded across the pages!
4904 - *
4905 - * @since 6.9
4906 - *
4907 - * @return void
3694 + * @since 2.0
3695 + * @deprecated 2.05.06
3696 + * @codeCoverageIgnore
3697 + * @return mixed The cached value or false
4908 3698 */
4909 - public static function dequeue_extra_global_scripts() {
4910 - wp_dequeue_script( 'frm-surveys-admin' );
4911 - wp_dequeue_script( 'frm-quizzes-form-action' );
3699 + public static function check_cache_and_transient( $cache_key ) {
3700 + return FrmDeprecated::check_cache( $cache_key );
4912 3701 }
4913 3702
4914 3703 /**
4915 - * Shows tooltip icon.
3704 + * @since 2.0
3705 + * @deprecated 2.05.06
3706 + * @codeCoverageIgnore
4916 3707 *
4917 - * @since 6.12
4918 - *
4919 - * @param string $tooltip_text Tooltip text.
4920 - * @param array $atts Tooltip wrapper HTML attributes.
4921 - *
4922 - * @return void
3708 + * @param string $cache_key
4923 3709 */
4924 - public static function tooltip_icon( $tooltip_text, $atts = array() ) {
4925 - $atts['title'] = $tooltip_text;
4926 -
4927 - if ( isset( $atts['class'] ) ) {
4928 - $atts['class'] .= ' frm_help';
4929 - } else {
4930 - $atts['class'] = 'frm_help';
4931 - }
4932 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4933 - ?>
4934 - <span <?php self::array_to_html_params( $atts, true ); ?>>
4935 - <?php self::icon_by_class( 'frmfont frm_tooltip_icon' ); ?>
4936 - </span>
4937 - <?php
4938 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
3710 + public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
3711 + FrmDeprecated::delete_cache_and_transient( $cache_key, $group );
4939 3712 }
4940 3713
4941 3714 /**
4942 - * Prints errors for settings in onboarding wizard or template settings.
3715 + * @since 2.0
3716 + * @deprecated 2.05.06
3717 + * @codeCoverageIgnore
4943 3718 *
4944 - * @since 6.15
4945 - *
4946 - * @param array $args Args.
4947 - *
4948 - * @return void
3719 + * @param string $group The name of the cache group
4949 3720 */
4950 - public static function print_setting_error( $args ) {
4951 - $args = wp_parse_args(
4952 - $args,
4953 - array(
4954 - 'id' => '',
4955 - 'errors' => array(),
4956 - 'class' => '',
4957 - )
4958 - );
4959 -
4960 - $args['class'] .= ' frm-validation-error frm-mt-xs frm_hidden';
4961 -
4962 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4963 - ?>
4964 - <span id="<?php echo esc_attr( $args['id'] ); ?>" class="<?php echo esc_attr( $args['class'] ); ?>">
4965 - <?php
4966 - if ( is_array( $args['errors'] ) ) {
4967 - foreach ( $args['errors'] as $key => $msg ) {
4968 - ?>
4969 - <span frm-error="<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $msg ); ?></span>
4970 - <?php
4971 - }
4972 - } else {
4973 - echo '<span>' . esc_html( $args['errors'] ) . '</span>';
4974 - }
4975 - ?>
4976 - </span>
4977 - <?php
4978 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
3721 + public static function cache_delete_group( $group ) {
3722 + FrmDeprecated::cache_delete_group( $group );
4979 3723 }
4980 3724
4981 3725 /**
4982 - * Check if GDPR is enabled.
3726 + * @since 1.07.10
3727 + * @deprecated 2.05.06
3728 + * @codeCoverageIgnore
4983 3729 *
4984 - * @since 6.19
3730 + * @param string $term The value to escape
4985 3731 *
4986 - * @return bool
3732 + * @return string The escaped value
4987 3733 */
4988 - public static function is_gdpr_enabled() {
4989 - $frm_settings = self::get_settings();
4990 - return $frm_settings->enable_gdpr || $frm_settings->no_ips || $frm_settings->custom_header_ip || $frm_settings->no_gdpr_cookies;
3734 + public static function esc_like( $term ) {
3735 + return FrmDeprecated::esc_like( $term );
4991 3736 }
4992 3737
4993 3738 /**
4994 - * Check if GDPR cookies are disabled.
3739 + * @param string $order_query
4995 3740 *
4996 - * @since 6.19
4997 - *
4998 - * @return bool
3741 + * @deprecated 2.05.06
3742 + * @codeCoverageIgnore
4999 3743 */
5000 - public static function no_gdpr_cookies() {
5001 - $frm_settings = self::get_settings();
5002 - return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
3744 + public static function esc_order( $order_query ) {
3745 + return FrmDeprecated::esc_order( $order_query );
5003 3746 }
5004 3747
5005 3748 /**
5006 - * Check if a string is valid UTF-8.
5007 - *
5008 - * @since 6.24
5009 - *
5010 - * @param string $string The string to check.
5011 - *
5012 - * @return bool
3749 + * @deprecated 2.05.06
3750 + * @codeCoverageIgnore
5013 3751 */
5014 - public static function is_valid_utf8( $string ) {
5015 - // wp_is_valid_utf8 is added in WP 6.9.
5016 - if ( function_exists( 'wp_is_valid_utf8' ) ) {
5017 - return wp_is_valid_utf8( $string );
5018 - }
5019 -
5020 - // As of WP 6.9, seems_utf8 is deprecated.
5021 - return function_exists( 'seems_utf8' ) ? seems_utf8( $string ) : false;
3752 + public static function esc_order_by( &$order_by ) {
3753 + FrmDeprecated::esc_order_by( $order_by );
5022 3754 }
5023 3755
5024 3756 /**
5025 - * Get a documentation URL with UTM parameters and affiliate tracking.
3757 + * @param string $limit
5026 3758 *
5027 - * @since 6.26
5028 - *
5029 - * @param string $path The relative path to append to the base URL.
5030 - * @param string $campaign The campaign to use for UTM parameters.
5031 - * @param bool $add_kb_base Whether to prepend 'knowledgebase/' to the path. Default true.
5032 - *
5033 - * @return string The processed URL with UTM parameters and affiliate tracking.
3759 + * @deprecated 2.05.06
3760 + * @codeCoverageIgnore
5034 3761 */
5035 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5036 - $path = trim( $path, '/' );
3762 + public static function esc_limit( $limit ) {
3763 + return FrmDeprecated::esc_limit( $limit );
3764 + }
5037 3765
5038 - if ( $add_kb_base ) {
5039 - $path = 'knowledgebase/' . $path;
5040 - }
3766 + /**
3767 + * @since 2.0
3768 + * @deprecated 2.05.06
3769 + * @codeCoverageIgnore
3770 + */
3771 + public static function prepare_array_values( $array, $type = '%s' ) {
3772 + return FrmDeprecated::prepare_array_values( $array, $type );
3773 + }
5041 3774
5042 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
3775 + /**
3776 + * @deprecated 2.05.06
3777 + * @codeCoverageIgnore
3778 + */
3779 + public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
3780 + return FrmDeprecated::prepend_and_or_where( $starts_with, $where );
5043 3781 }
5044 3782
5045 3783 /**
5046 - * @since 5.0.16
5047 - * @deprecated 6.26
3784 + * @since 2.0
3785 + * @deprecated 5.0.13
5048 3786 *
5049 - * @return bool
3787 + * @return string The base Google APIS url for the current version of jQuery UI
5050 3788 */
5051 - public static function show_landing_pages() {
5052 - _deprecated_function( __METHOD__, '6.26' );
5053 - return true;
3789 + public static function jquery_ui_base_url() {
3790 + _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3791 + return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
3792 + }
3793 +
3794 + /**
3795 + * @since 4.07
3796 + * @deprecated x.x
3797 + */
3798 + public static function renewal_message() {
3799 + _deprecated_function( __METHOD__, 'x.x', 'FrmProAddonsController::renewal_message' );
5054 3800 }
5055 3801 }