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