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