PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.20
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.20
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 -280 6.32.16.20 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,45 +467,8 @@
488 467 return 'free';
489 468 }
490 469
491 470 /**
492 - * Determine the license status for payment fee decisions.
493 - *
494 - * Mirrors the API's determine_status_from_license_details logic.
495 - *
496 - * @since 6.31
497 - *
498 - * @return string 'active', 'expired', or 'free'.
499 - */
500 - public static function get_payment_license_status() {
501 - $version_info = self::get_primary_license_info();
502 -
503 - if ( ! $version_info ) {
504 - return 'free';
505 - }
506 -
507 - $error = $version_info['error'] ?? array();
508 -
509 - if ( is_array( $error ) ) {
510 - $code = $error['code'] ?? '';
511 -
512 - if ( 'expired' === $code ) {
513 - return 'expired';
514 - }
515 -
516 - if ( 'grandfathered' === $code && isset( $error['expires'] ) && gmdate( 'Y-m-d', $error['expires'] ) < '2016-04-26' ) {
517 - return 'free';
518 - }
519 - }
520 -
521 - if ( in_array( self::license_type( true ), array( 'elite', 'business' ), true ) ) {
522 - return 'active';
523 - }
524 -
525 - return 'free';
526 - }
527 -
528 - /**
529 471 * @since 4.0.01
530 472 *
531 473 * @return bool
532 474 */
@@ -531,21 +473,18 @@
531 473 * @return bool
532 474 */
533 475 public static function is_license_expired() {
534 476 $version_info = self::get_primary_license_info();
535 -
536 477 if ( ! isset( $version_info['error'] ) ) {
537 478 return false;
538 479 }
539 480
540 - $expires = $version_info['error']['expires'] ?? 0;
541 -
542 - if ( ! $expires || $expires > time() ) {
481 + $expires = isset( $version_info['error']['expires'] ) ? $version_info['error']['expires'] : 0;
482 + if ( empty( $expires ) || $expires > time() ) {
543 483 return false;
544 484 }
545 485
546 486 $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
547 -
548 487 if ( $rate_limited ) {
549 488 // Do not return false positives for rate limited responses.
550 489 return false;
551 490 }
@@ -560,13 +499,11 @@
560 499 * @return array|false
561 500 */
562 501 public static function get_primary_license_info() {
563 502 $installed_addons = apply_filters( 'frm_installed_addons', array() );
564 -
565 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
503 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
566 504 return false;
567 505 }
568 -
569 506 $installed_addons = array(
570 507 'formidable_pro' => $installed_addons['formidable_pro'],
571 508 );
572 509
@@ -574,12 +511,8 @@
574 511 }
575 512
576 513 /**
577 514 * @since 3.04.03
578 - *
579 - * @param mixed $transient
580 - *
581 - * @return object
582 515 */
583 516 public static function check_update( $transient ) {
584 517 if ( ! FrmAppHelper::pro_is_installed() ) {
585 518 // Don't make any changes if only Lite is installed.
@@ -590,10 +523,9 @@
590 523 $transient = new stdClass();
591 524 }
592 525
593 526 $installed_addons = apply_filters( 'frm_installed_addons', array() );
594 -
595 - if ( ! $installed_addons ) {
527 + if ( empty( $installed_addons ) ) {
596 528 return $transient;
597 529 }
598 530
599 531 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -607,20 +539,19 @@
607 539 continue;
608 540 }
609 541
610 542 $folder = $plugin->plugin;
611 -
612 - if ( ! $folder ) {
543 + if ( empty( $folder ) ) {
613 544 continue;
614 545 }
615 546
616 547 if ( ! self::is_installed( $folder ) ) {
617 - // Don't show an update if the plugin isn't installed
548 + // don't show an update if the plugin isn't installed
618 549 continue;
619 550 }
620 551
621 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
622 - $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';
623 554 $plugin->slug = explode( '/', $folder )[0];
624 555
625 556 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
626 557 $transient->response[ $folder ] = $plugin;
@@ -628,8 +559,9 @@
628 559 $transient->no_update[ $folder ] = $plugin;
629 560 }
630 561
631 562 $transient->checked[ $folder ] = $wp_version;
563 +
632 564 }//end foreach
633 565
634 566 return $transient;
635 567 }
@@ -639,9 +571,8 @@
639 571 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
640 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.
641 573 *
642 574 * @since 5.5.2
643 - *
644 575 * @return array
645 576 */
646 577 protected static function get_plugins() {
647 578 if ( ! function_exists( 'get_plugins' ) ) {
@@ -676,49 +607,43 @@
676 607 $version_info = array();
677 608
678 609 foreach ( $installed_addons as $addon ) {
679 610 if ( $addon->store_url !== 'https://formidableforms.com' ) {
680 - // Check if this is a third-party addon
611 + // check if this is a third-party addon
681 612 continue;
682 613 }
683 614
684 615 $new_license = $addon->license;
685 -
686 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
616 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
687 617 continue;
688 618 }
689 619
690 620 $checked_licenses[] = $new_license;
691 - $api = new FrmFormApi( $new_license );
692 621
693 - if ( ! $version_info ) {
622 + $api = new FrmFormApi( $new_license );
623 + if ( empty( $version_info ) ) {
694 624 $version_info = $api->get_api_info();
695 625 continue;
696 626 }
697 627
698 628 $plugin = $api->get_addon_for_license( $addon, $version_info );
699 -
700 - if ( ! $plugin ) {
629 + if ( empty( $plugin ) ) {
701 630 continue;
702 631 }
703 632
704 - $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();
705 637
706 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
707 - 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 + }
708 645 }
709 -
710 - // If this addon is using its own license, get the update url
711 - $addon_info = $api->get_api_info();
712 -
713 - $version_info[ $download_id ] = $addon_info[ $download_id ];
714 -
715 - if ( isset( $addon_info['error'] ) ) {
716 - $version_info[ $download_id ]['error'] = array(
717 - 'message' => $addon_info['error']['message'],
718 - 'code' => $addon_info['error']['code'],
719 - );
720 - }
721 646 }//end foreach
722 647
723 648 return $version_info;
724 649 }
@@ -726,11 +651,9 @@
726 651 /**
727 652 * Get the action link for an addon that isn't active.
728 653 *
729 654 * @since 3.06.03
730 - *
731 655 * @param string $plugin The plugin slug.
732 - *
733 656 * @return array
734 657 */
735 658 public static function install_link( $plugin ) {
736 659 $link = array();
@@ -752,9 +675,9 @@
752 675 'categories' => $addon['categories'],
753 676 );
754 677 }
755 678
756 - if ( $link ) {
679 + if ( ! empty( $link ) ) {
757 680 $link['status'] = $addon['status']['type'];
758 681 }
759 682 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
760 683 $link = array(
@@ -766,81 +689,34 @@
766 689 return $link;
767 690 }
768 691
769 692 /**
770 - * Get the JSON-encoded install data for a plugin update.
771 - *
772 - * @since 6.29
773 - *
774 - * @param string $addon_slug The addon slug (e.g. 'pro', 'dates').
775 - *
776 - * @return string JSON-encoded install data, or empty string if no URL is available.
777 - */
778 - public static function get_update_install_data( $addon_slug ) {
779 - $upgrading = self::install_link( $addon_slug );
780 -
781 - if ( isset( $upgrading['class'] ) && 'frm-install-addon' === $upgrading['class'] ) {
782 - return (string) json_encode( $upgrading );
783 - }
784 -
785 - if ( 'pro' === $addon_slug ) {
786 - $download_url = self::get_pro_download_url();
787 - $plugin_file = 'formidable-pro/formidable-pro.php';
788 - } else {
789 - $addon_data = self::get_addon( $addon_slug );
790 - $download_url = $addon_data && ! empty( $addon_data['url'] ) ? $addon_data['url'] : '';
791 - $plugin_file = $addon_data && ! empty( $addon_data['plugin'] ) ? $addon_data['plugin'] : 'formidable-' . $addon_slug . '/formidable-' . $addon_slug . '.php';
792 - }
793 -
794 - if ( ! $download_url ) {
795 - $update_plugins = get_site_transient( 'update_plugins' );
796 - $plugin_update = $update_plugins->response[ $plugin_file ] ?? null;
797 - $download_url = $plugin_update && ! empty( $plugin_update->package ) ? $plugin_update->package : '';
798 - }
799 -
800 - return $download_url ? (string) json_encode(
801 - array(
802 - 'url' => $download_url,
803 - 'class' => 'frm-install-addon',
804 - )
805 - ) : '';
806 - }
807 -
808 - /**
809 693 * @since 4.09
810 - *
811 694 * @param string $plugin The plugin slug.
812 - *
813 695 * @return array|false
814 696 */
815 697 public static function get_addon( $plugin ) {
816 698 $addons = self::get_api_addons();
817 699 self::prepare_addons( $addons );
818 -
819 700 foreach ( $addons as $addon ) {
820 701 $slug = explode( '/', $addon['plugin'] );
821 -
822 702 if ( $slug[0] === 'formidable-' . $plugin ) {
823 703 return $addon;
824 704 }
825 705 }
826 -
827 706 return false;
828 707 }
829 708
830 709 /**
831 710 * @since 4.09
832 - *
833 711 * @return string
834 712 */
835 713 protected static function get_license_type() {
836 714 $license_type = '';
837 715 $addons = self::get_api_addons();
838 -
839 716 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
840 - return $addons['error']['type'];
717 + $license_type = $addons['error']['type'];
841 718 }
842 -
843 719 return $license_type;
844 720 }
845 721
846 722 /**
@@ -853,12 +729,11 @@
853 729 */
854 730 public static function get_addon_for_license( $addons, $license ) {
855 731 $download_id = $license->download_id;
856 732 $plugin = array();
857 -
858 - if ( ! $download_id && $addons ) {
733 + if ( empty( $download_id ) && ! empty( $addons ) ) {
859 734 foreach ( $addons as $addon ) {
860 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
735 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
861 736 return $addon;
862 737 }
863 738 }
864 739 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -868,33 +743,29 @@
868 743 return $plugin;
869 744 }
870 745
871 746 /**
872 - * @param array $addons
873 - *
874 747 * @return void
875 748 */
876 749 protected static function prepare_addons( &$addons ) {
877 - // Reset categories to prevent count accumulation across multiple calls.
878 - self::$categories = array();
879 -
880 750 $activate_url = '';
881 -
882 751 if ( current_user_can( 'activate_plugins' ) ) {
883 752 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
884 753 }
885 754
886 755 $loop_addons = $addons;
887 -
888 756 foreach ( $loop_addons as $id => $addon ) {
889 757 if ( is_numeric( $id ) ) {
890 758 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
891 759 $file_name = $addon['plugin'];
892 760 } else {
893 - $slug = $id;
894 - $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 + }
895 767 $file_name = $base_file . '/' . $base_file . '.php';
896 -
897 768 if ( ! isset( $addon['plugin'] ) ) {
898 769 $addon['plugin'] = $file_name;
899 770 }
900 771 }
@@ -899,17 +770,10 @@
899 770 }
900 771 }
901 772
902 773 $addon['installed'] = self::is_installed( $file_name );
903 -
904 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
905 - unset( $addons[ $id ] );
906 - continue;
907 - }
908 -
909 774 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
910 775 $active_views_version = self::get_active_views_version();
911 -
912 776 if ( false !== $active_views_version && $slug !== $active_views_version ) {
913 777 $addon['installed'] = false;
914 778 }
915 779 }
@@ -915,9 +779,9 @@
915 779 }
916 780
917 781 $addon['activate_url'] = '';
918 782
919 - 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 ) ) {
920 784 $addon['activate_url'] = add_query_arg(
921 785 array(
922 786 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
923 787 'plugin' => $file_name,
@@ -943,11 +807,8 @@
943 807 }//end foreach
944 808 }
945 809
946 810 /**
947 - * @param string $file_name
948 - * @param string $slug
949 - *
950 811 * @return bool
951 812 */
952 813 private static function is_plugin_active( $file_name, $slug ) {
953 814 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -962,9 +823,8 @@
962 823 private static function get_active_views_version() {
963 824 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
964 825 return false;
965 826 }
966 -
967 827 $plugin_version = FrmViewsAppHelper::plugin_version();
968 828 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
969 829 }
970 830
@@ -970,25 +830,22 @@
970 830
971 831 /**
972 832 * @since 3.04.02
973 833 *
974 - * @param string $link
975 - *
976 834 * @return void
977 835 */
978 836 protected static function prepare_addon_link( &$link ) {
979 837 $site_url = 'https://formidableforms.com/';
980 -
981 - if ( ! str_starts_with( $link, 'http' ) ) {
838 + if ( strpos( $link, 'http' ) !== 0 ) {
982 839 $link = $site_url . $link;
983 840 }
984 -
985 - $link = FrmAppHelper::make_affiliate_url( $link );
986 -
987 - $utm = array(
988 - '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',
989 846 );
990 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
847 + $link = add_query_arg( $query_args, $link );
991 848 }
992 849
993 850 /**
994 851 * Add the status to the addon array. Status options are:
@@ -995,10 +852,8 @@
995 852 * installed, active, not installed
996 853 *
997 854 * @since 3.04.02
998 855 *
999 - * @param array $addon
1000 - *
1001 856 * @return void
1002 857 */
1003 858 protected static function set_addon_status( &$addon ) {
1004 859 if ( ! empty( $addon['activate_url'] ) ) {
@@ -1025,9 +880,8 @@
1025 880 * @param string $plugin
1026 881 * @param string $redirect
1027 882 * @param bool $network_wide
1028 883 * @param bool $silent
1029 - *
1030 884 * @return WP_Error|null Null on success, WP_Error on invalid file.
1031 885 */
1032 886 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
1033 887 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1042,9 +896,8 @@
1042 896 * @since 6.8
1043 897 *
1044 898 * @param string $plugin
1045 899 * @param bool $silent
1046 - *
1047 900 * @return void
1048 901 */
1049 902 protected static function deactivate_plugin( $plugin, $silent = false ) {
1050 903 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1058,9 +911,8 @@
1058 911 *
1059 912 * @since 6.8
1060 913 *
1061 914 * @param string $plugin
1062 - *
1063 915 * @return true|WP_Error True on success, WP_Error on invalid file.
1064 916 */
1065 917 protected static function uninstall_plugin( $plugin ) {
1066 918 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1073,9 +925,13 @@
1073 925
1074 926 self::deactivate_plugin( $plugin, true );
1075 927 $result = delete_plugins( array( $plugin ) );
1076 928
1077 - return is_wp_error( $result ) ? $result : true;
929 + if ( is_wp_error( $result ) ) {
930 + return $result;
931 + }
932 +
933 + return true;
1078 934 }
1079 935
1080 936 /**
1081 937 * @since 5.0.10
@@ -1082,9 +938,9 @@
1082 938 *
1083 939 * @return string
1084 940 */
1085 941 protected static function get_current_plugin() {
1086 - if ( ! self::$plugin ) {
942 + if ( empty( self::$plugin ) ) {
1087 943 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1088 944 }
1089 945 return self::$plugin;
1090 946 }
@@ -1091,9 +947,9 @@
1091 947
1092 948 /**
1093 949 * @since 4.08
1094 950 *
1095 - * @return mixed[]|null
951 + * @return array|void
1096 952 */
1097 953 protected static function download_and_activate() {
1098 954 if ( is_admin() ) {
1099 955 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1101,14 +957,12 @@
1101 957
1102 958 self::maybe_show_cred_form();
1103 959
1104 960 $installed = self::install_addon();
1105 -
1106 961 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1107 962 return $installed;
1108 963 }
1109 964 self::handle_addon_action( $installed, 'activate' );
1110 - return null;
1111 965 }
1112 966
1113 967 /**
1114 968 * @since 3.04.02
@@ -1119,9 +973,9 @@
1119 973 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1120 974 include_once ABSPATH . 'wp-admin/includes/file.php';
1121 975 }
1122 976
1123 - // 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.
1124 978 ob_start();
1125 979
1126 980 $show_form = false;
1127 981 $method = '';
@@ -1138,8 +992,9 @@
1138 992
1139 993 if ( $show_form ) {
1140 994 $form = ob_get_clean();
1141 995 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
996 + $data = $form;
1142 997 $response = array(
1143 998 'success' => false,
1144 999 'message' => $message,
1145 1000 'form' => $form,
@@ -1167,10 +1022,8 @@
1167 1022 * We do not need any extra credentials if we have gotten this far,
1168 1023 * so let's install the plugin.
1169 1024 *
1170 1025 * @since 3.04.02
1171 - *
1172 - * @return array|string
1173 1026 */
1174 1027 protected static function install_addon() {
1175 1028 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1176 1029
@@ -1184,15 +1037,14 @@
1184 1037 }
1185 1038
1186 1039 // Create the plugin upgrader with our custom skin.
1187 1040 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1188 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1041 + $installer->install( $download_url );
1189 1042
1190 1043 // Flush the cache and return the newly installed plugin basename.
1191 1044 wp_cache_flush();
1192 1045
1193 1046 $plugin = $installer->plugin_info();
1194 -
1195 1047 if ( ! $plugin ) {
1196 1048 return array(
1197 1049 'message' => 'Plugin was not installed. ' . $installer->result,
1198 1050 'success' => false,
@@ -1197,9 +1049,8 @@
1197 1049 'message' => 'Plugin was not installed. ' . $installer->result,
1198 1050 'success' => false,
1199 1051 );
1200 1052 }
1201 -
1202 1053 return $plugin;
1203 1054 }
1204 1055
1205 1056 /**
@@ -1263,9 +1114,8 @@
1263 1114 * @since 6.8
1264 1115 *
1265 1116 * @param callable $action_callback The specific add-on action to be executed.
1266 1117 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1267 - *
1268 1118 * @return void
1269 1119 */
1270 1120 private static function process_addon_action( $action_callback, $response_callback = null ) {
1271 1121 self::install_addon_permissions();
@@ -1288,14 +1138,13 @@
1288 1138 * @since 6.8
1289 1139 *
1290 1140 * @param string $installed The plugin folder name with file name.
1291 1141 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1292 - *
1293 - * @return mixed[]|null
1142 + * @return array|void
1294 1143 */
1295 1144 protected static function handle_addon_action( $installed, $action ) {
1296 1145 if ( ! $installed || ! $action ) {
1297 - return null;
1146 + return;
1298 1147 }
1299 1148
1300 1149 $result = null;
1301 1150 switch ( $action ) {
@@ -1315,9 +1164,8 @@
1315 1164 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1316 1165 if ( wp_doing_ajax() ) {
1317 1166 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1318 1167 }
1319 -
1320 1168 return array(
1321 1169 'message' => $result->get_error_message(),
1322 1170 'success' => false,
1323 1171 );
@@ -1331,14 +1179,17 @@
1331 1179 * @return array
1332 1180 */
1333 1181 private static function get_addon_activation_response() {
1334 1182 $activating_page = self::get_activating_page();
1335 - $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
1336 1183
1337 - 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(
1338 1187 'message' => $message,
1339 1188 'saveAndReload' => $activating_page,
1340 1189 );
1190 +
1191 + return $response;
1341 1192 }
1342 1193
1343 1194 /**
1344 1195 * Return a string that reflects the page from which the addon is being activated on,
@@ -1347,14 +1198,17 @@
1347 1198 * @return string
1348 1199 */
1349 1200 private static function get_activating_page() {
1350 1201 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1202 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1203 + return 'settings';
1204 + }
1351 1205
1352 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1353 - return 'settings';
1206 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1207 + return 'form_builder';
1354 1208 }
1355 1209
1356 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1210 + return '';
1357 1211 }
1358 1212
1359 1213 /**
1360 1214 * Run security checks before installing
@@ -1365,14 +1219,12 @@
1365 1219 */
1366 1220 protected static function install_addon_permissions() {
1367 1221 check_ajax_referer( 'frm_ajax', 'nonce' );
1368 1222
1369 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1370 - return;
1223 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1224 + echo json_encode( true );
1225 + wp_die();
1371 1226 }
1372 -
1373 - echo json_encode( true );
1374 - wp_die();
1375 1227 }
1376 1228
1377 1229 /**
1378 1230 * @since 4.08
@@ -1380,14 +1232,12 @@
1380 1232 * @return string
1381 1233 */
1382 1234 public static function connect_link() {
1383 1235 $auth = get_option( 'frm_connect_token' );
1384 -
1385 - if ( ! $auth ) {
1236 + if ( empty( $auth ) ) {
1386 1237 $auth = hash( 'sha512', wp_rand() );
1387 - update_option( 'frm_connect_token', $auth, false );
1238 + update_option( 'frm_connect_token', $auth, 'no' );
1388 1239 }
1389 -
1390 1240 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1391 1241 $link = 'https://formidableforms.com/api-connect/';
1392 1242 $args = array(
1393 1243 'v' => 2,
@@ -1415,10 +1265,9 @@
1415 1265 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1416 1266
1417 1267 // The download link is not required if already installed.
1418 1268 $is_installed = FrmAppHelper::pro_is_included();
1419 - $file_missing = ! $is_installed && ! $post_url;
1420 -
1269 + $file_missing = ! $is_installed && empty( $post_url );
1421 1270 if ( ! $post_auth || $file_missing ) {
1422 1271 return false;
1423 1272 }
1424 1273
@@ -1423,9 +1272,13 @@
1423 1272 }
1424 1273
1425 1274 // Verify auth.
1426 1275 $auth = get_option( 'frm_connect_token' );
1427 - return $auth && hash_equals( $auth, $post_auth );
1276 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1277 + return false;
1278 + }
1279 +
1280 + return true;
1428 1281 }
1429 1282
1430 1283 /**
1431 1284 * Install and/or activate the add-on file.
@@ -1436,17 +1289,17 @@
1436 1289 */
1437 1290 public static function install_addon_api() {
1438 1291 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1439 1292
1293 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1294 +
1440 1295 // Delete so cannot replay.
1441 1296 delete_option( 'frm_connect_token' );
1442 1297
1443 1298 // It's already installed and active.
1444 1299 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1445 -
1446 1300 if ( is_wp_error( $active ) ) {
1447 1301 $response = self::maybe_download_and_activate();
1448 -
1449 1302 if ( is_array( $response ) ) {
1450 1303 // The download failed.
1451 1304 return $response;
1452 1305 }
@@ -1452,12 +1305,11 @@
1452 1305 }
1453 1306 }
1454 1307
1455 1308 // If empty license, save it now.
1456 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1309 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1457 1310 load_formidable_pro();
1458 1311 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1459 -
1460 1312 if ( ! $license ) {
1461 1313 return array(
1462 1314 'success' => false,
1463 1315 'error' => 'That site does not have a valid license key.',
@@ -1464,9 +1316,8 @@
1464 1316 );
1465 1317 }
1466 1318
1467 1319 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1468 -
1469 1320 if ( ! $response['success'] ) {
1470 1321 // Could not activate license.
1471 1322 return $response;
1472 1323 }
@@ -1491,9 +1342,8 @@
1491 1342 }
1492 1343
1493 1344 // Download plugin now.
1494 1345 $response = self::download_and_activate();
1495 -
1496 1346 if ( is_array( $response ) && isset( $response['success'] ) ) {
1497 1347 // The download failed.
1498 1348 return $response;
1499 1349 }
@@ -1507,9 +1357,8 @@
1507 1357 * @since 4.09
1508 1358 *
1509 1359 * @param string $plugin
1510 1360 * @param array|string $upgrade_link_args
1511 - *
1512 1361 * @return void
1513 1362 */
1514 1363 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1515 1364 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1544,9 +1393,8 @@
1544 1393 * @type false|string $license_type
1545 1394 * @type string $plan_required
1546 1395 * @type string $upgrade_link
1547 1396 * }
1548 - *
1549 1397 * @return void
1550 1398 */
1551 1399 public static function show_conditional_action_button( $atts ) {
1552 1400 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1579,19 +1427,16 @@
1579 1427 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1580 1428 }
1581 1429
1582 1430 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1583 -
1584 - if ( ! str_contains( $class, 'frm-button' ) ) {
1431 + if ( strpos( $class, 'frm-button' ) === false ) {
1585 1432 $class .= ' frm-button-secondary frm-button-sm';
1586 1433 }
1587 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1588 1434 ?>
1589 - <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' ); ?>">
1590 1436 <?php echo esc_html( $text ); ?>
1591 1437 </a>
1592 1438 <?php
1593 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1594 1439 }
1595 1440
1596 1441 /**
1597 1442 * @since 3.04.02
@@ -1601,9 +1446,8 @@
1601 1446 public static function ajax_install_addon() {
1602 1447 self::install_addon_permissions();
1603 1448
1604 1449 $result = self::download_and_activate();
1605 -
1606 1450 if ( isset( $result['success'] ) && ! $result['success'] ) {
1607 1451 echo json_encode( $result );
1608 1452 wp_die();
1609 1453 }
@@ -1636,8 +1480,9 @@
1636 1480 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1637 1481
1638 1482 if ( ! is_array( $allowed_url_list ) ) {
1639 1483 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1484 +
1640 1485 return array();
1641 1486 }
1642 1487
1643 1488 return $allowed_url_list;
@@ -1647,10 +1492,8 @@
1647 1492 * Gets required plan for an addon.
1648 1493 *
1649 1494 * @since 6.4.2
1650 1495 *
1651 - * @param int|string $addon_id
1652 - *
1653 1496 * @return string Empty string if no plan is required for active license.
1654 1497 */
1655 1498 public static function get_addon_required_plan( $addon_id ) {
1656 1499 $api = new FrmFormApi();
@@ -1661,9 +1504,9 @@
1661 1504 $requires = FrmFormsHelper::get_plan_required( $dates );
1662 1505 }
1663 1506
1664 1507 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1665 - return '';
1508 + $requires = '';
1666 1509 }
1667 1510
1668 1511 return $requires;
1669 1512 }