PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.22
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.22
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/controllers/FrmAddonsController.php +123 -357 6.356.22 View file →
@@ -26,23 +26,19 @@
26 26 protected static $plugin;
27 27
28 28 /**
29 29 * @since 6.15
30 - *
31 - * @return void
32 30 */
33 31 public static function load_admin_hooks() {
34 - add_action( 'admin_menu', self::class . '::menu', 100 );
35 - add_filter( 'pre_set_site_transient_update_plugins', self::class . '::check_update' );
32 + add_action( 'admin_menu', __CLASS__ . '::menu', 100 );
33 + add_filter( 'pre_set_site_transient_update_plugins', __CLASS__ . '::check_update' );
36 34
37 - if ( ! FrmAppHelper::is_admin_page( 'formidable-addons' ) ) {
38 - return;
35 + if ( FrmAppHelper::is_admin_page( 'formidable-addons' ) ) {
36 + self::$request_addon_url = 'https://connect.formidableforms.com/add-on-request/';
37 +
38 + add_action( 'admin_enqueue_scripts', __CLASS__ . '::enqueue_assets', 15 );
39 + add_filter( 'frm_show_footer_links', '__return_false' );
39 40 }
40 -
41 - self::$request_addon_url = 'https://connect.formidableforms.com/add-on-request/';
42 -
43 - add_action( 'admin_enqueue_scripts', self::class . '::enqueue_assets', 15 );
44 - add_filter( 'frm_show_footer_links', '__return_false' );
45 41 }
46 42
47 43 /**
48 44 * Enqueues the Add-Ons page scripts and styles.
@@ -104,14 +100,13 @@
104 100 $label = '<span style="color:#3FCA89">' . esc_html( $label ) . '</span>';
105 101
106 102 add_submenu_page( 'formidable', 'Formidable | ' . __( 'Add-Ons', 'formidable' ), $label, 'frm_view_forms', 'formidable-addons', 'FrmAddonsController::list_addons' );
107 103
108 - // Remove default created subpage, make the page with highest priority as default.
104 + // remove default created subpage, make the page with highest priority as default.
109 105 remove_submenu_page( 'formidable', 'formidable' );
110 106
111 107 if ( ! FrmAppHelper::pro_is_installed() ) {
112 108 $cta_text = FrmSalesApi::get_best_sale_value( 'menu_cta_text' );
113 -
114 109 if ( ! $cta_text ) {
115 110 $cta_text = __( 'Upgrade', 'formidable' );
116 111 }
117 112
@@ -147,9 +142,9 @@
147 142
148 143 if ( isset( $addons['error'] ) ) {
149 144 $api = new FrmFormApi();
150 145 $errors = $api->get_error_from_response( $addons );
151 - $license_type = $addons['error']['type'] ?? '';
146 + $license_type = isset( $addons['error']['type'] ) ? $addons['error']['type'] : '';
152 147 unset( $addons['error'] );
153 148 }
154 149
155 150 $pro = array(
@@ -156,10 +151,9 @@
156 151 'pro' => array(
157 152 'title' => 'Formidable Forms Pro',
158 153 'slug' => 'formidable-pro',
159 154 'released' => '2011-02-05',
160 - 'docs' => 'knowledgebase/what-is-the-difference-between-the-lite-free-and-pro-version/',
161 - 'docs_label' => __( 'Why Upgrade', 'formidable' ),
155 + 'docs' => 'knowledgebase/',
162 156 'categories' => array( 'basic', 'plus', 'business', 'elite' ),
163 157 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
164 158 ),
165 159 );
@@ -194,18 +188,15 @@
194 188 );
195 189
196 190 // Extract the elements to move
197 191 foreach ( $plans as $plan ) {
198 - if ( ! isset( self::$categories[ $plan ] ) ) {
199 - continue;
192 + if ( isset( self::$categories[ $plan ] ) ) {
193 + $bottom_categories[ $plan ] = self::$categories[ $plan ];
194 + unset( self::$categories[ $plan ] );
200 195 }
201 -
202 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
203 - unset( self::$categories[ $plan ] );
204 196 }
205 197
206 198 $special_categories = array();
207 -
208 199 if ( 'elite' !== self::license_type() ) {
209 200 $special_categories['available-addons'] = array(
210 201 'name' => __( 'Available', 'formidable' ),
211 202 // To be assigned via JavaScript.
@@ -237,9 +228,8 @@
237 228 *
238 229 * @since 6.15
239 230 *
240 231 * @param array $addon The addon array that will be modified by reference.
241 - *
242 232 * @return void
243 233 */
244 234 protected static function set_categories( &$addon ) {
245 235 if ( ! isset( $addon['categories'] ) ) {
@@ -270,11 +260,11 @@
270 260 * @return void
271 261 */
272 262 public static function license_settings() {
273 263 $plugins = apply_filters( 'frm_installed_addons', array() );
264 + if ( empty( $plugins ) ) {
265 + esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
274 266
275 - if ( ! $plugins ) {
276 - esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
277 267 return;
278 268 }
279 269
280 270 ksort( $plugins );
@@ -288,15 +278,15 @@
288 278 protected static function get_api_addons() {
289 279 $api = new FrmFormApi();
290 280 $addons = $api->get_api_info();
291 281
292 - if ( ! $addons ) {
293 - return self::fallback_plugin_list();
294 - }
295 -
296 - foreach ( $addons as $k => $addon ) {
297 - if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
298 - unset( $addons[ $k ] );
282 + if ( empty( $addons ) ) {
283 + $addons = self::fallback_plugin_list();
284 + } else {
285 + foreach ( $addons as $k => $addon ) {
286 + if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
287 + unset( $addons[ $k ] );
288 + }
299 289 }
300 290 }
301 291
302 292 return $addons;
@@ -309,9 +299,11 @@
309 299 *
310 300 * @return int Count of addons.
311 301 */
312 302 public static function get_addons_count() {
313 - return count( self::get_api_addons() );
303 + $addons = self::get_api_addons();
304 +
305 + return count( $addons );
314 306 }
315 307
316 308 /**
317 309 * If the API is unable to connect, show something on the addons page
@@ -316,9 +308,8 @@
316 308 /**
317 309 * If the API is unable to connect, show something on the addons page
318 310 *
319 311 * @since 3.04.03
320 - *
321 312 * @return array
322 313 */
323 314 protected static function fallback_plugin_list() {
324 315 $list = array(
@@ -329,19 +320,19 @@
329 320 'excerpt' => 'Enhance your basic Formidable forms with a plethora of Pro field types and features. Create advanced forms and data-driven applications in minutes.',
330 321 ),
331 322 'mailchimp' => array(
332 323 'title' => 'Mailchimp Forms',
333 - 'excerpt' => 'Get on the path to more sales and leads in a matter of minutes. Add leads to a Mailchimp mailing list when they submit forms and update their information along with the entry.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
324 + 'excerpt' => 'Get on the path to more sales and leads in a matter of minutes. Add leads to a Mailchimp mailing list when they submit forms and update their information along with the entry.',
334 325 ),
335 326 'registration' => array(
336 327 'title' => 'User Registration Forms',
337 328 'link' => 'downloads/user-registration/',
338 - 'excerpt' => 'Give new users access to your site as quickly and painlessly as possible. Allow users to register, edit and be able to login to their profiles on your site from the front end in a clean, customized registration form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
329 + 'excerpt' => 'Give new users access to your site as quickly and painlessly as possible. Allow users to register, edit and be able to login to their profiles on your site from the front end in a clean, customized registration form.',
339 330 ),
340 331 'paypal' => array(
341 332 'title' => 'PayPal Standard Forms',
342 333 'link' => 'downloads/paypal-standard/',
343 - 'excerpt' => 'Automate your business by collecting instant payments from your clients. Collect information, calculate a total, and send them on to PayPal. Require a payment before publishing content on your site.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
334 + 'excerpt' => 'Automate your business by collecting instant payments from your clients. Collect information, calculate a total, and send them on to PayPal. Require a payment before publishing content on your site.',
344 335 ),
345 336 'stripe' => array(
346 337 'title' => 'Stripe Forms',
347 338 'docs' => 'knowledgebase/stripe/',
@@ -373,9 +364,9 @@
373 364 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
374 365 ),
375 366 'zapier' => array(
376 367 'title' => 'Zapier Forms',
377 - 'excerpt' => 'Connect with hundreds of different applications through Zapier. Insert a new row in a Google docs spreadsheet, post on Twitter, or add a new Dropbox file with your form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
368 + 'excerpt' => 'Connect with hundreds of different applications through Zapier. Insert a new row in a Google docs spreadsheet, post on Twitter, or add a new Dropbox file with your form.',
378 369 ),
379 370 'signature' => array(
380 371 'title' => 'Digital Signature Forms',
381 372 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -408,9 +399,8 @@
408 399 foreach ( $list as $k => $info ) {
409 400 $info['slug'] = $k;
410 401 $list[ $k ] = array_merge( $defaults, $info );
411 402 }
412 -
413 403 return $list;
414 404 }
415 405
416 406 /**
@@ -416,28 +406,25 @@
416 406 /**
417 407 * If Pro is missing but has been authenticated, include a download URL
418 408 *
419 409 * @since 3.04.03
420 - *
421 410 * @return string
422 411 */
423 412 public static function get_pro_download_url() {
424 - $api = new FrmFormApi( self::get_pro_license() );
413 + $license = self::get_pro_license();
414 + $api = new FrmFormApi( $license );
425 415 $downloads = $api->get_api_info();
426 416 $pro = self::get_pro_from_addons( $downloads );
427 417
428 - return $pro['url'] ?? '';
418 + return isset( $pro['url'] ) ? $pro['url'] : '';
429 419 }
430 420
431 421 /**
432 422 * @since 4.08
433 - *
434 - * @return string
435 423 */
436 424 public static function get_pro_license() {
437 425 $pro_cred_store = 'frmpro-credentials';
438 426 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
439 -
440 427 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
441 428 $creds = get_site_option( $pro_cred_store );
442 429 } else {
443 430 $creds = get_option( $pro_cred_store );
@@ -447,18 +434,16 @@
447 434 return '';
448 435 }
449 436
450 437 $license = $creds['license'];
451 -
452 - if ( ! $license ) {
438 + if ( empty( $license ) ) {
453 439 return '';
454 440 }
455 441
456 - if ( str_contains( $license, '-' ) ) {
457 - // This is a fix for licenses saved in the past
458 - return strtoupper( $license );
442 + if ( strpos( $license, '-' ) ) {
443 + // this is a fix for licenses saved in the past
444 + $license = strtoupper( $license );
459 445 }
460 -
461 446 return $license;
462 447 }
463 448
464 449 /**
@@ -464,26 +449,20 @@
464 449 /**
465 450 * @since 4.08
466 451 *
467 452 * @param array $addons
468 - *
469 453 * @return array
470 454 */
471 455 protected static function get_pro_from_addons( $addons ) {
472 - return $addons['93790'] ?? array();
456 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
473 457 }
474 458
475 459 /**
476 460 * @since 4.06
477 - * @since 6.31 Added the $force_type param.
478 - *
479 - * @param bool $force_type Whether to resolve grandfathered licenses to their real license type.
480 - *
481 - * @return string
482 461 */
483 - public static function license_type( $force_type = false ) {
462 + public static function license_type() {
484 463 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
485 - return FrmProAddonsController::license_type( $force_type );
464 + return FrmProAddonsController::license_type();
486 465 }
487 466
488 467 return 'free';
489 468 }
@@ -488,122 +467,8 @@
488 467 return 'free';
489 468 }
490 469
491 470 /**
492 - * Determine the license status for payment fee decisions.
493 - *
494 - * Mirrors determine_status_from_license_details in the Stripe Connect service,
495 - * including its 2016-04-26 grandfathered cutoff. Square and PayPal Commerce use a
496 - * later cutoff, so read their fees through payment_fees_apply instead.
497 - *
498 - * @since 6.31
499 - *
500 - * @return string 'active', 'expired', or 'free'.
501 - */
502 - public static function get_payment_license_status() {
503 - $version_info = self::get_primary_license_info();
504 -
505 - if ( ! $version_info ) {
506 - return 'free';
507 - }
508 -
509 - $error = $version_info['error'] ?? array();
510 -
511 - if ( is_array( $error ) && 'expired' === ( $error['code'] ?? '' ) ) {
512 - return 'expired';
513 - }
514 -
515 - if ( self::is_grandfathered_license() ) {
516 - $expires = self::get_grandfathered_expiration( $version_info );
517 -
518 - if ( $expires && gmdate( 'Y-m-d', $expires ) < '2016-04-26' ) {
519 - return 'free';
520 - }
521 - }
522 -
523 - if ( in_array( self::license_type( true ), array( 'elite', 'business' ), true ) ) {
524 - return 'active';
525 - }
526 -
527 - return 'free';
528 - }
529 -
530 - /**
531 - * Check if a connect service charges its per-transaction fee for this license.
532 - *
533 - * Square and PayPal Commerce launched long after lifetime licenses stopped being
534 - * sold, so their services charge every grandfathered license. Stripe's predates
535 - * them and exempts most of them, which get_payment_license_status mirrors.
536 - *
537 - * @since 6.34
538 - *
539 - * @param string $service The connect service: 'stripe', 'square', or 'paypal'.
540 - *
541 - * @return bool
542 - */
543 - public static function payment_fees_apply( $service ) {
544 - if ( 'active' !== self::get_payment_license_status() ) {
545 - return true;
546 - }
547 -
548 - if ( in_array( $service, array( 'square', 'paypal' ), true ) ) {
549 - return self::is_grandfathered_license();
550 - }
551 -
552 - return false;
553 - }
554 -
555 - /**
556 - * Check if the primary license is grandfathered.
557 - *
558 - * The API reports this on the Pro add-on itself, the same place
559 - * FrmProAddonsController::license_type reads it from. Older responses put it
560 - * in the top level error instead, so check both.
561 - *
562 - * @since 6.34
563 - *
564 - * @return bool
565 - */
566 - public static function is_grandfathered_license() {
567 - $version_info = self::get_primary_license_info();
568 -
569 - if ( ! $version_info ) {
570 - return false;
571 - }
572 -
573 - $error = $version_info['error'] ?? array();
574 -
575 - if ( is_array( $error ) && 'grandfathered' === ( $error['code'] ?? '' ) ) {
576 - return true;
577 - }
578 -
579 - $pro = self::get_pro_from_addons( $version_info );
580 -
581 - return 'grandfathered' === ( $pro['code'] ?? '' );
582 - }
583 -
584 - /**
585 - * Get the expiration timestamp reported alongside a grandfathered license.
586 - *
587 - * @since 6.34
588 - *
589 - * @param array $version_info The license info from get_primary_license_info.
590 - *
591 - * @return int
592 - */
593 - private static function get_grandfathered_expiration( $version_info ) {
594 - $error = $version_info['error'] ?? array();
595 -
596 - if ( is_array( $error ) && ! empty( $error['expires'] ) ) {
597 - return (int) $error['expires'];
598 - }
599 -
600 - $pro = self::get_pro_from_addons( $version_info );
601 -
602 - return (int) ( $pro['expires'] ?? 0 );
603 - }
604 -
605 - /**
606 471 * @since 4.0.01
607 472 *
608 473 * @return bool
609 474 */
@@ -608,21 +473,18 @@
608 473 * @return bool
609 474 */
610 475 public static function is_license_expired() {
611 476 $version_info = self::get_primary_license_info();
612 -
613 477 if ( ! isset( $version_info['error'] ) ) {
614 478 return false;
615 479 }
616 480
617 - $expires = $version_info['error']['expires'] ?? 0;
618 -
619 - if ( ! $expires || $expires > time() ) {
481 + $expires = isset( $version_info['error']['expires'] ) ? $version_info['error']['expires'] : 0;
482 + if ( empty( $expires ) || $expires > time() ) {
620 483 return false;
621 484 }
622 485
623 486 $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
624 -
625 487 if ( $rate_limited ) {
626 488 // Do not return false positives for rate limited responses.
627 489 return false;
628 490 }
@@ -637,13 +499,11 @@
637 499 * @return array|false
638 500 */
639 501 public static function get_primary_license_info() {
640 502 $installed_addons = apply_filters( 'frm_installed_addons', array() );
641 -
642 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
503 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
643 504 return false;
644 505 }
645 -
646 506 $installed_addons = array(
647 507 'formidable_pro' => $installed_addons['formidable_pro'],
648 508 );
649 509
@@ -651,12 +511,8 @@
651 511 }
652 512
653 513 /**
654 514 * @since 3.04.03
655 - *
656 - * @param mixed $transient
657 - *
658 - * @return object
659 515 */
660 516 public static function check_update( $transient ) {
661 517 if ( ! FrmAppHelper::pro_is_installed() ) {
662 518 // Don't make any changes if only Lite is installed.
@@ -667,10 +523,9 @@
667 523 $transient = new stdClass();
668 524 }
669 525
670 526 $installed_addons = apply_filters( 'frm_installed_addons', array() );
671 -
672 - if ( ! $installed_addons ) {
527 + if ( empty( $installed_addons ) ) {
673 528 return $transient;
674 529 }
675 530
676 531 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -684,20 +539,19 @@
684 539 continue;
685 540 }
686 541
687 542 $folder = $plugin->plugin;
688 -
689 - if ( ! $folder ) {
543 + if ( empty( $folder ) ) {
690 544 continue;
691 545 }
692 546
693 547 if ( ! self::is_installed( $folder ) ) {
694 - // Don't show an update if the plugin isn't installed
548 + // don't show an update if the plugin isn't installed
695 549 continue;
696 550 }
697 551
698 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
699 - $wp_version = $wp_plugin['Version'] ?? '1.0';
552 + $wp_plugin = isset( $wp_plugins[ $folder ] ) ? $wp_plugins[ $folder ] : array();
553 + $wp_version = isset( $wp_plugin['Version'] ) ? $wp_plugin['Version'] : '1.0';
700 554 $plugin->slug = explode( '/', $folder )[0];
701 555
702 556 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
703 557 $transient->response[ $folder ] = $plugin;
@@ -705,8 +559,9 @@
705 559 $transient->no_update[ $folder ] = $plugin;
706 560 }
707 561
708 562 $transient->checked[ $folder ] = $wp_version;
563 +
709 564 }//end foreach
710 565
711 566 return $transient;
712 567 }
@@ -716,9 +571,8 @@
716 571 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
717 572 * This means that trying to access FrmAppHelper::get_plugins when upgrading from a Lite version before v5.5 results in a one-off error.
718 573 *
719 574 * @since 5.5.2
720 - *
721 575 * @return array
722 576 */
723 577 protected static function get_plugins() {
724 578 if ( ! function_exists( 'get_plugins' ) ) {
@@ -753,49 +607,43 @@
753 607 $version_info = array();
754 608
755 609 foreach ( $installed_addons as $addon ) {
756 610 if ( $addon->store_url !== 'https://formidableforms.com' ) {
757 - // Check if this is a third-party addon
611 + // check if this is a third-party addon
758 612 continue;
759 613 }
760 614
761 615 $new_license = $addon->license;
762 -
763 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
616 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
764 617 continue;
765 618 }
766 619
767 620 $checked_licenses[] = $new_license;
768 - $api = new FrmFormApi( $new_license );
769 621
770 - if ( ! $version_info ) {
622 + $api = new FrmFormApi( $new_license );
623 + if ( empty( $version_info ) ) {
771 624 $version_info = $api->get_api_info();
772 625 continue;
773 626 }
774 627
775 628 $plugin = $api->get_addon_for_license( $addon, $version_info );
776 -
777 - if ( ! $plugin ) {
629 + if ( empty( $plugin ) ) {
778 630 continue;
779 631 }
780 632
781 - $download_id = $plugin['id'] ?? 0;
633 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
634 + if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
635 + // if this addon is using its own license, get the update url
636 + $addon_info = $api->get_api_info();
782 637
783 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
784 - continue;
638 + $version_info[ $download_id ] = $addon_info[ $download_id ];
639 + if ( isset( $addon_info['error'] ) ) {
640 + $version_info[ $download_id ]['error'] = array(
641 + 'message' => $addon_info['error']['message'],
642 + 'code' => $addon_info['error']['code'],
643 + );
644 + }
785 645 }
786 -
787 - // If this addon is using its own license, get the update url
788 - $addon_info = $api->get_api_info();
789 -
790 - $version_info[ $download_id ] = $addon_info[ $download_id ];
791 -
792 - if ( isset( $addon_info['error'] ) ) {
793 - $version_info[ $download_id ]['error'] = array(
794 - 'message' => $addon_info['error']['message'],
795 - 'code' => $addon_info['error']['code'],
796 - );
797 - }
798 646 }//end foreach
799 647
800 648 return $version_info;
801 649 }
@@ -803,11 +651,9 @@
803 651 /**
804 652 * Get the action link for an addon that isn't active.
805 653 *
806 654 * @since 3.06.03
807 - *
808 655 * @param string $plugin The plugin slug.
809 - *
810 656 * @return array
811 657 */
812 658 public static function install_link( $plugin ) {
813 659 $link = array();
@@ -829,9 +675,9 @@
829 675 'categories' => $addon['categories'],
830 676 );
831 677 }
832 678
833 - if ( $link ) {
679 + if ( ! empty( $link ) ) {
834 680 $link['status'] = $addon['status']['type'];
835 681 }
836 682 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
837 683 $link = array(
@@ -843,81 +689,34 @@
843 689 return $link;
844 690 }
845 691
846 692 /**
847 - * Get the JSON-encoded install data for a plugin update.
848 - *
849 - * @since 6.29
850 - *
851 - * @param string $addon_slug The addon slug (e.g. 'pro', 'dates').
852 - *
853 - * @return string JSON-encoded install data, or empty string if no URL is available.
854 - */
855 - public static function get_update_install_data( $addon_slug ) {
856 - $upgrading = self::install_link( $addon_slug );
857 -
858 - if ( isset( $upgrading['class'] ) && 'frm-install-addon' === $upgrading['class'] ) {
859 - return (string) json_encode( $upgrading );
860 - }
861 -
862 - if ( 'pro' === $addon_slug ) {
863 - $download_url = self::get_pro_download_url();
864 - $plugin_file = 'formidable-pro/formidable-pro.php';
865 - } else {
866 - $addon_data = self::get_addon( $addon_slug );
867 - $download_url = $addon_data && ! empty( $addon_data['url'] ) ? $addon_data['url'] : '';
868 - $plugin_file = $addon_data && ! empty( $addon_data['plugin'] ) ? $addon_data['plugin'] : 'formidable-' . $addon_slug . '/formidable-' . $addon_slug . '.php';
869 - }
870 -
871 - if ( ! $download_url ) {
872 - $update_plugins = get_site_transient( 'update_plugins' );
873 - $plugin_update = $update_plugins->response[ $plugin_file ] ?? null;
874 - $download_url = $plugin_update && ! empty( $plugin_update->package ) ? $plugin_update->package : '';
875 - }
876 -
877 - return $download_url ? (string) json_encode(
878 - array(
879 - 'url' => $download_url,
880 - 'class' => 'frm-install-addon',
881 - )
882 - ) : '';
883 - }
884 -
885 - /**
886 693 * @since 4.09
887 - *
888 694 * @param string $plugin The plugin slug.
889 - *
890 695 * @return array|false
891 696 */
892 697 public static function get_addon( $plugin ) {
893 698 $addons = self::get_api_addons();
894 699 self::prepare_addons( $addons );
895 -
896 700 foreach ( $addons as $addon ) {
897 701 $slug = explode( '/', $addon['plugin'] );
898 -
899 702 if ( $slug[0] === 'formidable-' . $plugin ) {
900 703 return $addon;
901 704 }
902 705 }
903 -
904 706 return false;
905 707 }
906 708
907 709 /**
908 710 * @since 4.09
909 - *
910 711 * @return string
911 712 */
912 713 protected static function get_license_type() {
913 714 $license_type = '';
914 715 $addons = self::get_api_addons();
915 -
916 716 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
917 - return $addons['error']['type'];
717 + $license_type = $addons['error']['type'];
918 718 }
919 -
920 719 return $license_type;
921 720 }
922 721
923 722 /**
@@ -930,12 +729,11 @@
930 729 */
931 730 public static function get_addon_for_license( $addons, $license ) {
932 731 $download_id = $license->download_id;
933 732 $plugin = array();
934 -
935 - if ( ! $download_id && $addons ) {
733 + if ( empty( $download_id ) && ! empty( $addons ) ) {
936 734 foreach ( $addons as $addon ) {
937 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
735 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
938 736 return $addon;
939 737 }
940 738 }
941 739 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -945,33 +743,29 @@
945 743 return $plugin;
946 744 }
947 745
948 746 /**
949 - * @param array $addons
950 - *
951 747 * @return void
952 748 */
953 749 protected static function prepare_addons( &$addons ) {
954 - // Reset categories to prevent count accumulation across multiple calls.
955 - self::$categories = array();
956 -
957 750 $activate_url = '';
958 -
959 751 if ( current_user_can( 'activate_plugins' ) ) {
960 752 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
961 753 }
962 754
963 755 $loop_addons = $addons;
964 -
965 756 foreach ( $loop_addons as $id => $addon ) {
966 757 if ( is_numeric( $id ) ) {
967 758 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
968 759 $file_name = $addon['plugin'];
969 760 } else {
970 - $slug = $id;
971 - $base_file = $addon['file'] ?? 'formidable-' . $slug;
761 + $slug = $id;
762 + if ( isset( $addon['file'] ) ) {
763 + $base_file = $addon['file'];
764 + } else {
765 + $base_file = 'formidable-' . $slug;
766 + }
972 767 $file_name = $base_file . '/' . $base_file . '.php';
973 -
974 768 if ( ! isset( $addon['plugin'] ) ) {
975 769 $addon['plugin'] = $file_name;
976 770 }
977 771 }
@@ -976,17 +770,10 @@
976 770 }
977 771 }
978 772
979 773 $addon['installed'] = self::is_installed( $file_name );
980 -
981 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
982 - unset( $addons[ $id ] );
983 - continue;
984 - }
985 -
986 774 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
987 775 $active_views_version = self::get_active_views_version();
988 -
989 776 if ( false !== $active_views_version && $slug !== $active_views_version ) {
990 777 $addon['installed'] = false;
991 778 }
992 779 }
@@ -992,9 +779,9 @@
992 779 }
993 780
994 781 $addon['activate_url'] = '';
995 782
996 - if ( $addon['installed'] && $activate_url && ! self::is_plugin_active( $file_name, $slug ) ) {
783 + if ( $addon['installed'] && ! empty( $activate_url ) && ! self::is_plugin_active( $file_name, $slug ) ) {
997 784 $addon['activate_url'] = add_query_arg(
998 785 array(
999 786 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
1000 787 'plugin' => $file_name,
@@ -1020,11 +807,8 @@
1020 807 }//end foreach
1021 808 }
1022 809
1023 810 /**
1024 - * @param string $file_name
1025 - * @param string $slug
1026 - *
1027 811 * @return bool
1028 812 */
1029 813 private static function is_plugin_active( $file_name, $slug ) {
1030 814 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -1039,9 +823,8 @@
1039 823 private static function get_active_views_version() {
1040 824 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
1041 825 return false;
1042 826 }
1043 -
1044 827 $plugin_version = FrmViewsAppHelper::plugin_version();
1045 828 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
1046 829 }
1047 830
@@ -1047,25 +830,22 @@
1047 830
1048 831 /**
1049 832 * @since 3.04.02
1050 833 *
1051 - * @param string $link
1052 - *
1053 834 * @return void
1054 835 */
1055 836 protected static function prepare_addon_link( &$link ) {
1056 837 $site_url = 'https://formidableforms.com/';
1057 -
1058 - if ( ! str_starts_with( $link, 'http' ) ) {
838 + if ( strpos( $link, 'http' ) !== 0 ) {
1059 839 $link = $site_url . $link;
1060 840 }
1061 -
1062 - $link = FrmAppHelper::make_affiliate_url( $link );
1063 -
1064 - $utm = array(
1065 - 'campaign' => 'addons',
841 + $link = FrmAppHelper::make_affiliate_url( $link );
842 + $query_args = array(
843 + 'utm_source' => 'WordPress',
844 + 'utm_medium' => 'addons',
845 + 'utm_campaign' => 'liteplugin',
1066 846 );
1067 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
847 + $link = add_query_arg( $query_args, $link );
1068 848 }
1069 849
1070 850 /**
1071 851 * Add the status to the addon array. Status options are:
@@ -1072,10 +852,8 @@
1072 852 * installed, active, not installed
1073 853 *
1074 854 * @since 3.04.02
1075 855 *
1076 - * @param array $addon
1077 - *
1078 856 * @return void
1079 857 */
1080 858 protected static function set_addon_status( &$addon ) {
1081 859 if ( ! empty( $addon['activate_url'] ) ) {
@@ -1102,9 +880,8 @@
1102 880 * @param string $plugin
1103 881 * @param string $redirect
1104 882 * @param bool $network_wide
1105 883 * @param bool $silent
1106 - *
1107 884 * @return WP_Error|null Null on success, WP_Error on invalid file.
1108 885 */
1109 886 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
1110 887 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1119,9 +896,8 @@
1119 896 * @since 6.8
1120 897 *
1121 898 * @param string $plugin
1122 899 * @param bool $silent
1123 - *
1124 900 * @return void
1125 901 */
1126 902 protected static function deactivate_plugin( $plugin, $silent = false ) {
1127 903 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1135,9 +911,8 @@
1135 911 *
1136 912 * @since 6.8
1137 913 *
1138 914 * @param string $plugin
1139 - *
1140 915 * @return true|WP_Error True on success, WP_Error on invalid file.
1141 916 */
1142 917 protected static function uninstall_plugin( $plugin ) {
1143 918 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1150,9 +925,13 @@
1150 925
1151 926 self::deactivate_plugin( $plugin, true );
1152 927 $result = delete_plugins( array( $plugin ) );
1153 928
1154 - return is_wp_error( $result ) ? $result : true;
929 + if ( is_wp_error( $result ) ) {
930 + return $result;
931 + }
932 +
933 + return true;
1155 934 }
1156 935
1157 936 /**
1158 937 * @since 5.0.10
@@ -1159,9 +938,9 @@
1159 938 *
1160 939 * @return string
1161 940 */
1162 941 protected static function get_current_plugin() {
1163 - if ( ! self::$plugin ) {
942 + if ( empty( self::$plugin ) ) {
1164 943 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1165 944 }
1166 945 return self::$plugin;
1167 946 }
@@ -1168,9 +947,9 @@
1168 947
1169 948 /**
1170 949 * @since 4.08
1171 950 *
1172 - * @return mixed[]|null
951 + * @return array|void
1173 952 */
1174 953 protected static function download_and_activate() {
1175 954 if ( is_admin() ) {
1176 955 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1178,14 +957,12 @@
1178 957
1179 958 self::maybe_show_cred_form();
1180 959
1181 960 $installed = self::install_addon();
1182 -
1183 961 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1184 962 return $installed;
1185 963 }
1186 964 self::handle_addon_action( $installed, 'activate' );
1187 - return null;
1188 965 }
1189 966
1190 967 /**
1191 968 * @since 3.04.02
@@ -1196,9 +973,9 @@
1196 973 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1197 974 include_once ABSPATH . 'wp-admin/includes/file.php';
1198 975 }
1199 976
1200 - // Start output buffering to catch the filesystem form if credentials are needed.
977 + // Start output bufferring to catch the filesystem form if credentials are needed.
1201 978 ob_start();
1202 979
1203 980 $show_form = false;
1204 981 $method = '';
@@ -1215,8 +992,9 @@
1215 992
1216 993 if ( $show_form ) {
1217 994 $form = ob_get_clean();
1218 995 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
996 + $data = $form;
1219 997 $response = array(
1220 998 'success' => false,
1221 999 'message' => $message,
1222 1000 'form' => $form,
@@ -1244,10 +1022,8 @@
1244 1022 * We do not need any extra credentials if we have gotten this far,
1245 1023 * so let's install the plugin.
1246 1024 *
1247 1025 * @since 3.04.02
1248 - *
1249 - * @return array|string
1250 1026 */
1251 1027 protected static function install_addon() {
1252 1028 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1253 1029
@@ -1261,15 +1037,14 @@
1261 1037 }
1262 1038
1263 1039 // Create the plugin upgrader with our custom skin.
1264 1040 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1265 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1041 + $installer->install( $download_url );
1266 1042
1267 1043 // Flush the cache and return the newly installed plugin basename.
1268 1044 wp_cache_flush();
1269 1045
1270 1046 $plugin = $installer->plugin_info();
1271 -
1272 1047 if ( ! $plugin ) {
1273 1048 return array(
1274 1049 'message' => 'Plugin was not installed. ' . $installer->result,
1275 1050 'success' => false,
@@ -1274,9 +1049,8 @@
1274 1049 'message' => 'Plugin was not installed. ' . $installer->result,
1275 1050 'success' => false,
1276 1051 );
1277 1052 }
1278 -
1279 1053 return $plugin;
1280 1054 }
1281 1055
1282 1056 /**
@@ -1340,9 +1114,8 @@
1340 1114 * @since 6.8
1341 1115 *
1342 1116 * @param callable $action_callback The specific add-on action to be executed.
1343 1117 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1344 - *
1345 1118 * @return void
1346 1119 */
1347 1120 private static function process_addon_action( $action_callback, $response_callback = null ) {
1348 1121 self::install_addon_permissions();
@@ -1365,14 +1138,13 @@
1365 1138 * @since 6.8
1366 1139 *
1367 1140 * @param string $installed The plugin folder name with file name.
1368 1141 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1369 - *
1370 - * @return mixed[]|null
1142 + * @return array|void
1371 1143 */
1372 1144 protected static function handle_addon_action( $installed, $action ) {
1373 1145 if ( ! $installed || ! $action ) {
1374 - return null;
1146 + return;
1375 1147 }
1376 1148
1377 1149 $result = null;
1378 1150 switch ( $action ) {
@@ -1392,9 +1164,8 @@
1392 1164 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1393 1165 if ( wp_doing_ajax() ) {
1394 1166 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1395 1167 }
1396 -
1397 1168 return array(
1398 1169 'message' => $result->get_error_message(),
1399 1170 'success' => false,
1400 1171 );
@@ -1408,14 +1179,17 @@
1408 1179 * @return array
1409 1180 */
1410 1181 private static function get_addon_activation_response() {
1411 1182 $activating_page = self::get_activating_page();
1412 - $message = $activating_page ? __( 'Your plugin has been activated. Would you like to save and reload the page now?', 'formidable' ) : __( 'Your plugin has been activated.', 'formidable' ); // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
1413 1183
1414 - return array(
1184 + $message = $activating_page ? __( 'Your plugin has been activated. Would you like to save and reload the page now?', 'formidable' ) : __( 'Your plugin has been activated.', 'formidable' );
1185 +
1186 + $response = array(
1415 1187 'message' => $message,
1416 1188 'saveAndReload' => $activating_page,
1417 1189 );
1190 +
1191 + return $response;
1418 1192 }
1419 1193
1420 1194 /**
1421 1195 * Return a string that reflects the page from which the addon is being activated on,
@@ -1424,14 +1198,17 @@
1424 1198 * @return string
1425 1199 */
1426 1200 private static function get_activating_page() {
1427 1201 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1202 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1203 + return 'settings';
1204 + }
1428 1205
1429 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1430 - return 'settings';
1206 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1207 + return 'form_builder';
1431 1208 }
1432 1209
1433 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1210 + return '';
1434 1211 }
1435 1212
1436 1213 /**
1437 1214 * Run security checks before installing
@@ -1442,14 +1219,12 @@
1442 1219 */
1443 1220 protected static function install_addon_permissions() {
1444 1221 check_ajax_referer( 'frm_ajax', 'nonce' );
1445 1222
1446 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1447 - return;
1223 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1224 + echo json_encode( true );
1225 + wp_die();
1448 1226 }
1449 -
1450 - echo json_encode( true );
1451 - wp_die();
1452 1227 }
1453 1228
1454 1229 /**
1455 1230 * @since 4.08
@@ -1457,14 +1232,12 @@
1457 1232 * @return string
1458 1233 */
1459 1234 public static function connect_link() {
1460 1235 $auth = get_option( 'frm_connect_token' );
1461 -
1462 - if ( ! $auth ) {
1236 + if ( empty( $auth ) ) {
1463 1237 $auth = hash( 'sha512', wp_rand() );
1464 - update_option( 'frm_connect_token', $auth, false );
1238 + update_option( 'frm_connect_token', $auth, 'no' );
1465 1239 }
1466 -
1467 1240 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1468 1241 $link = 'https://formidableforms.com/api-connect/';
1469 1242 $args = array(
1470 1243 'v' => 2,
@@ -1492,10 +1265,9 @@
1492 1265 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1493 1266
1494 1267 // The download link is not required if already installed.
1495 1268 $is_installed = FrmAppHelper::pro_is_included();
1496 - $file_missing = ! $is_installed && ! $post_url;
1497 -
1269 + $file_missing = ! $is_installed && empty( $post_url );
1498 1270 if ( ! $post_auth || $file_missing ) {
1499 1271 return false;
1500 1272 }
1501 1273
@@ -1500,9 +1272,13 @@
1500 1272 }
1501 1273
1502 1274 // Verify auth.
1503 1275 $auth = get_option( 'frm_connect_token' );
1504 - return $auth && hash_equals( $auth, $post_auth );
1276 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1277 + return false;
1278 + }
1279 +
1280 + return true;
1505 1281 }
1506 1282
1507 1283 /**
1508 1284 * Install and/or activate the add-on file.
@@ -1513,17 +1289,17 @@
1513 1289 */
1514 1290 public static function install_addon_api() {
1515 1291 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1516 1292
1293 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1294 +
1517 1295 // Delete so cannot replay.
1518 1296 delete_option( 'frm_connect_token' );
1519 1297
1520 1298 // It's already installed and active.
1521 1299 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1522 -
1523 1300 if ( is_wp_error( $active ) ) {
1524 1301 $response = self::maybe_download_and_activate();
1525 -
1526 1302 if ( is_array( $response ) ) {
1527 1303 // The download failed.
1528 1304 return $response;
1529 1305 }
@@ -1529,12 +1305,11 @@
1529 1305 }
1530 1306 }
1531 1307
1532 1308 // If empty license, save it now.
1533 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1309 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1534 1310 load_formidable_pro();
1535 1311 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1536 -
1537 1312 if ( ! $license ) {
1538 1313 return array(
1539 1314 'success' => false,
1540 1315 'error' => 'That site does not have a valid license key.',
@@ -1541,9 +1316,8 @@
1541 1316 );
1542 1317 }
1543 1318
1544 1319 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1545 -
1546 1320 if ( ! $response['success'] ) {
1547 1321 // Could not activate license.
1548 1322 return $response;
1549 1323 }
@@ -1568,9 +1342,8 @@
1568 1342 }
1569 1343
1570 1344 // Download plugin now.
1571 1345 $response = self::download_and_activate();
1572 -
1573 1346 if ( is_array( $response ) && isset( $response['success'] ) ) {
1574 1347 // The download failed.
1575 1348 return $response;
1576 1349 }
@@ -1584,9 +1357,8 @@
1584 1357 * @since 4.09
1585 1358 *
1586 1359 * @param string $plugin
1587 1360 * @param array|string $upgrade_link_args
1588 - *
1589 1361 * @return void
1590 1362 */
1591 1363 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1592 1364 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1621,9 +1393,8 @@
1621 1393 * @type false|string $license_type
1622 1394 * @type string $plan_required
1623 1395 * @type string $upgrade_link
1624 1396 * }
1625 - *
1626 1397 * @return void
1627 1398 */
1628 1399 public static function show_conditional_action_button( $atts ) {
1629 1400 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1656,19 +1427,16 @@
1656 1427 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1657 1428 }
1658 1429
1659 1430 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1660 -
1661 - if ( ! str_contains( $class, 'frm-button' ) ) {
1431 + if ( strpos( $class, 'frm-button' ) === false ) {
1662 1432 $class .= ' frm-button-secondary frm-button-sm';
1663 1433 }
1664 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1665 1434 ?>
1666 - <a class="install-now button <?php echo esc_attr( $class ); ?>" href="<?php echo esc_url( $upgrade_link ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>"><?php // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong ?>
1435 + <a class="install-now button <?php echo esc_attr( $class ); ?>" href="<?php echo esc_url( $upgrade_link ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>">
1667 1436 <?php echo esc_html( $text ); ?>
1668 1437 </a>
1669 1438 <?php
1670 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1671 1439 }
1672 1440
1673 1441 /**
1674 1442 * @since 3.04.02
@@ -1678,9 +1446,8 @@
1678 1446 public static function ajax_install_addon() {
1679 1447 self::install_addon_permissions();
1680 1448
1681 1449 $result = self::download_and_activate();
1682 -
1683 1450 if ( isset( $result['success'] ) && ! $result['success'] ) {
1684 1451 echo json_encode( $result );
1685 1452 wp_die();
1686 1453 }
@@ -1713,8 +1480,9 @@
1713 1480 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1714 1481
1715 1482 if ( ! is_array( $allowed_url_list ) ) {
1716 1483 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1484 +
1717 1485 return array();
1718 1486 }
1719 1487
1720 1488 return $allowed_url_list;
@@ -1724,10 +1492,8 @@
1724 1492 * Gets required plan for an addon.
1725 1493 *
1726 1494 * @since 6.4.2
1727 1495 *
1728 - * @param int|string $addon_id
1729 - *
1730 1496 * @return string Empty string if no plan is required for active license.
1731 1497 */
1732 1498 public static function get_addon_required_plan( $addon_id ) {
1733 1499 $api = new FrmFormApi();
@@ -1738,9 +1504,9 @@
1738 1504 $requires = FrmFormsHelper::get_plan_required( $dates );
1739 1505 }
1740 1506
1741 1507 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1742 - return '';
1508 + $requires = '';
1743 1509 }
1744 1510
1745 1511 return $requires;
1746 1512 }