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