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