PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.10
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.10
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 +364 -469 6.336.10 View file →
@@ -7,95 +7,13 @@
7 7
8 8 /**
9 9 * @var string
10 10 */
11 - const SCRIPT_HANDLE = 'frm-addons-page';
12 -
13 - /**
14 - * @var array
15 - */
16 - private static $categories = array();
17 -
18 - /**
19 - * @var string
20 - */
21 - private static $request_addon_url;
22 -
23 - /**
24 - * @var string
25 - */
26 11 protected static $plugin;
27 12
28 13 /**
29 - * @since 6.15
30 - *
31 14 * @return void
32 15 */
33 - 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' );
36 -
37 - if ( ! FrmAppHelper::is_admin_page( 'formidable-addons' ) ) {
38 - return;
39 - }
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 - }
46 -
47 - /**
48 - * Enqueues the Add-Ons page scripts and styles.
49 - *
50 - * @since 6.15
51 - *
52 - * @return void
53 - */
54 - public static function enqueue_assets() {
55 - $plugin_url = FrmAppHelper::plugin_url();
56 - $version = FrmAppHelper::plugin_version();
57 - $js_dependencies = array(
58 - 'wp-i18n',
59 - // This prevents a console error "wp.hooks is undefined" in WP versions older than 5.7.
60 - 'wp-hooks',
61 - 'formidable_dom',
62 - );
63 -
64 - // Enqueue styles that needed.
65 - wp_enqueue_style( 'formidable-admin' );
66 - wp_enqueue_style( 'formidable-grids' );
67 -
68 - // Register and enqueue Add-Ons page style.
69 - wp_register_style( self::SCRIPT_HANDLE, $plugin_url . '/css/admin/addons-page.css', array(), $version );
70 - wp_enqueue_style( self::SCRIPT_HANDLE );
71 -
72 - // Register and enqueue Add-Ons page script.
73 - wp_register_script( self::SCRIPT_HANDLE, $plugin_url . '/js/addons-page.js', $js_dependencies, $version, true );
74 - wp_localize_script( self::SCRIPT_HANDLE, 'frmAddonsVars', self::get_js_variables() );
75 - wp_enqueue_script( self::SCRIPT_HANDLE );
76 - wp_set_script_translations( self::SCRIPT_HANDLE, 'formidable' );
77 -
78 - FrmAppHelper::dequeue_extra_global_scripts();
79 - }
80 -
81 - /**
82 - * Get the Add-Ons page JS variables as an array.
83 - *
84 - * @since 6.15
85 - *
86 - * @return array
87 - */
88 - private static function get_js_variables() {
89 - return array(
90 - 'proIsIncluded' => FrmAppHelper::pro_is_included(),
91 - 'addonRequestURL' => self::$request_addon_url,
92 - );
93 - }
94 -
95 - /**
96 - * @return void
97 - */
98 16 public static function menu() {
99 17 if ( ! current_user_can( 'activate_plugins' ) ) {
100 18 return;
101 19 }
@@ -100,37 +18,28 @@
100 18 return;
101 19 }
102 20
103 21 $label = __( 'Add-Ons', 'formidable' );
104 - $label = '<span style="color:#3FCA89">' . esc_html( $label ) . '</span>';
22 + $label = '<span style="color:#1da867">' . $label . '</span>';
105 23
106 24 add_submenu_page( 'formidable', 'Formidable | ' . __( 'Add-Ons', 'formidable' ), $label, 'frm_view_forms', 'formidable-addons', 'FrmAddonsController::list_addons' );
107 25
108 - // Remove default created subpage, make the page with highest priority as default.
26 + // remove default created subpage, make the page with highest priority as default.
109 27 remove_submenu_page( 'formidable', 'formidable' );
110 28
111 29 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 30 add_submenu_page(
119 31 'formidable',
120 32 'Formidable | ' . __( 'Upgrade', 'formidable' ),
121 - '<span class="frm-upgrade-submenu">' . esc_html( $cta_text ) . '</span>',
33 + '<span class="frm-upgrade-submenu">' . __( 'Upgrade', 'formidable' ) . '</span>',
122 34 'frm_view_forms',
123 35 'formidable-pro-upgrade',
124 - function () {
125 - // This function doesn't need to do anything.
126 - // The redirect is handled earlier to avoid issues with the headers being sent.
127 - }
36 + 'FrmAddonsController::upgrade_to_pro'
128 37 );
129 38 } elseif ( 'formidable-pro-upgrade' === FrmAppHelper::get_param( 'page' ) ) {
130 39 wp_safe_redirect( admin_url( 'admin.php?page=formidable' ) );
131 40 exit;
132 - }//end if
41 + }
133 42 }
134 43
135 44 /**
136 45 * @return void
@@ -136,32 +45,28 @@
136 45 * @return void
137 46 */
138 47 public static function list_addons() {
139 48 FrmAppHelper::include_svg();
49 + $installed_addons = apply_filters( 'frm_installed_addons', array() );
50 + $license_type = '';
140 51
141 - $view_path = FrmAppHelper::plugin_path() . '/classes/views/addons/';
142 - $installed_addons = apply_filters( 'frm_installed_addons', array() );
143 - $addons = self::get_api_addons();
144 - $errors = array();
145 - $license_type = '';
146 - $request_addon_url = self::$request_addon_url;
52 + $addons = self::get_api_addons();
53 + $errors = array();
147 54
148 55 if ( isset( $addons['error'] ) ) {
149 56 $api = new FrmFormApi();
150 57 $errors = $api->get_error_from_response( $addons );
151 - $license_type = $addons['error']['type'] ?? '';
58 + $license_type = isset( $addons['error']['type'] ) ? $addons['error']['type'] : '';
152 59 unset( $addons['error'] );
153 60 }
154 61
155 62 $pro = array(
156 63 'pro' => array(
157 - 'title' => 'Formidable Forms Pro',
158 - 'slug' => 'formidable-pro',
159 - 'released' => '2011-02-05',
160 - 'docs' => 'knowledgebase/what-is-the-difference-between-the-lite-free-and-pro-version/',
161 - 'docs_label' => __( 'Why Upgrade', 'formidable' ),
162 - 'categories' => array( 'basic', 'plus', 'business', 'elite' ),
163 - 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
64 + 'title' => 'Formidable Forms Pro',
65 + 'slug' => 'formidable-pro',
66 + 'released' => '2011-02-05',
67 + 'docs' => 'knowledgebase/',
68 + 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
164 69 ),
165 70 );
166 71 $addons = $pro + $addons;
167 72 self::prepare_addons( $addons );
@@ -167,114 +72,19 @@
167 72 self::prepare_addons( $addons );
168 73
169 74 $pricing = FrmAppHelper::admin_upgrade_link( 'addons' );
170 75
171 - self::organize_and_get_categories();
172 - $categories = self::$categories;
173 -
174 - include $view_path . 'index.php';
76 + include FrmAppHelper::plugin_path() . '/classes/views/addons/list.php';
175 77 }
176 78
177 79 /**
178 - * Organize and set categories.
179 - *
180 - * @since 6.15
181 - *
182 80 * @return void
183 81 */
184 - protected static function organize_and_get_categories() {
185 - unset( self::$categories['strategy11'] );
186 - ksort( self::$categories );
187 -
188 - $bottom_categories = array();
189 - $plans = FrmFormsHelper::get_license_types(
190 - array(
191 - 'include_all' => false,
192 - 'case_lower' => true,
193 - )
194 - );
195 -
196 - // Extract the elements to move
197 - foreach ( $plans as $plan ) {
198 - if ( ! isset( self::$categories[ $plan ] ) ) {
199 - continue;
200 - }
201 -
202 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
203 - unset( self::$categories[ $plan ] );
204 - }
205 -
206 - $special_categories = array();
207 -
208 - if ( 'elite' !== self::license_type() ) {
209 - $special_categories['available-addons'] = array(
210 - 'name' => __( 'Available', 'formidable' ),
211 - // To be assigned via JavaScript.
212 - 'count' => 0,
213 - );
214 - }
215 -
216 - $special_categories['active-addons'] = array(
217 - 'name' => __( 'Active', 'formidable' ),
218 - // To be assigned via JavaScript.
219 - 'count' => 0,
220 - );
221 -
222 - $special_categories['all-items'] = array(
223 - 'name' => __( 'All Add-Ons', 'formidable' ),
224 - // To be assigned via JavaScript.
225 - 'count' => 0,
226 - );
227 -
228 - self::$categories = array_merge(
229 - $special_categories,
230 - self::$categories,
231 - $bottom_categories
232 - );
233 - }
234 -
235 - /**
236 - * Organize and set categories.
237 - *
238 - * @since 6.15
239 - *
240 - * @param array $addon The addon array that will be modified by reference.
241 - *
242 - * @return void
243 - */
244 - protected static function set_categories( &$addon ) {
245 - if ( ! isset( $addon['categories'] ) ) {
246 - return;
247 - }
248 -
249 - $addon['category-slugs'] = array();
250 -
251 - foreach ( $addon['categories'] as $category ) {
252 - $category = FrmFormsHelper::convert_legacy_package_names( $category );
253 - $category_slug = sanitize_title( $category );
254 -
255 - // Add the slug to the new array.
256 - $addon['category-slugs'][] = $category_slug;
257 -
258 - if ( ! isset( self::$categories[ $category_slug ] ) ) {
259 - self::$categories[ $category_slug ] = array(
260 - 'name' => $category,
261 - 'count' => 0,
262 - );
263 - }
264 -
265 - ++self::$categories[ $category_slug ]['count'];
266 - }
267 - }
268 -
269 - /**
270 - * @return void
271 - */
272 82 public static function license_settings() {
273 83 $plugins = apply_filters( 'frm_installed_addons', array() );
84 + if ( empty( $plugins ) ) {
85 + esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
274 86
275 - if ( ! $plugins ) {
276 - esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
277 87 return;
278 88 }
279 89
280 90 ksort( $plugins );
@@ -288,15 +98,15 @@
288 98 protected static function get_api_addons() {
289 99 $api = new FrmFormApi();
290 100 $addons = $api->get_api_info();
291 101
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 ] );
102 + if ( empty( $addons ) ) {
103 + $addons = self::fallback_plugin_list();
104 + } else {
105 + foreach ( $addons as $k => $addon ) {
106 + if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
107 + unset( $addons[ $k ] );
108 + }
299 109 }
300 110 }
301 111
302 112 return $addons;
@@ -309,9 +119,11 @@
309 119 *
310 120 * @return int Count of addons.
311 121 */
312 122 public static function get_addons_count() {
313 - return count( self::get_api_addons() );
123 + $addons = self::get_api_addons();
124 +
125 + return count( $addons );
314 126 }
315 127
316 128 /**
317 129 * If the API is unable to connect, show something on the addons page
@@ -316,9 +128,8 @@
316 128 /**
317 129 * If the API is unable to connect, show something on the addons page
318 130 *
319 131 * @since 3.04.03
320 - *
321 132 * @return array
322 133 */
323 134 protected static function fallback_plugin_list() {
324 135 $list = array(
@@ -329,19 +140,19 @@
329 140 '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 141 ),
331 142 'mailchimp' => array(
332 143 '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
144 + '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 145 ),
335 146 'registration' => array(
336 147 'title' => 'User Registration Forms',
337 148 '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
149 + '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 150 ),
340 151 'paypal' => array(
341 152 'title' => 'PayPal Standard Forms',
342 153 '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
154 + '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 155 ),
345 156 'stripe' => array(
346 157 'title' => 'Stripe Forms',
347 158 'docs' => 'knowledgebase/stripe/',
@@ -373,9 +184,9 @@
373 184 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
374 185 ),
375 186 'zapier' => array(
376 187 '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
188 + '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 189 ),
379 190 'signature' => array(
380 191 'title' => 'Digital Signature Forms',
381 192 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -408,9 +219,8 @@
408 219 foreach ( $list as $k => $info ) {
409 220 $info['slug'] = $k;
410 221 $list[ $k ] = array_merge( $defaults, $info );
411 222 }
412 -
413 223 return $list;
414 224 }
415 225
416 226 /**
@@ -416,28 +226,25 @@
416 226 /**
417 227 * If Pro is missing but has been authenticated, include a download URL
418 228 *
419 229 * @since 3.04.03
420 - *
421 230 * @return string
422 231 */
423 232 public static function get_pro_download_url() {
424 - $api = new FrmFormApi( self::get_pro_license() );
233 + $license = self::get_pro_license();
234 + $api = new FrmFormApi( $license );
425 235 $downloads = $api->get_api_info();
426 236 $pro = self::get_pro_from_addons( $downloads );
427 237
428 - return $pro['url'] ?? '';
238 + return isset( $pro['url'] ) ? $pro['url'] : '';
429 239 }
430 240
431 241 /**
432 242 * @since 4.08
433 - *
434 - * @return string
435 243 */
436 244 public static function get_pro_license() {
437 245 $pro_cred_store = 'frmpro-credentials';
438 246 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
439 -
440 247 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
441 248 $creds = get_site_option( $pro_cred_store );
442 249 } else {
443 250 $creds = get_option( $pro_cred_store );
@@ -447,18 +254,16 @@
447 254 return '';
448 255 }
449 256
450 257 $license = $creds['license'];
451 -
452 - if ( ! $license ) {
258 + if ( empty( $license ) ) {
453 259 return '';
454 260 }
455 261
456 - if ( str_contains( $license, '-' ) ) {
457 - // This is a fix for licenses saved in the past
458 - return strtoupper( $license );
262 + if ( strpos( $license, '-' ) ) {
263 + // this is a fix for licenses saved in the past
264 + $license = strtoupper( $license );
459 265 }
460 -
461 266 return $license;
462 267 }
463 268
464 269 /**
@@ -464,26 +269,20 @@
464 269 /**
465 270 * @since 4.08
466 271 *
467 272 * @param array $addons
468 - *
469 273 * @return array
470 274 */
471 275 protected static function get_pro_from_addons( $addons ) {
472 - return $addons['93790'] ?? array();
276 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
473 277 }
474 278
475 279 /**
476 280 * @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 281 */
483 - public static function license_type( $force_type = false ) {
282 + public static function license_type() {
484 283 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
485 - return FrmProAddonsController::license_type( $force_type );
284 + return FrmProAddonsController::license_type();
486 285 }
487 286
488 287 return 'free';
489 288 }
@@ -488,45 +287,8 @@
488 287 return 'free';
489 288 }
490 289
491 290 /**
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 291 * @since 4.0.01
530 292 *
531 293 * @return bool
532 294 */
@@ -531,21 +293,18 @@
531 293 * @return bool
532 294 */
533 295 public static function is_license_expired() {
534 296 $version_info = self::get_primary_license_info();
535 -
536 297 if ( ! isset( $version_info['error'] ) ) {
537 298 return false;
538 299 }
539 300
540 - $expires = $version_info['error']['expires'] ?? 0;
541 -
542 - if ( ! $expires || $expires > time() ) {
301 + $expires = isset( $version_info['error']['expires'] ) ? $version_info['error']['expires'] : 0;
302 + if ( empty( $expires ) || $expires > time() ) {
543 303 return false;
544 304 }
545 305
546 306 $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
547 -
548 307 if ( $rate_limited ) {
549 308 // Do not return false positives for rate limited responses.
550 309 return false;
551 310 }
@@ -554,8 +313,21 @@
554 313 }
555 314
556 315 /**
557 316 * @since 4.08
317 + *
318 + * @return bool|int false or the number of days until expiration.
319 + */
320 + public static function is_license_expiring() {
321 + if ( is_callable( 'FrmProAddonsController::is_license_expiring' ) ) {
322 + return FrmProAddonsController::is_license_expiring();
323 + }
324 +
325 + return false;
326 + }
327 +
328 + /**
329 + * @since 4.08
558 330 * @since 6.7 This is public.
559 331 *
560 332 * @return array|false
561 333 */
@@ -560,13 +332,11 @@
560 332 * @return array|false
561 333 */
562 334 public static function get_primary_license_info() {
563 335 $installed_addons = apply_filters( 'frm_installed_addons', array() );
564 -
565 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
336 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
566 337 return false;
567 338 }
568 -
569 339 $installed_addons = array(
570 340 'formidable_pro' => $installed_addons['formidable_pro'],
571 341 );
572 342
@@ -574,12 +344,8 @@
574 344 }
575 345
576 346 /**
577 347 * @since 3.04.03
578 - *
579 - * @param mixed $transient
580 - *
581 - * @return object
582 348 */
583 349 public static function check_update( $transient ) {
584 350 if ( ! FrmAppHelper::pro_is_installed() ) {
585 351 // Don't make any changes if only Lite is installed.
@@ -590,10 +356,9 @@
590 356 $transient = new stdClass();
591 357 }
592 358
593 359 $installed_addons = apply_filters( 'frm_installed_addons', array() );
594 -
595 - if ( ! $installed_addons ) {
360 + if ( empty( $installed_addons ) ) {
596 361 return $transient;
597 362 }
598 363
599 364 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -607,20 +372,19 @@
607 372 continue;
608 373 }
609 374
610 375 $folder = $plugin->plugin;
611 -
612 - if ( ! $folder ) {
376 + if ( empty( $folder ) ) {
613 377 continue;
614 378 }
615 379
616 380 if ( ! self::is_installed( $folder ) ) {
617 - // Don't show an update if the plugin isn't installed
381 + // don't show an update if the plugin isn't installed
618 382 continue;
619 383 }
620 384
621 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
622 - $wp_version = $wp_plugin['Version'] ?? '1.0';
385 + $wp_plugin = isset( $wp_plugins[ $folder ] ) ? $wp_plugins[ $folder ] : array();
386 + $wp_version = isset( $wp_plugin['Version'] ) ? $wp_plugin['Version'] : '1.0';
623 387 $plugin->slug = explode( '/', $folder )[0];
624 388
625 389 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
626 390 $transient->response[ $folder ] = $plugin;
@@ -628,8 +392,9 @@
628 392 $transient->no_update[ $folder ] = $plugin;
629 393 }
630 394
631 395 $transient->checked[ $folder ] = $wp_version;
396 +
632 397 }//end foreach
633 398
634 399 return $transient;
635 400 }
@@ -639,9 +404,8 @@
639 404 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
640 405 * 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 406 *
642 407 * @since 5.5.2
643 - *
644 408 * @return array
645 409 */
646 410 protected static function get_plugins() {
647 411 if ( ! function_exists( 'get_plugins' ) ) {
@@ -676,49 +440,43 @@
676 440 $version_info = array();
677 441
678 442 foreach ( $installed_addons as $addon ) {
679 443 if ( $addon->store_url !== 'https://formidableforms.com' ) {
680 - // Check if this is a third-party addon
444 + // check if this is a third-party addon
681 445 continue;
682 446 }
683 447
684 448 $new_license = $addon->license;
685 -
686 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
449 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
687 450 continue;
688 451 }
689 452
690 453 $checked_licenses[] = $new_license;
691 - $api = new FrmFormApi( $new_license );
692 454
693 - if ( ! $version_info ) {
455 + $api = new FrmFormApi( $new_license );
456 + if ( empty( $version_info ) ) {
694 457 $version_info = $api->get_api_info();
695 458 continue;
696 459 }
697 460
698 461 $plugin = $api->get_addon_for_license( $addon, $version_info );
699 -
700 - if ( ! $plugin ) {
462 + if ( empty( $plugin ) ) {
701 463 continue;
702 464 }
703 465
704 - $download_id = $plugin['id'] ?? 0;
466 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
467 + if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
468 + // if this addon is using its own license, get the update url
469 + $addon_info = $api->get_api_info();
705 470
706 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
707 - continue;
471 + $version_info[ $download_id ] = $addon_info[ $download_id ];
472 + if ( isset( $addon_info['error'] ) ) {
473 + $version_info[ $download_id ]['error'] = array(
474 + 'message' => $addon_info['error']['message'],
475 + 'code' => $addon_info['error']['code'],
476 + );
477 + }
708 478 }
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 479 }//end foreach
722 480
723 481 return $version_info;
724 482 }
@@ -726,11 +484,9 @@
726 484 /**
727 485 * Get the action link for an addon that isn't active.
728 486 *
729 487 * @since 3.06.03
730 - *
731 488 * @param string $plugin The plugin slug.
732 - *
733 489 * @return array
734 490 */
735 491 public static function install_link( $plugin ) {
736 492 $link = array();
@@ -752,9 +508,9 @@
752 508 'categories' => $addon['categories'],
753 509 );
754 510 }
755 511
756 - if ( $link ) {
512 + if ( ! empty( $link ) ) {
757 513 $link['status'] = $addon['status']['type'];
758 514 }
759 515 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
760 516 $link = array(
@@ -766,81 +522,34 @@
766 522 return $link;
767 523 }
768 524
769 525 /**
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 526 * @since 4.09
810 - *
811 527 * @param string $plugin The plugin slug.
812 - *
813 528 * @return array|false
814 529 */
815 530 public static function get_addon( $plugin ) {
816 531 $addons = self::get_api_addons();
817 532 self::prepare_addons( $addons );
818 -
819 533 foreach ( $addons as $addon ) {
820 534 $slug = explode( '/', $addon['plugin'] );
821 -
822 535 if ( $slug[0] === 'formidable-' . $plugin ) {
823 536 return $addon;
824 537 }
825 538 }
826 -
827 539 return false;
828 540 }
829 541
830 542 /**
831 543 * @since 4.09
832 - *
833 544 * @return string
834 545 */
835 546 protected static function get_license_type() {
836 547 $license_type = '';
837 548 $addons = self::get_api_addons();
838 -
839 549 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
840 - return $addons['error']['type'];
550 + $license_type = $addons['error']['type'];
841 551 }
842 -
843 552 return $license_type;
844 553 }
845 554
846 555 /**
@@ -853,12 +562,11 @@
853 562 */
854 563 public static function get_addon_for_license( $addons, $license ) {
855 564 $download_id = $license->download_id;
856 565 $plugin = array();
857 -
858 - if ( ! $download_id && $addons ) {
566 + if ( empty( $download_id ) && ! empty( $addons ) ) {
859 567 foreach ( $addons as $addon ) {
860 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
568 + if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
861 569 return $addon;
862 570 }
863 571 }
864 572 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -868,33 +576,29 @@
868 576 return $plugin;
869 577 }
870 578
871 579 /**
872 - * @param array $addons
873 - *
874 580 * @return void
875 581 */
876 582 protected static function prepare_addons( &$addons ) {
877 - // Reset categories to prevent count accumulation across multiple calls.
878 - self::$categories = array();
879 -
880 583 $activate_url = '';
881 -
882 584 if ( current_user_can( 'activate_plugins' ) ) {
883 585 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
884 586 }
885 587
886 588 $loop_addons = $addons;
887 -
888 589 foreach ( $loop_addons as $id => $addon ) {
889 590 if ( is_numeric( $id ) ) {
890 591 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
891 592 $file_name = $addon['plugin'];
892 593 } else {
893 - $slug = $id;
894 - $base_file = $addon['file'] ?? 'formidable-' . $slug;
594 + $slug = $id;
595 + if ( isset( $addon['file'] ) ) {
596 + $base_file = $addon['file'];
597 + } else {
598 + $base_file = 'formidable-' . $slug;
599 + }
895 600 $file_name = $base_file . '/' . $base_file . '.php';
896 -
897 601 if ( ! isset( $addon['plugin'] ) ) {
898 602 $addon['plugin'] = $file_name;
899 603 }
900 604 }
@@ -899,17 +603,10 @@
899 603 }
900 604 }
901 605
902 606 $addon['installed'] = self::is_installed( $file_name );
903 -
904 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
905 - unset( $addons[ $id ] );
906 - continue;
907 - }
908 -
909 607 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
910 608 $active_views_version = self::get_active_views_version();
911 -
912 609 if ( false !== $active_views_version && $slug !== $active_views_version ) {
913 610 $addon['installed'] = false;
914 611 }
915 612 }
@@ -915,9 +612,9 @@
915 612 }
916 613
917 614 $addon['activate_url'] = '';
918 615
919 - if ( $addon['installed'] && $activate_url && ! self::is_plugin_active( $file_name, $slug ) ) {
616 + if ( $addon['installed'] && ! empty( $activate_url ) && ! self::is_plugin_active( $file_name, $slug ) ) {
920 617 $addon['activate_url'] = add_query_arg(
921 618 array(
922 619 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
923 620 'plugin' => $file_name,
@@ -933,21 +630,16 @@
933 630
934 631 if ( ! isset( $addon['link'] ) ) {
935 632 $addon['link'] = 'downloads/' . $slug . '/';
936 633 }
634 + self::prepare_addon_link( $addon['link'] );
937 635
938 - self::prepare_addon_link( $addon['link'] );
939 636 self::set_addon_status( $addon );
940 - self::set_categories( $addon );
941 -
942 637 $addons[ $id ] = $addon;
943 638 }//end foreach
944 639 }
945 640
946 641 /**
947 - * @param string $file_name
948 - * @param string $slug
949 - *
950 642 * @return bool
951 643 */
952 644 private static function is_plugin_active( $file_name, $slug ) {
953 645 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -962,9 +654,8 @@
962 654 private static function get_active_views_version() {
963 655 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
964 656 return false;
965 657 }
966 -
967 658 $plugin_version = FrmViewsAppHelper::plugin_version();
968 659 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
969 660 }
970 661
@@ -970,25 +661,22 @@
970 661
971 662 /**
972 663 * @since 3.04.02
973 664 *
974 - * @param string $link
975 - *
976 665 * @return void
977 666 */
978 667 protected static function prepare_addon_link( &$link ) {
979 668 $site_url = 'https://formidableforms.com/';
980 -
981 - if ( ! str_starts_with( $link, 'http' ) ) {
669 + if ( strpos( $link, 'http' ) !== 0 ) {
982 670 $link = $site_url . $link;
983 671 }
984 -
985 - $link = FrmAppHelper::make_affiliate_url( $link );
986 -
987 - $utm = array(
988 - 'campaign' => 'addons',
672 + $link = FrmAppHelper::make_affiliate_url( $link );
673 + $query_args = array(
674 + 'utm_source' => 'WordPress',
675 + 'utm_medium' => 'addons',
676 + 'utm_campaign' => 'liteplugin',
989 677 );
990 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
678 + $link = add_query_arg( $query_args, $link );
991 679 }
992 680
993 681 /**
994 682 * Add the status to the addon array. Status options are:
@@ -995,10 +683,8 @@
995 683 * installed, active, not installed
996 684 *
997 685 * @since 3.04.02
998 686 *
999 - * @param array $addon
1000 - *
1001 687 * @return void
1002 688 */
1003 689 protected static function set_addon_status( &$addon ) {
1004 690 if ( ! empty( $addon['activate_url'] ) ) {
@@ -1019,8 +705,218 @@
1019 705 }
1020 706 }
1021 707
1022 708 /**
709 + * @return void
710 + */
711 + public static function upgrade_to_pro() {
712 + FrmAppHelper::include_svg();
713 +
714 + $link_parts = array(
715 + 'medium' => 'upgrade',
716 + 'content' => 'button',
717 + );
718 +
719 + $features = array(
720 + 'Display Entries' => array(
721 + array(
722 + 'label' => 'Display form data with virtually limitless views',
723 + 'link' => array(
724 + 'content' => 'views',
725 + 'param' => 'views-display-form-data',
726 + ),
727 + 'lite' => false,
728 + ),
729 + array(
730 + 'label' => 'Generate graphs and stats based on your submitted data',
731 + 'link' => array(
732 + 'content' => 'graphs',
733 + 'param' => 'statistics-graphs-wordpress-forms',
734 + ),
735 + 'lite' => false,
736 + ),
737 + ),
738 + 'Entry Management' => array(
739 + array(
740 + 'label' => 'Import entries from a CSV',
741 + 'link' => array(
742 + 'content' => 'import-entries',
743 + 'param' => 'importing-exporting-wordpress-forms',
744 + ),
745 + 'lite' => false,
746 + ),
747 + array(
748 + 'label' => 'Logged-in users can save drafts and return later',
749 + 'link' => array(
750 + 'content' => 'save-drafts',
751 + 'param' => 'save-drafts-wordpress-form',
752 + ),
753 + 'lite' => false,
754 + ),
755 + array(
756 + 'label' => 'Flexibly and powerfully view, edit, and delete entries from anywhere on your site',
757 + 'link' => array(
758 + 'content' => 'front-edit',
759 + 'param' => 'wordpress-front-end-editing',
760 + ),
761 + 'lite' => false,
762 + ),
763 + array(
764 + 'label' => 'View form submissions from the back-end',
765 + 'lite' => true,
766 + ),
767 + array(
768 + 'label' => 'Export your entries to a CSV',
769 + 'lite' => true,
770 + ),
771 + ),
772 + 'Form Building' => array(
773 + array(
774 + 'label' => 'Save a calculated value into a field',
775 + 'link' => array(
776 + 'content' => 'calculations',
777 + 'param' => 'field-calculations-wordpress-form',
778 + ),
779 + 'lite' => false,
780 + ),
781 + array(
782 + 'label' => 'Allow multiple file uploads',
783 + 'link' => array(
784 + 'content' => 'file-uploads',
785 + 'param' => 'wordpress-multi-file-upload-fields',
786 + ),
787 + 'lite' => false,
788 + ),
789 + array(
790 + 'label' => 'Repeat sections of fields',
791 + 'link' => array(
792 + 'content' => 'repeaters',
793 + 'param' => 'repeatable-sections-forms',
794 + ),
795 + 'lite' => false,
796 + ),
797 + array(
798 + 'label' => 'Hide and show fields conditionally based on other fields or the user\'s role',
799 + 'link' => array(
800 + 'content' => 'conditional-logic',
801 + 'param' => 'conditional-logic-wordpress-forms',
802 + ),
803 + 'lite' => false,
804 + ),
805 + array(
806 + 'label' => 'Confirmation fields',
807 + 'link' => array(
808 + 'content' => 'confirmation-fields',
809 + 'param' => 'confirmation-fields-wordpress-forms',
810 + ),
811 + 'lite' => false,
812 + ),
813 + array(
814 + 'label' => 'Multi-paged forms',
815 + 'link' => array(
816 + 'content' => 'page-breaks',
817 + 'param' => 'wordpress-multi-page-forms',
818 + ),
819 + 'lite' => false,
820 + ),
821 + array(
822 + 'label' => 'Include section headings, page breaks, rich text, dates, times, scales, star ratings, sliders, toggles, dynamic fields populated from other forms, passwords, and tags in advanced forms.',
823 + 'lite' => false,
824 + ),
825 + array(
826 + 'label' => 'Include text, email, url, paragraph text, radio, checkbox, dropdown fields, hidden fields, user ID fields, and HTML blocks in your form.',
827 + 'lite' => true,
828 + ),
829 + array(
830 + 'label' => 'Drag & Drop Form building',
831 + 'link' => array(
832 + 'content' => 'drag-drop',
833 + 'param' => 'drag-drop-forms',
834 + ),
835 + 'lite' => true,
836 + ),
837 + array(
838 + 'label' => 'Create forms from Templates',
839 + 'link' => array(
840 + 'content' => 'form-templates',
841 + 'param' => 'wordpress-form-templates',
842 + ),
843 + 'lite' => true,
844 + ),
845 + array(
846 + 'label' => 'Import and export forms with XML',
847 + 'link' => array(
848 + 'content' => 'import',
849 + 'param' => 'importing-exporting-wordpress-forms',
850 + ),
851 + 'lite' => true,
852 + ),
853 + array(
854 + 'label' => 'Use input placeholder text in your fields that clear when typing starts.',
855 + 'lite' => true,
856 + ),
857 + ),
858 + 'Form Actions' => array(
859 + array(
860 + 'label' => 'Conditionally send your email notifications based on values in your form',
861 + 'link' => array(
862 + 'content' => 'conditional-emails',
863 + ),
864 + 'lite' => false,
865 + ),
866 + array(
867 + 'label' => 'Create and edit WordPress posts or custom posts from the front-end',
868 + 'link' => array(
869 + 'content' => 'create-posts',
870 + 'param' => 'create-posts-pages-wordpress-forms',
871 + ),
872 + 'lite' => false,
873 + ),
874 + array(
875 + 'label' => 'Send multiple emails and autoresponders',
876 + 'link' => array(
877 + 'content' => 'multiple-emails',
878 + 'param' => 'virtually-unlimited-emails',
879 + ),
880 + 'lite' => true,
881 + ),
882 + ),
883 + 'Form Appearance' => array(
884 + array(
885 + 'label' => 'Create Multiple styles for different forms',
886 + 'link' => array(
887 + 'content' => 'multiple-styles',
888 + 'param' => 'wordpress-visual-form-styler',
889 + ),
890 + 'lite' => false,
891 + ),
892 + array(
893 + 'label' => 'Customizable layout with CSS classes',
894 + 'link' => array(
895 + 'content' => 'form-layout',
896 + 'param' => 'wordpress-mobile-friendly-forms',
897 + ),
898 + 'lite' => true,
899 + ),
900 + array(
901 + 'label' => 'Customize the HTML for your forms',
902 + 'link' => array(
903 + 'content' => 'custom-html',
904 + 'param' => 'customizable-html-wordpress-form',
905 + ),
906 + 'lite' => true,
907 + ),
908 + array(
909 + 'label' => 'Style your form with the Visual Form Styler',
910 + 'lite' => true,
911 + ),
912 + ),
913 + );
914 +
915 + include FrmAppHelper::plugin_path() . '/classes/views/addons/upgrade_to_pro.php';
916 + }
917 +
918 + /**
1023 919 * @since 5.5.2
1024 920 *
1025 921 * @param string $plugin
1026 922 * @param string $redirect
@@ -1025,9 +921,8 @@
1025 921 * @param string $plugin
1026 922 * @param string $redirect
1027 923 * @param bool $network_wide
1028 924 * @param bool $silent
1029 - *
1030 925 * @return WP_Error|null Null on success, WP_Error on invalid file.
1031 926 */
1032 927 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
1033 928 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -1042,9 +937,8 @@
1042 937 * @since 6.8
1043 938 *
1044 939 * @param string $plugin
1045 940 * @param bool $silent
1046 - *
1047 941 * @return void
1048 942 */
1049 943 protected static function deactivate_plugin( $plugin, $silent = false ) {
1050 944 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1058,9 +952,8 @@
1058 952 *
1059 953 * @since 6.8
1060 954 *
1061 955 * @param string $plugin
1062 - *
1063 956 * @return true|WP_Error True on success, WP_Error on invalid file.
1064 957 */
1065 958 protected static function uninstall_plugin( $plugin ) {
1066 959 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1073,9 +966,13 @@
1073 966
1074 967 self::deactivate_plugin( $plugin, true );
1075 968 $result = delete_plugins( array( $plugin ) );
1076 969
1077 - return is_wp_error( $result ) ? $result : true;
970 + if ( is_wp_error( $result ) ) {
971 + return $result;
972 + }
973 +
974 + return true;
1078 975 }
1079 976
1080 977 /**
1081 978 * @since 5.0.10
@@ -1082,9 +979,9 @@
1082 979 *
1083 980 * @return string
1084 981 */
1085 982 protected static function get_current_plugin() {
1086 - if ( ! self::$plugin ) {
983 + if ( empty( self::$plugin ) ) {
1087 984 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1088 985 }
1089 986 return self::$plugin;
1090 987 }
@@ -1091,9 +988,9 @@
1091 988
1092 989 /**
1093 990 * @since 4.08
1094 991 *
1095 - * @return mixed[]|null
992 + * @return array|void
1096 993 */
1097 994 protected static function download_and_activate() {
1098 995 if ( is_admin() ) {
1099 996 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1101,14 +998,12 @@
1101 998
1102 999 self::maybe_show_cred_form();
1103 1000
1104 1001 $installed = self::install_addon();
1105 -
1106 1002 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1107 1003 return $installed;
1108 1004 }
1109 1005 self::handle_addon_action( $installed, 'activate' );
1110 - return null;
1111 1006 }
1112 1007
1113 1008 /**
1114 1009 * @since 3.04.02
@@ -1119,9 +1014,9 @@
1119 1014 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1120 1015 include_once ABSPATH . 'wp-admin/includes/file.php';
1121 1016 }
1122 1017
1123 - // Start output buffering to catch the filesystem form if credentials are needed.
1018 + // Start output bufferring to catch the filesystem form if credentials are needed.
1124 1019 ob_start();
1125 1020
1126 1021 $show_form = false;
1127 1022 $method = '';
@@ -1138,8 +1033,9 @@
1138 1033
1139 1034 if ( $show_form ) {
1140 1035 $form = ob_get_clean();
1141 1036 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
1037 + $data = $form;
1142 1038 $response = array(
1143 1039 'success' => false,
1144 1040 'message' => $message,
1145 1041 'form' => $form,
@@ -1167,10 +1063,8 @@
1167 1063 * We do not need any extra credentials if we have gotten this far,
1168 1064 * so let's install the plugin.
1169 1065 *
1170 1066 * @since 3.04.02
1171 - *
1172 - * @return array|string
1173 1067 */
1174 1068 protected static function install_addon() {
1175 1069 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1176 1070
@@ -1184,15 +1078,14 @@
1184 1078 }
1185 1079
1186 1080 // Create the plugin upgrader with our custom skin.
1187 1081 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1188 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1082 + $installer->install( $download_url );
1189 1083
1190 1084 // Flush the cache and return the newly installed plugin basename.
1191 1085 wp_cache_flush();
1192 1086
1193 1087 $plugin = $installer->plugin_info();
1194 -
1195 1088 if ( ! $plugin ) {
1196 1089 return array(
1197 1090 'message' => 'Plugin was not installed. ' . $installer->result,
1198 1091 'success' => false,
@@ -1197,9 +1090,8 @@
1197 1090 'message' => 'Plugin was not installed. ' . $installer->result,
1198 1091 'success' => false,
1199 1092 );
1200 1093 }
1201 -
1202 1094 return $plugin;
1203 1095 }
1204 1096
1205 1097 /**
@@ -1263,9 +1155,8 @@
1263 1155 * @since 6.8
1264 1156 *
1265 1157 * @param callable $action_callback The specific add-on action to be executed.
1266 1158 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1267 - *
1268 1159 * @return void
1269 1160 */
1270 1161 private static function process_addon_action( $action_callback, $response_callback = null ) {
1271 1162 self::install_addon_permissions();
@@ -1288,14 +1179,13 @@
1288 1179 * @since 6.8
1289 1180 *
1290 1181 * @param string $installed The plugin folder name with file name.
1291 1182 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1292 - *
1293 - * @return mixed[]|null
1183 + * @return array|void
1294 1184 */
1295 1185 protected static function handle_addon_action( $installed, $action ) {
1296 1186 if ( ! $installed || ! $action ) {
1297 - return null;
1187 + return;
1298 1188 }
1299 1189
1300 1190 $result = null;
1301 1191 switch ( $action ) {
@@ -1315,9 +1205,8 @@
1315 1205 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1316 1206 if ( wp_doing_ajax() ) {
1317 1207 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1318 1208 }
1319 -
1320 1209 return array(
1321 1210 'message' => $result->get_error_message(),
1322 1211 'success' => false,
1323 1212 );
@@ -1331,14 +1220,17 @@
1331 1220 * @return array
1332 1221 */
1333 1222 private static function get_addon_activation_response() {
1334 1223 $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 1224
1337 - return array(
1225 + $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' );
1226 +
1227 + $response = array(
1338 1228 'message' => $message,
1339 1229 'saveAndReload' => $activating_page,
1340 1230 );
1231 +
1232 + return $response;
1341 1233 }
1342 1234
1343 1235 /**
1344 1236 * Return a string that reflects the page from which the addon is being activated on,
@@ -1347,14 +1239,17 @@
1347 1239 * @return string
1348 1240 */
1349 1241 private static function get_activating_page() {
1350 1242 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1243 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1244 + return 'settings';
1245 + }
1351 1246
1352 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1353 - return 'settings';
1247 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1248 + return 'form_builder';
1354 1249 }
1355 1250
1356 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1251 + return '';
1357 1252 }
1358 1253
1359 1254 /**
1360 1255 * Run security checks before installing
@@ -1365,14 +1260,12 @@
1365 1260 */
1366 1261 protected static function install_addon_permissions() {
1367 1262 check_ajax_referer( 'frm_ajax', 'nonce' );
1368 1263
1369 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1370 - return;
1264 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1265 + echo json_encode( true );
1266 + wp_die();
1371 1267 }
1372 -
1373 - echo json_encode( true );
1374 - wp_die();
1375 1268 }
1376 1269
1377 1270 /**
1378 1271 * @since 4.08
@@ -1380,14 +1273,12 @@
1380 1273 * @return string
1381 1274 */
1382 1275 public static function connect_link() {
1383 1276 $auth = get_option( 'frm_connect_token' );
1384 -
1385 - if ( ! $auth ) {
1277 + if ( empty( $auth ) ) {
1386 1278 $auth = hash( 'sha512', wp_rand() );
1387 - update_option( 'frm_connect_token', $auth, false );
1279 + update_option( 'frm_connect_token', $auth, 'no' );
1388 1280 }
1389 -
1390 1281 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1391 1282 $link = 'https://formidableforms.com/api-connect/';
1392 1283 $args = array(
1393 1284 'v' => 2,
@@ -1415,10 +1306,9 @@
1415 1306 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1416 1307
1417 1308 // The download link is not required if already installed.
1418 1309 $is_installed = FrmAppHelper::pro_is_included();
1419 - $file_missing = ! $is_installed && ! $post_url;
1420 -
1310 + $file_missing = ! $is_installed && empty( $post_url );
1421 1311 if ( ! $post_auth || $file_missing ) {
1422 1312 return false;
1423 1313 }
1424 1314
@@ -1423,9 +1313,13 @@
1423 1313 }
1424 1314
1425 1315 // Verify auth.
1426 1316 $auth = get_option( 'frm_connect_token' );
1427 - return $auth && hash_equals( $auth, $post_auth );
1317 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1318 + return false;
1319 + }
1320 +
1321 + return true;
1428 1322 }
1429 1323
1430 1324 /**
1431 1325 * Install and/or activate the add-on file.
@@ -1436,17 +1330,17 @@
1436 1330 */
1437 1331 public static function install_addon_api() {
1438 1332 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1439 1333
1334 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1335 +
1440 1336 // Delete so cannot replay.
1441 1337 delete_option( 'frm_connect_token' );
1442 1338
1443 1339 // It's already installed and active.
1444 1340 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1445 -
1446 1341 if ( is_wp_error( $active ) ) {
1447 1342 $response = self::maybe_download_and_activate();
1448 -
1449 1343 if ( is_array( $response ) ) {
1450 1344 // The download failed.
1451 1345 return $response;
1452 1346 }
@@ -1452,12 +1346,11 @@
1452 1346 }
1453 1347 }
1454 1348
1455 1349 // If empty license, save it now.
1456 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1350 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1457 1351 load_formidable_pro();
1458 1352 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1459 -
1460 1353 if ( ! $license ) {
1461 1354 return array(
1462 1355 'success' => false,
1463 1356 'error' => 'That site does not have a valid license key.',
@@ -1464,9 +1357,8 @@
1464 1357 );
1465 1358 }
1466 1359
1467 1360 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1468 -
1469 1361 if ( ! $response['success'] ) {
1470 1362 // Could not activate license.
1471 1363 return $response;
1472 1364 }
@@ -1491,9 +1383,8 @@
1491 1383 }
1492 1384
1493 1385 // Download plugin now.
1494 1386 $response = self::download_and_activate();
1495 -
1496 1387 if ( is_array( $response ) && isset( $response['success'] ) ) {
1497 1388 // The download failed.
1498 1389 return $response;
1499 1390 }
@@ -1507,9 +1398,8 @@
1507 1398 * @since 4.09
1508 1399 *
1509 1400 * @param string $plugin
1510 1401 * @param array|string $upgrade_link_args
1511 - *
1512 1402 * @return void
1513 1403 */
1514 1404 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1515 1405 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1544,9 +1434,8 @@
1544 1434 * @type false|string $license_type
1545 1435 * @type string $plan_required
1546 1436 * @type string $upgrade_link
1547 1437 * }
1548 - *
1549 1438 * @return void
1550 1439 */
1551 1440 public static function show_conditional_action_button( $atts ) {
1552 1441 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1564,12 +1453,11 @@
1564 1453 * @param array|string $upgrade_link
1565 1454 *
1566 1455 * @return void
1567 1456 */
1568 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1457 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1569 1458 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1570 1459 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1571 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1572 1460
1573 1461 if ( $addon ) {
1574 1462 $upgrade_link .= '&utm_content=' . $addon['slug'];
1575 1463 }
@@ -1579,19 +1467,16 @@
1579 1467 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1580 1468 }
1581 1469
1582 1470 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1583 -
1584 - if ( ! str_contains( $class, 'frm-button' ) ) {
1471 + if ( strpos( $class, 'frm-button' ) === false ) {
1585 1472 $class .= ' frm-button-secondary frm-button-sm';
1586 1473 }
1587 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1588 1474 ?>
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 ?>
1590 - <?php echo esc_html( $text ); ?>
1475 + <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' ); ?>">
1476 + <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
1591 1477 </a>
1592 1478 <?php
1593 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1594 1479 }
1595 1480
1596 1481 /**
1597 1482 * @since 3.04.02
@@ -1601,9 +1486,8 @@
1601 1486 public static function ajax_install_addon() {
1602 1487 self::install_addon_permissions();
1603 1488
1604 1489 $result = self::download_and_activate();
1605 -
1606 1490 if ( isset( $result['success'] ) && ! $result['success'] ) {
1607 1491 echo json_encode( $result );
1608 1492 wp_die();
1609 1493 }
@@ -1636,8 +1520,9 @@
1636 1520 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1637 1521
1638 1522 if ( ! is_array( $allowed_url_list ) ) {
1639 1523 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1524 +
1640 1525 return array();
1641 1526 }
1642 1527
1643 1528 return $allowed_url_list;
@@ -1647,10 +1532,8 @@
1647 1532 * Gets required plan for an addon.
1648 1533 *
1649 1534 * @since 6.4.2
1650 1535 *
1651 - * @param int|string $addon_id
1652 - *
1653 1536 * @return string Empty string if no plan is required for active license.
1654 1537 */
1655 1538 public static function get_addon_required_plan( $addon_id ) {
1656 1539 $api = new FrmFormApi();
@@ -1661,10 +1544,22 @@
1661 1544 $requires = FrmFormsHelper::get_plan_required( $dates );
1662 1545 }
1663 1546
1664 1547 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1665 - return '';
1548 + $requires = '';
1666 1549 }
1667 1550
1668 1551 return $requires;
1552 + }
1553 +
1554 + /**
1555 + * @since 4.02.05
1556 + * @deprecated 6.8.3
1557 + *
1558 + * @codeCoverageIgnore
1559 + *
1560 + * @return void
1561 + */
1562 + public static function connect_pro() {
1563 + _deprecated_function( __METHOD__, '6.8.3' );
1669 1564 }
1670 1565 }