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