PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.16.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.16.1
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 +127 -367 6.356.16.1 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.
@@ -100,26 +96,20 @@
100 96 return;
101 97 }
102 98
103 99 $label = __( 'Add-Ons', 'formidable' );
104 - $label = '<span style="color:#3FCA89">' . esc_html( $label ) . '</span>';
100 + $label = '<span style="color:#3FCA89">' . $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 - $cta_text = FrmSalesApi::get_best_sale_value( 'menu_cta_text' );
113 -
114 - if ( ! $cta_text ) {
115 - $cta_text = __( 'Upgrade', 'formidable' );
116 - }
117 -
118 108 add_submenu_page(
119 109 'formidable',
120 110 'Formidable | ' . __( 'Upgrade', 'formidable' ),
121 - '<span class="frm-upgrade-submenu">' . esc_html( $cta_text ) . '</span>',
111 + '<span class="frm-upgrade-submenu">' . __( 'Upgrade', 'formidable' ) . '</span>',
122 112 'frm_view_forms',
123 113 'formidable-pro-upgrade',
124 114 function () {
125 115 // This function doesn't need to do anything.
@@ -128,9 +118,9 @@
128 118 );
129 119 } elseif ( 'formidable-pro-upgrade' === FrmAppHelper::get_param( 'page' ) ) {
130 120 wp_safe_redirect( admin_url( 'admin.php?page=formidable' ) );
131 121 exit;
132 - }//end if
122 + }
133 123 }
134 124
135 125 /**
136 126 * @return void
@@ -147,9 +137,9 @@
147 137
148 138 if ( isset( $addons['error'] ) ) {
149 139 $api = new FrmFormApi();
150 140 $errors = $api->get_error_from_response( $addons );
151 - $license_type = $addons['error']['type'] ?? '';
141 + $license_type = isset( $addons['error']['type'] ) ? $addons['error']['type'] : '';
152 142 unset( $addons['error'] );
153 143 }
154 144
155 145 $pro = array(
@@ -156,10 +146,9 @@
156 146 'pro' => array(
157 147 'title' => 'Formidable Forms Pro',
158 148 'slug' => 'formidable-pro',
159 149 'released' => '2011-02-05',
160 - 'docs' => 'knowledgebase/what-is-the-difference-between-the-lite-free-and-pro-version/',
161 - 'docs_label' => __( 'Why Upgrade', 'formidable' ),
150 + 'docs' => 'knowledgebase/',
162 151 'categories' => array( 'basic', 'plus', 'business', 'elite' ),
163 152 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
164 153 ),
165 154 );
@@ -194,18 +183,15 @@
194 183 );
195 184
196 185 // Extract the elements to move
197 186 foreach ( $plans as $plan ) {
198 - if ( ! isset( self::$categories[ $plan ] ) ) {
199 - continue;
187 + if ( isset( self::$categories[ $plan ] ) ) {
188 + $bottom_categories[ $plan ] = self::$categories[ $plan ];
189 + unset( self::$categories[ $plan ] );
200 190 }
201 -
202 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
203 - unset( self::$categories[ $plan ] );
204 191 }
205 192
206 193 $special_categories = array();
207 -
208 194 if ( 'elite' !== self::license_type() ) {
209 195 $special_categories['available-addons'] = array(
210 196 'name' => __( 'Available', 'formidable' ),
211 197 // To be assigned via JavaScript.
@@ -237,9 +223,8 @@
237 223 *
238 224 * @since 6.15
239 225 *
240 226 * @param array $addon The addon array that will be modified by reference.
241 - *
242 227 * @return void
243 228 */
244 229 protected static function set_categories( &$addon ) {
245 230 if ( ! isset( $addon['categories'] ) ) {
@@ -270,11 +255,11 @@
270 255 * @return void
271 256 */
272 257 public static function license_settings() {
273 258 $plugins = apply_filters( 'frm_installed_addons', array() );
259 + if ( empty( $plugins ) ) {
260 + esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
274 261
275 - if ( ! $plugins ) {
276 - esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
277 262 return;
278 263 }
279 264
280 265 ksort( $plugins );
@@ -288,15 +273,15 @@
288 273 protected static function get_api_addons() {
289 274 $api = new FrmFormApi();
290 275 $addons = $api->get_api_info();
291 276
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 ] );
277 + if ( empty( $addons ) ) {
278 + $addons = self::fallback_plugin_list();
279 + } else {
280 + foreach ( $addons as $k => $addon ) {
281 + if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
282 + unset( $addons[ $k ] );
283 + }
299 284 }
300 285 }
301 286
302 287 return $addons;
@@ -309,9 +294,11 @@
309 294 *
310 295 * @return int Count of addons.
311 296 */
312 297 public static function get_addons_count() {
313 - return count( self::get_api_addons() );
298 + $addons = self::get_api_addons();
299 +
300 + return count( $addons );
314 301 }
315 302
316 303 /**
317 304 * If the API is unable to connect, show something on the addons page
@@ -316,9 +303,8 @@
316 303 /**
317 304 * If the API is unable to connect, show something on the addons page
318 305 *
319 306 * @since 3.04.03
320 - *
321 307 * @return array
322 308 */
323 309 protected static function fallback_plugin_list() {
324 310 $list = array(
@@ -329,19 +315,19 @@
329 315 '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 316 ),
331 317 'mailchimp' => array(
332 318 '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
319 + '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 320 ),
335 321 'registration' => array(
336 322 'title' => 'User Registration Forms',
337 323 '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
324 + '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 325 ),
340 326 'paypal' => array(
341 327 'title' => 'PayPal Standard Forms',
342 328 '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
329 + '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 330 ),
345 331 'stripe' => array(
346 332 'title' => 'Stripe Forms',
347 333 'docs' => 'knowledgebase/stripe/',
@@ -373,9 +359,9 @@
373 359 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
374 360 ),
375 361 'zapier' => array(
376 362 '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
363 + '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 364 ),
379 365 'signature' => array(
380 366 'title' => 'Digital Signature Forms',
381 367 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -408,9 +394,8 @@
408 394 foreach ( $list as $k => $info ) {
409 395 $info['slug'] = $k;
410 396 $list[ $k ] = array_merge( $defaults, $info );
411 397 }
412 -
413 398 return $list;
414 399 }
415 400
416 401 /**
@@ -416,28 +401,25 @@
416 401 /**
417 402 * If Pro is missing but has been authenticated, include a download URL
418 403 *
419 404 * @since 3.04.03
420 - *
421 405 * @return string
422 406 */
423 407 public static function get_pro_download_url() {
424 - $api = new FrmFormApi( self::get_pro_license() );
408 + $license = self::get_pro_license();
409 + $api = new FrmFormApi( $license );
425 410 $downloads = $api->get_api_info();
426 411 $pro = self::get_pro_from_addons( $downloads );
427 412
428 - return $pro['url'] ?? '';
413 + return isset( $pro['url'] ) ? $pro['url'] : '';
429 414 }
430 415
431 416 /**
432 417 * @since 4.08
433 - *
434 - * @return string
435 418 */
436 419 public static function get_pro_license() {
437 420 $pro_cred_store = 'frmpro-credentials';
438 421 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
439 -
440 422 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
441 423 $creds = get_site_option( $pro_cred_store );
442 424 } else {
443 425 $creds = get_option( $pro_cred_store );
@@ -447,18 +429,16 @@
447 429 return '';
448 430 }
449 431
450 432 $license = $creds['license'];
451 -
452 - if ( ! $license ) {
433 + if ( empty( $license ) ) {
453 434 return '';
454 435 }
455 436
456 - if ( str_contains( $license, '-' ) ) {
457 - // This is a fix for licenses saved in the past
458 - return strtoupper( $license );
437 + if ( strpos( $license, '-' ) ) {
438 + // this is a fix for licenses saved in the past
439 + $license = strtoupper( $license );
459 440 }
460 -
461 441 return $license;
462 442 }
463 443
464 444 /**
@@ -464,26 +444,20 @@
464 444 /**
465 445 * @since 4.08
466 446 *
467 447 * @param array $addons
468 - *
469 448 * @return array
470 449 */
471 450 protected static function get_pro_from_addons( $addons ) {
472 - return $addons['93790'] ?? array();
451 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
473 452 }
474 453
475 454 /**
476 455 * @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 456 */
483 - public static function license_type( $force_type = false ) {
457 + public static function license_type() {
484 458 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
485 - return FrmProAddonsController::license_type( $force_type );
459 + return FrmProAddonsController::license_type();
486 460 }
487 461
488 462 return 'free';
489 463 }
@@ -488,122 +462,8 @@
488 462 return 'free';
489 463 }
490 464
491 465 /**
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 466 * @since 4.0.01
607 467 *
608 468 * @return bool
609 469 */
@@ -608,21 +468,18 @@
608 468 * @return bool
609 469 */
610 470 public static function is_license_expired() {
611 471 $version_info = self::get_primary_license_info();
612 -
613 472 if ( ! isset( $version_info['error'] ) ) {
614 473 return false;
615 474 }
616 475
617 - $expires = $version_info['error']['expires'] ?? 0;
618 -
619 - if ( ! $expires || $expires > time() ) {
476 + $expires = isset( $version_info['error']['expires'] ) ? $version_info['error']['expires'] : 0;
477 + if ( empty( $expires ) || $expires > time() ) {
620 478 return false;
621 479 }
622 480
623 481 $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
624 -
625 482 if ( $rate_limited ) {
626 483 // Do not return false positives for rate limited responses.
627 484 return false;
628 485 }
@@ -637,13 +494,11 @@
637 494 * @return array|false
638 495 */
639 496 public static function get_primary_license_info() {
640 497 $installed_addons = apply_filters( 'frm_installed_addons', array() );
641 -
642 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
498 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
643 499 return false;
644 500 }
645 -
646 501 $installed_addons = array(
647 502 'formidable_pro' => $installed_addons['formidable_pro'],
648 503 );
649 504
@@ -651,12 +506,8 @@
651 506 }
652 507
653 508 /**
654 509 * @since 3.04.03
655 - *
656 - * @param mixed $transient
657 - *
658 - * @return object
659 510 */
660 511 public static function check_update( $transient ) {
661 512 if ( ! FrmAppHelper::pro_is_installed() ) {
662 513 // Don't make any changes if only Lite is installed.
@@ -667,10 +518,9 @@
667 518 $transient = new stdClass();
668 519 }
669 520
670 521 $installed_addons = apply_filters( 'frm_installed_addons', array() );
671 -
672 - if ( ! $installed_addons ) {
522 + if ( empty( $installed_addons ) ) {
673 523 return $transient;
674 524 }
675 525
676 526 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -684,20 +534,19 @@
684 534 continue;
685 535 }
686 536
687 537 $folder = $plugin->plugin;
688 -
689 - if ( ! $folder ) {
538 + if ( empty( $folder ) ) {
690 539 continue;
691 540 }
692 541
693 542 if ( ! self::is_installed( $folder ) ) {
694 - // Don't show an update if the plugin isn't installed
543 + // don't show an update if the plugin isn't installed
695 544 continue;
696 545 }
697 546
698 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
699 - $wp_version = $wp_plugin['Version'] ?? '1.0';
547 + $wp_plugin = isset( $wp_plugins[ $folder ] ) ? $wp_plugins[ $folder ] : array();
548 + $wp_version = isset( $wp_plugin['Version'] ) ? $wp_plugin['Version'] : '1.0';
700 549 $plugin->slug = explode( '/', $folder )[0];
701 550
702 551 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
703 552 $transient->response[ $folder ] = $plugin;
@@ -705,8 +554,9 @@
705 554 $transient->no_update[ $folder ] = $plugin;
706 555 }
707 556
708 557 $transient->checked[ $folder ] = $wp_version;
558 +
709 559 }//end foreach
710 560
711 561 return $transient;
712 562 }
@@ -716,9 +566,8 @@
716 566 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
717 567 * 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 568 *
719 569 * @since 5.5.2
720 - *
721 570 * @return array
722 571 */
723 572 protected static function get_plugins() {
724 573 if ( ! function_exists( 'get_plugins' ) ) {
@@ -753,49 +602,43 @@
753 602 $version_info = array();
754 603
755 604 foreach ( $installed_addons as $addon ) {
756 605 if ( $addon->store_url !== 'https://formidableforms.com' ) {
757 - // Check if this is a third-party addon
606 + // check if this is a third-party addon
758 607 continue;
759 608 }
760 609
761 610 $new_license = $addon->license;
762 -
763 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
611 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
764 612 continue;
765 613 }
766 614
767 615 $checked_licenses[] = $new_license;
768 - $api = new FrmFormApi( $new_license );
769 616
770 - if ( ! $version_info ) {
617 + $api = new FrmFormApi( $new_license );
618 + if ( empty( $version_info ) ) {
771 619 $version_info = $api->get_api_info();
772 620 continue;
773 621 }
774 622
775 623 $plugin = $api->get_addon_for_license( $addon, $version_info );
776 -
777 - if ( ! $plugin ) {
624 + if ( empty( $plugin ) ) {
778 625 continue;
779 626 }
780 627
781 - $download_id = $plugin['id'] ?? 0;
628 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
629 + if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
630 + // if this addon is using its own license, get the update url
631 + $addon_info = $api->get_api_info();
782 632
783 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
784 - continue;
633 + $version_info[ $download_id ] = $addon_info[ $download_id ];
634 + if ( isset( $addon_info['error'] ) ) {
635 + $version_info[ $download_id ]['error'] = array(
636 + 'message' => $addon_info['error']['message'],
637 + 'code' => $addon_info['error']['code'],
638 + );
639 + }
785 640 }
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 641 }//end foreach
799 642
800 643 return $version_info;
801 644 }
@@ -803,11 +646,9 @@
803 646 /**
804 647 * Get the action link for an addon that isn't active.
805 648 *
806 649 * @since 3.06.03
807 - *
808 650 * @param string $plugin The plugin slug.
809 - *
810 651 * @return array
811 652 */
812 653 public static function install_link( $plugin ) {
813 654 $link = array();
@@ -829,9 +670,9 @@
829 670 'categories' => $addon['categories'],
830 671 );
831 672 }
832 673
833 - if ( $link ) {
674 + if ( ! empty( $link ) ) {
834 675 $link['status'] = $addon['status']['type'];
835 676 }
836 677 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
837 678 $link = array(
@@ -843,81 +684,34 @@
843 684 return $link;
844 685 }
845 686
846 687 /**
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 688 * @since 4.09
887 - *
888 689 * @param string $plugin The plugin slug.
889 - *
890 690 * @return array|false
891 691 */
892 692 public static function get_addon( $plugin ) {
893 693 $addons = self::get_api_addons();
894 694 self::prepare_addons( $addons );
895 -
896 695 foreach ( $addons as $addon ) {
897 696 $slug = explode( '/', $addon['plugin'] );
898 -
899 697 if ( $slug[0] === 'formidable-' . $plugin ) {
900 698 return $addon;
901 699 }
902 700 }
903 -
904 701 return false;
905 702 }
906 703
907 704 /**
908 705 * @since 4.09
909 - *
910 706 * @return string
911 707 */
912 708 protected static function get_license_type() {
913 709 $license_type = '';
914 710 $addons = self::get_api_addons();
915 -
916 711 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
917 - return $addons['error']['type'];
712 + $license_type = $addons['error']['type'];
918 713 }
919 -
920 714 return $license_type;
921 715 }
922 716
923 717 /**
@@ -930,12 +724,11 @@
930 724 */
931 725 public static function get_addon_for_license( $addons, $license ) {
932 726 $download_id = $license->download_id;
933 727 $plugin = array();
934 -
935 - if ( ! $download_id && $addons ) {
728 + if ( empty( $download_id ) && ! empty( $addons ) ) {
936 729 foreach ( $addons as $addon ) {
937 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
730 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
938 731 return $addon;
939 732 }
940 733 }
941 734 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -945,33 +738,29 @@
945 738 return $plugin;
946 739 }
947 740
948 741 /**
949 - * @param array $addons
950 - *
951 742 * @return void
952 743 */
953 744 protected static function prepare_addons( &$addons ) {
954 - // Reset categories to prevent count accumulation across multiple calls.
955 - self::$categories = array();
956 -
957 745 $activate_url = '';
958 -
959 746 if ( current_user_can( 'activate_plugins' ) ) {
960 747 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
961 748 }
962 749
963 750 $loop_addons = $addons;
964 -
965 751 foreach ( $loop_addons as $id => $addon ) {
966 752 if ( is_numeric( $id ) ) {
967 753 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
968 754 $file_name = $addon['plugin'];
969 755 } else {
970 - $slug = $id;
971 - $base_file = $addon['file'] ?? 'formidable-' . $slug;
756 + $slug = $id;
757 + if ( isset( $addon['file'] ) ) {
758 + $base_file = $addon['file'];
759 + } else {
760 + $base_file = 'formidable-' . $slug;
761 + }
972 762 $file_name = $base_file . '/' . $base_file . '.php';
973 -
974 763 if ( ! isset( $addon['plugin'] ) ) {
975 764 $addon['plugin'] = $file_name;
976 765 }
977 766 }
@@ -976,17 +765,10 @@
976 765 }
977 766 }
978 767
979 768 $addon['installed'] = self::is_installed( $file_name );
980 -
981 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
982 - unset( $addons[ $id ] );
983 - continue;
984 - }
985 -
986 769 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
987 770 $active_views_version = self::get_active_views_version();
988 -
989 771 if ( false !== $active_views_version && $slug !== $active_views_version ) {
990 772 $addon['installed'] = false;
991 773 }
992 774 }
@@ -992,9 +774,9 @@
992 774 }
993 775
994 776 $addon['activate_url'] = '';
995 777
996 - if ( $addon['installed'] && $activate_url && ! self::is_plugin_active( $file_name, $slug ) ) {
778 + if ( $addon['installed'] && ! empty( $activate_url ) && ! self::is_plugin_active( $file_name, $slug ) ) {
997 779 $addon['activate_url'] = add_query_arg(
998 780 array(
999 781 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
1000 782 'plugin' => $file_name,
@@ -1020,11 +802,8 @@
1020 802 }//end foreach
1021 803 }
1022 804
1023 805 /**
1024 - * @param string $file_name
1025 - * @param string $slug
1026 - *
1027 806 * @return bool
1028 807 */
1029 808 private static function is_plugin_active( $file_name, $slug ) {
1030 809 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -1039,9 +818,8 @@
1039 818 private static function get_active_views_version() {
1040 819 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
1041 820 return false;
1042 821 }
1043 -
1044 822 $plugin_version = FrmViewsAppHelper::plugin_version();
1045 823 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
1046 824 }
1047 825
@@ -1047,25 +825,22 @@
1047 825
1048 826 /**
1049 827 * @since 3.04.02
1050 828 *
1051 - * @param string $link
1052 - *
1053 829 * @return void
1054 830 */
1055 831 protected static function prepare_addon_link( &$link ) {
1056 832 $site_url = 'https://formidableforms.com/';
1057 -
1058 - if ( ! str_starts_with( $link, 'http' ) ) {
833 + if ( strpos( $link, 'http' ) !== 0 ) {
1059 834 $link = $site_url . $link;
1060 835 }
1061 -
1062 - $link = FrmAppHelper::make_affiliate_url( $link );
1063 -
1064 - $utm = array(
1065 - 'campaign' => 'addons',
836 + $link = FrmAppHelper::make_affiliate_url( $link );
837 + $query_args = array(
838 + 'utm_source' => 'WordPress',
839 + 'utm_medium' => 'addons',
840 + 'utm_campaign' => 'liteplugin',
1066 841 );
1067 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
842 + $link = add_query_arg( $query_args, $link );
1068 843 }
1069 844
1070 845 /**
1071 846 * Add the status to the addon array. Status options are:
@@ -1072,10 +847,8 @@
1072 847 * installed, active, not installed
1073 848 *
1074 849 * @since 3.04.02
1075 850 *
1076 - * @param array $addon
1077 - *
1078 851 * @return void
1079 852 */
1080 853 protected static function set_addon_status( &$addon ) {
1081 854 if ( ! empty( $addon['activate_url'] ) ) {
@@ -1102,9 +875,8 @@
1102 875 * @param string $plugin
1103 876 * @param string $redirect
1104 877 * @param bool $network_wide
1105 878 * @param bool $silent
1106 - *
1107 879 * @return WP_Error|null Null on success, WP_Error on invalid file.
1108 880 */
1109 881 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
1110 882 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1119,9 +891,8 @@
1119 891 * @since 6.8
1120 892 *
1121 893 * @param string $plugin
1122 894 * @param bool $silent
1123 - *
1124 895 * @return void
1125 896 */
1126 897 protected static function deactivate_plugin( $plugin, $silent = false ) {
1127 898 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1135,9 +906,8 @@
1135 906 *
1136 907 * @since 6.8
1137 908 *
1138 909 * @param string $plugin
1139 - *
1140 910 * @return true|WP_Error True on success, WP_Error on invalid file.
1141 911 */
1142 912 protected static function uninstall_plugin( $plugin ) {
1143 913 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1150,9 +920,13 @@
1150 920
1151 921 self::deactivate_plugin( $plugin, true );
1152 922 $result = delete_plugins( array( $plugin ) );
1153 923
1154 - return is_wp_error( $result ) ? $result : true;
924 + if ( is_wp_error( $result ) ) {
925 + return $result;
926 + }
927 +
928 + return true;
1155 929 }
1156 930
1157 931 /**
1158 932 * @since 5.0.10
@@ -1159,9 +933,9 @@
1159 933 *
1160 934 * @return string
1161 935 */
1162 936 protected static function get_current_plugin() {
1163 - if ( ! self::$plugin ) {
937 + if ( empty( self::$plugin ) ) {
1164 938 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1165 939 }
1166 940 return self::$plugin;
1167 941 }
@@ -1168,9 +942,9 @@
1168 942
1169 943 /**
1170 944 * @since 4.08
1171 945 *
1172 - * @return mixed[]|null
946 + * @return array|void
1173 947 */
1174 948 protected static function download_and_activate() {
1175 949 if ( is_admin() ) {
1176 950 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1178,14 +952,12 @@
1178 952
1179 953 self::maybe_show_cred_form();
1180 954
1181 955 $installed = self::install_addon();
1182 -
1183 956 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1184 957 return $installed;
1185 958 }
1186 959 self::handle_addon_action( $installed, 'activate' );
1187 - return null;
1188 960 }
1189 961
1190 962 /**
1191 963 * @since 3.04.02
@@ -1196,9 +968,9 @@
1196 968 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1197 969 include_once ABSPATH . 'wp-admin/includes/file.php';
1198 970 }
1199 971
1200 - // Start output buffering to catch the filesystem form if credentials are needed.
972 + // Start output bufferring to catch the filesystem form if credentials are needed.
1201 973 ob_start();
1202 974
1203 975 $show_form = false;
1204 976 $method = '';
@@ -1215,8 +987,9 @@
1215 987
1216 988 if ( $show_form ) {
1217 989 $form = ob_get_clean();
1218 990 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
991 + $data = $form;
1219 992 $response = array(
1220 993 'success' => false,
1221 994 'message' => $message,
1222 995 'form' => $form,
@@ -1244,10 +1017,8 @@
1244 1017 * We do not need any extra credentials if we have gotten this far,
1245 1018 * so let's install the plugin.
1246 1019 *
1247 1020 * @since 3.04.02
1248 - *
1249 - * @return array|string
1250 1021 */
1251 1022 protected static function install_addon() {
1252 1023 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1253 1024
@@ -1261,15 +1032,14 @@
1261 1032 }
1262 1033
1263 1034 // Create the plugin upgrader with our custom skin.
1264 1035 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1265 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1036 + $installer->install( $download_url );
1266 1037
1267 1038 // Flush the cache and return the newly installed plugin basename.
1268 1039 wp_cache_flush();
1269 1040
1270 1041 $plugin = $installer->plugin_info();
1271 -
1272 1042 if ( ! $plugin ) {
1273 1043 return array(
1274 1044 'message' => 'Plugin was not installed. ' . $installer->result,
1275 1045 'success' => false,
@@ -1274,9 +1044,8 @@
1274 1044 'message' => 'Plugin was not installed. ' . $installer->result,
1275 1045 'success' => false,
1276 1046 );
1277 1047 }
1278 -
1279 1048 return $plugin;
1280 1049 }
1281 1050
1282 1051 /**
@@ -1340,9 +1109,8 @@
1340 1109 * @since 6.8
1341 1110 *
1342 1111 * @param callable $action_callback The specific add-on action to be executed.
1343 1112 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1344 - *
1345 1113 * @return void
1346 1114 */
1347 1115 private static function process_addon_action( $action_callback, $response_callback = null ) {
1348 1116 self::install_addon_permissions();
@@ -1365,14 +1133,13 @@
1365 1133 * @since 6.8
1366 1134 *
1367 1135 * @param string $installed The plugin folder name with file name.
1368 1136 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1369 - *
1370 - * @return mixed[]|null
1137 + * @return array|void
1371 1138 */
1372 1139 protected static function handle_addon_action( $installed, $action ) {
1373 1140 if ( ! $installed || ! $action ) {
1374 - return null;
1141 + return;
1375 1142 }
1376 1143
1377 1144 $result = null;
1378 1145 switch ( $action ) {
@@ -1392,9 +1159,8 @@
1392 1159 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1393 1160 if ( wp_doing_ajax() ) {
1394 1161 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1395 1162 }
1396 -
1397 1163 return array(
1398 1164 'message' => $result->get_error_message(),
1399 1165 'success' => false,
1400 1166 );
@@ -1408,14 +1174,17 @@
1408 1174 * @return array
1409 1175 */
1410 1176 private static function get_addon_activation_response() {
1411 1177 $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 1178
1414 - return array(
1179 + $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' );
1180 +
1181 + $response = array(
1415 1182 'message' => $message,
1416 1183 'saveAndReload' => $activating_page,
1417 1184 );
1185 +
1186 + return $response;
1418 1187 }
1419 1188
1420 1189 /**
1421 1190 * Return a string that reflects the page from which the addon is being activated on,
@@ -1424,14 +1193,17 @@
1424 1193 * @return string
1425 1194 */
1426 1195 private static function get_activating_page() {
1427 1196 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1197 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1198 + return 'settings';
1199 + }
1428 1200
1429 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1430 - return 'settings';
1201 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1202 + return 'form_builder';
1431 1203 }
1432 1204
1433 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1205 + return '';
1434 1206 }
1435 1207
1436 1208 /**
1437 1209 * Run security checks before installing
@@ -1442,14 +1214,12 @@
1442 1214 */
1443 1215 protected static function install_addon_permissions() {
1444 1216 check_ajax_referer( 'frm_ajax', 'nonce' );
1445 1217
1446 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1447 - return;
1218 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1219 + echo json_encode( true );
1220 + wp_die();
1448 1221 }
1449 -
1450 - echo json_encode( true );
1451 - wp_die();
1452 1222 }
1453 1223
1454 1224 /**
1455 1225 * @since 4.08
@@ -1457,14 +1227,12 @@
1457 1227 * @return string
1458 1228 */
1459 1229 public static function connect_link() {
1460 1230 $auth = get_option( 'frm_connect_token' );
1461 -
1462 - if ( ! $auth ) {
1231 + if ( empty( $auth ) ) {
1463 1232 $auth = hash( 'sha512', wp_rand() );
1464 - update_option( 'frm_connect_token', $auth, false );
1233 + update_option( 'frm_connect_token', $auth, 'no' );
1465 1234 }
1466 -
1467 1235 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1468 1236 $link = 'https://formidableforms.com/api-connect/';
1469 1237 $args = array(
1470 1238 'v' => 2,
@@ -1492,10 +1260,9 @@
1492 1260 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1493 1261
1494 1262 // The download link is not required if already installed.
1495 1263 $is_installed = FrmAppHelper::pro_is_included();
1496 - $file_missing = ! $is_installed && ! $post_url;
1497 -
1264 + $file_missing = ! $is_installed && empty( $post_url );
1498 1265 if ( ! $post_auth || $file_missing ) {
1499 1266 return false;
1500 1267 }
1501 1268
@@ -1500,9 +1267,13 @@
1500 1267 }
1501 1268
1502 1269 // Verify auth.
1503 1270 $auth = get_option( 'frm_connect_token' );
1504 - return $auth && hash_equals( $auth, $post_auth );
1271 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1272 + return false;
1273 + }
1274 +
1275 + return true;
1505 1276 }
1506 1277
1507 1278 /**
1508 1279 * Install and/or activate the add-on file.
@@ -1513,17 +1284,17 @@
1513 1284 */
1514 1285 public static function install_addon_api() {
1515 1286 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1516 1287
1288 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1289 +
1517 1290 // Delete so cannot replay.
1518 1291 delete_option( 'frm_connect_token' );
1519 1292
1520 1293 // It's already installed and active.
1521 1294 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1522 -
1523 1295 if ( is_wp_error( $active ) ) {
1524 1296 $response = self::maybe_download_and_activate();
1525 -
1526 1297 if ( is_array( $response ) ) {
1527 1298 // The download failed.
1528 1299 return $response;
1529 1300 }
@@ -1529,12 +1300,11 @@
1529 1300 }
1530 1301 }
1531 1302
1532 1303 // If empty license, save it now.
1533 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1304 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1534 1305 load_formidable_pro();
1535 1306 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1536 -
1537 1307 if ( ! $license ) {
1538 1308 return array(
1539 1309 'success' => false,
1540 1310 'error' => 'That site does not have a valid license key.',
@@ -1541,9 +1311,8 @@
1541 1311 );
1542 1312 }
1543 1313
1544 1314 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1545 -
1546 1315 if ( ! $response['success'] ) {
1547 1316 // Could not activate license.
1548 1317 return $response;
1549 1318 }
@@ -1568,9 +1337,8 @@
1568 1337 }
1569 1338
1570 1339 // Download plugin now.
1571 1340 $response = self::download_and_activate();
1572 -
1573 1341 if ( is_array( $response ) && isset( $response['success'] ) ) {
1574 1342 // The download failed.
1575 1343 return $response;
1576 1344 }
@@ -1584,9 +1352,8 @@
1584 1352 * @since 4.09
1585 1353 *
1586 1354 * @param string $plugin
1587 1355 * @param array|string $upgrade_link_args
1588 - *
1589 1356 * @return void
1590 1357 */
1591 1358 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1592 1359 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1621,9 +1388,8 @@
1621 1388 * @type false|string $license_type
1622 1389 * @type string $plan_required
1623 1390 * @type string $upgrade_link
1624 1391 * }
1625 - *
1626 1392 * @return void
1627 1393 */
1628 1394 public static function show_conditional_action_button( $atts ) {
1629 1395 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1644,9 +1410,8 @@
1644 1410 */
1645 1411 public static function addon_upgrade_link( $addon, $upgrade_link ) {
1646 1412 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1647 1413 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1648 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1649 1414
1650 1415 if ( $addon ) {
1651 1416 $upgrade_link .= '&utm_content=' . $addon['slug'];
1652 1417 }
@@ -1656,19 +1421,16 @@
1656 1421 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1657 1422 }
1658 1423
1659 1424 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1660 -
1661 - if ( ! str_contains( $class, 'frm-button' ) ) {
1425 + if ( strpos( $class, 'frm-button' ) === false ) {
1662 1426 $class .= ' frm-button-secondary frm-button-sm';
1663 1427 }
1664 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1665 1428 ?>
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 ?>
1667 - <?php echo esc_html( $text ); ?>
1429 + <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' ); ?>">
1430 + <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
1668 1431 </a>
1669 1432 <?php
1670 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1671 1433 }
1672 1434
1673 1435 /**
1674 1436 * @since 3.04.02
@@ -1678,9 +1440,8 @@
1678 1440 public static function ajax_install_addon() {
1679 1441 self::install_addon_permissions();
1680 1442
1681 1443 $result = self::download_and_activate();
1682 -
1683 1444 if ( isset( $result['success'] ) && ! $result['success'] ) {
1684 1445 echo json_encode( $result );
1685 1446 wp_die();
1686 1447 }
@@ -1713,8 +1474,9 @@
1713 1474 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1714 1475
1715 1476 if ( ! is_array( $allowed_url_list ) ) {
1716 1477 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1478 +
1717 1479 return array();
1718 1480 }
1719 1481
1720 1482 return $allowed_url_list;
@@ -1724,10 +1486,8 @@
1724 1486 * Gets required plan for an addon.
1725 1487 *
1726 1488 * @since 6.4.2
1727 1489 *
1728 - * @param int|string $addon_id
1729 - *
1730 1490 * @return string Empty string if no plan is required for active license.
1731 1491 */
1732 1492 public static function get_addon_required_plan( $addon_id ) {
1733 1493 $api = new FrmFormApi();
@@ -1738,9 +1498,9 @@
1738 1498 $requires = FrmFormsHelper::get_plan_required( $dates );
1739 1499 }
1740 1500
1741 1501 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1742 - return '';
1502 + $requires = '';
1743 1503 }
1744 1504
1745 1505 return $requires;
1746 1506 }