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