PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.8.2
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.8.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
formidable / classes / controllers / FrmAddonsController.php

FrmAddonsController.php in Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More 6.8.2, at classes/controllers/FrmAddonsController.php

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