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