PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.16
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.16
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 +148 -244 6.296.16 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(
@@ -193,18 +183,15 @@
193 183 );
194 184
195 185 // Extract the elements to move
196 186 foreach ( $plans as $plan ) {
197 - if ( ! isset( self::$categories[ $plan ] ) ) {
198 - continue;
187 + if ( isset( self::$categories[ $plan ] ) ) {
188 + $bottom_categories[ $plan ] = self::$categories[ $plan ];
189 + unset( self::$categories[ $plan ] );
199 190 }
200 -
201 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
202 - unset( self::$categories[ $plan ] );
203 191 }
204 192
205 193 $special_categories = array();
206 -
207 194 if ( 'elite' !== self::license_type() ) {
208 195 $special_categories['available-addons'] = array(
209 196 'name' => __( 'Available', 'formidable' ),
210 197 // To be assigned via JavaScript.
@@ -236,9 +223,8 @@
236 223 *
237 224 * @since 6.15
238 225 *
239 226 * @param array $addon The addon array that will be modified by reference.
240 - *
241 227 * @return void
242 228 */
243 229 protected static function set_categories( &$addon ) {
244 230 if ( ! isset( $addon['categories'] ) ) {
@@ -269,11 +255,11 @@
269 255 * @return void
270 256 */
271 257 public static function license_settings() {
272 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' );
273 261
274 - if ( ! $plugins ) {
275 - esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
276 262 return;
277 263 }
278 264
279 265 ksort( $plugins );
@@ -287,15 +273,15 @@
287 273 protected static function get_api_addons() {
288 274 $api = new FrmFormApi();
289 275 $addons = $api->get_api_info();
290 276
291 - if ( ! $addons ) {
292 - return self::fallback_plugin_list();
293 - }
294 -
295 - foreach ( $addons as $k => $addon ) {
296 - if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
297 - 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 + }
298 284 }
299 285 }
300 286
301 287 return $addons;
@@ -309,8 +295,9 @@
309 295 * @return int Count of addons.
310 296 */
311 297 public static function get_addons_count() {
312 298 $addons = self::get_api_addons();
299 +
313 300 return count( $addons );
314 301 }
315 302
316 303 /**
@@ -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,9 +401,8 @@
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 408 $license = self::get_pro_license();
@@ -425,20 +409,17 @@
425 409 $api = new FrmFormApi( $license );
426 410 $downloads = $api->get_api_info();
427 411 $pro = self::get_pro_from_addons( $downloads );
428 412
429 - return $pro['url'] ?? '';
413 + return isset( $pro['url'] ) ? $pro['url'] : '';
430 414 }
431 415
432 416 /**
433 417 * @since 4.08
434 - *
435 - * @return string
436 418 */
437 419 public static function get_pro_license() {
438 420 $pro_cred_store = 'frmpro-credentials';
439 421 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
440 -
441 422 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
442 423 $creds = get_site_option( $pro_cred_store );
443 424 } else {
444 425 $creds = get_option( $pro_cred_store );
@@ -448,18 +429,16 @@
448 429 return '';
449 430 }
450 431
451 432 $license = $creds['license'];
452 -
453 - if ( ! $license ) {
433 + if ( empty( $license ) ) {
454 434 return '';
455 435 }
456 436
457 - if ( str_contains( $license, '-' ) ) {
458 - // This is a fix for licenses saved in the past
459 - return strtoupper( $license );
437 + if ( strpos( $license, '-' ) ) {
438 + // this is a fix for licenses saved in the past
439 + $license = strtoupper( $license );
460 440 }
461 -
462 441 return $license;
463 442 }
464 443
465 444 /**
@@ -465,19 +444,16 @@
465 444 /**
466 445 * @since 4.08
467 446 *
468 447 * @param array $addons
469 - *
470 448 * @return array
471 449 */
472 450 protected static function get_pro_from_addons( $addons ) {
473 - return $addons['93790'] ?? array();
451 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
474 452 }
475 453
476 454 /**
477 455 * @since 4.06
478 - *
479 - * @return string
480 456 */
481 457 public static function license_type() {
482 458 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
483 459 return FrmProAddonsController::license_type();
@@ -492,21 +468,18 @@
492 468 * @return bool
493 469 */
494 470 public static function is_license_expired() {
495 471 $version_info = self::get_primary_license_info();
496 -
497 472 if ( ! isset( $version_info['error'] ) ) {
498 473 return false;
499 474 }
500 475
501 - $expires = $version_info['error']['expires'] ?? 0;
502 -
503 - if ( ! $expires || $expires > time() ) {
476 + $expires = isset( $version_info['error']['expires'] ) ? $version_info['error']['expires'] : 0;
477 + if ( empty( $expires ) || $expires > time() ) {
504 478 return false;
505 479 }
506 480
507 481 $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
508 -
509 482 if ( $rate_limited ) {
510 483 // Do not return false positives for rate limited responses.
511 484 return false;
512 485 }
@@ -521,13 +494,11 @@
521 494 * @return array|false
522 495 */
523 496 public static function get_primary_license_info() {
524 497 $installed_addons = apply_filters( 'frm_installed_addons', array() );
525 -
526 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
498 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
527 499 return false;
528 500 }
529 -
530 501 $installed_addons = array(
531 502 'formidable_pro' => $installed_addons['formidable_pro'],
532 503 );
533 504
@@ -535,12 +506,8 @@
535 506 }
536 507
537 508 /**
538 509 * @since 3.04.03
539 - *
540 - * @param mixed $transient
541 - *
542 - * @return object
543 510 */
544 511 public static function check_update( $transient ) {
545 512 if ( ! FrmAppHelper::pro_is_installed() ) {
546 513 // Don't make any changes if only Lite is installed.
@@ -551,10 +518,9 @@
551 518 $transient = new stdClass();
552 519 }
553 520
554 521 $installed_addons = apply_filters( 'frm_installed_addons', array() );
555 -
556 - if ( ! $installed_addons ) {
522 + if ( empty( $installed_addons ) ) {
557 523 return $transient;
558 524 }
559 525
560 526 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -568,20 +534,19 @@
568 534 continue;
569 535 }
570 536
571 537 $folder = $plugin->plugin;
572 -
573 - if ( ! $folder ) {
538 + if ( empty( $folder ) ) {
574 539 continue;
575 540 }
576 541
577 542 if ( ! self::is_installed( $folder ) ) {
578 - // Don't show an update if the plugin isn't installed
543 + // don't show an update if the plugin isn't installed
579 544 continue;
580 545 }
581 546
582 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
583 - $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';
584 549 $plugin->slug = explode( '/', $folder )[0];
585 550
586 551 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
587 552 $transient->response[ $folder ] = $plugin;
@@ -589,8 +554,9 @@
589 554 $transient->no_update[ $folder ] = $plugin;
590 555 }
591 556
592 557 $transient->checked[ $folder ] = $wp_version;
558 +
593 559 }//end foreach
594 560
595 561 return $transient;
596 562 }
@@ -600,9 +566,8 @@
600 566 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
601 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.
602 568 *
603 569 * @since 5.5.2
604 - *
605 570 * @return array
606 571 */
607 572 protected static function get_plugins() {
608 573 if ( ! function_exists( 'get_plugins' ) ) {
@@ -637,49 +602,43 @@
637 602 $version_info = array();
638 603
639 604 foreach ( $installed_addons as $addon ) {
640 605 if ( $addon->store_url !== 'https://formidableforms.com' ) {
641 - // Check if this is a third-party addon
606 + // check if this is a third-party addon
642 607 continue;
643 608 }
644 609
645 610 $new_license = $addon->license;
646 -
647 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
611 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
648 612 continue;
649 613 }
650 614
651 615 $checked_licenses[] = $new_license;
652 - $api = new FrmFormApi( $new_license );
653 616
654 - if ( ! $version_info ) {
617 + $api = new FrmFormApi( $new_license );
618 + if ( empty( $version_info ) ) {
655 619 $version_info = $api->get_api_info();
656 620 continue;
657 621 }
658 622
659 623 $plugin = $api->get_addon_for_license( $addon, $version_info );
660 -
661 - if ( ! $plugin ) {
624 + if ( empty( $plugin ) ) {
662 625 continue;
663 626 }
664 627
665 - $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();
666 632
667 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
668 - 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 + }
669 640 }
670 -
671 - // If this addon is using its own license, get the update url
672 - $addon_info = $api->get_api_info();
673 -
674 - $version_info[ $download_id ] = $addon_info[ $download_id ];
675 -
676 - if ( isset( $addon_info['error'] ) ) {
677 - $version_info[ $download_id ]['error'] = array(
678 - 'message' => $addon_info['error']['message'],
679 - 'code' => $addon_info['error']['code'],
680 - );
681 - }
682 641 }//end foreach
683 642
684 643 return $version_info;
685 644 }
@@ -687,11 +646,9 @@
687 646 /**
688 647 * Get the action link for an addon that isn't active.
689 648 *
690 649 * @since 3.06.03
691 - *
692 650 * @param string $plugin The plugin slug.
693 - *
694 651 * @return array
695 652 */
696 653 public static function install_link( $plugin ) {
697 654 $link = array();
@@ -713,9 +670,9 @@
713 670 'categories' => $addon['categories'],
714 671 );
715 672 }
716 673
717 - if ( $link ) {
674 + if ( ! empty( $link ) ) {
718 675 $link['status'] = $addon['status']['type'];
719 676 }
720 677 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
721 678 $link = array(
@@ -727,81 +684,34 @@
727 684 return $link;
728 685 }
729 686
730 687 /**
731 - * Get the JSON-encoded install data for a plugin update.
732 - *
733 - * @since 6.29
734 - *
735 - * @param string $addon_slug The addon slug (e.g. 'pro', 'dates').
736 - *
737 - * @return string JSON-encoded install data, or empty string if no URL is available.
738 - */
739 - public static function get_update_install_data( $addon_slug ) {
740 - $upgrading = self::install_link( $addon_slug );
741 -
742 - if ( isset( $upgrading['class'] ) && 'frm-install-addon' === $upgrading['class'] ) {
743 - return (string) json_encode( $upgrading );
744 - }
745 -
746 - if ( 'pro' === $addon_slug ) {
747 - $download_url = self::get_pro_download_url();
748 - $plugin_file = 'formidable-pro/formidable-pro.php';
749 - } else {
750 - $addon_data = self::get_addon( $addon_slug );
751 - $download_url = $addon_data && ! empty( $addon_data['url'] ) ? $addon_data['url'] : '';
752 - $plugin_file = $addon_data && ! empty( $addon_data['plugin'] ) ? $addon_data['plugin'] : 'formidable-' . $addon_slug . '/formidable-' . $addon_slug . '.php';
753 - }
754 -
755 - if ( ! $download_url ) {
756 - $update_plugins = get_site_transient( 'update_plugins' );
757 - $plugin_update = $update_plugins->response[ $plugin_file ] ?? null;
758 - $download_url = $plugin_update && ! empty( $plugin_update->package ) ? $plugin_update->package : '';
759 - }
760 -
761 - return $download_url ? (string) json_encode(
762 - array(
763 - 'url' => $download_url,
764 - 'class' => 'frm-install-addon',
765 - )
766 - ) : '';
767 - }
768 -
769 - /**
770 688 * @since 4.09
771 - *
772 689 * @param string $plugin The plugin slug.
773 - *
774 690 * @return array|false
775 691 */
776 692 public static function get_addon( $plugin ) {
777 693 $addons = self::get_api_addons();
778 694 self::prepare_addons( $addons );
779 -
780 695 foreach ( $addons as $addon ) {
781 696 $slug = explode( '/', $addon['plugin'] );
782 -
783 697 if ( $slug[0] === 'formidable-' . $plugin ) {
784 698 return $addon;
785 699 }
786 700 }
787 -
788 701 return false;
789 702 }
790 703
791 704 /**
792 705 * @since 4.09
793 - *
794 706 * @return string
795 707 */
796 708 protected static function get_license_type() {
797 709 $license_type = '';
798 710 $addons = self::get_api_addons();
799 -
800 711 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
801 - return $addons['error']['type'];
712 + $license_type = $addons['error']['type'];
802 713 }
803 -
804 714 return $license_type;
805 715 }
806 716
807 717 /**
@@ -814,12 +724,11 @@
814 724 */
815 725 public static function get_addon_for_license( $addons, $license ) {
816 726 $download_id = $license->download_id;
817 727 $plugin = array();
818 -
819 - if ( ! $download_id && $addons ) {
728 + if ( empty( $download_id ) && ! empty( $addons ) ) {
820 729 foreach ( $addons as $addon ) {
821 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
730 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
822 731 return $addon;
823 732 }
824 733 }
825 734 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -829,33 +738,29 @@
829 738 return $plugin;
830 739 }
831 740
832 741 /**
833 - * @param array $addons
834 - *
835 742 * @return void
836 743 */
837 744 protected static function prepare_addons( &$addons ) {
838 - // Reset categories to prevent count accumulation across multiple calls.
839 - self::$categories = array();
840 -
841 745 $activate_url = '';
842 -
843 746 if ( current_user_can( 'activate_plugins' ) ) {
844 747 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
845 748 }
846 749
847 750 $loop_addons = $addons;
848 -
849 751 foreach ( $loop_addons as $id => $addon ) {
850 752 if ( is_numeric( $id ) ) {
851 753 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
852 754 $file_name = $addon['plugin'];
853 755 } else {
854 - $slug = $id;
855 - $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 + }
856 762 $file_name = $base_file . '/' . $base_file . '.php';
857 -
858 763 if ( ! isset( $addon['plugin'] ) ) {
859 764 $addon['plugin'] = $file_name;
860 765 }
861 766 }
@@ -860,17 +765,10 @@
860 765 }
861 766 }
862 767
863 768 $addon['installed'] = self::is_installed( $file_name );
864 -
865 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
866 - unset( $addons[ $id ] );
867 - continue;
868 - }
869 -
870 769 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
871 770 $active_views_version = self::get_active_views_version();
872 -
873 771 if ( false !== $active_views_version && $slug !== $active_views_version ) {
874 772 $addon['installed'] = false;
875 773 }
876 774 }
@@ -876,9 +774,9 @@
876 774 }
877 775
878 776 $addon['activate_url'] = '';
879 777
880 - 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 ) ) {
881 779 $addon['activate_url'] = add_query_arg(
882 780 array(
883 781 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
884 782 'plugin' => $file_name,
@@ -904,11 +802,8 @@
904 802 }//end foreach
905 803 }
906 804
907 805 /**
908 - * @param string $file_name
909 - * @param string $slug
910 - *
911 806 * @return bool
912 807 */
913 808 private static function is_plugin_active( $file_name, $slug ) {
914 809 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -923,9 +818,8 @@
923 818 private static function get_active_views_version() {
924 819 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
925 820 return false;
926 821 }
927 -
928 822 $plugin_version = FrmViewsAppHelper::plugin_version();
929 823 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
930 824 }
931 825
@@ -931,25 +825,22 @@
931 825
932 826 /**
933 827 * @since 3.04.02
934 828 *
935 - * @param string $link
936 - *
937 829 * @return void
938 830 */
939 831 protected static function prepare_addon_link( &$link ) {
940 832 $site_url = 'https://formidableforms.com/';
941 -
942 - if ( ! str_starts_with( $link, 'http' ) ) {
833 + if ( strpos( $link, 'http' ) !== 0 ) {
943 834 $link = $site_url . $link;
944 835 }
945 -
946 - $link = FrmAppHelper::make_affiliate_url( $link );
947 -
948 - $utm = array(
949 - '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',
950 841 );
951 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
842 + $link = add_query_arg( $query_args, $link );
952 843 }
953 844
954 845 /**
955 846 * Add the status to the addon array. Status options are:
@@ -956,10 +847,8 @@
956 847 * installed, active, not installed
957 848 *
958 849 * @since 3.04.02
959 850 *
960 - * @param array $addon
961 - *
962 851 * @return void
963 852 */
964 853 protected static function set_addon_status( &$addon ) {
965 854 if ( ! empty( $addon['activate_url'] ) ) {
@@ -986,9 +875,8 @@
986 875 * @param string $plugin
987 876 * @param string $redirect
988 877 * @param bool $network_wide
989 878 * @param bool $silent
990 - *
991 879 * @return WP_Error|null Null on success, WP_Error on invalid file.
992 880 */
993 881 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
994 882 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1003,9 +891,8 @@
1003 891 * @since 6.8
1004 892 *
1005 893 * @param string $plugin
1006 894 * @param bool $silent
1007 - *
1008 895 * @return void
1009 896 */
1010 897 protected static function deactivate_plugin( $plugin, $silent = false ) {
1011 898 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1019,9 +906,8 @@
1019 906 *
1020 907 * @since 6.8
1021 908 *
1022 909 * @param string $plugin
1023 - *
1024 910 * @return true|WP_Error True on success, WP_Error on invalid file.
1025 911 */
1026 912 protected static function uninstall_plugin( $plugin ) {
1027 913 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1034,9 +920,13 @@
1034 920
1035 921 self::deactivate_plugin( $plugin, true );
1036 922 $result = delete_plugins( array( $plugin ) );
1037 923
1038 - return is_wp_error( $result ) ? $result : true;
924 + if ( is_wp_error( $result ) ) {
925 + return $result;
926 + }
927 +
928 + return true;
1039 929 }
1040 930
1041 931 /**
1042 932 * @since 5.0.10
@@ -1043,9 +933,9 @@
1043 933 *
1044 934 * @return string
1045 935 */
1046 936 protected static function get_current_plugin() {
1047 - if ( ! self::$plugin ) {
937 + if ( empty( self::$plugin ) ) {
1048 938 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1049 939 }
1050 940 return self::$plugin;
1051 941 }
@@ -1052,9 +942,9 @@
1052 942
1053 943 /**
1054 944 * @since 4.08
1055 945 *
1056 - * @return mixed[]|null
946 + * @return array|void
1057 947 */
1058 948 protected static function download_and_activate() {
1059 949 if ( is_admin() ) {
1060 950 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1062,14 +952,12 @@
1062 952
1063 953 self::maybe_show_cred_form();
1064 954
1065 955 $installed = self::install_addon();
1066 -
1067 956 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1068 957 return $installed;
1069 958 }
1070 959 self::handle_addon_action( $installed, 'activate' );
1071 - return null;
1072 960 }
1073 961
1074 962 /**
1075 963 * @since 3.04.02
@@ -1080,9 +968,9 @@
1080 968 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1081 969 include_once ABSPATH . 'wp-admin/includes/file.php';
1082 970 }
1083 971
1084 - // 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.
1085 973 ob_start();
1086 974
1087 975 $show_form = false;
1088 976 $method = '';
@@ -1099,8 +987,9 @@
1099 987
1100 988 if ( $show_form ) {
1101 989 $form = ob_get_clean();
1102 990 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
991 + $data = $form;
1103 992 $response = array(
1104 993 'success' => false,
1105 994 'message' => $message,
1106 995 'form' => $form,
@@ -1128,10 +1017,8 @@
1128 1017 * We do not need any extra credentials if we have gotten this far,
1129 1018 * so let's install the plugin.
1130 1019 *
1131 1020 * @since 3.04.02
1132 - *
1133 - * @return array|string
1134 1021 */
1135 1022 protected static function install_addon() {
1136 1023 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1137 1024
@@ -1145,15 +1032,14 @@
1145 1032 }
1146 1033
1147 1034 // Create the plugin upgrader with our custom skin.
1148 1035 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1149 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1036 + $installer->install( $download_url );
1150 1037
1151 1038 // Flush the cache and return the newly installed plugin basename.
1152 1039 wp_cache_flush();
1153 1040
1154 1041 $plugin = $installer->plugin_info();
1155 -
1156 1042 if ( ! $plugin ) {
1157 1043 return array(
1158 1044 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1045 'success' => false,
@@ -1158,9 +1044,8 @@
1158 1044 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1045 'success' => false,
1160 1046 );
1161 1047 }
1162 -
1163 1048 return $plugin;
1164 1049 }
1165 1050
1166 1051 /**
@@ -1224,9 +1109,8 @@
1224 1109 * @since 6.8
1225 1110 *
1226 1111 * @param callable $action_callback The specific add-on action to be executed.
1227 1112 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1228 - *
1229 1113 * @return void
1230 1114 */
1231 1115 private static function process_addon_action( $action_callback, $response_callback = null ) {
1232 1116 self::install_addon_permissions();
@@ -1249,14 +1133,13 @@
1249 1133 * @since 6.8
1250 1134 *
1251 1135 * @param string $installed The plugin folder name with file name.
1252 1136 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1253 - *
1254 - * @return mixed[]|null
1137 + * @return array|void
1255 1138 */
1256 1139 protected static function handle_addon_action( $installed, $action ) {
1257 1140 if ( ! $installed || ! $action ) {
1258 - return null;
1141 + return;
1259 1142 }
1260 1143
1261 1144 $result = null;
1262 1145 switch ( $action ) {
@@ -1276,9 +1159,8 @@
1276 1159 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1277 1160 if ( wp_doing_ajax() ) {
1278 1161 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1279 1162 }
1280 -
1281 1163 return array(
1282 1164 'message' => $result->get_error_message(),
1283 1165 'success' => false,
1284 1166 );
@@ -1292,14 +1174,17 @@
1292 1174 * @return array
1293 1175 */
1294 1176 private static function get_addon_activation_response() {
1295 1177 $activating_page = self::get_activating_page();
1296 - $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
1297 1178
1298 - 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(
1299 1182 'message' => $message,
1300 1183 'saveAndReload' => $activating_page,
1301 1184 );
1185 +
1186 + return $response;
1302 1187 }
1303 1188
1304 1189 /**
1305 1190 * Return a string that reflects the page from which the addon is being activated on,
@@ -1308,14 +1193,17 @@
1308 1193 * @return string
1309 1194 */
1310 1195 private static function get_activating_page() {
1311 1196 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1197 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1198 + return 'settings';
1199 + }
1312 1200
1313 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1314 - return 'settings';
1201 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1202 + return 'form_builder';
1315 1203 }
1316 1204
1317 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1205 + return '';
1318 1206 }
1319 1207
1320 1208 /**
1321 1209 * Run security checks before installing
@@ -1326,14 +1214,12 @@
1326 1214 */
1327 1215 protected static function install_addon_permissions() {
1328 1216 check_ajax_referer( 'frm_ajax', 'nonce' );
1329 1217
1330 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1331 - return;
1218 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1219 + echo json_encode( true );
1220 + wp_die();
1332 1221 }
1333 -
1334 - echo json_encode( true );
1335 - wp_die();
1336 1222 }
1337 1223
1338 1224 /**
1339 1225 * @since 4.08
@@ -1341,14 +1227,12 @@
1341 1227 * @return string
1342 1228 */
1343 1229 public static function connect_link() {
1344 1230 $auth = get_option( 'frm_connect_token' );
1345 -
1346 - if ( ! $auth ) {
1231 + if ( empty( $auth ) ) {
1347 1232 $auth = hash( 'sha512', wp_rand() );
1348 - update_option( 'frm_connect_token', $auth, false );
1233 + update_option( 'frm_connect_token', $auth, 'no' );
1349 1234 }
1350 -
1351 1235 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1352 1236 $link = 'https://formidableforms.com/api-connect/';
1353 1237 $args = array(
1354 1238 'v' => 2,
@@ -1376,10 +1260,9 @@
1376 1260 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1377 1261
1378 1262 // The download link is not required if already installed.
1379 1263 $is_installed = FrmAppHelper::pro_is_included();
1380 - $file_missing = ! $is_installed && ! $post_url;
1381 -
1264 + $file_missing = ! $is_installed && empty( $post_url );
1382 1265 if ( ! $post_auth || $file_missing ) {
1383 1266 return false;
1384 1267 }
1385 1268
@@ -1384,9 +1267,13 @@
1384 1267 }
1385 1268
1386 1269 // Verify auth.
1387 1270 $auth = get_option( 'frm_connect_token' );
1388 - return $auth && hash_equals( $auth, $post_auth );
1271 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1272 + return false;
1273 + }
1274 +
1275 + return true;
1389 1276 }
1390 1277
1391 1278 /**
1392 1279 * Install and/or activate the add-on file.
@@ -1397,17 +1284,17 @@
1397 1284 */
1398 1285 public static function install_addon_api() {
1399 1286 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1400 1287
1288 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1289 +
1401 1290 // Delete so cannot replay.
1402 1291 delete_option( 'frm_connect_token' );
1403 1292
1404 1293 // It's already installed and active.
1405 1294 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1406 -
1407 1295 if ( is_wp_error( $active ) ) {
1408 1296 $response = self::maybe_download_and_activate();
1409 -
1410 1297 if ( is_array( $response ) ) {
1411 1298 // The download failed.
1412 1299 return $response;
1413 1300 }
@@ -1413,12 +1300,11 @@
1413 1300 }
1414 1301 }
1415 1302
1416 1303 // If empty license, save it now.
1417 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1304 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1418 1305 load_formidable_pro();
1419 1306 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1420 -
1421 1307 if ( ! $license ) {
1422 1308 return array(
1423 1309 'success' => false,
1424 1310 'error' => 'That site does not have a valid license key.',
@@ -1425,9 +1311,8 @@
1425 1311 );
1426 1312 }
1427 1313
1428 1314 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1429 -
1430 1315 if ( ! $response['success'] ) {
1431 1316 // Could not activate license.
1432 1317 return $response;
1433 1318 }
@@ -1452,9 +1337,8 @@
1452 1337 }
1453 1338
1454 1339 // Download plugin now.
1455 1340 $response = self::download_and_activate();
1456 -
1457 1341 if ( is_array( $response ) && isset( $response['success'] ) ) {
1458 1342 // The download failed.
1459 1343 return $response;
1460 1344 }
@@ -1468,9 +1352,8 @@
1468 1352 * @since 4.09
1469 1353 *
1470 1354 * @param string $plugin
1471 1355 * @param array|string $upgrade_link_args
1472 - *
1473 1356 * @return void
1474 1357 */
1475 1358 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1476 1359 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1505,9 +1388,8 @@
1505 1388 * @type false|string $license_type
1506 1389 * @type string $plan_required
1507 1390 * @type string $upgrade_link
1508 1391 * }
1509 - *
1510 1392 * @return void
1511 1393 */
1512 1394 public static function show_conditional_action_button( $atts ) {
1513 1395 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1528,9 +1410,8 @@
1528 1410 */
1529 1411 public static function addon_upgrade_link( $addon, $upgrade_link ) {
1530 1412 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1531 1413 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1532 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1533 1414
1534 1415 if ( $addon ) {
1535 1416 $upgrade_link .= '&utm_content=' . $addon['slug'];
1536 1417 }
@@ -1540,19 +1421,16 @@
1540 1421 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1541 1422 }
1542 1423
1543 1424 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1544 -
1545 - if ( ! str_contains( $class, 'frm-button' ) ) {
1425 + if ( strpos( $class, 'frm-button' ) === false ) {
1546 1426 $class .= ' frm-button-secondary frm-button-sm';
1547 1427 }
1548 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1549 1428 ?>
1550 - <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 ?>
1551 - <?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' ); ?>
1552 1431 </a>
1553 1432 <?php
1554 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1555 1433 }
1556 1434
1557 1435 /**
1558 1436 * @since 3.04.02
@@ -1562,9 +1440,8 @@
1562 1440 public static function ajax_install_addon() {
1563 1441 self::install_addon_permissions();
1564 1442
1565 1443 $result = self::download_and_activate();
1566 -
1567 1444 if ( isset( $result['success'] ) && ! $result['success'] ) {
1568 1445 echo json_encode( $result );
1569 1446 wp_die();
1570 1447 }
@@ -1597,8 +1474,9 @@
1597 1474 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1598 1475
1599 1476 if ( ! is_array( $allowed_url_list ) ) {
1600 1477 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1478 +
1601 1479 return array();
1602 1480 }
1603 1481
1604 1482 return $allowed_url_list;
@@ -1608,10 +1486,8 @@
1608 1486 * Gets required plan for an addon.
1609 1487 *
1610 1488 * @since 6.4.2
1611 1489 *
1612 - * @param int|string $addon_id
1613 - *
1614 1490 * @return string Empty string if no plan is required for active license.
1615 1491 */
1616 1492 public static function get_addon_required_plan( $addon_id ) {
1617 1493 $api = new FrmFormApi();
@@ -1622,10 +1498,38 @@
1622 1498 $requires = FrmFormsHelper::get_plan_required( $dates );
1623 1499 }
1624 1500
1625 1501 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1626 - return '';
1502 + $requires = '';
1627 1503 }
1628 1504
1629 1505 return $requires;
1506 + }
1507 +
1508 + /**
1509 + * @since 4.02.05
1510 + * @deprecated 6.8.3
1511 + *
1512 + * @codeCoverageIgnore
1513 + *
1514 + * @return void
1515 + */
1516 + public static function connect_pro() {
1517 + _deprecated_function( __METHOD__, '6.8.3' );
1518 + }
1519 +
1520 + /**
1521 + * @since 4.08
1522 + * @deprecated 6.11.1
1523 + *
1524 + * @return bool|int false or the number of days until expiration.
1525 + */
1526 + public static function is_license_expiring() {
1527 + _deprecated_function( __METHOD__, '6.11.1', 'FrmProAddonsController::is_license_expiring' );
1528 +
1529 + if ( is_callable( 'FrmProAddonsController::is_license_expiring' ) ) {
1530 + return FrmProAddonsController::is_license_expiring();
1531 + }
1532 +
1533 + return false;
1630 1534 }
1631 1535 }