PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 5.2.07
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v5.2.07
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 +814 -2224 6.29 → 5.2.07 View file →
@@ -3,43 +3,22 @@
3 3 die( 'You are not allowed to call this page directly.' );
4 4 }
5 5
6 6 class FrmAppHelper {
7 -
8 - /**
9 - * Version of the database we are moving to.
10 - *
11 - * @var int
12 - */
13 - public static $db_version = 104;
14 -
15 - /**
16 - * Used by the API add-on.
17 - *
18 - * @var float
19 - */
7 + public static $db_version = 98; // Version of the database we are moving to.
8 + public static $pro_db_version = 37; //deprecated
20 9 public static $font_version = 7;
21 10
22 11 /**
23 - * @var bool
24 - */
25 - private static $added_gmt_offset_filter = false;
26 -
27 - /**
28 12 * @since 2.0
29 - *
30 - * @var string
31 13 */
32 - public static $plug_version = '6.29';
14 + public static $plug_version = '5.2.07';
33 15
34 16 /**
35 - * @var bool
36 - */
37 - private static $included_svg = false;
38 -
39 - /**
40 17 * @since 1.07.02
41 18 *
19 + * @param none
20 + *
42 21 * @return string The version of this plugin
43 22 */
44 23 public static function plugin_version() {
45 24 return self::$plug_version;
@@ -44,33 +23,21 @@
44 23 public static function plugin_version() {
45 24 return self::$plug_version;
46 25 }
47 26
48 - /**
49 - * @return string
50 - */
51 27 public static function plugin_folder() {
52 28 return basename( self::plugin_path() );
53 29 }
54 30
55 - /**
56 - * @return string
57 - */
58 31 public static function plugin_path() {
59 - return dirname( __DIR__, 2 );
32 + return dirname( dirname( dirname( __FILE__ ) ) );
60 33 }
61 34
62 - /**
63 - * @return string
64 - */
65 35 public static function plugin_url() {
66 - // Previously FRM_URL constant.
36 + // Prevously FRM_URL constant.
67 37 return plugins_url( '', self::plugin_path() . '/formidable.php' );
68 38 }
69 39
70 - /**
71 - * @return string
72 - */
73 40 public static function relative_plugin_url() {
74 41 return str_replace( array( 'https:', 'http:' ), '', self::plugin_url() );
75 42 }
76 43
@@ -85,9 +52,8 @@
85 52 * Get the name of this site
86 53 * Used for [sitename] shortcode
87 54 *
88 55 * @since 2.0
89 - *
90 56 * @return string
91 57 */
92 58 public static function site_name() {
93 59 return get_option( 'blogname' );
@@ -92,17 +58,11 @@
92 58 public static function site_name() {
93 59 return get_option( 'blogname' );
94 60 }
95 61
96 - /**
97 - * @param string $url
98 - *
99 - * @return string
100 - */
101 62 public static function make_affiliate_url( $url ) {
102 63 $affiliate_id = self::get_affiliate();
103 -
104 - if ( $affiliate_id ) {
64 + if ( ! empty( $affiliate_id ) ) {
105 65 $url = str_replace( array( 'http://', 'https://' ), '', $url );
106 66 $url = 'http://www.shareasale.com/r.cfm?u=' . absint( $affiliate_id ) . '&b=841990&m=64739&afftrack=plugin&urllink=' . urlencode( $url );
107 67 }
108 68
@@ -108,11 +68,8 @@
108 68
109 69 return $url;
110 70 }
111 71
112 - /**
113 - * @return int
114 - */
115 72 public static function get_affiliate() {
116 73 return absint( apply_filters( 'frm_affiliate_id', 0 ) );
117 74 }
118 75
@@ -117,167 +74,65 @@
117 74 }
118 75
119 76 /**
120 77 * @since 3.04.02
121 - *
122 - * @param array|string $args If a string is passed, it is used for the utm_campaign attribute.
78 + * @param array|string $args
123 79 * @param string $page
124 80 */
125 81 public static function admin_upgrade_link( $args, $page = '' ) {
126 - if ( $page ) {
82 + if ( empty( $page ) ) {
83 + $page = 'https://formidableforms.com/lite-upgrade/';
84 + } else {
127 85 $page = str_replace( 'https://formidableforms.com/', '', $page );
128 86 $page = 'https://formidableforms.com/' . $page;
87 + }
88 +
89 + $anchor = '';
90 + if ( is_array( $args ) ) {
91 + $medium = $args['medium'];
92 + if ( isset( $args['content'] ) ) {
93 + $content = $args['content'];
94 + }
95 + if ( isset( $args['anchor'] ) ) {
96 + $anchor = '#' . $args['anchor'];
97 + }
129 98 } else {
130 - $page = 'https://formidableforms.com/lite-upgrade/';
99 + $medium = $args;
131 100 }
132 101
133 - $args = is_array( $args ) ? self::adjust_legacy_utm_args( $args ) : array( 'campaign' => $args );
134 -
135 102 $query_args = array(
136 - 'utm_source' => 'plugin',
137 - 'utm_medium' => self::get_utm_medium(),
103 + 'utm_source' => 'WordPress',
104 + 'utm_medium' => $medium,
105 + 'utm_campaign' => 'liteplugin',
138 106 );
139 - $query_args = self::maybe_add_utm_license( $query_args );
140 107
141 - if ( isset( $args['campaign'] ) ) {
142 - $query_args['utm_campaign'] = $args['campaign'];
108 + if ( isset( $content ) ) {
109 + $query_args['utm_content'] = $content;
143 110 }
144 111
145 - if ( isset( $args['content'] ) ) {
146 - $query_args['utm_content'] = $args['content'];
147 - }
148 -
149 - if ( isset( $args['param'] ) ) {
112 + if ( is_array( $args ) && isset( $args['param'] ) ) {
150 113 $query_args['f'] = $args['param'];
151 114 }
152 115
153 - if ( ! empty( $args['plan'] ) ) {
116 + if ( is_array( $args ) && ! empty( $args['plan'] ) ) {
154 117 $query_args['plan'] = $args['plan'];
155 118 }
156 119
157 - $link = add_query_arg( $query_args, $page );
158 -
159 - if ( isset( $args['anchor'] ) ) {
160 - $link .= '#' . $args['anchor'];
161 - }
162 -
120 + $link = add_query_arg( $query_args, $page ) . $anchor;
163 121 return self::make_affiliate_url( $link );
164 122 }
165 123
166 124 /**
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 125 * Get the Formidable settings
269 126 *
270 127 * @since 2.0
271 128 *
272 129 * @param array $args - May include the form id when values need translation.
273 - *
274 - * @return FrmSettings
130 + * @return FrmSettings $frm_setings
275 131 */
276 132 public static function get_settings( $args = array() ) {
277 133 global $frm_settings;
278 -
279 - if ( ! $frm_settings ) {
134 + if ( empty( $frm_settings ) ) {
280 135 $frm_settings = new FrmSettings( $args );
281 136 } elseif ( isset( $args['current_form'] ) ) {
282 137 // If the global has already been set, allow strings to be filtered.
283 138 $frm_settings->maybe_filter_for_form( $args );
@@ -285,42 +140,16 @@
285 140
286 141 return $frm_settings;
287 142 }
288 143
289 - /**
290 - * @return string
291 - */
292 144 public static function get_menu_name() {
293 - if ( ! self::pro_is_installed() || FrmAddonsController::is_license_expired() ) {
294 - return 'Formidable';
295 - }
145 + $frm_settings = self::get_settings();
296 146
297 - return self::get_settings()->menu;
147 + return $frm_settings->menu;
298 148 }
299 149
300 150 /**
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 151 * @since 3.05
319 - *
320 - * @param array $atts
321 - *
322 - * @return string
323 152 */
324 153 public static function svg_logo( $atts = array() ) {
325 154 $defaults = array(
326 155 'height' => 18,
@@ -329,31 +158,23 @@
329 158 'orange' => '#f05a24',
330 159 );
331 160 $atts = array_merge( $defaults, $atts );
332 161
333 - // phpcs:disable SlevomatCodingStandard.Files.LineLength.LineTooLong
334 162 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 163 <path fill="' . esc_attr( $atts['orange'] ) . '" d="M289.6 384h140v76h-140z"/>
336 164 <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 165 </svg>';
338 - // phpcs:enable SlevomatCodingStandard.Files.LineLength.LineTooLong
339 166 }
340 167
341 168 /**
342 169 * @since 4.0
343 - *
344 - * @param array $atts
345 - *
346 - * @return void
347 170 */
348 171 public static function show_logo( $atts = array() ) {
349 - self::kses_echo( self::svg_logo( $atts ), 'all' );
172 + echo self::kses( self::svg_logo( $atts ), 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
350 173 }
351 174
352 175 /**
353 176 * @since 4.03.02
354 - *
355 - * @return void
356 177 */
357 178 public static function show_header_logo() {
358 179 $icon = self::svg_logo(
359 180 array(
@@ -362,11 +183,10 @@
362 183 )
363 184 );
364 185
365 186 $new_icon = apply_filters( 'frm_icon', $icon, true );
366 -
367 187 if ( $new_icon !== $icon ) {
368 - if ( str_starts_with( $new_icon, '<svg' ) ) {
188 + if ( strpos( $new_icon, '<svg' ) === 0 ) {
369 189 $icon = str_replace( 'viewBox="0 0 20', 'width="30" height="35" style="color:#929699" viewBox="0 0 20', $new_icon );
370 190 } else {
371 191 // Show nothing if it isn't an SVG.
372 192 $icon = '<div style="height:39px"></div>';
@@ -371,43 +191,26 @@
371 191 // Show nothing if it isn't an SVG.
372 192 $icon = '<div style="height:39px"></div>';
373 193 }
374 194 }
375 - self::kses_echo( $icon, 'all' );
195 + echo self::kses( $icon, 'all' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
376 196 }
377 197
378 198 /**
379 199 * @since 2.02.04
380 - *
381 - * @return bool
382 200 */
383 201 public static function ips_saved() {
384 202 $frm_settings = self::get_settings();
203 +
385 204 return ! $frm_settings->no_ips;
386 205 }
387 206
388 - /**
389 - * @return bool
390 - */
391 207 public static function pro_is_installed() {
392 - return (bool) apply_filters( 'frm_pro_installed', false );
208 + return apply_filters( 'frm_pro_installed', false );
393 209 }
394 210
395 211 /**
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 212 * @since 4.06.02
408 - *
409 - * @return bool
410 213 */
411 214 public static function pro_is_connected() {
412 215 global $frm_vars;
413 216 return self::pro_is_installed() && $frm_vars['pro_is_authorized'];
@@ -414,100 +217,45 @@
414 217 }
415 218
416 219 /**
417 220 * @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 221 */
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 );
222 + public static function is_form_builder_page() {
223 + $action = self::simple_get( 'frm_action', 'sanitize_title' );
224 + return self::is_admin_page( 'formidable' ) && ( $action === 'edit' || $action === 'settings' || $action === 'duplicate' );
433 225 }
434 226
435 - /**
436 - * @return bool
437 - */
438 227 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();
228 + $page = self::simple_get( 'page', 'sanitize_title' );
229 + $is_formidable = strpos( $page, 'formidable' ) !== false;
230 + if ( empty( $page ) ) {
231 + $is_formidable = self::is_view_builder_page();
443 232 }
444 233
445 - return str_contains( $page, 'formidable' );
234 + return $is_formidable;
446 235 }
447 236
448 237 /**
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 238 * Check for certain page in Formidable settings
489 239 *
490 240 * @since 2.0
491 241 *
492 - * @param string $page The name of the page to check.
242 + * @param string $page The name of the page to check
493 243 *
494 - * @return bool
244 + * @return boolean
495 245 */
496 246 public static function is_admin_page( $page = 'formidable' ) {
497 247 global $pagenow;
498 248 $get_page = self::simple_get( 'page', 'sanitize_title' );
499 -
500 249 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 -
250 + // allow this to be true during ajax load i.e. ajax form builder loading
251 + $is_page = ( $pagenow == 'admin.php' || $pagenow == 'admin-ajax.php' ) && $get_page == $page;
504 252 if ( $is_page ) {
505 253 return true;
506 254 }
507 255 }
508 256
509 - return is_admin() && $get_page === $page;
257 + return is_admin() && $get_page == $page;
510 258 }
511 259
512 260 /**
513 261 * If the current page is for editing or creating a view.
@@ -513,23 +261,21 @@
513 261 * If the current page is for editing or creating a view.
514 262 * Returns false for the views listing page.
515 263 *
516 264 * @since 4.0
517 - *
518 - * @return bool
519 265 */
520 266 public static function is_view_builder_page() {
521 267 global $pagenow;
522 268
523 - if ( ! in_array( $pagenow, array( 'post.php', 'post-new.php', 'edit.php' ), true ) ) {
269 + if ( $pagenow !== 'post.php' && $pagenow !== 'post-new.php' && $pagenow !== 'edit.php' ) {
524 270 return false;
525 271 }
526 272
527 273 $post_type = self::simple_get( 'post_type', 'sanitize_title' );
528 274
529 - if ( ! $post_type ) {
530 - $post_id = self::simple_get( 'post', 'absint' );
531 - $post = get_post( $post_id );
275 + if ( empty( $post_type ) ) {
276 + $post_id = self::simple_get( 'post', 'absint' );
277 + $post = get_post( $post_id );
532 278 $post_type = $post ? $post->post_type : '';
533 279 }
534 280
535 281 return $post_type === 'frm_display';
@@ -539,15 +285,17 @@
539 285 * Check for the form preview page
540 286 *
541 287 * @since 2.0
542 288 *
543 - * @return bool
289 + * @param None
290 + *
291 + * @return boolean
544 292 */
545 293 public static function is_preview_page() {
546 294 global $pagenow;
547 295 $action = self::simple_get( 'action', 'sanitize_title' );
548 296
549 - return $pagenow === 'admin-ajax.php' && $action === 'frm_forms_preview';
297 + return $pagenow && $pagenow == 'admin-ajax.php' && $action == 'frm_forms_preview';
550 298 }
551 299
552 300 /**
553 301 * Check for ajax except the form preview page
@@ -553,17 +301,16 @@
553 301 * Check for ajax except the form preview page
554 302 *
555 303 * @since 2.0
556 304 *
557 - * @return bool
305 + * @param None
306 + *
307 + * @return boolean
558 308 */
559 309 public static function doing_ajax() {
560 310 return wp_doing_ajax() && ! self::is_preview_page();
561 311 }
562 312
563 - /**
564 - * @return string
565 - */
566 313 public static function js_suffix() {
567 314 return defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
568 315 }
569 316
@@ -568,14 +315,13 @@
568 315 }
569 316
570 317 /**
571 318 * @since 2.0.8
572 - *
573 - * @return bool
574 319 */
575 320 public static function prevent_caching() {
576 321 global $frm_vars;
577 - return ! empty( $frm_vars['prevent_caching'] );
322 +
323 + return isset( $frm_vars['prevent_caching'] ) && $frm_vars['prevent_caching'];
578 324 }
579 325
580 326 /**
581 327 * Check if on an admin page
@@ -581,19 +327,14 @@
581 327 * Check if on an admin page
582 328 *
583 329 * @since 2.0
584 330 *
585 - * @return bool
331 + * @param None
332 + *
333 + * @return boolean
586 334 */
587 335 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 );
336 + return is_admin() && ! wp_doing_ajax();
596 337 }
597 338
598 339 /**
599 340 * Check if value contains blank value or empty array
@@ -599,23 +340,17 @@
599 340 * Check if value contains blank value or empty array
600 341 *
601 342 * @since 2.0
602 343 *
603 - * @param mixed $value Value to check.
604 - * @param string $empty
344 + * @param mixed $value - value to check
345 + * @param string
605 346 *
606 - * @return bool
347 + * @return boolean
607 348 */
608 349 public static function is_empty_value( $value, $empty = '' ) {
609 - return $value === array() || $value === $empty;
350 + return ( is_array( $value ) && empty( $value ) ) || $value === $empty;
610 351 }
611 352
612 - /**
613 - * @param mixed $value
614 - * @param string $empty
615 - *
616 - * @return bool
617 - */
618 353 public static function is_not_empty_value( $value, $empty = '' ) {
619 354 return ! self::is_empty_value( $value, $empty );
620 355 }
621 356
@@ -632,37 +367,26 @@
632 367 return isset( $_SERVER[ $value ] ) ? wp_strip_all_tags( wp_unslash( $_SERVER[ $value ] ) ) : '';
633 368 }
634 369
635 370 /**
636 - * Get the server OS
371 + * Check for the IP address in several places
372 + * Used by [ip] shortcode
637 373 *
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 374 * @return string The IP address of the current user
660 375 */
661 376 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 -
377 + $ip_options = array(
378 + 'HTTP_CLIENT_IP',
379 + 'HTTP_CF_CONNECTING_IP',
380 + 'HTTP_X_FORWARDED_FOR',
381 + 'HTTP_X_FORWARDED',
382 + 'HTTP_X_CLUSTER_CLIENT_IP',
383 + 'HTTP_X_REAL_IP',
384 + 'HTTP_FORWARDED_FOR',
385 + 'HTTP_FORWARDED',
386 + 'REMOTE_ADDR',
387 + );
388 + $ip = '';
665 389 foreach ( $ip_options as $key ) {
666 390 if ( ! isset( $_SERVER[ $key ] ) ) {
667 391 continue;
668 392 }
@@ -667,12 +391,10 @@
667 391 continue;
668 392 }
669 393
670 394 $key = self::get_server_value( $key );
671 -
672 395 foreach ( explode( ',', $key ) as $ip ) {
673 - // Just to be safe.
674 - $ip = trim( $ip );
396 + $ip = trim( $ip ); // just to be safe.
675 397
676 398 if ( filter_var( $ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE ) !== false ) {
677 399 return sanitize_text_field( $ip );
678 400 }
@@ -681,70 +403,16 @@
681 403
682 404 return sanitize_text_field( $ip );
683 405 }
684 406
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 407 public static function get_param( $param, $default = '', $src = 'get', $sanitize = '' ) {
738 - if ( str_contains( $param, '[' ) ) {
408 + if ( strpos( $param, '[' ) ) {
739 409 $params = explode( '[', $param );
740 410 $param = $params[0];
741 411 }
742 412
743 413 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 -
414 + $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 415 if ( ! isset( $_POST[ $param ] ) && isset( $_GET[ $param ] ) && ! is_array( $value ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
748 416 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
749 417 $value = htmlspecialchars_decode( wp_unslash( $_GET[ $param ] ) );
750 418 }
@@ -759,41 +427,29 @@
759 427 )
760 428 );
761 429 }
762 430
763 - if ( ! isset( $params ) || ! is_array( $value ) || ! $value ) {
764 - return $value;
765 - }
431 + if ( isset( $params ) && is_array( $value ) && ! empty( $value ) ) {
432 + foreach ( $params as $k => $p ) {
433 + if ( ! $k || ! is_array( $value ) ) {
434 + continue;
435 + }
766 436
767 - foreach ( $params as $k => $p ) {
768 - if ( ! $k || ! is_array( $value ) ) {
769 - continue;
437 + $p = trim( $p, ']' );
438 + $value = isset( $value[ $p ] ) ? $value[ $p ] : $default;
770 439 }
771 -
772 - $p = trim( $p, ']' );
773 - $value = $value[ $p ] ?? $default;
774 440 }
775 441
776 442 return $value;
777 443 }
778 444
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 445 public static function get_post_param( $param, $default = '', $sanitize = '', $serialized = false ) {
790 446 return self::get_simple_request(
791 447 array(
792 - 'type' => 'post',
793 - 'param' => $param,
794 - 'default' => $default,
795 - 'sanitize' => $sanitize,
448 + 'type' => 'post',
449 + 'param' => $param,
450 + 'default' => $default,
451 + 'sanitize' => $sanitize,
796 452 'serialized' => $serialized,
797 453 )
798 454 );
799 455 }
@@ -804,9 +460,9 @@
804 460 * @param string $param
805 461 * @param string $sanitize
806 462 * @param string $default
807 463 *
808 - * @return array|int|string
464 + * @return string|array
809 465 */
810 466 public static function simple_get( $param, $sanitize = 'sanitize_text_field', $default = '' ) {
811 467 return self::get_simple_request(
812 468 array(
@@ -824,38 +480,39 @@
824 480 * @since 2.0.6
825 481 *
826 482 * @param array $args
827 483 *
828 - * @return array|string
484 + * @return string|array
829 485 */
830 486 public static function get_simple_request( $args ) {
831 487 $defaults = array(
832 - 'param' => '',
833 - 'default' => '',
834 - 'type' => 'get',
835 - 'sanitize' => 'sanitize_text_field',
488 + 'param' => '',
489 + 'default' => '',
490 + 'type' => 'get',
491 + 'sanitize' => 'sanitize_text_field',
836 492 'serialized' => false,
837 493 );
838 494 $args = wp_parse_args( $args, $defaults );
839 - $value = $args['default'];
840 495
841 - if ( $args['type'] === 'get' ) {
496 + $value = $args['default'];
497 + if ( $args['type'] == 'get' ) {
842 498 if ( $_GET && isset( $_GET[ $args['param'] ] ) ) {
843 499 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
844 500 $value = wp_unslash( $_GET[ $args['param'] ] );
845 501 }
846 - } elseif ( $args['type'] === 'post' ) {
502 + } elseif ( $args['type'] == 'post' ) {
847 503 if ( isset( $_POST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
848 504 // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized, WordPress.Security.NonceVerification.Missing
849 505 $value = wp_unslash( $_POST[ $args['param'] ] );
850 -
851 506 if ( $args['serialized'] === true && is_serialized_string( $value ) && is_serialized( $value ) ) {
852 507 self::unserialize_or_decode( $value );
853 508 }
854 509 }
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'] ] );
510 + } else {
511 + if ( isset( $_REQUEST[ $args['param'] ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing
512 + // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
513 + $value = wp_unslash( $_REQUEST[ $args['param'] ] );
514 + }
858 515 }
859 516
860 517 self::sanitize_value( $args['sanitize'], $value );
861 518
@@ -868,56 +525,34 @@
868 525 * @since 2.0.8
869 526 *
870 527 * @param string $value
871 528 *
872 - * @return string Value.
529 + * @return string $value
873 530 */
874 531 public static function preserve_backslashes( $value ) {
875 532 // If backslashes have already been added, don't add them again
876 - return str_contains( $value, '\\\\' ) ? $value : addslashes( $value );
533 + if ( strpos( $value, '\\\\' ) === false ) {
534 + $value = addslashes( $value );
535 + }
536 +
537 + return $value;
877 538 }
878 539
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 540 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 ] );
541 + if ( ! empty( $sanitize ) ) {
542 + if ( is_array( $value ) ) {
543 + $temp_values = $value;
544 + foreach ( $temp_values as $k => $v ) {
545 + self::sanitize_value( $sanitize, $value[ $k ] );
546 + }
547 + } else {
548 + $value = call_user_func( $sanitize, $value );
903 549 }
904 -
905 - return;
906 550 }
907 -
908 - $value = call_user_func( $sanitize, $value );
909 551 }
910 552
911 - /**
912 - * @param array $sanitize_method
913 - * @param array $values
914 - *
915 - * @return void
916 - */
917 553 public static function sanitize_request( $sanitize_method, &$values ) {
918 554 $temp_values = $values;
919 -
920 555 foreach ( $temp_values as $k => $val ) {
921 556 if ( isset( $sanitize_method[ $k ] ) ) {
922 557 $values[ $k ] = call_user_func( $sanitize_method[ $k ], $val );
923 558 }
@@ -925,68 +560,23 @@
925 560 }
926 561
927 562 /**
928 563 * @since 4.0.04
929 - *
930 - * @param mixed $value
931 - *
932 - * @return void
933 564 */
934 565 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 - }
566 + self::sanitize_value( 'wp_kses_post', $value );
941 567 self::decode_specialchars( $value );
942 568 }
943 569
944 570 /**
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 571 * Do wp_specialchars_decode to get back '&' that wp_kses_post might have turned to '&amp;'
979 572 * this MUST be done, else we'll be back to the '& entity' problem.
980 573 *
981 574 * @since 4.0.04
982 - *
983 - * @param mixed $value Value to decode, passed by reference.
984 575 */
985 576 public static function decode_specialchars( &$value ) {
986 577 if ( is_array( $value ) ) {
987 578 $temp_values = $value;
988 -
989 579 foreach ( $temp_values as $k => $v ) {
990 580 self::decode_specialchars( $value[ $k ] );
991 581 }
992 582 } else {
@@ -1000,13 +590,13 @@
1000 590 * Adapted from wp_specialchars_decode().
1001 591 *
1002 592 * @since 4.03.01
1003 593 *
1004 - * @param string $string The string to prep, passed by reference.
594 + * @param string $string The string to prep.
1005 595 */
1006 596 private static function decode_amp( &$string ) {
1007 597 // Don't bother if there are no entities - saves a lot of processing
1008 - if ( ! $string || ! str_contains( $string, '&' ) ) {
598 + if ( empty( $string ) || strpos( $string, '&' ) === false ) {
1009 599 return;
1010 600 }
1011 601
1012 602 $translation = array(
@@ -1012,12 +602,10 @@
1012 602 $translation = array(
1013 603 '&quot;' => '"',
1014 604 '&#034;' => '"',
1015 605 '&#x22;' => '"',
1016 - // The space preserves the HTML.
1017 - '&lt; ' => '< ',
1018 - // The space preserves the HTML.
1019 - '&#060; ' => '< ',
606 + '&lt; ' => '< ', // The space preserves the HTML.
607 + '&#060; ' => '< ', // The space preserves the HTML.
1020 608 '&gt;' => '>',
1021 609 '&#062;' => '>',
1022 610 '&amp;' => '&',
1023 611 '&#038;' => '&',
@@ -1044,53 +632,38 @@
1044 632 * Sanitize the value, and allow some HTML
1045 633 *
1046 634 * @since 2.0
1047 635 *
1048 - * @param string $value The value to sanitize.
1049 - * @param array|string $allowed Allowed HTML tags and attributes, or 'all' for defaults.
636 + * @param string $value
637 + * @param array|string $allowed 'all' for everything included as defaults
1050 638 *
1051 639 * @return string
1052 640 */
1053 641 public static function kses( $value, $allowed = array() ) {
1054 642 $allowed_html = self::allowed_html( $allowed );
643 +
1055 644 return wp_kses( $value, $allowed_html );
1056 645 }
1057 646
1058 647 /**
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 648 * The regular kses function strips [button_action] from submit button HTML.
1074 649 *
1075 650 * @since 5.0.13
1076 651 *
1077 652 * @param string $html
1078 - *
1079 653 * @return string
1080 654 */
1081 655 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]' );
656 + $included_button_action = false !== strpos( $html, '[button_action]' );
657 + $included_back_hook = false !== strpos( $html, '[back_hook]' );
658 + $included_draft_hook = false !== strpos( $html, '[draft_hook]' );
1085 659 add_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1086 660 add_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1087 661 $html = self::kses( $html, 'all' );
1088 662 remove_filter( 'safe_style_css', 'FrmAppHelper::allow_visibility_style' );
1089 663 remove_filter( 'frm_striphtml_allowed_tags', 'FrmAppHelper::add_allowed_submit_button_tags' );
1090 -
1091 664 if ( $included_button_action ) {
1092 - if ( str_contains( $html, '<input type="submit"' ) ) {
665 + if ( false !== strpos( $html, '<input type="submit"' ) ) {
1093 666 $pattern = '/(<input type="submit")([^>]*)(\/>)/';
1094 667 $html = preg_replace( $pattern, '$1$2[button_action] $3', $html, 1 );
1095 668 } else {
1096 669 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
@@ -1096,17 +669,14 @@
1096 669 $pattern = '/(<button)(.*)(class=")(.*)(frm_button_submit)(.*)(")(.*)([^>]+)(>)/';
1097 670 $html = preg_replace( $pattern, '$1$2$3$4$5$6$7 [button_action]$8$9$10', $html, 1 );
1098 671 }
1099 672 }
1100 -
1101 673 if ( $included_back_hook ) {
1102 674 $html = str_replace( 'class="frm_prev_page"', 'class="frm_prev_page" [back_hook]', $html );
1103 675 }
1104 -
1105 676 if ( $included_draft_hook ) {
1106 - return str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
677 + $html = str_replace( 'class="frm_save_draft"', 'class="frm_save_draft" [draft_hook]', $html );
1107 678 }
1108 -
1109 679 return $html;
1110 680 }
1111 681
1112 682 /**
@@ -1112,9 +682,8 @@
1112 682 /**
1113 683 * @since 5.0.13
1114 684 *
1115 685 * @param array $allowed_attr
1116 - *
1117 686 * @return array
1118 687 */
1119 688 public static function allow_visibility_style( $allowed_attr ) {
1120 689 $allowed_attr[] = 'visibility';
@@ -1124,9 +693,8 @@
1124 693 /**
1125 694 * @since 5.0.13
1126 695 *
1127 696 * @param array $allowed_html
1128 - *
1129 697 * @return array
1130 698 */
1131 699 public static function add_allowed_submit_button_tags( $allowed_html ) {
1132 700 $allowed_html['input'] = array(
@@ -1143,22 +711,17 @@
1143 711 }
1144 712
1145 713 /**
1146 714 * @since 2.05.03
1147 - *
1148 - * @param array|string $allowed
1149 - *
1150 - * @return array
1151 715 */
1152 716 private static function allowed_html( $allowed ) {
1153 717 $html = self::safe_html();
1154 718 $allowed_html = array();
1155 -
1156 719 if ( $allowed === 'all' ) {
1157 720 $allowed_html = $html;
1158 - } elseif ( $allowed ) {
721 + } elseif ( ! empty( $allowed ) ) {
1159 722 foreach ( (array) $allowed as $a ) {
1160 - $allowed_html[ $a ] = $html[ $a ] ?? array();
723 + $allowed_html[ $a ] = isset( $html[ $a ] ) ? $html[ $a ] : array();
1161 724 }
1162 725 }
1163 726
1164 727 return apply_filters( 'frm_striphtml_allowed_tags', $allowed_html );
@@ -1165,10 +728,8 @@
1165 728 }
1166 729
1167 730 /**
1168 731 * @since 2.05.03
1169 - *
1170 - * @return array
1171 732 */
1172 733 private static function safe_html() {
1173 734 $allow_class = array(
1174 735 'class' => true,
@@ -1175,9 +736,9 @@
1175 736 'id' => true,
1176 737 );
1177 738
1178 739 return array(
1179 - 'a' => array(
740 + 'a' => array(
1180 741 'class' => true,
1181 742 'href' => true,
1182 743 'id' => true,
1183 744 'rel' => true,
@@ -1246,16 +807,16 @@
1246 807 'cite' => true,
1247 808 'title' => true,
1248 809 ),
1249 810 '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,
811 + 'class' => true,
812 + 'fill' => true,
813 + 'height' => true,
814 + 'width' => true,
815 + 'x' => true,
816 + 'y' => true,
817 + 'rx' => true,
818 + 'stroke' => true,
1258 819 'stroke-opacity' => true,
1259 820 'stroke-width' => true,
1260 821 ),
1261 822 'section' => $allow_class,
@@ -1290,9 +851,9 @@
1290 851 'xlink:href' => true,
1291 852 ),
1292 853 'ul' => $allow_class,
1293 854 'label' => array(
1294 - 'for' => true,
855 + 'for' => true,
1295 856 'class' => true,
1296 857 'id' => true,
1297 858 ),
1298 859 'button' => array(
@@ -1301,13 +862,8 @@
1301 862 ),
1302 863 'legend' => array(
1303 864 'class' => true,
1304 865 ),
1305 - 'option' => array(
1306 - 'class' => true,
1307 - 'value' => true,
1308 - 'selected' => true,
1309 - ),
1310 866 );
1311 867 }
1312 868
1313 869 /**
@@ -1315,21 +871,19 @@
1315 871 *
1316 872 * @since 2.0
1317 873 */
1318 874 public static function remove_get_action() {
1319 - if ( empty( $_GET ) ) {
875 + if ( ! isset( $_GET ) ) {
1320 876 return;
1321 877 }
1322 878
1323 879 $action_name = isset( $_GET['action'] ) ? 'action' : ( isset( $_GET['action2'] ) ? 'action2' : '' );
1324 -
1325 - if ( ! $action_name ) {
880 + if ( empty( $action_name ) ) {
1326 881 return;
1327 882 }
1328 883
1329 884 $new_action = self::get_param( $action_name, '', 'get', 'sanitize_text_field' );
1330 -
1331 - if ( $new_action ) {
885 + if ( ! empty( $new_action ) ) {
1332 886 $_SERVER['REQUEST_URI'] = str_replace( '&action=' . $new_action, '', self::get_server_value( 'REQUEST_URI' ) );
1333 887 }
1334 888 }
1335 889
@@ -1336,23 +890,21 @@
1336 890 /**
1337 891 * Check the WP query for a parameter
1338 892 *
1339 893 * @since 2.0
1340 - *
1341 - * @param array|string $value
1342 - * @param string $param
1343 - *
1344 - * @return array|string
894 + * @return string|array
1345 895 */
1346 896 public static function get_query_var( $value, $param ) {
1347 - // phpcs:ignore Universal.Operators.StrictComparisons
1348 897 if ( $value != '' ) {
1349 898 return $value;
1350 899 }
1351 900
1352 901 global $wp_query;
902 + if ( isset( $wp_query->query_vars[ $param ] ) ) {
903 + $value = $wp_query->query_vars[ $param ];
904 + }
1353 905
1354 - return $wp_query->query_vars[ $param ] ?? $value;
906 + return $value;
1355 907 }
1356 908
1357 909 /**
1358 910 * Try to show the SVG if possible. Otherwise, use the font icon.
@@ -1357,55 +909,38 @@
1357 909 /**
1358 910 * Try to show the SVG if possible. Otherwise, use the font icon.
1359 911 *
1360 912 * @since 4.0.02
1361 - *
1362 913 * @param string $class
1363 914 * @param array $atts
1364 - *
1365 - * @return string|null
1366 915 */
1367 916 public static function icon_by_class( $class, $atts = array() ) {
1368 917 $echo = ! isset( $atts['echo'] ) || $atts['echo'];
1369 -
1370 918 if ( isset( $atts['echo'] ) ) {
1371 919 unset( $atts['echo'] );
1372 920 }
1373 921
1374 922 $html_atts = self::array_to_html_params( $atts );
1375 - $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1376 923
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 -
924 + $icon = trim( str_replace( array( 'frm_icon_font', 'frmfont ' ), '', $class ) );
1389 925 if ( $icon === $class ) {
1390 926 $icon = '<i class="' . esc_attr( $class ) . '"' . $html_atts . '></i>';
1391 927 } else {
1392 - $class = str_contains( $icon, ' ' ) ? ' ' . $icon : '';
1393 -
1394 - if ( str_contains( $icon, ' ' ) ) {
928 + $class = strpos( $icon, ' ' ) === false ? '' : ' ' . $icon;
929 + if ( strpos( $icon, ' ' ) ) {
1395 930 $icon = explode( ' ', $icon );
1396 931 $icon = reset( $icon );
1397 932 }
1398 -
1399 - $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '><use href="#' . esc_attr( $icon ) . '" /></svg>';
933 + $icon = '<svg class="frmsvg' . esc_attr( $class ) . '"' . $html_atts . '>
934 + <use xlink:href="#' . esc_attr( $icon ) . '" />
935 + </svg>';
1400 936 }
1401 937
1402 938 if ( $echo ) {
1403 939 echo self::kses_icon( $icon ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1404 - return null;
940 + } else {
941 + return $icon;
1405 942 }
1406 -
1407 - return $icon;
1408 943 }
1409 944
1410 945 /**
1411 946 * Run kses for icons. It needs to add a few filters first in order to preserve some custom style values.
@@ -1412,9 +947,8 @@
1412 947 *
1413 948 * @since 5.0.13
1414 949 *
1415 950 * @param string $icon
1416 - *
1417 951 * @return string
1418 952 */
1419 953 public static function kses_icon( $icon ) {
1420 954 add_filter( 'safe_style_css', 'FrmAppHelper::allow_vars_in_styles' );
@@ -1430,15 +964,13 @@
1430 964 /**
1431 965 * @since 5.0.13.1
1432 966 *
1433 967 * @param array $allowed_html
1434 - *
1435 968 * @return array
1436 969 */
1437 970 public static function add_allowed_icon_tags( $allowed_html ) {
1438 971 $allowed_html['svg']['data-open'] = true;
1439 972 $allowed_html['svg']['title'] = true;
1440 - $allowed_html['svg']['tabindex'] = true;
1441 973 return $allowed_html;
1442 974 }
1443 975
1444 976 /**
@@ -1444,13 +976,12 @@
1444 976 /**
1445 977 * @since 5.0.13
1446 978 *
1447 979 * @param array $allowed_attr
1448 - *
1449 980 * @return array
1450 981 */
1451 982 public static function allow_vars_in_styles( $allowed_attr ) {
1452 - $allowed_attr[] = '--primary-700';
983 + $allowed_attr[] = '--primary-hover';
1453 984 return $allowed_attr;
1454 985 }
1455 986
1456 987 /**
@@ -1459,9 +990,9 @@
1459 990 * @param bool $allow_css
1460 991 * @param string $css_string
1461 992 */
1462 993 public static function allow_style( $allow_css, $css_string ) {
1463 - if ( ! $allow_css && str_starts_with( $css_string, '--primary-700:' ) ) {
994 + if ( ! $allow_css && 0 === strpos( $css_string, '--primary-hover:' ) ) {
1464 995 $split = explode( ':', $css_string, 2 );
1465 996 $allow_css = 2 === count( $split ) && self::is_a_valid_color( $split[1] );
1466 997 }
1467 998 return $allow_css;
@@ -1470,22 +1001,19 @@
1470 1001 /**
1471 1002 * @since 5.0.13
1472 1003 *
1473 1004 * @param string $value
1474 - *
1475 1005 * @return bool
1476 1006 */
1477 1007 private static function is_a_valid_color( $value ) {
1478 1008 $match = 0;
1479 -
1480 - if ( str_starts_with( $value, 'rgba(' ) ) {
1009 + if ( 0 === strpos( $value, 'rgba(' ) ) {
1481 1010 $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(' ) ) {
1011 + } elseif ( 0 === strpos( $value, 'rgb(' ) ) {
1483 1012 $match = preg_match( '/^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/', $value );
1484 - } elseif ( str_starts_with( $value, '#' ) ) {
1013 + } elseif ( 0 === strpos( $value, '#' ) ) {
1485 1014 $match = preg_match( '/^#([a-f0-9]{6}|[a-f0-9]{3})\b$/', $value );
1486 1015 }
1487 -
1488 1016 return (bool) $match;
1489 1017 }
1490 1018
1491 1019 /**
@@ -1491,19 +1019,11 @@
1491 1019 /**
1492 1020 * Include svg images.
1493 1021 *
1494 1022 * @since 4.0.02
1495 - *
1496 - * @return void
1497 1023 */
1498 1024 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;
1025 + include_once( self::plugin_path() . '/images/icons.svg' );
1506 1026 }
1507 1027
1508 1028 /**
1509 1029 * Convert an associative array to HTML values.
@@ -1512,20 +1032,17 @@
1512 1032 * @since 5.0.13 added $echo parameter.
1513 1033 *
1514 1034 * @param array $atts
1515 1035 * @param bool $echo
1516 - *
1517 1036 * @return string|void
1518 1037 */
1519 1038 public static function array_to_html_params( $atts, $echo = false ) {
1520 - $callback = function () use ( $atts ) {
1521 - if ( ! $atts ) {
1522 - return;
1039 + $callback = function() use ( $atts ) {
1040 + if ( $atts ) {
1041 + foreach ( $atts as $key => $value ) {
1042 + echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1043 + }
1523 1044 }
1524 -
1525 - foreach ( $atts as $key => $value ) {
1526 - echo ' ' . esc_attr( $key ) . '="' . esc_attr( $value ) . '"';
1527 - }
1528 1045 };
1529 1046 return self::clip( $callback, $echo );
1530 1047 }
1531 1048
@@ -1535,10 +1052,9 @@
1535 1052 * @since 5.0.13
1536 1053 *
1537 1054 * @param Closure $echo_function
1538 1055 * @param bool $echo
1539 - *
1540 - * @return string|null
1056 + * @return string|void
1541 1057 */
1542 1058 public static function clip( $echo_function, $echo = false ) {
1543 1059 if ( ! $echo ) {
1544 1060 ob_start();
@@ -1543,160 +1059,60 @@
1543 1059 if ( ! $echo ) {
1544 1060 ob_start();
1545 1061 }
1546 1062
1547 - if ( is_callable( $echo_function ) ) {
1548 - $echo_function();
1063 + $echo_function();
1064 +
1065 + if ( ! $echo ) {
1066 + $return = ob_get_contents();
1067 + ob_end_clean();
1068 + return $return;
1549 1069 }
1550 -
1551 - return $echo ? null : ob_get_clean();
1552 1070 }
1553 1071
1554 1072 /**
1555 1073 * @since 3.0
1556 - *
1557 - * @param array $atts
1558 - *
1559 - * @return void
1560 1074 */
1561 1075 public static function get_admin_header( $atts ) {
1562 - $has_nav = ! empty( $atts['form'] ) && empty( $atts['is_template'] );
1563 -
1564 - if ( empty( $atts['close'] ) ) {
1076 + $has_nav = ( isset( $atts['form'] ) && ! empty( $atts['form'] ) && ( ! isset( $atts['is_template'] ) || ! $atts['is_template'] ) );
1077 + if ( ! isset( $atts['close'] ) || empty( $atts['close'] ) ) {
1565 1078 $atts['close'] = admin_url( 'admin.php?page=formidable' );
1566 1079 }
1567 -
1568 1080 if ( ! isset( $atts['import_link'] ) ) {
1569 1081 $atts['import_link'] = false;
1570 1082 }
1571 1083
1572 - include self::plugin_path() . '/classes/views/shared/admin-header.php';
1084 + include( self::plugin_path() . '/classes/views/shared/admin-header.php' );
1573 1085 }
1574 1086
1575 1087 /**
1576 - * @since 6.0
1577 - *
1578 - * @param string $type
1579 - *
1580 - * @return void
1088 + * @since 3.0
1089 + * @param array $atts
1581 1090 */
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 - * Print applicable admin banner.
1594 - *
1595 - * @since 5.4.2
1596 - *
1597 - * @param bool $should_show_lite_upgrade
1598 - *
1599 - * @return void
1600 - */
1601 - public static function print_admin_banner( $should_show_lite_upgrade ) {
1602 - if ( ! current_user_can( 'administrator' ) ) {
1603 - FrmInbox::maybe_show_banner();
1604 - return;
1605 - }
1606 -
1607 - if ( FrmSalesApi::maybe_show_banner() || self::maybe_show_license_warning() || FrmInbox::maybe_show_banner() || ! $should_show_lite_upgrade || self::pro_is_installed() ) {
1608 - // Print license warning or inbox banner and exit if either prints.
1609 - // And exit before printing the upgrade bar if it shouldn't be shown.
1610 - return;
1611 - }
1612 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1613 - ?>
1614 - <div class="frm-upgrade-bar">
1615 - <div class="frm-upgrade-bar-inner">
1091 + public static function add_new_item_link( $atts ) {
1092 + if ( ! empty( $atts['new_link'] ) ) {
1093 + ?>
1094 + <a href="<?php echo esc_url( $atts['new_link'] ); ?>" class="button button-primary frm-button-primary frm-with-plus">
1095 + <?php self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' ); ?>
1096 + <?php esc_html_e( 'Add New', 'formidable' ); ?>
1097 + </a>
1098 + <?php
1099 + } elseif ( ! empty( $atts['trigger_new_form_modal'] ) ) {
1100 + ?>
1101 + <a href="#" class="button button-primary frm-button-primary frm-with-plus frm-trigger-new-form-modal">
1616 1102 <?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 - );
1103 + self::icon_by_class( 'frmfont frm_plus_icon frm_svg15' );
1104 + esc_html_e( 'Add New', 'formidable' );
1638 1105 ?>
1639 - </div>
1640 - </div>
1641 - <?php
1642 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1643 - }
1644 -
1645 - /**
1646 - * @since 5.4.2
1647 - *
1648 - * @return bool True if a banner is available and shown.
1649 - */
1650 - private static function maybe_show_license_warning() {
1651 - return is_callable( 'FrmProAddonsController::admin_banner' ) && FrmProAddonsController::admin_banner();
1652 - }
1653 -
1654 - /**
1655 - * Render a button for a new item (Form, Application, etc).
1656 - *
1657 - * @since 3.0
1658 - *
1659 - * @param array $atts {
1660 - * Details about the button.
1661 - *
1662 - * @type array $link_hook Custom link hook, calls do_action and exits early.
1663 - * @type string $new_link Href value, default #.
1664 - * @type string $class Custom class names, space separated.
1665 - * @type string $button_text Button text. Default "Add New".
1666 - * }
1667 - *
1668 - * @return void
1669 - */
1670 - public static function add_new_item_link( $atts ) {
1671 - if ( isset( $atts['link_hook'] ) ) {
1106 + </a>
1107 + <?php
1108 + } elseif ( isset( $atts['link_hook'] ) ) {
1672 1109 do_action( $atts['link_hook']['hook'], $atts['link_hook']['param'] );
1673 - return;
1674 1110 }
1675 -
1676 - if ( empty( $atts['new_link'] ) && empty( $atts['create_form'] ) && empty( $atts['class'] ) ) {
1677 - // Do not render a button if none of these attributes are set.
1678 - return;
1679 - }
1680 -
1681 - $href = ! empty( $atts['new_link'] ) ? esc_url( $atts['new_link'] ) : '#';
1682 - $class = 'button button-primary frm-button-primary';
1683 -
1684 - if ( ! empty( $atts['class'] ) ) {
1685 - $class .= ' ' . $atts['class'];
1686 - }
1687 -
1688 - $button_text = ! empty( $atts['button_text'] ) ? $atts['button_text'] : __( 'Add New', 'formidable' );
1689 -
1690 - require self::plugin_path() . '/classes/views/shared/add-button.php';
1691 1111 }
1692 1112
1693 1113 /**
1694 1114 * @since 3.06
1695 - *
1696 - * @param array $atts
1697 - *
1698 - * @return void
1699 1115 */
1700 1116 public static function show_search_box( $atts ) {
1701 1117 $defaults = array(
1702 1118 'placeholder' => '',
@@ -1702,12 +1118,10 @@
1702 1118 'placeholder' => '',
1703 1119 'tosearch' => '',
1704 1120 'text' => __( 'Search', 'formidable' ),
1705 1121 'input_id' => '',
1706 - 'value' => false,
1707 - 'class' => '',
1708 1122 );
1709 - $atts = array_merge( $defaults, $atts );
1123 + $atts = array_merge( $defaults, $atts );
1710 1124
1711 1125 if ( $atts['input_id'] === 'template' && empty( $atts['tosearch'] ) ) {
1712 1126 $atts['tosearch'] = 'frm-card';
1713 1127 }
@@ -1712,9 +1126,8 @@
1712 1126 $atts['tosearch'] = 'frm-card';
1713 1127 }
1714 1128
1715 1129 $class = 'frm-search-input';
1716 -
1717 1130 if ( ! empty( $atts['tosearch'] ) ) {
1718 1131 $class .= ' frm-auto-search';
1719 1132 }
1720 1133
@@ -1719,35 +1132,21 @@
1719 1132 }
1720 1133
1721 1134 $input_id = $atts['input_id'] . '-search-input';
1722 1135
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 1136 ?>
1744 - <p class="frm-search <?php echo esc_attr( $atts['class'] ); ?>">
1137 + <p class="frm-search">
1745 1138 <label class="screen-reader-text" for="<?php echo esc_attr( $input_id ); ?>">
1746 1139 <?php echo esc_html( $atts['text'] ); ?>:
1747 1140 </label>
1748 - <?php self::icon_by_class( 'frmfont frm_search_icon frm_svg20' ); ?>
1749 - <input <?php self::array_to_html_params( $input_atts, true ); ?> />
1141 + <span class="frmfont frm_search_icon"></span>
1142 + <input type="search" id="<?php echo esc_attr( $input_id ); ?>" name="s"
1143 + value="<?php _admin_search_query(); ?>" placeholder="<?php echo esc_attr( $atts['placeholder'] ); ?>"
1144 + class="<?php echo esc_attr( $class ); ?>" data-tosearch="<?php echo esc_attr( $atts['tosearch'] ); ?>"
1145 + <?php if ( ! empty( $atts['tosearch'] ) ) { ?>
1146 + autocomplete="off"
1147 + <?php } ?>
1148 + />
1750 1149 <?php
1751 1150 if ( empty( $atts['tosearch'] ) ) {
1752 1151 submit_button( $atts['text'], 'button-secondary', '', false, array( 'id' => 'search-submit' ) );
1753 1152 }
@@ -1753,21 +1152,16 @@
1753 1152 }
1754 1153 ?>
1755 1154 </p>
1756 1155 <?php
1757 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1758 1156 }
1759 1157
1760 1158 /**
1761 - * @param string $type Hook type slug.
1762 - * @param object|null $object Optional related object.
1763 - *
1764 - * @return void
1159 + * @param string $type
1765 1160 */
1766 1161 public static function trigger_hook_load( $type, $object = null ) {
1767 1162 // Only load the form hooks once.
1768 1163 $hooks_loaded = apply_filters( 'frm_' . $type . '_hooks_loaded', false, $object );
1769 -
1770 1164 if ( ! $hooks_loaded ) {
1771 1165 do_action( 'frm_load_' . $type . '_hooks' );
1772 1166 }
1773 1167 }
@@ -1772,14 +1166,11 @@
1772 1166 }
1773 1167 }
1774 1168
1775 1169 /**
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.
1170 + * Save all front-end js scripts into a single file
1778 1171 *
1779 1172 * @since 3.0
1780 - *
1781 - * @return void
1782 1173 */
1783 1174 public static function save_combined_js() {
1784 1175 $file_atts = apply_filters(
1785 1176 'frm_js_location',
@@ -1792,34 +1183,10 @@
1792 1183
1793 1184 $files = array(
1794 1185 self::plugin_path() . '/js/formidable.min.js',
1795 1186 );
1796 - /**
1797 - * @param array $files
1798 - */
1799 1187 $files = apply_filters( 'frm_combined_js_files', $files );
1800 1188 $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 1189 }
1823 1190
1824 1191 /**
1825 1192 * Check a value from a shortcode to see if true or false.
@@ -1826,14 +1193,14 @@
1826 1193 * True when value is 1, true, 'true', 'yes'
1827 1194 *
1828 1195 * @since 1.07.10
1829 1196 *
1830 - * @param bool|int|string $value The value to compare.
1197 + * @param string $value The value to compare
1831 1198 *
1832 - * @return bool
1199 + * @return boolean True or False
1833 1200 */
1834 1201 public static function is_true( $value ) {
1835 - return true === $value || '1' === (string) $value || 'true' === $value || 'yes' === $value;
1202 + return ( true === $value || 1 == $value || 'true' == $value || 'yes' == $value );
1836 1203 }
1837 1204
1838 1205 /**
1839 1206 * Gets all post from a specific post type.
@@ -1841,9 +1208,8 @@
1841 1208 *
1842 1209 * @since 4.10.01 Add `$post_type` argument.
1843 1210 *
1844 1211 * @param string $post_type Post type to query. Default is `page`.
1845 - *
1846 1212 * @return WP_Post[]
1847 1213 */
1848 1214 public static function get_pages( $post_type = 'page' ) {
1849 1215 $query = array(
@@ -1862,9 +1228,8 @@
1862 1228 *
1863 1229 * @since 5.0.09
1864 1230 *
1865 1231 * @param string $post_type Post type to query. Default is `page`.
1866 - *
1867 1232 * @return array
1868 1233 */
1869 1234 public static function get_post_ids_and_titles( $post_type = 'page' ) {
1870 1235 return FrmDb::get_results(
@@ -1889,12 +1254,13 @@
1889 1254 *
1890 1255 * @param array $args Selection arguments.
1891 1256 */
1892 1257 public static function maybe_autocomplete_pages_options( $args ) {
1893 - $args = self::preformat_selection_args( $args );
1258 + $args = self::preformat_selection_args( $args );
1259 +
1894 1260 $pages_count = wp_count_posts( $args['post_type'] );
1895 1261
1896 - if ( ! isset( $pages_count->publish ) || $pages_count->publish <= 50 ) {
1262 + if ( $pages_count->publish <= 50 ) {
1897 1263 self::wp_pages_dropdown( $args );
1898 1264 return;
1899 1265 }
1900 1266
@@ -1900,9 +1266,9 @@
1900 1266
1901 1267 wp_enqueue_script( 'jquery-ui-autocomplete' );
1902 1268
1903 1269 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
1904 - $title = '';
1270 + $title = '';
1905 1271
1906 1272 if ( $selected ) {
1907 1273 $title = get_the_title( $selected );
1908 1274 }
@@ -1918,119 +1284,18 @@
1918 1284 <?php
1919 1285 }
1920 1286
1921 1287 /**
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.
1288 + * @param array $args
1289 + * @param string $page_id Deprecated.
1290 + * @param boolean $truncate Deprecated.
1927 1291 */
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 1292 public static function wp_pages_dropdown( $args = array(), $page_id = '', $truncate = false ) {
2028 1293 self::prep_page_dropdown_params( $page_id, $truncate, $args );
2029 1294
2030 1295 $pages = self::get_post_ids_and_titles( $args['post_type'] );
2031 1296 $selected = self::get_post_param( $args['field_name'], $args['page_id'], 'absint' );
2032 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1297 +
2033 1298 ?>
2034 1299 <select name="<?php echo esc_attr( $args['field_name'] ); ?>" id="<?php echo esc_attr( $args['field_name'] ); ?>" class="frm-pages-dropdown">
2035 1300 <option value=""><?php echo esc_html( $args['placeholder'] ); ?></option>
2036 1301 <?php foreach ( $pages as $page ) { ?>
@@ -2039,9 +1304,8 @@
2039 1304 </option>
2040 1305 <?php } ?>
2041 1306 </select>
2042 1307 <?php
2043 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2044 1308 }
2045 1309
2046 1310 /**
2047 1311 * Fill in missing parameters passed to wp_pages_dropdown().
@@ -2047,14 +1311,8 @@
2047 1311 * Fill in missing parameters passed to wp_pages_dropdown().
2048 1312 * This is for reverse compatibility with switching 3 params to 1.
2049 1313 *
2050 1314 * @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 1315 */
2058 1316 private static function prep_page_dropdown_params( $page_id, $truncate, &$args ) {
2059 1317 if ( ! is_array( $args ) ) {
2060 1318 $args = array(
@@ -2071,20 +1329,16 @@
2071 1329 * Filter to format args for page dropdown or autocomplete
2072 1330 *
2073 1331 * @since 4.03.06
2074 1332 * @since 4.10.01 Added `post_type` and `autocomplete_placeholder` to the arguments array.
2075 - *
2076 - * @param array $args
2077 - *
2078 - * @return array
2079 1333 */
2080 1334 private static function preformat_selection_args( $args ) {
2081 1335 $defaults = array(
2082 - 'truncate' => false,
2083 - 'placeholder' => ' ',
2084 - 'field_name' => '',
2085 - 'page_id' => '',
2086 - 'post_type' => 'page',
1336 + 'truncate' => false,
1337 + 'placeholder' => ' ',
1338 + 'field_name' => '',
1339 + 'page_id' => '',
1340 + 'post_type' => 'page',
2087 1341 'autocomplete_placeholder' => __( 'Select a Page', 'formidable' ),
2088 1342 );
2089 1343
2090 1344 return array_merge( $defaults, $args );
@@ -2089,18 +1343,14 @@
2089 1343
2090 1344 return array_merge( $defaults, $args );
2091 1345 }
2092 1346
2093 - /**
2094 - * @param int $post_id
2095 - *
2096 - * @return string
2097 - */
2098 1347 public static function post_edit_link( $post_id ) {
2099 1348 $post = get_post( $post_id );
2100 -
2101 1349 if ( $post ) {
2102 1350 $post_url = admin_url( 'post.php?post=' . $post_id . '&action=edit' );
1351 + $post_url = self::maybe_full_screen_link( $post_url );
1352 +
2103 1353 return '<a href="' . esc_url( $post_url ) . '">' . self::truncate( $post->post_title, 50 ) . '</a>';
2104 1354 }
2105 1355
2106 1356 return '';
@@ -2109,79 +1359,47 @@
2109 1359 /**
2110 1360 * Hide the WordPress menus on some pages.
2111 1361 *
2112 1362 * @since 4.0
2113 - *
2114 - * @return bool
2115 1363 */
2116 1364 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();
1365 + $full_builder = self::is_form_builder_page();
1366 + $styler = self::is_admin_page( 'formidable-styles' ) || self::is_admin_page( 'formidable-styles2' );
1367 + $full_entries = self::simple_get( 'frm-full', 'absint' );
1368 +
1369 + return $full_builder || $full_entries || $styler || self::is_view_builder_page();
2118 1370 }
2119 1371
2120 1372 /**
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
1373 + * @since 4.0
2131 1374 */
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;
1375 + public static function maybe_full_screen_link( $link ) {
1376 + $is_full = self::simple_get( 'frm-full', 'absint' );
1377 + if ( $is_full && ! empty( $link ) && $link !== '#' ) {
1378 + $link .= '&frm-full=1';
2135 1379 }
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;
1380 + return $link;
2151 1381 }
2152 1382
2153 1383 /**
2154 - * @since 5.5.3
2155 - *
2156 - * @return bool
1384 + * @param string $field_name
1385 + * @param string|array $capability
1386 + * @param string $multiple 'single' and 'multiple'
2157 1387 */
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 1388 public static function wp_roles_dropdown( $field_name, $capability, $multiple = 'single' ) {
2168 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
2169 1389 ?>
2170 1390 <select name="<?php echo esc_attr( $field_name ); ?>" id="<?php echo esc_attr( $field_name ); ?>"
2171 - <?php echo 'multiple' === $multiple ? 'multiple="multiple"' : ''; ?>
1391 + <?php echo ( 'multiple' === $multiple ) ? 'multiple="multiple"' : ''; ?>
2172 1392 class="frm_multiselect">
2173 1393 <?php self::roles_options( $capability ); ?>
2174 1394 </select>
2175 1395 <?php
2176 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
2177 1396 }
2178 1397
2179 1398 /**
2180 1399 * @since 4.07
2181 - *
2182 1400 * @param array|string $selected
2183 - * @param string $current
1401 + * @param string $current
2184 1402 */
2185 1403 private static function selected( $selected, $current ) {
2186 1404 if ( is_callable( 'FrmProAppHelper::selected' ) ) {
2187 1405 FrmProAppHelper::selected( $selected, $current );
@@ -2190,13 +1408,12 @@
2190 1408 }
2191 1409 }
2192 1410
2193 1411 /**
2194 - * @param array|string $capability
1412 + * @param string|array $capability
2195 1413 */
2196 1414 public static function roles_options( $capability ) {
2197 1415 global $frm_vars;
2198 -
2199 1416 if ( isset( $frm_vars['editable_roles'] ) ) {
2200 1417 $editable_roles = $frm_vars['editable_roles'];
2201 1418 } else {
2202 1419 $editable_roles = get_editable_roles();
@@ -2205,9 +1422,9 @@
2205 1422
2206 1423 foreach ( $editable_roles as $role => $details ) {
2207 1424 $name = translate_user_role( $details['name'] );
2208 1425 ?>
2209 - <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_html( $name ); ?></option>
1426 + <option value="<?php echo esc_attr( $role ); ?>" <?php self::selected( $capability, $role ); ?>><?php echo esc_attr( $name ); ?> </option>
2210 1427 <?php
2211 1428 unset( $role, $details );
2212 1429 }
2213 1430 }
@@ -2217,14 +1434,22 @@
2217 1434 *
2218 1435 * @since 5.0 Parameter `$type` supports `pro_only` value.
2219 1436 *
2220 1437 * @param string $type Supports `auto`, `pro`, or `pro_only`.
2221 - *
2222 1438 * @return array
2223 1439 */
2224 1440 public static function frm_capabilities( $type = 'auto' ) {
2225 - if ( ! self::pro_is_installed() && ! in_array( $type, array( 'pro', 'pro_only' ), true ) ) {
2226 - return self::get_lite_capabilities();
1441 + $cap = array(
1442 + 'frm_view_forms' => __( 'View Forms', 'formidable' ),
1443 + 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
1444 + 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
1445 + 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
1446 + 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
1447 + 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
1448 + );
1449 +
1450 + if ( ! self::pro_is_installed() && 'pro' !== $type && 'pro_only' !== $type ) {
1451 + return $cap;
2227 1452 }
2228 1453
2229 1454 $pro_cap = array(
2230 1455 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
@@ -2229,42 +1454,19 @@
2229 1454 $pro_cap = array(
2230 1455 'frm_create_entries' => __( 'Add Entries from Admin Area', 'formidable' ),
2231 1456 'frm_edit_entries' => __( 'Edit Entries from Admin Area', 'formidable' ),
2232 1457 'frm_view_reports' => __( 'View Reports', 'formidable' ),
1458 + 'frm_edit_displays' => __( 'Add/Edit Views', 'formidable' ),
2233 1459 );
2234 - /**
2235 - * @since 5.3.1
2236 - *
2237 - * @param array<string,string> $pro_cap
2238 - */
2239 - $pro_cap = apply_filters( 'frm_pro_capabilities', $pro_cap );
2240 1460
2241 1461 if ( 'pro_only' === $type ) {
2242 1462 return $pro_cap;
2243 1463 }
2244 1464
2245 - return self::get_lite_capabilities() + $pro_cap;
1465 + return $cap + $pro_cap;
2246 1466 }
2247 1467
2248 1468 /**
2249 - * Get the list of lite plugin capabilities.
2250 - *
2251 - * @since 5.3.1
2252 - *
2253 - * @return array<string,string>
2254 - */
2255 - private static function get_lite_capabilities() {
2256 - return array(
2257 - 'frm_view_forms' => __( 'View Forms List', 'formidable' ),
2258 - 'frm_edit_forms' => __( 'Add and Edit Forms', 'formidable' ),
2259 - 'frm_delete_forms' => __( 'Delete Forms', 'formidable' ),
2260 - 'frm_change_settings' => __( 'Access this Settings Page', 'formidable' ),
2261 - 'frm_view_entries' => __( 'View Entries from Admin Area', 'formidable' ),
2262 - 'frm_delete_entries' => __( 'Delete Entries from Admin Area', 'formidable' ),
2263 - );
2264 - }
2265 -
2266 - /**
2267 1469 * Call the WordPress current_user_can but also validate empty strings as true for any logged in user
2268 1470 *
2269 1471 * @since 4.06.03
2270 1472 *
@@ -2284,18 +1486,21 @@
2284 1486 if ( $role === 'loggedin' || ! $role ) {
2285 1487 return is_user_logged_in();
2286 1488 }
2287 1489
2288 - if ( (int) $role === 1 ) {
1490 + if ( $role == 1 ) {
2289 1491 $role = 'administrator';
2290 1492 }
2291 1493
2292 - return is_user_logged_in() ? current_user_can( $role ) : false;
1494 + if ( ! is_user_logged_in() ) {
1495 + return false;
1496 + }
1497 +
1498 + return current_user_can( $role );
2293 1499 }
2294 1500
2295 1501 /**
2296 - * @param array|string $needed_role
2297 - *
1502 + * @param string|array $needed_role
2298 1503 * @return bool
2299 1504 */
2300 1505 public static function user_has_permission( $needed_role ) {
2301 1506 if ( is_array( $needed_role ) ) {
@@ -2309,20 +1514,18 @@
2309 1514 }
2310 1515
2311 1516 $can = self::current_user_can( $needed_role );
2312 1517
2313 - if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ), true ) ) {
1518 + if ( $can || in_array( $needed_role, array( '-1', 'loggedout' ) ) ) {
2314 1519 return $can;
2315 1520 }
2316 1521
2317 1522 $roles = array( 'administrator', 'editor', 'author', 'contributor', 'subscriber' );
2318 -
2319 1523 foreach ( $roles as $role ) {
2320 1524 if ( current_user_can( $role ) ) {
2321 1525 return true;
2322 1526 }
2323 -
2324 - if ( $role === $needed_role ) {
1527 + if ( $role == $needed_role ) {
2325 1528 break;
2326 1529 }
2327 1530 }
2328 1531
@@ -2343,9 +1546,8 @@
2343 1546
2344 1547 $user_id = get_current_user_id();
2345 1548 $user = new WP_User( $user_id );
2346 1549 $frm_roles = self::frm_capabilities();
2347 -
2348 1550 foreach ( $frm_roles as $frm_role => $frm_role_description ) {
2349 1551 $user->add_cap( $frm_role );
2350 1552 unset( $frm_role, $frm_role_description );
2351 1553 }
@@ -2354,47 +1556,35 @@
2354 1556 /**
2355 1557 * Make sure admins have permission to see the menu items
2356 1558 *
2357 1559 * @since 2.0.6
2358 - *
2359 - * @param string $cap
2360 - *
2361 - * @return void
2362 1560 */
2363 1561 public static function force_capability( $cap = 'frm_change_settings' ) {
2364 - if ( ! current_user_can( 'administrator' ) || current_user_can( $cap ) ) {
2365 - return;
1562 + if ( current_user_can( 'administrator' ) && ! current_user_can( $cap ) ) {
1563 + $role = get_role( 'administrator' );
1564 + $frm_roles = self::frm_capabilities();
1565 + foreach ( $frm_roles as $frm_role => $frm_role_description ) {
1566 + $role->add_cap( $frm_role );
1567 + }
2366 1568 }
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 1569 }
2375 1570
2376 1571 /**
2377 - * Check if the user has permission for action.
1572 + * Check if the user has permision for action.
2378 1573 * Return permission message and stop the action if no permission
2379 1574 *
2380 1575 * @since 2.0
2381 1576 *
2382 1577 * @param string $permission
2383 - * @param string $show_message
2384 1578 */
2385 1579 public static function permission_check( $permission, $show_message = 'show' ) {
2386 1580 $permission_error = self::permission_nonce_error( $permission );
2387 -
2388 - if ( $permission_error === false ) {
2389 - return;
1581 + if ( $permission_error !== false ) {
1582 + if ( 'hide' == $show_message ) {
1583 + $permission_error = '';
1584 + }
1585 + wp_die( esc_html( $permission_error ) );
2390 1586 }
2391 -
2392 - if ( 'hide' === $show_message ) {
2393 - $permission_error = '';
2394 - }
2395 -
2396 - wp_die( esc_html( $permission_error ) );
2397 1587 }
2398 1588
2399 1589 /**
2400 1590 * Check user permission and nonce
@@ -2401,27 +1591,24 @@
2401 1591 *
2402 1592 * @since 2.0
2403 1593 *
2404 1594 * @param string $permission
2405 - * @param string $nonce_name
2406 - * @param string $nonce
2407 1595 *
2408 1596 * @return false|string The permission message or false if allowed
2409 1597 */
2410 1598 public static function permission_nonce_error( $permission, $nonce_name = '', $nonce = '' ) {
2411 - if ( $permission && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
1599 + if ( ! empty( $permission ) && ! current_user_can( $permission ) && ! current_user_can( 'administrator' ) ) {
2412 1600 $frm_settings = self::get_settings();
1601 +
2413 1602 return $frm_settings->admin_permission;
2414 1603 }
2415 1604
2416 1605 $error = false;
2417 -
2418 - if ( ! $nonce_name ) {
1606 + if ( empty( $nonce_name ) ) {
2419 1607 return $error;
2420 1608 }
2421 1609
2422 - $nonce_value = $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2423 -
1610 + $nonce_value = ( $_REQUEST && isset( $_REQUEST[ $nonce_name ] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST[ $nonce_name ] ) ) : '';
2424 1611 if ( $_REQUEST && ( ! isset( $_REQUEST[ $nonce_name ] ) || ! wp_verify_nonce( $nonce_value, $nonce ) ) ) {
2425 1612 $frm_settings = self::get_settings();
2426 1613 $error = $frm_settings->admin_permission;
2427 1614 }
@@ -2428,14 +1615,8 @@
2428 1615
2429 1616 return $error;
2430 1617 }
2431 1618
2432 - /**
2433 - * @param array|string $values
2434 - * @param string $current
2435 - *
2436 - * @return void
2437 - */
2438 1619 public static function checked( $values, $current ) {
2439 1620 if ( self::check_selected( $values, $current ) ) {
2440 1621 echo ' checked="checked"';
2441 1622 }
@@ -2440,74 +1621,40 @@
2440 1621 echo ' checked="checked"';
2441 1622 }
2442 1623 }
2443 1624
2444 - /**
2445 - * @param array|string $values
2446 - * @param string|null $current
2447 - *
2448 - * @return bool
2449 - */
2450 1625 public static function check_selected( $values, $current ) {
2451 1626 $values = self::recursive_function_map( $values, 'trim' );
2452 1627 $values = self::recursive_function_map( $values, 'htmlspecialchars_decode' );
2453 - $current = is_null( $current ) ? '' : htmlspecialchars_decode( trim( $current ) );
1628 + $current = htmlspecialchars_decode( trim( $current ) );
2454 1629
2455 - // phpcs:ignore WordPress.PHP.StrictInArray.MissingTrueStrict, Universal.Operators.StrictComparisons
2456 - return is_array( $values ) ? in_array( $current, $values ) : $values == $current;
1630 + return ( is_array( $values ) && in_array( $current, $values ) ) || ( ! is_array( $values ) && $values == $current );
2457 1631 }
2458 1632
2459 - /**
2460 - * @param array|string $value
2461 - * @param callable|string $function
2462 - *
2463 - * @return array|string
2464 - */
2465 1633 public static function recursive_function_map( $value, $function ) {
2466 1634 if ( is_array( $value ) ) {
2467 1635 $original_function = $function;
2468 - $function = count( $value ) ? explode( ', ', FrmDb::prepare_array_values( $value, $function ) ) : array( $function );
2469 -
2470 - if ( self::is_assoc( $value ) ) {
1636 + if ( count( $value ) ) {
1637 + $function = explode( ', ', FrmDb::prepare_array_values( $value, $function ) );
1638 + } else {
1639 + $function = array( $function );
1640 + }
1641 + if ( ! self::is_assoc( $value ) ) {
1642 + $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
1643 + } else {
2471 1644 foreach ( $value as $k => $v ) {
2472 1645 if ( ! is_array( $v ) ) {
2473 1646 $value[ $k ] = call_user_func( $original_function, $v );
2474 1647 }
2475 1648 }
2476 - } else {
2477 - $value = array_map( array( 'FrmAppHelper', 'recursive_function_map' ), $value, $function );
2478 1649 }
2479 1650 } else {
2480 - $value = self::maybe_update_value_if_null( $value, $function );
2481 1651 $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 1652 }
2501 1653
2502 1654 return $value;
2503 1655 }
2504 1656
2505 - /**
2506 - * @param array $array
2507 - *
2508 - * @return bool
2509 - */
2510 1657 public static function is_assoc( $array ) {
2511 1658 return (bool) count( array_filter( array_keys( $array ), 'is_string' ) );
2512 1659 }
2513 1660
@@ -2512,24 +1659,20 @@
2512 1659 }
2513 1660
2514 1661 /**
2515 1662 * Flatten a multi-dimensional array
2516 - *
2517 - * @param array $array
2518 - * @param string $keys
2519 - *
2520 - * @return array
2521 1663 */
2522 1664 public static function array_flatten( $array, $keys = 'keep' ) {
2523 1665 $return = array();
2524 -
2525 1666 foreach ( $array as $key => $value ) {
2526 1667 if ( is_array( $value ) ) {
2527 1668 $return = array_merge( $return, self::array_flatten( $value, $keys ) );
2528 - } elseif ( $keys === 'keep' ) {
2529 - $return[ $key ] = $value;
2530 1669 } else {
2531 - $return[] = $value;
1670 + if ( $keys == 'keep' ) {
1671 + $return[ $key ] = $value;
1672 + } else {
1673 + $return[] = $value;
1674 + }
2532 1675 }
2533 1676 }
2534 1677
2535 1678 return $return;
@@ -2534,43 +1677,16 @@
2534 1677
2535 1678 return $return;
2536 1679 }
2537 1680
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 1681 public static function esc_textarea( $text, $is_rich_text = false ) {
2560 1682 $safe_text = str_replace( '&quot;', '"', $text );
2561 -
2562 1683 if ( ! $is_rich_text ) {
2563 1684 $safe_text = htmlspecialchars( $safe_text, ENT_NOQUOTES );
2564 1685 }
2565 -
2566 1686 $safe_text = str_replace( '&amp; ', '& ', $safe_text );
2567 1687
2568 - /**
2569 - * @param string $safe_text
2570 - * @param string $text
2571 - */
2572 - return (string) apply_filters( 'esc_textarea', $safe_text, $text );
1688 + return apply_filters( 'esc_textarea', $safe_text, $text );
2573 1689 }
2574 1690
2575 1691 /**
2576 1692 * Add auto paragraphs to text areas
@@ -2575,59 +1691,44 @@
2575 1691 /**
2576 1692 * Add auto paragraphs to text areas
2577 1693 *
2578 1694 * @since 2.0
2579 - *
2580 - * @param mixed $content
2581 - *
2582 - * @return mixed
2583 1695 */
2584 1696 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 ) );
1697 + if ( apply_filters( 'frm_use_wpautop', true ) && ! is_array( $content ) ) {
1698 + $content = wpautop( str_replace( '<br>', '<br />', $content ) );
2587 1699 }
2588 1700
2589 1701 return $content;
2590 1702 }
2591 1703
2592 - /**
2593 - * Replace quotes with their HTML entities.
2594 - *
2595 - * @param string $val
2596 - *
2597 - * @return string
2598 - */
2599 1704 public static function replace_quotes( $val ) {
2600 1705 // Replace double quotes.
2601 1706 $val = str_replace( array( '&#8220;', '&#8221;', '&#8243;' ), '"', $val );
2602 1707
2603 1708 // Replace single quotes.
2604 - return str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
1709 + $val = str_replace( array( '&#8216;', '&#8217;', '&#8242;', '&prime;', '&rsquo;', '&lsquo;' ), "'", $val );
1710 +
1711 + return $val;
2605 1712 }
2606 1713
2607 1714 /**
2608 - * @param string $handle
2609 - * @param int|string $default
2610 - *
2611 - * @return int|string
1715 + * @param string $handle
2612 1716 */
2613 1717 public static function script_version( $handle, $default = 0 ) {
2614 1718 global $wp_scripts;
2615 -
2616 1719 if ( ! $wp_scripts ) {
2617 1720 return $default;
2618 1721 }
2619 1722
2620 1723 $ver = $default;
2621 -
2622 1724 if ( ! isset( $wp_scripts->registered[ $handle ] ) ) {
2623 1725 return $ver;
2624 1726 }
2625 1727
2626 1728 $query = $wp_scripts->registered[ $handle ];
2627 -
2628 1729 if ( is_object( $query ) && ! empty( $query->ver ) ) {
2629 - return $query->ver;
1730 + $ver = $query->ver;
2630 1731 }
2631 1732
2632 1733 return $ver;
2633 1734 }
@@ -2636,23 +1737,17 @@
2636 1737 * @since 5.0.13 added $echo param.
2637 1738 *
2638 1739 * @param string $url
2639 1740 * @param bool $echo
2640 - *
2641 - * @return string|null
1741 + * @return string|void
2642 1742 */
2643 1743 public static function js_redirect( $url, $echo = false ) {
2644 - $callback = function () use ( $url ) {
1744 + $callback = function() use ( $url ) {
2645 1745 echo '<script type="text/javascript">window.location="' . esc_url_raw( $url ) . '"</script>';
2646 1746 };
2647 1747 return self::clip( $callback, $echo );
2648 1748 }
2649 1749
2650 - /**
2651 - * @param int|string $user_id
2652 - *
2653 - * @return int|string
2654 - */
2655 1750 public static function get_user_id_param( $user_id ) {
2656 1751 if ( ! $user_id || is_numeric( $user_id ) ) {
2657 1752 return $user_id;
2658 1753 }
@@ -2657,13 +1752,16 @@
2657 1752 return $user_id;
2658 1753 }
2659 1754
2660 1755 $user_id = sanitize_text_field( $user_id );
2661 -
2662 - if ( $user_id === 'current' ) {
1756 + if ( $user_id == 'current' ) {
2663 1757 $user_id = get_current_user_id();
2664 1758 } else {
2665 - $user = is_email( $user_id ) ? get_user_by( 'email', $user_id ) : get_user_by( 'login', $user_id );
1759 + if ( is_email( $user_id ) ) {
1760 + $user = get_user_by( 'email', $user_id );
1761 + } else {
1762 + $user = get_user_by( 'login', $user_id );
1763 + }
2666 1764
2667 1765 if ( $user ) {
2668 1766 $user_id = $user->ID;
2669 1767 }
@@ -2672,14 +1770,8 @@
2672 1770
2673 1771 return $user_id;
2674 1772 }
2675 1773
2676 - /**
2677 - * @param string $filename
2678 - * @param array $atts
2679 - *
2680 - * @return false|string
2681 - */
2682 1774 public static function get_file_contents( $filename, $atts = array() ) {
2683 1775 if ( ! is_file( $filename ) ) {
2684 1776 return false;
2685 1777 }
@@ -2685,10 +1777,13 @@
2685 1777 }
2686 1778
2687 1779 extract( $atts ); // phpcs:ignore WordPress.PHP.DontExtract
2688 1780 ob_start();
2689 - include $filename;
2690 - return ob_get_clean();
1781 + include( $filename );
1782 + $contents = ob_get_contents();
1783 + ob_end_clean();
1784 +
1785 + return $contents;
2691 1786 }
2692 1787
2693 1788 /**
2694 1789 * @param string $name
@@ -2698,9 +1793,8 @@
2698 1793 * @param int $num_chars
2699 1794 */
2700 1795 public static function get_unique_key( $name, $table_name, $column, $id = 0, $num_chars = 5 ) {
2701 1796 $key = '';
2702 -
2703 1797 if ( $name ) {
2704 1798 $key = sanitize_key( $name );
2705 1799 $key = self::maybe_clear_long_key( $key, $column );
2706 1800 }
@@ -2720,31 +1814,31 @@
2720 1814 $column
2721 1815 );
2722 1816
2723 1817 // Create a unique field id if it has already been used.
2724 - if ( ! in_array( $key, $similar_keys, true ) ) {
2725 - return $key;
2726 - }
1818 + if ( in_array( $key, $similar_keys, true ) ) {
1819 + $key = self::maybe_truncate_key_before_appending( $column, $key );
2727 1820
2728 - $key = self::maybe_truncate_key_before_appending( $column, $key );
1821 + /**
1822 + * Allow for a custom separator between the attempted key and the generated suffix.
1823 + *
1824 + * @since 5.2.03
1825 + *
1826 + * @param string $separator. Default empty.
1827 + * @param string $key the key without the added suffix.
1828 + */
1829 + $separator = apply_filters( 'frm_unique_' . $column . '_separator', '', $key );
2729 1830
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 );
1831 + $suffix = 2;
1832 + do {
1833 + $key_check = $key . $separator . $suffix;
1834 + ++$suffix;
1835 + } while ( in_array( $key_check, $similar_keys, true ) );
2739 1836
2740 - $suffix = 2;
2741 - do {
2742 - $key_check = $key . $separator . $suffix;
2743 - ++$suffix;
2744 - } while ( in_array( $key_check, $similar_keys, true ) );
1837 + $key = $key_check;
1838 + }
2745 1839
2746 - return $key_check;
1840 + return $key;
2747 1841 }
2748 1842
2749 1843 /**
2750 1844 * Avoid trying to append to a really long key,
@@ -2751,26 +1845,20 @@
2751 1845 * The database limit is 100 for form and field keys so we want to avoid getting too close.
2752 1846 *
2753 1847 * @param string $column
2754 1848 * @param string $key
2755 - *
2756 1849 * @return string
2757 1850 */
2758 1851 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';
1852 + if ( in_array( $column, array( 'form_key', 'field_key' ), true ) ) {
1853 + $max_key_length_before_truncating = 60;
1854 + if ( strlen( $key ) > $max_key_length_before_truncating ) {
1855 + $key = substr( $key, 0, $max_key_length_before_truncating );
1856 + if ( is_numeric( $key ) ) {
1857 + $key .= 'a';
1858 + }
2770 1859 }
2771 1860 }
2772 -
2773 1861 return $key;
2774 1862 }
2775 1863
2776 1864 /**
@@ -2777,36 +1865,29 @@
2777 1865 * Possibly reset a key to avoid conflicts with column size limits.
2778 1866 *
2779 1867 * @param string $key
2780 1868 * @param string $column
2781 - *
2782 1869 * @return string either the original key value, or an empty string if the key was too long.
2783 1870 */
2784 1871 private static function maybe_clear_long_key( $key, $column ) {
2785 1872 if ( 'field_key' === $column && strlen( $key ) >= 70 ) {
2786 - return '';
1873 + $key = '';
2787 1874 }
2788 1875 return $key;
2789 1876 }
2790 1877
2791 1878 /**
2792 - * @since 6.21 This is changed from `private` to `public`.
2793 - *
2794 1879 * @param int $num_chars
2795 - *
2796 1880 * @return string
2797 1881 */
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 );
1882 + private static function generate_new_key( $num_chars ) {
1883 + $max_slug_value = pow( 36, $num_chars );
1884 + $min_slug_value = 37; // we want to have at least 2 characters in the slug
1885 + return base_convert( rand( $min_slug_value, $max_slug_value ), 10, 36 );
2804 1886 }
2805 1887
2806 1888 /**
2807 1889 * @param string $key
2808 - *
2809 1890 * @return string
2810 1891 */
2811 1892 private static function prevent_numeric_and_reserved_keys( $key ) {
2812 1893 if ( is_numeric( $key ) ) {
@@ -2820,14 +1901,12 @@
2820 1901 'editlink',
2821 1902 'siteurl',
2822 1903 'evenodd',
2823 1904 );
2824 -
2825 1905 if ( in_array( $key, $not_allowed, true ) ) {
2826 1906 $key .= 'a';
2827 1907 }
2828 1908 }
2829 -
2830 1909 return $key;
2831 1910 }
2832 1911
2833 1912 /**
@@ -2832,16 +1911,11 @@
2832 1911
2833 1912 /**
2834 1913 * Editing a Form or Entry
2835 1914 *
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
1915 + * @param string $table
2842 1916 *
2843 - * @return array|bool
1917 + * @return bool|array
2844 1918 */
2845 1919 public static function setup_edit_vars( $record, $table, $fields = '', $default = false, $post_values = array(), $args = array() ) {
2846 1920 if ( ! $record ) {
2847 1921 return false;
@@ -2846,9 +1920,9 @@
2846 1920 if ( ! $record ) {
2847 1921 return false;
2848 1922 }
2849 1923
2850 - if ( ! $post_values ) {
1924 + if ( empty( $post_values ) ) {
2851 1925 $post_values = wp_unslash( $_POST ); // phpcs:ignore WordPress.Security.NonceVerification.Missing
2852 1926 }
2853 1927
2854 1928 $values = array(
@@ -2856,9 +1930,9 @@
2856 1930 'fields' => array(),
2857 1931 );
2858 1932
2859 1933 foreach ( array( 'name', 'description' ) as $var ) {
2860 - $default_val = $record->{$var} ?? '';
1934 + $default_val = isset( $record->{$var} ) ? $record->{$var} : '';
2861 1935 $values[ $var ] = self::get_param( $var, $default_val, 'get', 'wp_kses_post' );
2862 1936 unset( $var, $default_val );
2863 1937 }
2864 1938
@@ -2876,67 +1950,48 @@
2876 1950
2877 1951 return $values;
2878 1952 }
2879 1953
2880 - /**
2881 - * @param array|string $fields
2882 - * @param object $record
2883 - * @param array $values
2884 - * @param array $args
2885 - *
2886 - * @return void
2887 - */
2888 1954 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 );
1955 + if ( ! empty( $fields ) ) {
1956 + foreach ( (array) $fields as $field ) {
1957 + if ( ! self::is_admin_page() ) {
1958 + // Don't prep default values on the form settings page.
1959 + $field->default_value = apply_filters( 'frm_get_default_value', $field->default_value, $field, true );
1960 + }
1961 + $args['parent_form_id'] = isset( $args['parent_form_id'] ) ? $args['parent_form_id'] : $field->form_id;
1962 + self::fill_field_defaults( $field, $record, $values, $args );
2897 1963 }
2898 -
2899 - $args['parent_form_id'] = $args['parent_form_id'] ?? $field->form_id;
2900 - self::fill_field_defaults( $field, $record, $values, $args );
2901 1964 }
2902 1965 }
2903 1966
2904 - /**
2905 - * @param object $field
2906 - * @param object $record
2907 - * @param array $values
2908 - * @param array $args
2909 - *
2910 - * @return void
2911 - */
2912 1967 private static function fill_field_defaults( $field, $record, array &$values, $args ) {
2913 1968 $post_values = $args['post_values'];
2914 1969
2915 1970 if ( $args['default'] ) {
2916 1971 $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'] = '';
1972 + } else {
1973 + if ( $record->post_id && self::pro_is_installed() && isset( $field->field_options['post_field'] ) && $field->field_options['post_field'] ) {
1974 + if ( ! isset( $field->field_options['custom_field'] ) ) {
1975 + $field->field_options['custom_field'] = '';
1976 + }
1977 + $meta_value = FrmProEntryMetaHelper::get_post_value(
1978 + $record->post_id,
1979 + $field->field_options['post_field'],
1980 + $field->field_options['custom_field'],
1981 + array(
1982 + 'truncate' => false,
1983 + 'type' => $field->type,
1984 + 'form_id' => $field->form_id,
1985 + 'field' => $field,
1986 + )
1987 + );
1988 + } else {
1989 + $meta_value = FrmEntryMeta::get_meta_value( $record, $field->id );
2920 1990 }
1991 + }
2921 1992
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 -
1993 + $field_type = isset( $post_values['field_options'][ 'type_' . $field->id ] ) ? $post_values['field_options'][ 'type_' . $field->id ] : $field->type;
2939 1994 if ( isset( $post_values['item_meta'][ $field->id ] ) ) {
2940 1995 $new_value = $post_values['item_meta'][ $field->id ];
2941 1996 self::unserialize_or_decode( $new_value );
2942 1997 } else {
@@ -2951,9 +2006,9 @@
2951 2006 $args['field_type'] = $field_type;
2952 2007
2953 2008 FrmFieldsHelper::prepare_edit_front_field( $field_array, $field, $values['id'], $args );
2954 2009
2955 - if ( empty( $field_array['unique'] ) ) {
2010 + if ( ! isset( $field_array['unique'] ) || ! $field_array['unique'] ) {
2956 2011 $field_array['unique_msg'] = '';
2957 2012 }
2958 2013
2959 2014 $field_array = array_merge( (array) $field->field_options, $field_array );
@@ -2982,15 +2037,12 @@
2982 2037 );
2983 2038 }
2984 2039
2985 2040 /**
2986 - * @param object $record
2987 2041 * @param string $table
2988 - * @param array $post_values
2989 - * @param array $values
2990 2042 */
2991 2043 private static function fill_form_opts( $record, $table, $post_values, array &$values ) {
2992 - if ( $table === 'entries' ) {
2044 + if ( $table == 'entries' ) {
2993 2045 $form = $record->form_id;
2994 2046 FrmForm::maybe_get_form( $form );
2995 2047 } else {
2996 2048 $form = $record;
@@ -3020,21 +2072,15 @@
3020 2072 }
3021 2073
3022 2074 /**
3023 2075 * Set to POST value or default
3024 - *
3025 - * @param array $post_values
3026 - * @param array $values
3027 - *
3028 - * @return void
3029 2076 */
3030 2077 private static function fill_form_defaults( $post_values, array &$values ) {
3031 2078 $form_defaults = FrmFormsHelper::get_default_opts();
3032 2079
3033 2080 foreach ( $form_defaults as $opt => $default ) {
3034 - // phpcs:ignore Universal.Operators.StrictComparisons
3035 2081 if ( ! isset( $values[ $opt ] ) || $values[ $opt ] == '' ) {
3036 - $values[ $opt ] = $post_values['options'][ $opt ] ?? $default;
2082 + $values[ $opt ] = ( $post_values && isset( $post_values['options'][ $opt ] ) ) ? $post_values['options'][ $opt ] : $default;
3037 2083 }
3038 2084
3039 2085 unset( $opt, $default );
3040 2086 }
@@ -3044,9 +2090,9 @@
3044 2090 }
3045 2091
3046 2092 foreach ( array( 'before', 'after', 'submit' ) as $h ) {
3047 2093 if ( ! isset( $values[ $h . '_html' ] ) ) {
3048 - $values[ $h . '_html' ] = $post_values['options'][ $h . '_html' ] ?? FrmFormsHelper::get_default_html( $h );
2094 + $values[ $h . '_html' ] = ( isset( $post_values['options'][ $h . '_html' ] ) ? $post_values['options'][ $h . '_html' ] : FrmFormsHelper::get_default_html( $h ) );
3049 2095 }
3050 2096 unset( $h );
3051 2097 }
3052 2098 }
@@ -3055,58 +2101,46 @@
3055 2101 * @since 2.2.10
3056 2102 *
3057 2103 * @param array $post_values
3058 2104 *
3059 - * @return bool|int
2105 + * @return boolean|int
3060 2106 */
3061 2107 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'] );
2108 + if ( ! empty( $post_values ) && isset( $post_values['options']['custom_style'] ) ) {
2109 + $custom_style = absint( $post_values['options']['custom_style'] );
2110 + } else {
2111 + $frm_settings = self::get_settings();
2112 + $custom_style = ( $frm_settings->load_style != 'none' );
3064 2113 }
3065 2114
3066 - $frm_settings = self::get_settings();
3067 - return $frm_settings->load_style !== 'none';
2115 + return $custom_style;
3068 2116 }
3069 2117
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 ) ) {
2118 + public static function truncate( $str, $length, $minword = 3, $continue = '...' ) {
2119 + if ( is_array( $str ) ) {
3080 2120 return '';
3081 2121 }
3082 2122
3083 - $length = (int) $length;
2123 + $length = (int) $length;
2124 + $str = wp_strip_all_tags( $str );
2125 + $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
3084 2126
3085 - if ( $length === 0 ) {
2127 + if ( $length == 0 ) {
3086 2128 return '';
2129 + } elseif ( $length <= 10 ) {
2130 + $sub = self::mb_function( array( 'mb_substr', 'substr' ), array( $str, 0, $length ) );
2131 +
2132 + return $sub . ( ( $length < $original_len ) ? $continue : '' );
3087 2133 }
3088 2134
3089 - $str = wp_strip_all_tags( (string) $original_string );
3090 - $original_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $str ) );
2135 + $sub = '';
2136 + $len = 0;
3091 2137
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 2138 $words = self::mb_function( array( 'mb_split', 'explode' ), array( ' ', $str ) );
3100 2139
3101 - if ( ! is_array( $words ) ) {
3102 - return $original_string;
3103 - }
3104 -
3105 2140 foreach ( $words as $word ) {
3106 - $part = ( $sub !== '' ? ' ' : '' ) . $word;
2141 + $part = ( ( $sub != '' ) ? ' ' : '' ) . $word;
3107 2142 $total_len = self::mb_function( array( 'mb_strlen', 'strlen' ), array( $sub . $part ) );
3108 -
3109 2143 if ( $total_len > $length && substr_count( $sub, ' ' ) ) {
3110 2144 break;
3111 2145 }
3112 2146
@@ -3119,49 +2153,14 @@
3119 2153
3120 2154 unset( $total_len, $word );
3121 2155 }
3122 2156
3123 - $sub = self::maybe_force_truncate_on_string_with_no_spaces( $sub, $length );
3124 -
3125 - return $sub . ( $len < $original_len ? $continue : '' );
2157 + return $sub . ( ( $len < $original_len ) ? $continue : '' );
3126 2158 }
3127 2159
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 2160 public static function mb_function( $function_names, $args ) {
3161 2161 $mb_function_name = $function_names[0];
3162 2162 $function_name = $function_names[1];
3163 -
3164 2163 if ( function_exists( $mb_function_name ) ) {
3165 2164 $function_name = $mb_function_name;
3166 2165 }
3167 2166
@@ -3167,21 +2166,14 @@
3167 2166
3168 2167 return call_user_func_array( $function_name, $args );
3169 2168 }
3170 2169
3171 - /**
3172 - * @param string $date
3173 - * @param string $date_format
3174 - * @param string $time_format
3175 - *
3176 - * @return string
3177 - */
3178 2170 public static function get_formatted_time( $date, $date_format = '', $time_format = '' ) {
3179 - if ( ! $date ) {
2171 + if ( empty( $date ) ) {
3180 2172 return $date;
3181 2173 }
3182 2174
3183 - if ( ! $date_format ) {
2175 + if ( empty( $date_format ) ) {
3184 2176 $date_format = get_option( 'date_format' );
3185 2177 }
3186 2178
3187 2179 if ( preg_match( '/^\d{1-2}\/\d{1-2}\/\d{4}$/', $date ) && self::pro_is_installed() ) {
@@ -3189,10 +2181,10 @@
3189 2181 $date = FrmProAppHelper::convert_date( $date, $frmpro_settings->date_format, 'Y-m-d' );
3190 2182 }
3191 2183
3192 2184 $formatted = self::get_localized_date( $date_format, $date );
3193 - $do_time = gmdate( 'H:i:s', strtotime( $date ) ) !== '00:00:00';
3194 2185
2186 + $do_time = ( gmdate( 'H:i:s', strtotime( $date ) ) != '00:00:00' );
3195 2187 if ( $do_time ) {
3196 2188 $formatted .= self::add_time_to_date( $time_format, $date );
3197 2189 }
3198 2190
@@ -3198,52 +2190,45 @@
3198 2190
3199 2191 return $formatted;
3200 2192 }
3201 2193
3202 - /**
3203 - * @param string $time_format
3204 - * @param string $date
3205 - *
3206 - * @return string
3207 - */
3208 2194 private static function add_time_to_date( $time_format, $date ) {
3209 - if ( ! $time_format ) {
2195 + if ( empty( $time_format ) ) {
3210 2196 $time_format = get_option( 'time_format' );
3211 2197 }
3212 2198
3213 2199 $trimmed_format = trim( $time_format );
3214 -
3215 - if ( $time_format && $trimmed_format ) {
3216 - return ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
2200 + $time = '';
2201 + if ( $time_format && ! empty( $trimmed_format ) ) {
2202 + $time = ' ' . __( 'at', 'formidable' ) . ' ' . self::get_localized_date( $time_format, $date );
3217 2203 }
3218 2204
3219 - return '';
2205 + return $time;
3220 2206 }
3221 2207
3222 2208 /**
3223 2209 * @since 2.0.8
3224 - *
3225 - * @param string $date_format
3226 - * @param string $date
3227 - *
3228 - * @return string
3229 2210 */
3230 2211 public static function get_localized_date( $date_format, $date ) {
3231 2212 $date = get_date_from_gmt( $date );
2213 +
3232 2214 return date_i18n( $date_format, strtotime( $date ) );
3233 2215 }
3234 2216
3235 2217 /**
3236 - * Gets the time ago in words.
2218 + * Gets the time ago in words
3237 2219 *
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.
2220 + * @param int $from in seconds
2221 + * @param int|string $to in seconds
3241 2222 *
3242 - * @return string Time ago.
2223 + * @return string $time_ago
3243 2224 */
3244 2225 public static function human_time_diff( $from, $to = '', $levels = 1 ) {
3245 - $now = ! $to && 0 !== $to ? new DateTime() : new DateTime( '@' . $to );
2226 + if ( empty( $to ) ) {
2227 + $now = new DateTime();
2228 + } else {
2229 + $now = new DateTime( '@' . $to );
2230 + }
3246 2231 $ago = new DateTime( '@' . $from );
3247 2232
3248 2233 // Get the time difference
3249 2234 $diff_object = $now->diff( $ago );
@@ -3249,9 +2234,9 @@
3249 2234 $diff_object = $now->diff( $ago );
3250 2235 $diff = get_object_vars( $diff_object );
3251 2236
3252 2237 // Add week amount and update day amount
3253 - $diff['w'] = floor( $diff['d'] / 7 );
2238 + $diff['w'] = floor( $diff['d'] / 7 );
3254 2239 $diff['d'] -= $diff['w'] * 7;
3255 2240
3256 2241 $time_strings = self::get_time_strings();
3257 2242
@@ -3257,11 +2242,10 @@
3257 2242
3258 2243 if ( ! is_numeric( $levels ) ) {
3259 2244 // Show time in specified unit.
3260 2245 $levels = self::get_unit( $levels );
3261 -
3262 2246 if ( isset( $time_strings[ $levels ] ) ) {
3263 - $diff = array(
2247 + $diff = array(
3264 2248 $levels => self::time_format( $levels, $diff ),
3265 2249 );
3266 2250 $time_strings = array(
3267 2251 $levels => $time_strings[ $levels ],
@@ -3266,14 +2250,13 @@
3266 2250 $time_strings = array(
3267 2251 $levels => $time_strings[ $levels ],
3268 2252 );
3269 2253 }
3270 -
3271 2254 $levels = 1;
3272 2255 }
3273 2256
3274 2257 foreach ( $time_strings as $k => $v ) {
3275 - if ( ! empty( $diff[ $k ] ) ) {
2258 + if ( isset( $diff[ $k ] ) && $diff[ $k ] ) {
3276 2259 $time_strings[ $k ] = $diff[ $k ] . ' ' . ( $diff[ $k ] > 1 ? $v[1] : $v[0] );
3277 2260 } elseif ( isset( $diff[ $k ] ) && count( $time_strings ) === 1 ) {
3278 2261 // Account for 0.
3279 2262 $time_strings[ $k ] = $diff[ $k ] . ' ' . $v[1];
@@ -3281,21 +2264,17 @@
3281 2264 unset( $time_strings[ $k ] );
3282 2265 }
3283 2266 }
3284 2267
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 ) );
2268 + $levels_deep = apply_filters( 'frm_time_ago_levels', $levels, compact( 'time_strings', 'from', 'to' ) );
2269 + $time_strings = array_slice( $time_strings, 0, absint( $levels_deep ) );
2270 + $time_ago_string = implode( ' ', $time_strings );
3287 2271
3288 - return implode( ' ', $time_strings );
2272 + return $time_ago_string;
3289 2273 }
3290 2274
3291 2275 /**
3292 2276 * @since 4.05.01
3293 - *
3294 - * @param string $unit
3295 - * @param array $diff
3296 - *
3297 - * @return int
3298 2277 */
3299 2278 private static function time_format( $unit, $diff ) {
3300 2279 $return = array(
3301 2280 'y' => 'y',
@@ -3300,14 +2279,14 @@
3300 2279 $return = array(
3301 2280 'y' => 'y',
3302 2281 'd' => 'days',
3303 2282 );
3304 -
3305 2283 if ( isset( $return[ $unit ] ) ) {
3306 2284 return $diff[ $return[ $unit ] ];
3307 2285 }
3308 2286
3309 2287 $total = $diff['days'] * self::convert_time( 'd', $unit );
2288 +
3310 2289 $times = array( 'h', 'i', 's' );
3311 2290
3312 2291 foreach ( $times as $time ) {
3313 2292 if ( ! isset( $diff[ $time ] ) ) {
@@ -3321,13 +2300,8 @@
3321 2300 }
3322 2301
3323 2302 /**
3324 2303 * @since 4.05.01
3325 - *
3326 - * @param string $from
3327 - * @param string $to
3328 - *
3329 - * @return int
3330 2304 */
3331 2305 private static function convert_time( $from, $to ) {
3332 2306 $convert = array(
3333 2307 's' => 1,
@@ -3343,35 +2317,28 @@
3343 2317 }
3344 2318
3345 2319 /**
3346 2320 * @since 4.05.01
3347 - *
3348 - * @param string $unit
3349 - *
3350 - * @return int|string
3351 2321 */
3352 2322 private static function get_unit( $unit ) {
3353 2323 $units = self::get_time_strings();
3354 -
3355 2324 if ( isset( $units[ $unit ] ) || is_numeric( $unit ) ) {
3356 2325 return $unit;
3357 2326 }
3358 2327
3359 2328 foreach ( $units as $u => $strings ) {
3360 - if ( in_array( $unit, $strings, true ) ) {
2329 + if ( in_array( $unit, $strings ) ) {
3361 2330 return $u;
3362 2331 }
3363 2332 }
3364 -
3365 2333 return 1;
3366 2334 }
3367 2335
3368 2336 /**
3369 2337 * Get the translatable time strings. The untranslated version is a failsafe
3370 - * in case languages are changing for the unit set in the shortcode.
2338 + * in case langauges are changing for the unit set in the shortcode.
3371 2339 *
3372 2340 * @since 2.0.20
3373 - *
3374 2341 * @return array
3375 2342 */
3376 2343 private static function get_time_strings() {
3377 2344 return array(
@@ -3415,48 +2382,35 @@
3415 2382
3416 2383 // Pagination Methods.
3417 2384
3418 2385 /**
3419 - * @param int $r_count
3420 - * @param int $current_p
3421 - * @param int $p_size
3422 - *
3423 - * @return int
2386 + * @param integer $current_p
3424 2387 */
3425 2388 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;
2389 + return ( ( $r_count < ( $current_p * $p_size ) ) ? $r_count : ( $current_p * $p_size ) );
3427 2390 }
3428 2391
3429 2392 /**
3430 - * @param int $r_count
3431 - * @param int $current_p
3432 - * @param int $p_size
3433 - *
3434 - * @return int
2393 + * @param integer $current_p
3435 2394 */
3436 2395 public static function get_first_record_num( $r_count, $current_p, $p_size ) {
3437 - // phpcs:ignore Universal.Operators.StrictComparisons
3438 2396 if ( $current_p == 1 ) {
3439 2397 return 1;
2398 + } else {
2399 + return ( self::get_last_record_num( $r_count, ( $current_p - 1 ), $p_size ) + 1 );
3440 2400 }
3441 - return self::get_last_record_num( $r_count, $current_p - 1, $p_size ) + 1;
3442 2401 }
3443 2402
3444 2403 /**
3445 - * @param array $json_vars
3446 - *
3447 2404 * @return array
3448 2405 */
3449 2406 public static function json_to_array( $json_vars ) {
3450 2407 $vars = array();
3451 -
3452 2408 foreach ( $json_vars as $jv ) {
3453 2409 $jv_name = explode( '[', $jv['name'] );
3454 2410 $last = count( $jv_name ) - 1;
3455 -
3456 2411 foreach ( $jv_name as $p => $n ) {
3457 2412 $name = trim( $n, ']' );
3458 -
3459 2413 if ( ! isset( $l1 ) ) {
3460 2414 $l1 = $name;
3461 2415 }
3462 2416
@@ -3467,9 +2421,9 @@
3467 2421 if ( ! isset( $l3 ) ) {
3468 2422 $l3 = $name;
3469 2423 }
3470 2424
3471 - $this_val = $p === $last ? $jv['value'] : array();
2425 + $this_val = ( $p == $last ) ? $jv['value'] : array();
3472 2426
3473 2427 switch ( $p ) {
3474 2428 case 0:
3475 2429 $l1 = $name;
@@ -3491,12 +2445,12 @@
3491 2445 self::add_value_to_array( $name, $l4, $this_val, $vars[ $l1 ][ $l2 ][ $l3 ] );
3492 2446 }
3493 2447
3494 2448 unset( $this_val, $n );
3495 - }//end foreach
2449 + }
3496 2450
3497 2451 unset( $last, $jv );
3498 - }//end foreach
2452 + }
3499 2453
3500 2454 return $vars;
3501 2455 }
3502 2456
@@ -3502,15 +2456,10 @@
3502 2456
3503 2457 /**
3504 2458 * @param string $name
3505 2459 * @param string $l1
3506 - * @param mixed $val
3507 - * @param array $vars
3508 - *
3509 - * @return void
3510 2460 */
3511 2461 public static function add_value_to_array( $name, $l1, $val, &$vars ) {
3512 - // phpcs:ignore Universal.Operators.StrictComparisons
3513 2462 if ( $name == '' ) {
3514 2463 $vars[] = $val;
3515 2464 } elseif ( ! isset( $vars[ $l1 ] ) ) {
3516 2465 $vars[ $l1 ] = $val;
@@ -3516,26 +2465,18 @@
3516 2465 $vars[ $l1 ] = $val;
3517 2466 }
3518 2467 }
3519 2468
3520 - /**
3521 - * @param string $name
3522 - * @param string $class
3523 - * @param string $form_name
3524 - *
3525 - * @return void
3526 - */
3527 2469 public static function maybe_add_tooltip( $name, $class = 'closed', $form_name = '' ) {
3528 2470 $tooltips = array(
3529 2471 '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
2472 + '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 2473 'cc' => __( 'Add CC addresses separated by a ",". FORMAT: Name <[email protected]> or [email protected].', 'formidable' ),
3532 2474 '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
2475 + '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 2476 'from' => __( 'Enter the name and/or email address of the sender. FORMAT: John Bates <[email protected]> or [email protected].', 'formidable' ),
3535 2477 /* 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
2478 + '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 2479 );
3539 2480
3540 2481 if ( ! isset( $tooltips[ $name ] ) ) {
3541 2482 return;
@@ -3540,9 +2481,9 @@
3540 2481 if ( ! isset( $tooltips[ $name ] ) ) {
3541 2482 return;
3542 2483 }
3543 2484
3544 - if ( 'open' === $class ) {
2485 + if ( 'open' == $class ) {
3545 2486 echo ' frm_help"';
3546 2487 } else {
3547 2488 echo ' class="frm_help"';
3548 2489 }
@@ -3548,9 +2489,9 @@
3548 2489 }
3549 2490
3550 2491 echo ' title="' . esc_attr( $tooltips[ $name ] );
3551 2492
3552 - if ( 'open' !== $class ) {
2493 + if ( 'open' != $class ) {
3553 2494 echo '"';
3554 2495 }
3555 2496 }
3556 2497
@@ -3555,28 +2496,16 @@
3555 2496 }
3556 2497
3557 2498 /**
3558 2499 * 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 2500 */
3566 2501 public static function select_current_page( $page, $current_page, $action = array() ) {
3567 - // phpcs:ignore Universal.Operators.StrictComparisons
3568 2502 if ( $current_page != $page ) {
3569 2503 return;
3570 2504 }
3571 2505
3572 2506 $frm_action = self::simple_get( 'frm_action', 'sanitize_title' );
3573 -
3574 - if ( 'lite-reports' === $frm_action ) {
3575 - $frm_action = 'reports';
3576 - }
3577 -
3578 - if ( ! $action || ( $frm_action && in_array( $frm_action, $action, true ) ) ) {
2507 + if ( empty( $action ) || ( ! empty( $frm_action ) && in_array( $frm_action, $action ) ) ) {
3579 2508 echo ' class="current_page"';
3580 2509 }
3581 2510 }
3582 2511
@@ -3606,19 +2535,14 @@
3606 2535
3607 2536 // Add extra slashes for \r\n since WP strips them.
3608 2537 $post_content = str_replace( array( '\\r', '\\n', '\\u', '\\t' ), array( '\\\\r', '\\\\n', '\\\\u', '\\\\t' ), $post_content );
3609 2538
3610 - // Allow for &quot
3611 - return str_replace( '&quot;', '\\"', $post_content );
2539 + // allow for &quot
2540 + $post_content = str_replace( '&quot;', '\\"', $post_content );
2541 +
2542 + return $post_content;
3612 2543 }
3613 2544
3614 - /**
3615 - * @param array|string $val
3616 - * @param int|string $key
3617 - * @param array $post_content
3618 - *
3619 - * @return void
3620 - */
3621 2545 private static function prepare_action_slashes( $val, $key, &$post_content ) {
3622 2546 if ( ! isset( $post_content[ $key ] ) || is_numeric( $val ) ) {
3623 2547 return;
3624 2548 }
@@ -3627,28 +2551,22 @@
3627 2551 foreach ( $val as $k1 => $v1 ) {
3628 2552 self::prepare_action_slashes( $v1, $k1, $post_content[ $key ] );
3629 2553 unset( $k1, $v1 );
3630 2554 }
2555 + } else {
2556 + // Strip all slashes so everything is the same, no matter where the value is coming from
2557 + $val = stripslashes( $val );
3631 2558
3632 - return;
2559 + // Add backslashes before double quotes and forward slashes only
2560 + $post_content[ $key ] = addcslashes( $val, '"\\/' );
3633 2561 }
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 2562 }
3641 2563
3642 2564 /**
3643 - * Check for either json or serialized data. This is temporary while transitioning
2565 + * Check for either json or serilized data. This is temporary while transitioning
3644 2566 * all data to json.
3645 2567 *
3646 2568 * @since 4.02.03
3647 - *
3648 - * @param array|string $value
3649 - *
3650 - * @return void
3651 2569 */
3652 2570 public static function unserialize_or_decode( &$value ) {
3653 2571 if ( is_array( $value ) ) {
3654 2572 return;
@@ -3653,34 +2571,13 @@
3653 2571 if ( is_array( $value ) ) {
3654 2572 return;
3655 2573 }
3656 2574
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;
2575 + if ( is_serialized( $value ) ) {
2576 + $value = maybe_unserialize( $value );
2577 + } else {
2578 + $value = self::maybe_json_decode( $value, false );
3673 2579 }
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 2580 }
3684 2581
3685 2582 /**
3686 2583 * Decode a JSON string.
@@ -3685,12 +2582,11 @@
3685 2582 /**
3686 2583 * Decode a JSON string.
3687 2584 * Do not switch shortcodes like [24] to array unless intentional ie XML values.
3688 2585 *
3689 - * @param array|string|null $string
3690 - * @param bool $single_to_array
3691 - *
3692 - * @return array|string|null
2586 + * @param mixed $string
2587 + * @param bool $single_to_array
2588 + * @return mixed
3693 2589 */
3694 2590 public static function maybe_json_decode( $string, $single_to_array = true ) {
3695 2591 if ( is_array( $string ) || is_null( $string ) ) {
3696 2592 return $string;
@@ -3695,51 +2591,21 @@
3695 2591 if ( is_array( $string ) || is_null( $string ) ) {
3696 2592 return $string;
3697 2593 }
3698 2594
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 );
2595 + $new_string = json_decode( $string, true );
2596 + if ( function_exists( 'json_last_error' ) ) {
2597 + // php 5.3+
2598 + $single_value = false;
2599 + if ( ! $single_to_array ) {
2600 + $single_value = is_array( $new_string ) && count( $new_string ) === 1 && isset( $new_string[0] );
3727 2601 }
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;
2602 + if ( json_last_error() == JSON_ERROR_NONE && is_array( $new_string ) && ! $single_value ) {
2603 + $string = $new_string;
3738 2604 }
3739 2605 }
3740 2606
3741 - return $value;
2607 + return $string;
3742 2608 }
3743 2609
3744 2610 /**
3745 2611 * Reformat the json serialized array in name => value array.
@@ -3744,12 +2610,8 @@
3744 2610 /**
3745 2611 * Reformat the json serialized array in name => value array.
3746 2612 *
3747 2613 * @since 4.02.03
3748 - *
3749 - * @param array $form
3750 - *
3751 - * @return void
3752 2614 */
3753 2615 public static function format_form_data( &$form ) {
3754 2616 $formatted = array();
3755 2617
@@ -3756,21 +2618,18 @@
3756 2618 foreach ( $form as $input ) {
3757 2619 if ( ! isset( $input['name'] ) ) {
3758 2620 continue;
3759 2621 }
3760 -
3761 2622 $key = $input['name'];
3762 -
3763 - if ( ! isset( $formatted[ $key ] ) ) {
2623 + if ( isset( $formatted[ $key ] ) ) {
2624 + if ( is_array( $formatted[ $key ] ) ) {
2625 + $formatted[ $key ][] = $input['value'];
2626 + } else {
2627 + $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
2628 + }
2629 + } else {
3764 2630 $formatted[ $key ] = $input['value'];
3765 - continue;
3766 2631 }
3767 -
3768 - if ( is_array( $formatted[ $key ] ) ) {
3769 - $formatted[ $key ][] = $input['value'];
3770 - } else {
3771 - $formatted[ $key ] = array( $formatted[ $key ], $input['value'] );
3772 - }
3773 2632 }
3774 2633
3775 2634 parse_str( http_build_query( $formatted ), $form );
3776 2635 }
@@ -3776,34 +2635,30 @@
3776 2635 }
3777 2636
3778 2637 /**
3779 2638 * @since 4.02.03
3780 - *
3781 - * @param array|string $value
3782 - *
3783 - * @return string
3784 2639 */
3785 2640 public static function maybe_json_encode( $value ) {
3786 - return is_array( $value ) ? wp_json_encode( $value ) : $value;
2641 + if ( is_array( $value ) ) {
2642 + $value = wp_json_encode( $value );
2643 + }
2644 + return $value;
3787 2645 }
3788 2646
3789 2647 /**
3790 - * Echo The javascript to open and highlight the Formidable menu
3791 - *
3792 2648 * @since 1.07.10
3793 2649 *
3794 - * @param string $post_type The name of the post type that may need to be highlighted.
3795 - *
3796 - * @return void
2650 + * @param string $post_type The name of the post type that may need to be highlighted
2651 + * echo The javascript to open and highlight the Formidable menu
3797 2652 */
3798 2653 public static function maybe_highlight_menu( $post_type ) {
3799 2654 global $post;
3800 2655
3801 - if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] !== $post_type ) {
2656 + if ( isset( $_REQUEST['post_type'] ) && $_REQUEST['post_type'] != $post_type ) {
3802 2657 return;
3803 2658 }
3804 2659
3805 - if ( is_object( $post ) && $post->post_type !== $post_type ) {
2660 + if ( is_object( $post ) && $post->post_type != $post_type ) {
3806 2661 return;
3807 2662 }
3808 2663
3809 2664 self::load_admin_wide_js();
@@ -3813,12 +2668,8 @@
3813 2668 /**
3814 2669 * Load the JS file on non-Formidable pages in the admin area
3815 2670 *
3816 2671 * @since 2.0
3817 - *
3818 - * @param bool $load
3819 - *
3820 - * @return void
3821 2672 */
3822 2673 public static function load_admin_wide_js( $load = true ) {
3823 2674 $version = self::plugin_version();
3824 2675 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
@@ -3823,18 +2674,14 @@
3823 2674 $version = self::plugin_version();
3824 2675 wp_register_script( 'formidable_admin_global', self::plugin_url() . '/js/formidable_admin_global.js', array( 'jquery' ), $version );
3825 2676
3826 2677 $global_strings = array(
3827 - 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
3828 - 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
3829 - 'url' => self::plugin_url(),
3830 - 'app_url' => 'https://formidableforms.com/',
3831 - '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
3833 - 'loading' => __( 'Loading&hellip;', 'formidable' ),
3834 - 'nonce' => wp_create_nonce( 'frm_ajax' ),
3835 - 'proIncludesSliderJs' => is_callable( 'FrmProFormsHelper::prepare_custom_currency' ),
3836 - 'inboxSlideIn' => FrmInbox::get_inbox_slide_in_value_for_js(),
2678 + 'updating_msg' => __( 'Please wait while your site updates.', 'formidable' ),
2679 + 'deauthorize' => __( 'Are you sure you want to deauthorize Formidable Forms on this site?', 'formidable' ),
2680 + 'url' => self::plugin_url(),
2681 + 'app_url' => 'https://formidableforms.com/',
2682 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2683 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
3837 2684 );
3838 2685 wp_localize_script( 'formidable_admin_global', 'frmGlobal', $global_strings );
3839 2686
3840 2687 if ( $load ) {
@@ -3843,10 +2690,8 @@
3843 2690 }
3844 2691
3845 2692 /**
3846 2693 * @since 2.0.9
3847 - *
3848 - * @return void
3849 2694 */
3850 2695 public static function load_font_style() {
3851 2696 wp_enqueue_style( 'frm_fonts', self::plugin_url() . '/css/frm_fonts.css', array(), self::plugin_version() );
3852 2697 }
@@ -3852,147 +2697,99 @@
3852 2697 }
3853 2698
3854 2699 /**
3855 2700 * @param string $location
3856 - *
3857 - * @return void
3858 2701 */
3859 2702 public static function localize_script( $location ) {
3860 - global $wp_scripts, $wp_version;
2703 + global $wp_scripts;
3861 2704
2705 + $ajax_url = admin_url( 'admin-ajax.php', is_ssl() ? 'admin' : 'http' );
2706 + $ajax_url = apply_filters( 'frm_ajax_url', $ajax_url );
2707 +
3862 2708 $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,
2709 + 'ajax_url' => $ajax_url,
2710 + 'images_url' => self::plugin_url() . '/images',
2711 + 'loading' => __( 'Loading&hellip;', 'formidable' ),
2712 + 'remove' => __( 'Remove', 'formidable' ),
2713 + 'offset' => apply_filters( 'frm_scroll_offset', 4 ),
2714 + 'nonce' => wp_create_nonce( 'frm_ajax' ),
2715 + 'id' => __( 'ID', 'formidable' ),
2716 + 'no_results' => __( 'No results match', 'formidable' ),
2717 + 'file_spam' => __( 'That file looks like Spam.', 'formidable' ),
2718 + 'calc_error' => __( 'There is an error in the calculation in the field with key', 'formidable' ),
2719 + 'empty_fields' => __( 'Please complete the preceding required fields before uploading a file.', 'formidable' ),
2720 + 'focus_first_error' => self::should_focus_first_error(),
2721 + 'include_alert_role' => self::should_include_alert_role_on_field_errors(),
3878 2722 );
3879 2723
3880 2724 $data = $wp_scripts->get_data( 'formidable', 'data' );
3881 -
3882 - if ( ! $data ) {
2725 + if ( empty( $data ) ) {
3883 2726 wp_localize_script( 'formidable', 'frm_js', $script_strings );
3884 2727 }
3885 2728
3886 - if ( $location === 'admin' ) {
2729 + if ( $location == 'admin' ) {
2730 + $frm_settings = self::get_settings();
3887 2731 $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(),
2732 + 'desc' => __( '(Click to add description)', 'formidable' ),
2733 + 'blank' => __( '(Blank)', 'formidable' ),
2734 + 'no_label' => __( '(no label)', 'formidable' ),
2735 + 'saving' => esc_attr( __( 'Saving', 'formidable' ) ),
2736 + 'saved' => esc_attr( __( 'Saved', 'formidable' ) ),
2737 + 'ok' => __( 'OK', 'formidable' ),
2738 + 'cancel' => __( 'Cancel', 'formidable' ),
2739 + 'default_label' => __( 'Default', 'formidable' ),
2740 + 'clear_default' => __( 'Clear default value when typing', 'formidable' ),
2741 + 'no_clear_default' => __( 'Do not clear default value when typing', 'formidable' ),
2742 + 'valid_default' => __( 'Default value will pass form validation', 'formidable' ),
2743 + 'no_valid_default' => __( 'Default value will NOT pass form validation', 'formidable' ),
2744 + 'caution' => __( 'Heads up', 'formidable' ),
2745 + 'confirm' => __( 'Are you sure?', 'formidable' ),
2746 + 'conf_delete' => __( 'Are you sure you want to delete this field and all data associated with it?', 'formidable' ),
2747 + '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' ),
2748 + 'conf_no_repeat' => __( 'Warning: If you have entries with multiple rows, all but the first row will be lost.', 'formidable' ),
2749 + 'default_unique' => $frm_settings->unique_msg,
2750 + 'default_conf' => __( 'The entered values do not match', 'formidable' ),
2751 + 'enter_email' => __( 'Enter Email', 'formidable' ),
2752 + 'confirm_email' => __( 'Confirm Email', 'formidable' ),
2753 + 'conditional_text' => __( 'Conditional content here', 'formidable' ),
2754 + 'new_option' => __( 'New Option', 'formidable' ),
2755 + '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' ),
2756 + 'enter_password' => __( 'Enter Password', 'formidable' ),
2757 + 'confirm_password' => __( 'Confirm Password', 'formidable' ),
2758 + 'import_complete' => __( 'Import Complete', 'formidable' ),
2759 + 'updating' => __( 'Please wait while your site updates.', 'formidable' ),
2760 + 'no_save_warning' => __( 'Warning: There is no way to retrieve unsaved entries.', 'formidable' ),
2761 + 'private_label' => __( 'Private', 'formidable' ),
2762 + 'jquery_ui_url' => '',
2763 + 'pro_url' => is_callable( 'FrmProAppHelper::plugin_url' ) ? FrmProAppHelper::plugin_url() : '',
2764 + 'no_licenses' => __( 'No new licenses were found', 'formidable' ),
2765 + 'unmatched_parens' => __( 'This calculation has at least one unmatched ( ) { } [ ].', 'formidable' ),
2766 + 'view_shortcodes' => __( 'This calculation may have shortcodes that work in Views but not forms.', 'formidable' ),
2767 + 'text_shortcodes' => __( 'This calculation may have shortcodes that work in text calculations but not numeric calculations.', 'formidable' ),
2768 + 'only_one_action' => __( 'This form action is limited to one per form. Please edit the existing form action.', 'formidable' ),
2769 + 'unsafe_params' => FrmFormsHelper::reserved_words(),
3925 2770 /* 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
2771 + 'slug_is_reserved' => sprintf( __( 'The Detail Page Slug "%s" is reserved by WordPress. This may cause problems. Is this intentional?', 'formidable' ), '****' ),
3927 2772 /* 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', '>=' ),
2773 + 'param_is_reserved' => sprintf( __( 'The parameter "%s" is reserved by WordPress. This may cause problems when included in the URL. Is this intentional? ', 'formidable' ), '****' ),
2774 + 'reserved_words' => __( 'See the list of reserved words in WordPress.', 'formidable' ),
2775 + 'repeat_limit_min' => __( 'Please enter a Repeat Limit that is greater than 1.', 'formidable' ),
2776 + 'checkbox_limit' => __( 'Please select a limit between 0 and 200.', 'formidable' ),
2777 + 'install' => __( 'Install', 'formidable' ),
2778 + 'active' => __( 'Active', 'formidable' ),
2779 + 'select_a_field' => __( 'Select a Field', 'formidable' ),
2780 + 'no_items_found' => __( 'No items found.', 'formidable' ),
3953 2781 );
3954 - /**
3955 - * @param array $admin_script_strings
3956 - */
3957 2782 $admin_script_strings = apply_filters( 'frm_admin_script_strings', $admin_script_strings );
3958 2783
3959 2784 $data = $wp_scripts->get_data( 'formidable_admin', 'data' );
3960 -
3961 - if ( ! $data ) {
2785 + if ( empty( $data ) ) {
3962 2786 wp_localize_script( 'formidable_admin', 'frm_admin_js', $admin_script_strings );
3963 2787 }
3964 - }//end if
2788 + }
3965 2789 }
3966 2790
3967 2791 /**
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 2792 * Returns whether or not the first errored input should be auto-focused (default true).
3996 2793 *
3997 2794 * @since 5.2.05
3998 2795 *
@@ -4017,11 +2814,9 @@
4017 2814 * Echo the message on the plugins listing page
4018 2815 *
4019 2816 * @since 1.07.10
4020 2817 *
4021 - * @param float $min_version The version the add-on requires.
4022 - *
4023 - * @return void
2818 + * @param float $min_version The version the add-on requires
4024 2819 */
4025 2820 public static function min_version_notice( $min_version ) {
4026 2821 $frm_version = self::plugin_version();
4027 2822
@@ -4030,11 +2825,11 @@
4030 2825 return;
4031 2826 }
4032 2827
4033 2828 $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>';
2829 + 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">' .
2830 + esc_html__( 'You are running an outdated version of Formidable. This plugin may not work correctly if you do not update Formidable.', 'formidable' ) .
2831 + '</div></td></tr>';
4037 2832 }
4038 2833
4039 2834 /**
4040 2835 * If Pro is far outdated, show a message.
@@ -4039,12 +2834,8 @@
4039 2834 /**
4040 2835 * If Pro is far outdated, show a message.
4041 2836 *
4042 2837 * @since 4.0.01
4043 - *
4044 - * @param string $min_version
4045 - *
4046 - * @return void
4047 2838 */
4048 2839 public static function min_pro_version_notice( $min_version ) {
4049 2840 if ( ! self::is_formidable_admin() ) {
4050 2841 // Don't show admin-wide.
@@ -4053,14 +2844,26 @@
4053 2844
4054 2845 self::php_version_notice();
4055 2846
4056 2847 $is_pro = self::pro_is_installed() && class_exists( 'FrmProDb' );
4057 -
4058 2848 if ( ! $is_pro || self::meets_min_pro_version( $min_version ) ) {
4059 2849 return;
4060 2850 }
4061 2851
4062 - include self::plugin_path() . '/classes/views/addons/min-version-notice.php';
2852 + $pro_version = FrmProDb::$plug_version;
2853 + $expired = FrmAddonsController::is_license_expired();
2854 + ?>
2855 + <div class="error frm_previous_install">
2856 + <?php
2857 + esc_html_e( 'You are running a version of Formidable Forms that may not be compatible with your version of Formidable Forms Pro.', 'formidable' );
2858 + if ( empty( $expired ) ) {
2859 + echo ' Please <a href="' . esc_url( admin_url( 'plugins.php?s=formidable%20forms%20pro' ) ) . '">update now</a>.';
2860 + } else {
2861 + echo '<br/>Please <a href="https://formidableforms.com/account/downloads/?utm_source=WordPress&utm_medium=outdated">renew now</a> to get the latest version.';
2862 + }
2863 + ?>
2864 + </div>
2865 + <?php
4063 2866 }
4064 2867
4065 2868 /**
4066 2869 * If Pro is installed, check the version number.
@@ -4065,12 +2868,8 @@
4065 2868 /**
4066 2869 * If Pro is installed, check the version number.
4067 2870 *
4068 2871 * @since 4.0.01
4069 - *
4070 - * @param string $min_version
4071 - *
4072 - * @return bool
4073 2872 */
4074 2873 public static function meets_min_pro_version( $min_version ) {
4075 2874 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4076 2875 }
@@ -4075,50 +2874,42 @@
4075 2874 return ! class_exists( 'FrmProDb' ) || version_compare( FrmProDb::$plug_version, $min_version, '>=' );
4076 2875 }
4077 2876
4078 2877 /**
4079 - * Show a message if the PHP version is below the recommendations.
2878 + * Show a message if the browser or PHP version is below the recommendations.
4080 2879 *
4081 2880 * @since 4.0.02
4082 - *
4083 - * @return void
4084 2881 */
4085 2882 private static function php_version_notice() {
4086 2883 $message = array();
2884 + if ( version_compare( phpversion(), '5.6', '<' ) ) {
2885 + $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' );
2886 + }
4087 2887
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
2888 + $browser = self::get_server_value( 'HTTP_USER_AGENT' );
2889 + $is_ie = strpos( $browser, 'MSIE' ) !== false;
2890 + if ( $is_ie ) {
2891 + $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 2892 }
4091 2893
4092 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
4093 2894 foreach ( $message as $m ) {
4094 2895 ?>
4095 - <div class="frm-banner-alert frm_error_style frm_previous_install">
2896 + <div class="error frm_previous_install">
4096 2897 <?php echo esc_html( $m ); ?>
4097 2898 </div>
4098 2899 <?php
4099 2900 }
4100 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
4101 2901 }
4102 2902
4103 - /**
4104 - * @param string $type
4105 - *
4106 - * @return array<string,string>
4107 - */
4108 2903 public static function locales( $type = 'date' ) {
4109 2904 $locales = array(
4110 2905 'en' => __( 'English', 'formidable' ),
4111 2906 'af' => __( 'Afrikaans', 'formidable' ),
4112 2907 'sq' => __( 'Albanian', 'formidable' ),
4113 - 'ar-DZ' => __( 'Algerian Arabic', 'formidable' ),
4114 - 'am' => __( 'Amharic', 'formidable' ),
4115 2908 'ar' => __( 'Arabic', 'formidable' ),
4116 2909 'hy' => __( 'Armenian', 'formidable' ),
4117 2910 'az' => __( 'Azerbaijani', 'formidable' ),
4118 2911 'eu' => __( 'Basque', 'formidable' ),
4119 - 'be' => __( 'Belarusian', 'formidable' ),
4120 - 'bn' => __( 'Bengali', 'formidable' ),
4121 2912 'bs' => __( 'Bosnian', 'formidable' ),
4122 2913 'bg' => __( 'Bulgarian', 'formidable' ),
4123 2914 'ca' => __( 'Catalan', 'formidable' ),
4124 2915 'zh-HK' => __( 'Chinese Hong Kong', 'formidable' ),
@@ -4137,15 +2928,12 @@
4137 2928 'fi' => __( 'Finnish', 'formidable' ),
4138 2929 'fr' => __( 'French', 'formidable' ),
4139 2930 'fr-CA' => __( 'French/Canadian', 'formidable' ),
4140 2931 'fr-CH' => __( 'French/Swiss', 'formidable' ),
4141 - 'gl' => __( 'Galician', 'formidable' ),
4142 - 'ka' => __( 'Georgian', 'formidable' ),
4143 2932 'de' => __( 'German', 'formidable' ),
4144 2933 'de-AT' => __( 'German/Austria', 'formidable' ),
4145 2934 'de-CH' => __( 'German/Switzerland', 'formidable' ),
4146 2935 'el' => __( 'Greek', 'formidable' ),
4147 - 'gu' => __( 'Gujarati', 'formidable' ),
4148 2936 'he' => __( 'Hebrew', 'formidable' ),
4149 2937 'iw' => __( 'Hebrew', 'formidable' ),
4150 2938 'hi' => __( 'Hindi', 'formidable' ),
4151 2939 'hu' => __( 'Hungarian', 'formidable' ),
@@ -4152,88 +2940,63 @@
4152 2940 'is' => __( 'Icelandic', 'formidable' ),
4153 2941 'id' => __( 'Indonesian', 'formidable' ),
4154 2942 'it' => __( 'Italian', 'formidable' ),
4155 2943 'ja' => __( 'Japanese', 'formidable' ),
4156 - 'kn' => __( 'Kannada', 'formidable' ),
4157 - 'kk' => __( 'Kazakh', 'formidable' ),
4158 - 'km' => __( 'Khmer', 'formidable' ),
4159 2944 'ko' => __( 'Korean', 'formidable' ),
4160 - 'ky' => __( 'Kyrgyz', 'formidable' ),
4161 - 'lo' => __( 'Laothian', 'formidable' ),
4162 2945 'lv' => __( 'Latvian', 'formidable' ),
4163 2946 'lt' => __( 'Lithuanian', 'formidable' ),
4164 - 'lb' => __( 'Luxembourgish', 'formidable' ),
4165 - 'mk' => __( 'Macedonian', 'formidable' ),
4166 - 'ml' => __( 'Malayalam', 'formidable' ),
4167 2947 'ms' => __( 'Malaysian', 'formidable' ),
4168 - 'mr' => __( 'Marathi', 'formidable' ),
4169 2948 'no' => __( 'Norwegian', 'formidable' ),
4170 - 'nb' => __( 'Norwegian Bokmål', 'formidable' ),
4171 - 'nn' => __( 'Norwegian Nynorsk', 'formidable' ),
4172 2949 'pl' => __( 'Polish', 'formidable' ),
4173 2950 'pt' => __( 'Portuguese', 'formidable' ),
4174 2951 'pt-BR' => __( 'Portuguese/Brazilian', 'formidable' ),
4175 2952 'pt-PT' => __( 'Portuguese/Portugal', 'formidable' ),
4176 - 'rm' => __( 'Romansh', 'formidable' ),
4177 2953 'ro' => __( 'Romanian', 'formidable' ),
4178 2954 'ru' => __( 'Russian', 'formidable' ),
4179 2955 'sr' => __( 'Serbian', 'formidable' ),
4180 2956 'sr-SR' => __( 'Serbian', 'formidable' ),
4181 - 'si' => __( 'Sinhalese', 'formidable' ),
4182 2957 'sk' => __( 'Slovak', 'formidable' ),
4183 2958 'sl' => __( 'Slovenian', 'formidable' ),
4184 2959 'es' => __( 'Spanish', 'formidable' ),
4185 2960 'es-419' => __( 'Spanish/Latin America', 'formidable' ),
4186 - 'sw' => __( 'Swahili', 'formidable' ),
4187 2961 'sv' => __( 'Swedish', 'formidable' ),
4188 2962 'ta' => __( 'Tamil', 'formidable' ),
4189 - 'te' => __( 'Telugu', 'formidable' ),
4190 2963 'th' => __( 'Thai', 'formidable' ),
4191 - 'tj' => __( 'Tajiki', 'formidable' ),
4192 2964 'tr' => __( 'Turkish', 'formidable' ),
4193 2965 'uk' => __( 'Ukrainian', 'formidable' ),
4194 - 'ur' => __( 'Urdu', 'formidable' ),
4195 2966 'vi' => __( 'Vietnamese', 'formidable' ),
4196 - 'cy-GB' => __( 'Welsh', 'formidable' ),
4197 - 'zu' => __( 'Zulu', 'formidable' ),
4198 2967 );
4199 2968
4200 2969 if ( $type === 'captcha' ) {
4201 - // Remove the languages unavailable for the captcha
4202 - $unset = array( 'sq', 'bs', 'eo', 'fo', 'fr-CH', 'sr-SR', 'ar-DZ', 'be', 'cy-GB', 'kk', 'km', 'ky', 'lb', 'mk', 'nb', 'nn', 'rm', 'tj' );
2970 + // remove the languages unavailable for the captcha
2971 + $unset = array( 'af', 'sq', 'hy', 'az', 'eu', 'bs', 'zh-HK', 'eo', 'et', 'fo', 'fr-CH', 'he', 'is', 'ms', 'sr-SR', 'ta' );
4203 2972 } else {
4204 - // Remove the languages unavailable for the datepicker
4205 - $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' );
2973 + // remove the languages unavailable for the datepicker
2974 + $unset = array( 'fil', 'fr-CA', 'de-AT', 'de-CH', 'iw', 'hi', 'pt', 'pt-PT', 'es-419' );
4206 2975 }
4207 2976
4208 2977 $locales = array_diff_key( $locales, array_flip( $unset ) );
2978 + $locales = apply_filters( 'frm_locales', $locales );
4209 2979
4210 - /**
4211 - * Filter available locale options.
4212 - *
4213 - * @since 5.4.5 Added $args parameter with type.
4214 - *
4215 - * @param array<string,string> $locales
4216 - * @param array $args {
4217 - *
4218 - * @type string $type
4219 - * }
4220 - */
4221 - return apply_filters( 'frm_locales', $locales, compact( 'type' ) );
2980 + return $locales;
4222 2981 }
4223 2982
4224 2983 /**
4225 - * @return string
2984 + * Output HTML containing reference text for accessibility
2985 + *
2986 + * @deprecated 5.1
4226 2987 */
2988 + public static function multiselect_accessibility() {
2989 + _deprecated_function( __METHOD__, '5.1' );
2990 + }
2991 +
4227 2992 public static function get_menu_icon_class() {
4228 2993 if ( is_callable( 'FrmProAppHelper::get_settings' ) ) {
4229 2994 $settings = FrmProAppHelper::get_settings();
4230 -
4231 2995 if ( is_object( $settings ) && ! empty( $settings->menu_icon ) ) {
4232 2996 return $settings->menu_icon;
4233 2997 }
4234 2998 }
4235 -
4236 2999 return 'frmfont frm_logo_icon';
4237 3000 }
4238 3001
4239 3002 /**
@@ -4251,9 +3014,10 @@
4251 3014 * @type array $input_attrs Attributes of value input.
4252 3015 * }
4253 3016 */
4254 3017 public static function images_dropdown( $args ) {
4255 - $args = self::fill_default_images_dropdown_args( $args );
3018 + $args = self::fill_default_images_dropdown_args( $args );
3019 +
4256 3020 $input_attrs_str = self::get_images_dropdown_input_attrs( $args );
4257 3021 ob_start();
4258 3022 include self::plugin_path() . '/classes/views/shared/images-dropdown.php';
4259 3023 $output = ob_get_clean();
@@ -4274,9 +3038,8 @@
4274 3038 *
4275 3039 * @since 5.0.04
4276 3040 *
4277 3041 * @param array $args The arguments.
4278 - *
4279 3042 * @return array
4280 3043 */
4281 3044 private static function fill_default_images_dropdown_args( $args ) {
4282 3045 $defaults = array(
@@ -4289,8 +3052,14 @@
4289 3052
4290 3053 $new_args['options'] = (array) $new_args['options'];
4291 3054 $new_args['input_attrs'] = (array) $new_args['input_attrs'];
4292 3055
3056 + // Set the number of columns.
3057 + $new_args['col_class'] = ceil( 12 / count( $new_args['options'] ) );
3058 + if ( $new_args['col_class'] > 6 ) {
3059 + $new_args['col_class'] = ceil( $new_args['col_class'] / 2 );
3060 + }
3061 +
4293 3062 /**
4294 3063 * Allows modifying the arguments of images_dropdown() method.
4295 3064 *
4296 3065 * @since 5.0.04
@@ -4306,9 +3075,8 @@
4306 3075 *
4307 3076 * @since 5.0.04
4308 3077 *
4309 3078 * @param array $args The arguments.
4310 - *
4311 3079 * @return string
4312 3080 */
4313 3081 private static function get_images_dropdown_input_attrs( $args ) {
4314 3082 $input_attrs = $args['input_attrs'];
@@ -4315,9 +3083,8 @@
4315 3083 $input_attrs['type'] = 'radio';
4316 3084 $input_attrs['name'] = $args['name'];
4317 3085
4318 3086 $input_attrs_str = '';
4319 -
4320 3087 foreach ( $input_attrs as $key => $input_attr ) {
4321 3088 $input_attrs_str .= ' ' . sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $input_attr ) );
4322 3089 }
4323 3090
@@ -4332,23 +3099,8 @@
4332 3099 return apply_filters( 'frm_images_dropdown_input_attrs', $input_attrs_str, $args );
4333 3100 }
4334 3101
4335 3102 /**
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 3103 * Gets the image of each option in images_dropdown() method.
4352 3104 *
4353 3105 * @since 5.0.04
4354 3106 *
@@ -4353,9 +3105,8 @@
4353 3105 * @since 5.0.04
4354 3106 *
4355 3107 * @param array $option Option data.
4356 3108 * @param array $args The arguments of images_dropdown() method.
4357 - *
4358 3109 * @return string
4359 3110 */
4360 3111 private static function get_images_dropdown_option_image( $option, $args ) {
4361 3112 $image = self::icon_by_class(
@@ -4360,9 +3111,9 @@
4360 3111 private static function get_images_dropdown_option_image( $option, $args ) {
4361 3112 $image = self::icon_by_class(
4362 3113 'frmfont ' . $option['svg'],
4363 3114 array(
4364 - 'echo' => false,
3115 + 'echo' => false,
4365 3116 )
4366 3117 );
4367 3118
4368 3119 $args['option'] = $option;
@@ -4384,9 +3135,8 @@
4384 3135 * @since 5.0.04
4385 3136 *
4386 3137 * @param array $option Option data.
4387 3138 * @param array $args The arguments of images_dropdown() method.
4388 - *
4389 3139 * @return string
4390 3140 */
4391 3141 private static function get_images_dropdown_option_classes( $option, $args ) {
4392 3142 $classes = '';
@@ -4414,19 +3164,17 @@
4414 3164 * @since 5.0.04
4415 3165 *
4416 3166 * @param array $option Option data.
4417 3167 * @param array $args The arguments of images_dropdown() method.
4418 - *
4419 3168 * @return string
4420 3169 */
4421 3170 private static function get_images_dropdown_option_html_attrs( $option, $args ) {
4422 3171 $html_attrs = '';
4423 -
4424 3172 if ( ! empty( $option['custom_attrs'] ) && is_array( $option['custom_attrs'] ) ) {
4425 3173 $html_attrs_arr = array();
4426 3174
4427 3175 foreach ( $option['custom_attrs'] as $key => $value ) {
4428 - if ( in_array( $key, array( 'type', 'class', 'data-value' ), true ) ) {
3176 + if ( in_array( $key, array( 'type', 'class', 'data-value' ) ) ) {
4429 3177 continue;
4430 3178 }
4431 3179
4432 3180 $html_attrs_arr[] = sprintf( '%s="%s"', esc_attr( $key ), esc_attr( $value ) );
@@ -4484,9 +3232,8 @@
4484 3232 * @since 5.0.07
4485 3233 *
4486 3234 * @param array $values
4487 3235 * @param array $keys
4488 - *
4489 3236 * @return array
4490 3237 */
4491 3238 public static function maybe_filter_array( $values, $keys ) {
4492 3239 $allow_unfiltered_html = self::allow_unfiltered_html();
@@ -4504,96 +3251,43 @@
4504 3251 return $values;
4505 3252 }
4506 3253
4507 3254 /**
4508 - * Some back end fields allow privileged users to add scripts.
3255 + * Some back end fields allow privleged users to add scripts.
4509 3256 * A site that uses the DISALLOW_UNFILTERED_HTML always remove scripts on echo.
4510 3257 *
4511 3258 * @since 5.0.13
4512 3259 *
4513 3260 * @param string $value
4514 - * @param array|string $allowed 'all' for everything included as defaults.
4515 - *
3261 + * @param array|string $allowed 'all' for everything included as defaults
4516 3262 * @return string
4517 3263 */
4518 3264 public static function maybe_kses( $value, $allowed = 'all' ) {
4519 3265 if ( self::should_never_allow_unfiltered_html() ) {
4520 - return self::kses( $value, $allowed );
3266 + $value = self::kses( $value, $allowed );
4521 3267 }
4522 3268 return $value;
4523 3269 }
4524 3270
4525 3271 /**
4526 - * Check if an option attribute used in an [input] shortcode is safe.
3272 + * @since 5.0.16
4527 3273 *
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 3274 * @return bool
4534 3275 */
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 );
3276 + public static function show_landing_pages() {
3277 + return self::show_new_feature( 'landing' );
4580 3278 }
4581 3279
4582 3280 /**
4583 3281 * @since 5.0.16
4584 3282 *
4585 - * @param string $medium
4586 - *
4587 3283 * @return array
4588 3284 */
4589 3285 public static function get_landing_page_upgrade_data_params( $medium = 'landing' ) {
4590 3286 $params = array(
4591 - 'medium' => $medium,
4592 - 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
4593 - 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4594 - 'screenshot' => 'landing.png',
4595 - 'learn-more' => self::get_doc_url( 'landing-page-forms', 'form-landing-page-settings', false ),
3287 + 'medium' => $medium,
3288 + 'upgrade' => __( 'Form Landing Pages', 'formidable' ),
3289 + 'message' => __( 'Easily manage a landing page for your form. Upgrade to get form landing pages.', 'formidable' ),
4596 3290 );
4597 3291 return self::get_upgrade_data_params( 'landing', $params );
4598 3292 }
4599 3293
@@ -4599,36 +3293,36 @@
4599 3293
4600 3294 /**
4601 3295 * @since 5.0.17
4602 3296 *
4603 - * @param string $feature
3297 + * @param string $plugin
3298 + * @return string|false
3299 + */
3300 + private static function get_plan_required( $plugin ) {
3301 + $link = FrmAddonsController::install_link( $plugin );
3302 + return FrmFormsHelper::get_plan_required( $link );
3303 + }
3304 +
3305 + /**
3306 + * @since 5.0.17
4604 3307 *
3308 + * @param string
4605 3309 * @return bool
4606 3310 */
4607 3311 public static function show_new_feature( $feature ) {
4608 3312 $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' );
3313 + return array_key_exists( 'status', $link ) || array_key_exists( 'class', $link );
4615 3314 }
4616 3315
4617 3316 /**
4618 - * Enhances upgrade data parameters with installation link and plan requirement information.
4619 - *
4620 3317 * @since 5.0.17
4621 3318 *
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.
3319 + * @param string $plugin
3320 + * @param array $params
3321 + * @return array
4627 3322 */
4628 - public static function get_upgrade_data_params( $plugin, $params, $detailed = false ) {
3323 + public static function get_upgrade_data_params( $plugin, $params ) {
4629 3324 $link = FrmAddonsController::install_link( $plugin );
4630 -
4631 3325 if ( ! $link ) {
4632 3326 return $params;
4633 3327 }
4634 3328
@@ -4634,20 +3328,15 @@
4634 3328
4635 3329 if ( ! empty( $link['url'] ) && self::pro_is_installed() ) {
4636 3330 $params['oneclick'] = json_encode( $link );
4637 3331 unset( $params['message'] );
4638 -
4639 3332 if ( ! isset( $params['medium'] ) ) {
4640 3333 $params['medium'] = $plugin;
4641 3334 }
4642 3335 } else {
4643 - $params['requires'] = $params['requires'] ?? FrmFormsHelper::get_plan_required( $link );
3336 + $params['requires'] = FrmFormsHelper::get_plan_required( $link );
4644 3337 }
4645 3338
4646 - if ( $detailed ) {
4647 - $params['plugin-status'] = $link['status'] ?? '';
4648 - }
4649 -
4650 3339 return $params;
4651 3340 }
4652 3341
4653 3342 /**
@@ -4656,9 +3345,8 @@
4656 3345 *
4657 3346 * @since 5.0.17
4658 3347 *
4659 3348 * @param string $text
4660 - *
4661 3349 * @return bool
4662 3350 */
4663 3351 public static function ctype_xdigit( $text ) {
4664 3352 if ( function_exists( 'ctype_xdigit' ) ) {
@@ -4673,15 +3361,41 @@
4673 3361 * @since 5.2.01
4674 3362 */
4675 3363 public static function set_current_screen_and_hook_suffix() {
4676 3364 global $hook_suffix;
4677 -
4678 3365 if ( is_null( $hook_suffix ) ) {
4679 3366 // $hook_suffix gets used in substr so make sure it's not null. PHP 8.1 deprecates null in substr.
4680 3367 $hook_suffix = ''; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited
4681 3368 }
3369 + set_current_screen();
3370 + }
4682 3371
4683 - set_current_screen();
3372 + /**
3373 + * @since 4.07
3374 + * @deprecated 4.09.01
3375 + */
3376 + public static function renewal_message() {
3377 + if ( is_callable( 'FrmProAddonsController::renewal_message' ) ) {
3378 + FrmProAddonsController::renewal_message();
3379 + return;
3380 + }
3381 +
3382 + if ( ! FrmAddonsController::is_license_expired() ) {
3383 + return;
3384 + }
3385 +
3386 + ?>
3387 + <div class="frm_error_style" style="text-align:left">
3388 + <?php self::icon_by_class( 'frmfont frm_alert_icon' ); ?>
3389 + &nbsp;
3390 + <?php esc_html_e( 'Your account has expired', 'formidable' ); ?>
3391 + <div style="float:right">
3392 + <a href="<?php echo esc_url( self::admin_upgrade_link( 'form-expired', 'account/downloads/' ) ); ?>">
3393 + <?php esc_html_e( 'Renew Now', 'formidable' ); ?>
3394 + </a>
3395 + </div>
3396 + </div>
3397 + <?php
4684 3398 }
4685 3399
4686 3400 /**
4687 3401 * Shows pill text.
@@ -4687,15 +3401,15 @@
4687 3401 * Shows pill text.
4688 3402 *
4689 3403 * @since 5.2.02
4690 3404 *
4691 - * @param string|null $text Text in the pill. Default is NEW.
3405 + * @param string $text Text in the pill. Default is NEW.
4692 3406 */
4693 3407 public static function show_pill_text( $text = null ) {
4694 3408 if ( null === $text ) {
4695 3409 $text = __( 'NEW', 'formidable' );
4696 3410 }
4697 - echo '<span class="frm-meta-tag frm-new-pill">' . esc_html( $text ) . '</span>';
3411 + echo '<span class="frm-new-pill">' . esc_html( $text ) . '</span>';
4698 3412 }
4699 3413
4700 3414 /**
4701 3415 * Count the number of decimals digits.
@@ -4702,10 +3416,9 @@
4702 3416 *
4703 3417 * @since 5.2.07
4704 3418 *
4705 3419 * @param mixed $num Number.
4706 - *
4707 - * @return false|int Returns `false` if the passed parameter is not number.
3420 + * @return int|false Returns `false` if the passed parameter is not number.
4708 3421 */
4709 3422 public static function count_decimals( $num ) {
4710 3423 if ( ! is_numeric( $num ) ) {
4711 3424 return false;
@@ -4712,9 +3425,8 @@
4712 3425 }
4713 3426
4714 3427 $num = (string) $num;
4715 3428 $parts = explode( '.', $num );
4716 -
4717 3429 if ( 1 === count( $parts ) ) {
4718 3430 return 0;
4719 3431 }
4720 3432
@@ -4721,335 +3433,213 @@
4721 3433 return strlen( $parts[ count( $parts ) - 1 ] );
4722 3434 }
4723 3435
4724 3436 /**
4725 - * Prevent a fatal error in PHP8 if gmt_offset happens to be set an empty string.
4726 - * This is a bug in WordPress. It isn't safe to call current_time( 'timestamp' ) without this with an empty string offset.
4727 - * In the future this might be safe to remove. Keep an eye on the current_time function in functions.php.
4728 - *
4729 - * @since 5.3.1
4730 - *
4731 - * @return void
3437 + * @since 4.08
3438 + * @deprecated 4.09.01
4732 3439 */
4733 - public static function filter_gmt_offset() {
4734 - if ( self::$added_gmt_offset_filter ) {
4735 - // Avoid adding twice.
4736 - return;
3440 + public static function expiring_message() {
3441 + _deprecated_function( __METHOD__, '4.09.01', 'FrmProAddonsController::expiring_message' );
3442 + if ( is_callable( 'FrmProAddonsController::expiring_message' ) ) {
3443 + FrmProAddonsController::expiring_message();
4737 3444 }
4738 -
4739 - add_filter(
4740 - 'option_gmt_offset',
4741 - function ( $offset ) {
4742 - if ( ! is_string( $offset ) || is_numeric( $offset ) ) {
4743 - // Leave a valid value alone.
4744 - return $offset;
4745 - }
4746 -
4747 - return 0;
4748 - }
4749 - );
4750 - self::$added_gmt_offset_filter = true;
4751 3445 }
4752 3446
4753 3447 /**
4754 - * @since 5.3.1
3448 + * Use the WP 4.7 wp_doing_ajax function
4755 3449 *
4756 - * @return bool
3450 + * @since 2.05.07
3451 + * @deprecated 4.04.04
4757 3452 */
4758 - public static function on_form_listing_page() {
4759 - if ( ! self::is_admin_page( 'formidable' ) ) {
4760 - return false;
4761 - }
3453 + public static function wp_doing_ajax() {
3454 + _deprecated_function( __METHOD__, '4.04.04', 'wp_doing_ajax' );
3455 + return wp_doing_ajax();
3456 + }
4762 3457
4763 - $action = self::simple_get( 'frm_action', 'sanitize_title' );
4764 - return ! $action || in_array( $action, self::get_form_listing_page_actions(), true );
3458 + /**
3459 + * @deprecated 4.0
3460 + */
3461 + public static function insert_opt_html( $args ) {
3462 + _deprecated_function( __METHOD__, '4.0', 'FrmFormsHelper::insert_opt_html' );
3463 + FrmFormsHelper::insert_opt_html( $args );
4765 3464 }
4766 3465
4767 3466 /**
4768 - * Get all actions that also display the forms list.
3467 + * Used to filter shortcode in text widgets
4769 3468 *
4770 - * @since 5.3.1
4771 - *
4772 - * @return array<string>
3469 + * @deprecated 2.5.4
3470 + * @codeCoverageIgnore
4773 3471 */
4774 - private static function get_form_listing_page_actions() {
4775 - return array( 'list', 'trash', 'untrash', 'destroy' );
3472 + public static function widget_text_filter_callback( $matches ) {
3473 + return FrmDeprecated::widget_text_filter_callback( $matches );
4776 3474 }
4777 3475
4778 3476 /**
4779 - * Safely call get_plugins, importing the required files if they are not yet loaded.
4780 - *
4781 - * @since 5.5
4782 - *
4783 - * @return array
3477 + * @deprecated 3.01
3478 + * @codeCoverageIgnore
4784 3479 */
4785 - public static function get_plugins() {
4786 - if ( ! function_exists( 'get_plugins' ) ) {
4787 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
4788 - }
4789 - return get_plugins();
3480 + public static function sanitize_array( &$values ) {
3481 + FrmDeprecated::sanitize_array( $values );
4790 3482 }
4791 3483
4792 3484 /**
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.
3485 + * @param array $settings
3486 + * @param string $group
4795 3487 *
4796 - * @since 5.5.5
4797 - *
4798 - * @param string $url
4799 - * @param string $expected_extension
4800 - *
4801 - * @return bool
3488 + * @since 2.0.6
3489 + * @deprecated 2.05.06
3490 + * @codeCoverageIgnore
4802 3491 */
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' );
3492 + public static function save_settings( $settings, $group ) {
3493 + return FrmDeprecated::save_settings( $settings, $group );
3494 + }
4805 3495
4806 - if ( ! $file_is_in_expected_s3_bucket ) {
4807 - return false;
4808 - }
4809 -
4810 - $parsed = parse_url( $url );
4811 -
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;
3496 + /**
3497 + * @since 2.0.4
3498 + * @deprecated 2.05.06
3499 + * @codeCoverageIgnore
3500 + */
3501 + public static function save_json_post( $settings ) {
3502 + return FrmDeprecated::save_json_post( $settings );
4821 3503 }
4822 3504
4823 3505 /**
4824 - * Display a dismissable warning message and save its dismissal state.
3506 + * @since 2.0
3507 + * @deprecated 2.05.06
3508 + * @codeCoverageIgnore
4825 3509 *
4826 - * @since 6.3
3510 + * @param string $cache_key The unique name for this cache
3511 + * @param string $group The name of the cache group
3512 + * @param string $query If blank, don't run a db call
3513 + * @param string $type The wpdb function to use with this query
4827 3514 *
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
3515 + * @return mixed $results The cache or query results
4832 3516 */
4833 - public static function add_dismissable_warning_message( $message = '', $option = '' ) {
4834 - if ( ! $message || ! $option ) {
4835 - return;
4836 - }
3517 + public static function check_cache( $cache_key, $group = '', $query = '', $type = 'get_var', $time = 300 ) {
3518 + return FrmDeprecated::check_cache( $cache_key, $group, $query, $type, $time );
3519 + }
4837 3520
4838 - $ajax_callback = function () use ( $option ) {
4839 - self::dismiss_warning_message( $option );
4840 - };
3521 + /**
3522 + * @deprecated 2.05.06
3523 + * @codeCoverageIgnore
3524 + */
3525 + public static function set_cache( $cache_key, $results, $group = '', $time = 300 ) {
3526 + return FrmDeprecated::set_cache( $cache_key, $results, $group, $time );
3527 + }
4841 3528
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 );
3529 + /**
3530 + * @deprecated 2.05.06
3531 + * @codeCoverageIgnore
3532 + */
3533 + public static function add_key_to_group_cache( $key, $group ) {
3534 + FrmDeprecated::add_key_to_group_cache( $key, $group );
3535 + }
4845 3536
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 - );
3537 + /**
3538 + * @deprecated 2.05.06
3539 + * @codeCoverageIgnore
3540 + */
3541 + public static function get_group_cached_keys( $group ) {
3542 + return FrmDeprecated::get_group_cached_keys( $group );
4867 3543 }
4868 3544
4869 3545 /**
4870 - * Dismiss a warning message and update the dismissal state.
4871 - *
4872 - * @since 6.3
4873 - *
4874 - * @param string $option The unique identifier for the dismissal state of the message.
4875 - *
4876 - * @return void
3546 + * @since 2.0
3547 + * @deprecated 2.05.06
3548 + * @codeCoverageIgnore
3549 + * @return mixed The cached value or false
4877 3550 */
4878 - public static function dismiss_warning_message( $option = '' ) {
4879 - self::permission_check( 'frm_change_settings' );
4880 - check_ajax_referer( 'frm_ajax', 'nonce' );
4881 -
4882 - if ( $option ) {
4883 - update_option( $option, true, false );
4884 - }
4885 -
4886 - wp_send_json_success();
3551 + public static function check_cache_and_transient( $cache_key ) {
3552 + return FrmDeprecated::check_cache( $cache_key );
4887 3553 }
4888 3554
4889 3555 /**
4890 - * Lite license copy.
4891 - * Used in FrmDashboardController & FrmSettingsController
3556 + * @since 2.0
3557 + * @deprecated 2.05.06
3558 + * @codeCoverageIgnore
4892 3559 *
4893 - * @since 6.8
4894 - *
4895 - * @return string
3560 + * @param string $cache_key
4896 3561 */
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 );
3562 + public static function delete_cache_and_transient( $cache_key, $group = 'default' ) {
3563 + FrmDeprecated::delete_cache_and_transient( $cache_key, $group );
4900 3564 }
4901 3565
4902 3566 /**
4903 - * Removes scripts that are unnecessarily loaded across the pages!
3567 + * @since 2.0
3568 + * @deprecated 2.05.06
3569 + * @codeCoverageIgnore
4904 3570 *
4905 - * @since 6.9
4906 - *
4907 - * @return void
3571 + * @param string $group The name of the cache group
4908 3572 */
4909 - public static function dequeue_extra_global_scripts() {
4910 - wp_dequeue_script( 'frm-surveys-admin' );
4911 - wp_dequeue_script( 'frm-quizzes-form-action' );
3573 + public static function cache_delete_group( $group ) {
3574 + FrmDeprecated::cache_delete_group( $group );
4912 3575 }
4913 3576
4914 3577 /**
4915 - * Shows tooltip icon.
3578 + * @since 1.07.10
3579 + * @deprecated 2.05.06
3580 + * @codeCoverageIgnore
4916 3581 *
4917 - * @since 6.12
3582 + * @param string $term The value to escape
4918 3583 *
4919 - * @param string $tooltip_text Tooltip text.
4920 - * @param array $atts Tooltip wrapper HTML attributes.
4921 - *
4922 - * @return void
3584 + * @return string The escaped value
4923 3585 */
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
3586 + public static function esc_like( $term ) {
3587 + return FrmDeprecated::esc_like( $term );
4939 3588 }
4940 3589
4941 3590 /**
4942 - * Prints errors for settings in onboarding wizard or template settings.
3591 + * @param string $order_query
4943 3592 *
4944 - * @since 6.15
4945 - *
4946 - * @param array $args Args.
4947 - *
4948 - * @return void
3593 + * @deprecated 2.05.06
3594 + * @codeCoverageIgnore
4949 3595 */
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
3596 + public static function esc_order( $order_query ) {
3597 + return FrmDeprecated::esc_order( $order_query );
4979 3598 }
4980 3599
4981 3600 /**
4982 - * Check if GDPR is enabled.
4983 - *
4984 - * @since 6.19
4985 - *
4986 - * @return bool
3601 + * @deprecated 2.05.06
3602 + * @codeCoverageIgnore
4987 3603 */
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;
3604 + public static function esc_order_by( &$order_by ) {
3605 + FrmDeprecated::esc_order_by( $order_by );
4991 3606 }
4992 3607
4993 3608 /**
4994 - * Check if GDPR cookies are disabled.
3609 + * @param string $limit
4995 3610 *
4996 - * @since 6.19
4997 - *
4998 - * @return bool
3611 + * @deprecated 2.05.06
3612 + * @codeCoverageIgnore
4999 3613 */
5000 - public static function no_gdpr_cookies() {
5001 - $frm_settings = self::get_settings();
5002 - return $frm_settings->enable_gdpr && $frm_settings->no_gdpr_cookies;
3614 + public static function esc_limit( $limit ) {
3615 + return FrmDeprecated::esc_limit( $limit );
5003 3616 }
5004 3617
5005 3618 /**
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
3619 + * @since 2.0
3620 + * @deprecated 2.05.06
3621 + * @codeCoverageIgnore
5013 3622 */
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;
3623 + public static function prepare_array_values( $array, $type = '%s' ) {
3624 + return FrmDeprecated::prepare_array_values( $array, $type );
5022 3625 }
5023 3626
5024 3627 /**
5025 - * Get a documentation URL with UTM parameters and affiliate tracking.
5026 - *
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.
3628 + * @deprecated 2.05.06
3629 + * @codeCoverageIgnore
5034 3630 */
5035 - public static function get_doc_url( $path, $campaign, $add_kb_base = true ) {
5036 - $path = trim( $path, '/' );
5037 -
5038 - if ( $add_kb_base ) {
5039 - $path = 'knowledgebase/' . $path;
5040 - }
5041 -
5042 - return self::maybe_add_missing_utm( 'https://formidableforms.com/' . $path, array( 'campaign' => $campaign ) );
3631 + public static function prepend_and_or_where( $starts_with = ' WHERE ', $where = '' ) {
3632 + return FrmDeprecated::prepend_and_or_where( $starts_with, $where );
5043 3633 }
5044 3634
5045 3635 /**
5046 - * @since 5.0.16
5047 - * @deprecated 6.26
3636 + * @since 2.0
3637 + * @deprecated 5.0.13
5048 3638 *
5049 - * @return bool
3639 + * @return string The base Google APIS url for the current version of jQuery UI
5050 3640 */
5051 - public static function show_landing_pages() {
5052 - _deprecated_function( __METHOD__, '6.26' );
5053 - return true;
3641 + public static function jquery_ui_base_url() {
3642 + _deprecated_function( __FUNCTION__, '5.0.13', 'FrmProAppHelper::jquery_ui_base_url' );
3643 + return is_callable( 'FrmProAppHelper::jquery_ui_base_url' ) ? FrmProAppHelper::jquery_ui_base_url() : '';
5054 3644 }
5055 3645 }