PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 4.10.03
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v4.10.03
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 +497 -1004 6.354.10.03 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,68 +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/what-is-the-difference-between-the-lite-free-and-pro-version/',
161 - 'docs_label' => __( 'Why Upgrade', 'formidable' ),
162 - 'categories' => array( 'basic', 'plus', 'business', 'elite' ),
163 - 'excerpt' => 'Create calculators, surveys, smart forms, and data-driven applications. Build directories, real estate listings, job boards, and much more.',
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.',
164 56 ),
165 57 );
166 58 $addons = $pro + $addons;
167 59 self::prepare_addons( $addons );
@@ -167,136 +59,35 @@
167 59 self::prepare_addons( $addons );
168 60
169 61 $pricing = FrmAppHelper::admin_upgrade_link( 'addons' );
170 62
171 - self::organize_and_get_categories();
172 - $categories = self::$categories;
173 -
174 - include $view_path . 'index.php';
63 + include( FrmAppHelper::plugin_path() . '/classes/views/addons/list.php' );
175 64 }
176 65
177 - /**
178 - * Organize and set categories.
179 - *
180 - * @since 6.15
181 - *
182 - * @return void
183 - */
184 - protected static function organize_and_get_categories() {
185 - unset( self::$categories['strategy11'] );
186 - ksort( self::$categories );
187 -
188 - $bottom_categories = array();
189 - $plans = FrmFormsHelper::get_license_types(
190 - array(
191 - 'include_all' => false,
192 - 'case_lower' => true,
193 - )
194 - );
195 -
196 - // Extract the elements to move
197 - foreach ( $plans as $plan ) {
198 - if ( ! isset( self::$categories[ $plan ] ) ) {
199 - continue;
200 - }
201 -
202 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
203 - unset( self::$categories[ $plan ] );
204 - }
205 -
206 - $special_categories = array();
207 -
208 - if ( 'elite' !== self::license_type() ) {
209 - $special_categories['available-addons'] = array(
210 - 'name' => __( 'Available', 'formidable' ),
211 - // To be assigned via JavaScript.
212 - 'count' => 0,
213 - );
214 - }
215 -
216 - $special_categories['active-addons'] = array(
217 - 'name' => __( 'Active', 'formidable' ),
218 - // To be assigned via JavaScript.
219 - 'count' => 0,
220 - );
221 -
222 - $special_categories['all-items'] = array(
223 - 'name' => __( 'All Add-Ons', 'formidable' ),
224 - // To be assigned via JavaScript.
225 - 'count' => 0,
226 - );
227 -
228 - self::$categories = array_merge(
229 - $special_categories,
230 - self::$categories,
231 - $bottom_categories
232 - );
233 - }
234 -
235 - /**
236 - * Organize and set categories.
237 - *
238 - * @since 6.15
239 - *
240 - * @param array $addon The addon array that will be modified by reference.
241 - *
242 - * @return void
243 - */
244 - protected static function set_categories( &$addon ) {
245 - if ( ! isset( $addon['categories'] ) ) {
246 - return;
247 - }
248 -
249 - $addon['category-slugs'] = array();
250 -
251 - foreach ( $addon['categories'] as $category ) {
252 - $category = FrmFormsHelper::convert_legacy_package_names( $category );
253 - $category_slug = sanitize_title( $category );
254 -
255 - // Add the slug to the new array.
256 - $addon['category-slugs'][] = $category_slug;
257 -
258 - if ( ! isset( self::$categories[ $category_slug ] ) ) {
259 - self::$categories[ $category_slug ] = array(
260 - 'name' => $category,
261 - 'count' => 0,
262 - );
263 - }
264 -
265 - ++self::$categories[ $category_slug ]['count'];
266 - }
267 - }
268 -
269 - /**
270 - * @return void
271 - */
272 66 public static function license_settings() {
273 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' );
274 70
275 - if ( ! $plugins ) {
276 - esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
277 71 return;
278 72 }
279 73
280 74 ksort( $plugins );
281 75
282 - include FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php';
76 + include( FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php' );
283 77 }
284 78
285 - /**
286 - * @return array
287 - */
288 79 protected static function get_api_addons() {
289 80 $api = new FrmFormApi();
290 81 $addons = $api->get_api_info();
291 82
292 - if ( ! $addons ) {
293 - return self::fallback_plugin_list();
294 - }
295 -
296 - foreach ( $addons as $k => $addon ) {
297 - if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
298 - unset( $addons[ $k ] );
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 + }
299 90 }
300 91 }
301 92
302 93 return $addons;
@@ -302,23 +93,11 @@
302 93 return $addons;
303 94 }
304 95
305 96 /**
306 - * Retrieves the count of available addons.
307 - *
308 - * @since 6.9
309 - *
310 - * @return int Count of addons.
311 - */
312 - public static function get_addons_count() {
313 - return count( self::get_api_addons() );
314 - }
315 -
316 - /**
317 97 * If the API is unable to connect, show something on the addons page
318 98 *
319 99 * @since 3.04.03
320 - *
321 100 * @return array
322 101 */
323 102 protected static function fallback_plugin_list() {
324 103 $list = array(
@@ -328,20 +107,20 @@
328 107 'docs' => '',
329 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.',
330 109 ),
331 110 'mailchimp' => array(
332 - 'title' => 'Mailchimp Forms',
333 - 'excerpt' => 'Get on the path to more sales and leads in a matter of minutes. Add leads to a Mailchimp mailing list when they submit forms and update their information along with the entry.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
334 113 ),
335 114 'registration' => array(
336 115 'title' => 'User Registration Forms',
337 116 'link' => 'downloads/user-registration/',
338 - 'excerpt' => 'Give new users access to your site as quickly and painlessly as possible. Allow users to register, edit and be able to login to their profiles on your site from the front end in a clean, customized registration form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
339 118 ),
340 119 'paypal' => array(
341 120 'title' => 'PayPal Standard Forms',
342 121 'link' => 'downloads/paypal-standard/',
343 - 'excerpt' => 'Automate your business by collecting instant payments from your clients. Collect information, calculate a total, and send them on to PayPal. Require a payment before publishing content on your site.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
344 123 ),
345 124 'stripe' => array(
346 125 'title' => 'Stripe Forms',
347 126 'docs' => 'knowledgebase/stripe/',
@@ -373,9 +152,9 @@
373 152 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
374 153 ),
375 154 'zapier' => array(
376 155 'title' => 'Zapier Forms',
377 - 'excerpt' => 'Connect with hundreds of different applications through Zapier. Insert a new row in a Google docs spreadsheet, post on Twitter, or add a new Dropbox file with your form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
378 157 ),
379 158 'signature' => array(
380 159 'title' => 'Digital Signature Forms',
381 160 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -393,13 +172,8 @@
393 172 'views' => array(
394 173 'title' => 'Formidable Views',
395 174 'excerpt' => 'Add the power of views to your Formidable Forms to display your form submissions in listings, tables, calendars, and more.',
396 175 ),
397 - 'quiz_maker' => array(
398 - 'title' => 'Quiz Maker',
399 - 'link' => 'downloads/quiz-maker/',
400 - 'excerpt' => 'Make quizzes, automatically score them and show user scores.',
401 - ),
402 176 );
403 177
404 178 $defaults = array(
405 179 'released' => '',
@@ -408,9 +182,8 @@
408 182 foreach ( $list as $k => $info ) {
409 183 $info['slug'] = $k;
410 184 $list[ $k ] = array_merge( $defaults, $info );
411 185 }
412 -
413 186 return $list;
414 187 }
415 188
416 189 /**
@@ -416,28 +189,25 @@
416 189 /**
417 190 * If Pro is missing but has been authenticated, include a download URL
418 191 *
419 192 * @since 3.04.03
420 - *
421 193 * @return string
422 194 */
423 195 public static function get_pro_download_url() {
424 - $api = new FrmFormApi( self::get_pro_license() );
196 + $license = self::get_pro_license();
197 + $api = new FrmFormApi( $license );
425 198 $downloads = $api->get_api_info();
426 199 $pro = self::get_pro_from_addons( $downloads );
427 200
428 - return $pro['url'] ?? '';
201 + return isset( $pro['url'] ) ? $pro['url'] : '';
429 202 }
430 203
431 204 /**
432 205 * @since 4.08
433 - *
434 - * @return string
435 206 */
436 207 public static function get_pro_license() {
437 208 $pro_cred_store = 'frmpro-credentials';
438 209 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
439 -
440 210 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
441 211 $creds = get_site_option( $pro_cred_store );
442 212 } else {
443 213 $creds = get_option( $pro_cred_store );
@@ -447,43 +217,32 @@
447 217 return '';
448 218 }
449 219
450 220 $license = $creds['license'];
451 -
452 - if ( ! $license ) {
221 + if ( empty( $license ) ) {
453 222 return '';
454 223 }
455 224
456 - if ( str_contains( $license, '-' ) ) {
457 - // This is a fix for licenses saved in the past
458 - return strtoupper( $license );
225 + if ( strpos( $license, '-' ) ) {
226 + // this is a fix for licenses saved in the past
227 + $license = strtoupper( $license );
459 228 }
460 -
461 229 return $license;
462 230 }
463 231
464 232 /**
465 233 * @since 4.08
466 - *
467 - * @param array $addons
468 - *
469 - * @return array
470 234 */
471 235 protected static function get_pro_from_addons( $addons ) {
472 - return $addons['93790'] ?? array();
236 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
473 237 }
474 238
475 239 /**
476 240 * @since 4.06
477 - * @since 6.31 Added the $force_type param.
478 - *
479 - * @param bool $force_type Whether to resolve grandfathered licenses to their real license type.
480 - *
481 - * @return string
482 241 */
483 - public static function license_type( $force_type = false ) {
242 + public static function license_type() {
484 243 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
485 - return FrmProAddonsController::license_type( $force_type );
244 + return FrmProAddonsController::license_type();
486 245 }
487 246
488 247 return 'free';
489 248 }
@@ -488,162 +247,40 @@
488 247 return 'free';
489 248 }
490 249
491 250 /**
492 - * Determine the license status for payment fee decisions.
493 - *
494 - * Mirrors determine_status_from_license_details in the Stripe Connect service,
495 - * including its 2016-04-26 grandfathered cutoff. Square and PayPal Commerce use a
496 - * later cutoff, so read their fees through payment_fees_apply instead.
497 - *
498 - * @since 6.31
499 - *
500 - * @return string 'active', 'expired', or 'free'.
251 + * @since 4.0.01
501 252 */
502 - public static function get_payment_license_status() {
253 + public static function is_license_expired() {
503 254 $version_info = self::get_primary_license_info();
504 -
505 - if ( ! $version_info ) {
506 - return 'free';
255 + if ( ! isset( $version_info['error'] ) ) {
256 + return false;
507 257 }
508 258
509 - $error = $version_info['error'] ?? array();
510 -
511 - if ( is_array( $error ) && 'expired' === ( $error['code'] ?? '' ) ) {
512 - return 'expired';
513 - }
514 -
515 - if ( self::is_grandfathered_license() ) {
516 - $expires = self::get_grandfathered_expiration( $version_info );
517 -
518 - if ( $expires && gmdate( 'Y-m-d', $expires ) < '2016-04-26' ) {
519 - return 'free';
520 - }
521 - }
522 -
523 - if ( in_array( self::license_type( true ), array( 'elite', 'business' ), true ) ) {
524 - return 'active';
525 - }
526 -
527 - return 'free';
259 + return $version_info['error'];
528 260 }
529 261
530 262 /**
531 - * Check if a connect service charges its per-transaction fee for this license.
263 + * @since 4.08
532 264 *
533 - * Square and PayPal Commerce launched long after lifetime licenses stopped being
534 - * sold, so their services charge every grandfathered license. Stripe's predates
535 - * them and exempts most of them, which get_payment_license_status mirrors.
536 - *
537 - * @since 6.34
538 - *
539 - * @param string $service The connect service: 'stripe', 'square', or 'paypal'.
540 - *
541 - * @return bool
265 + * @return boolean|int false or the number of days until expiration.
542 266 */
543 - public static function payment_fees_apply( $service ) {
544 - if ( 'active' !== self::get_payment_license_status() ) {
545 - return true;
267 + public static function is_license_expiring() {
268 + if ( is_callable( 'FrmProAddonsController::is_license_expiring' ) ) {
269 + return FrmProAddonsController::is_license_expiring();
546 270 }
547 271
548 - if ( in_array( $service, array( 'square', 'paypal' ), true ) ) {
549 - return self::is_grandfathered_license();
550 - }
551 -
552 272 return false;
553 273 }
554 274
555 275 /**
556 - * Check if the primary license is grandfathered.
557 - *
558 - * The API reports this on the Pro add-on itself, the same place
559 - * FrmProAddonsController::license_type reads it from. Older responses put it
560 - * in the top level error instead, so check both.
561 - *
562 - * @since 6.34
563 - *
564 - * @return bool
565 - */
566 - public static function is_grandfathered_license() {
567 - $version_info = self::get_primary_license_info();
568 -
569 - if ( ! $version_info ) {
570 - return false;
571 - }
572 -
573 - $error = $version_info['error'] ?? array();
574 -
575 - if ( is_array( $error ) && 'grandfathered' === ( $error['code'] ?? '' ) ) {
576 - return true;
577 - }
578 -
579 - $pro = self::get_pro_from_addons( $version_info );
580 -
581 - return 'grandfathered' === ( $pro['code'] ?? '' );
582 - }
583 -
584 - /**
585 - * Get the expiration timestamp reported alongside a grandfathered license.
586 - *
587 - * @since 6.34
588 - *
589 - * @param array $version_info The license info from get_primary_license_info.
590 - *
591 - * @return int
592 - */
593 - private static function get_grandfathered_expiration( $version_info ) {
594 - $error = $version_info['error'] ?? array();
595 -
596 - if ( is_array( $error ) && ! empty( $error['expires'] ) ) {
597 - return (int) $error['expires'];
598 - }
599 -
600 - $pro = self::get_pro_from_addons( $version_info );
601 -
602 - return (int) ( $pro['expires'] ?? 0 );
603 - }
604 -
605 - /**
606 - * @since 4.0.01
607 - *
608 - * @return bool
609 - */
610 - public static function is_license_expired() {
611 - $version_info = self::get_primary_license_info();
612 -
613 - if ( ! isset( $version_info['error'] ) ) {
614 - return false;
615 - }
616 -
617 - $expires = $version_info['error']['expires'] ?? 0;
618 -
619 - if ( ! $expires || $expires > time() ) {
620 - return false;
621 - }
622 -
623 - $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
624 -
625 - if ( $rate_limited ) {
626 - // Do not return false positives for rate limited responses.
627 - return false;
628 - }
629 -
630 - return $version_info['error'];
631 - }
632 -
633 - /**
634 276 * @since 4.08
635 - * @since 6.7 This is public.
636 - *
637 - * @return array|false
638 277 */
639 - public static function get_primary_license_info() {
278 + protected static function get_primary_license_info() {
640 279 $installed_addons = apply_filters( 'frm_installed_addons', array() );
641 -
642 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
280 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
643 281 return false;
644 282 }
645 -
646 283 $installed_addons = array(
647 284 'formidable_pro' => $installed_addons['formidable_pro'],
648 285 );
649 286
@@ -651,12 +288,8 @@
651 288 }
652 289
653 290 /**
654 291 * @since 3.04.03
655 - *
656 - * @param mixed $transient
657 - *
658 - * @return object
659 292 */
660 293 public static function check_update( $transient ) {
661 294 if ( ! FrmAppHelper::pro_is_installed() ) {
662 295 // Don't make any changes if only Lite is installed.
@@ -667,18 +300,22 @@
667 300 $transient = new stdClass();
668 301 }
669 302
670 303 $installed_addons = apply_filters( 'frm_installed_addons', array() );
671 -
672 - if ( ! $installed_addons ) {
304 + if ( empty( $installed_addons ) ) {
673 305 return $transient;
674 306 }
675 307
676 - $version_info = self::fill_update_addon_info( $installed_addons );
308 + $version_info = self::fill_update_addon_info( $installed_addons );
309 +
677 310 $transient->last_checked = time();
678 - $wp_plugins = self::get_plugins();
679 311
680 - 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 ) {
681 318 $plugin = (object) $plugin;
682 319
683 320 if ( ! isset( $plugin->new_version ) || ! isset( $plugin->package ) ) {
684 321 continue;
@@ -684,61 +321,49 @@
684 321 continue;
685 322 }
686 323
687 324 $folder = $plugin->plugin;
688 -
689 - if ( ! $folder ) {
325 + if ( empty( $folder ) ) {
690 326 continue;
691 327 }
692 328
693 329 if ( ! self::is_installed( $folder ) ) {
694 - // Don't show an update if the plugin isn't installed
330 + // don't show an update if the plugin isn't installed
695 331 continue;
696 332 }
697 333
698 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
699 - $wp_version = $wp_plugin['Version'] ?? '1.0';
700 - $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';
701 336
702 337 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
338 + $slug = explode( '/', $folder );
339 + $plugin->slug = $slug[0];
703 340 $transient->response[ $folder ] = $plugin;
704 - } else {
705 - $transient->no_update[ $folder ] = $plugin;
706 341 }
707 342
708 343 $transient->checked[ $folder ] = $wp_version;
709 - }//end foreach
710 344
345 + }
346 +
711 347 return $transient;
712 348 }
713 349
714 350 /**
715 - * Copy of FrmAppHelper::get_plugins.
716 - * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
717 - * This means that trying to access FrmAppHelper::get_plugins when upgrading from a Lite version before v5.5 results in a one-off error.
718 - *
719 - * @since 5.5.2
720 - *
721 - * @return array
722 - */
723 - protected static function get_plugins() {
724 - if ( ! function_exists( 'get_plugins' ) ) {
725 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
726 - }
727 - return get_plugins();
728 - }
729 -
730 - /**
731 351 * Check if a plugin is installed before showing an update for it
732 352 *
733 353 * @since 3.05
734 354 *
735 - * @param string $plugin The folder/filename.php for a plugin.
355 + * @param string $plugin - the folder/filename.php for a plugin
736 356 *
737 357 * @return bool - True if installed
738 358 */
739 359 protected static function is_installed( $plugin ) {
740 - $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 +
741 366 return isset( $all_plugins[ $plugin ] );
742 367 }
743 368
744 369 /**
@@ -753,51 +378,45 @@
753 378 $version_info = array();
754 379
755 380 foreach ( $installed_addons as $addon ) {
756 381 if ( $addon->store_url !== 'https://formidableforms.com' ) {
757 - // Check if this is a third-party addon
382 + // check if this is a third-party addon
758 383 continue;
759 384 }
760 385
761 386 $new_license = $addon->license;
762 -
763 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
387 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
764 388 continue;
765 389 }
766 390
767 391 $checked_licenses[] = $new_license;
768 - $api = new FrmFormApi( $new_license );
769 392
770 - if ( ! $version_info ) {
393 + $api = new FrmFormApi( $new_license );
394 + if ( empty( $version_info ) ) {
771 395 $version_info = $api->get_api_info();
772 396 continue;
773 397 }
774 398
775 399 $plugin = $api->get_addon_for_license( $addon, $version_info );
776 -
777 - if ( ! $plugin ) {
400 + if ( empty( $plugin ) ) {
778 401 continue;
779 402 }
780 403
781 - $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();
782 408
783 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
784 - 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 + }
785 416 }
417 + }
786 418
787 - // If this addon is using its own license, get the update url
788 - $addon_info = $api->get_api_info();
789 -
790 - $version_info[ $download_id ] = $addon_info[ $download_id ];
791 -
792 - if ( isset( $addon_info['error'] ) ) {
793 - $version_info[ $download_id ]['error'] = array(
794 - 'message' => $addon_info['error']['message'],
795 - 'code' => $addon_info['error']['code'],
796 - );
797 - }
798 - }//end foreach
799 -
800 419 return $version_info;
801 420 }
802 421
803 422 /**
@@ -803,11 +422,9 @@
803 422 /**
804 423 * Get the action link for an addon that isn't active.
805 424 *
806 425 * @since 3.06.03
807 - *
808 - * @param string $plugin The plugin slug.
809 - *
426 + * @param string $plugin The plugin slug
810 427 * @return array
811 428 */
812 429 public static function install_link( $plugin ) {
813 430 $link = array();
@@ -818,106 +435,54 @@
818 435 $link = array(
819 436 'url' => $addon['plugin'],
820 437 'class' => 'frm-activate-addon',
821 438 );
822 - } elseif ( ! empty( $addon['url'] ) ) {
439 + } elseif ( isset( $addon['url'] ) && ! empty( $addon['url'] ) ) {
823 440 $link = array(
824 441 'url' => $addon['url'],
825 442 'class' => 'frm-install-addon',
826 443 );
827 - } elseif ( ! empty( $addon['categories'] ) ) {
444 + } elseif ( isset( $addon['categories'] ) && ! empty( $addon['categories'] ) ) {
828 445 $link = array(
829 446 'categories' => $addon['categories'],
830 447 );
831 448 }
832 449
833 - if ( $link ) {
450 + if ( ! empty( $link ) ) {
834 451 $link['status'] = $addon['status']['type'];
835 452 }
836 - } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
837 - $link = array(
838 - 'url' => 'formidable-' . $plugin . '/formidable-' . $plugin . '.php',
839 - 'class' => 'frm-activate-addon',
840 - );
841 - }//end if
453 + }
842 454
843 455 return $link;
844 456 }
845 457
846 458 /**
847 - * Get the JSON-encoded install data for a plugin update.
848 - *
849 - * @since 6.29
850 - *
851 - * @param string $addon_slug The addon slug (e.g. 'pro', 'dates').
852 - *
853 - * @return string JSON-encoded install data, or empty string if no URL is available.
854 - */
855 - public static function get_update_install_data( $addon_slug ) {
856 - $upgrading = self::install_link( $addon_slug );
857 -
858 - if ( isset( $upgrading['class'] ) && 'frm-install-addon' === $upgrading['class'] ) {
859 - return (string) json_encode( $upgrading );
860 - }
861 -
862 - if ( 'pro' === $addon_slug ) {
863 - $download_url = self::get_pro_download_url();
864 - $plugin_file = 'formidable-pro/formidable-pro.php';
865 - } else {
866 - $addon_data = self::get_addon( $addon_slug );
867 - $download_url = $addon_data && ! empty( $addon_data['url'] ) ? $addon_data['url'] : '';
868 - $plugin_file = $addon_data && ! empty( $addon_data['plugin'] ) ? $addon_data['plugin'] : 'formidable-' . $addon_slug . '/formidable-' . $addon_slug . '.php';
869 - }
870 -
871 - if ( ! $download_url ) {
872 - $update_plugins = get_site_transient( 'update_plugins' );
873 - $plugin_update = $update_plugins->response[ $plugin_file ] ?? null;
874 - $download_url = $plugin_update && ! empty( $plugin_update->package ) ? $plugin_update->package : '';
875 - }
876 -
877 - return $download_url ? (string) json_encode(
878 - array(
879 - 'url' => $download_url,
880 - 'class' => 'frm-install-addon',
881 - )
882 - ) : '';
883 - }
884 -
885 - /**
886 459 * @since 4.09
887 - *
888 - * @param string $plugin The plugin slug.
889 - *
460 + * @param string $plugin The plugin slug
890 461 * @return array|false
891 462 */
892 - public static function get_addon( $plugin ) {
463 + protected static function get_addon( $plugin ) {
893 464 $addons = self::get_api_addons();
894 465 self::prepare_addons( $addons );
895 -
896 466 foreach ( $addons as $addon ) {
897 467 $slug = explode( '/', $addon['plugin'] );
898 -
899 468 if ( $slug[0] === 'formidable-' . $plugin ) {
900 469 return $addon;
901 470 }
902 471 }
903 -
904 472 return false;
905 473 }
906 474
907 475 /**
908 476 * @since 4.09
909 - *
910 477 * @return string
911 478 */
912 479 protected static function get_license_type() {
913 480 $license_type = '';
914 481 $addons = self::get_api_addons();
915 -
916 482 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
917 - return $addons['error']['type'];
483 + $license_type = $addons['error']['type'];
918 484 }
919 -
920 485 return $license_type;
921 486 }
922 487
923 488 /**
@@ -922,10 +487,10 @@
922 487
923 488 /**
924 489 * @since 3.04.03
925 490 *
926 - * @param array $addons
927 - * @param object $license The FrmAddon object.
491 + * @param array $addons
492 + * @param object $license The FrmAddon object
928 493 *
929 494 * @return array
930 495 */
931 496 public static function get_addon_for_license( $addons, $license ) {
@@ -930,12 +495,11 @@
930 495 */
931 496 public static function get_addon_for_license( $addons, $license ) {
932 497 $download_id = $license->download_id;
933 498 $plugin = array();
934 -
935 - if ( ! $download_id && $addons ) {
499 + if ( empty( $download_id ) && ! empty( $addons ) ) {
936 500 foreach ( $addons as $addon ) {
937 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
501 + if ( strtolower( $license->plugin_name ) == strtolower( $addon['title'] ) ) {
938 502 return $addon;
939 503 }
940 504 }
941 505 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -944,57 +508,36 @@
944 508
945 509 return $plugin;
946 510 }
947 511
948 - /**
949 - * @param array $addons
950 - *
951 - * @return void
952 - */
953 512 protected static function prepare_addons( &$addons ) {
954 - // Reset categories to prevent count accumulation across multiple calls.
955 - self::$categories = array();
956 -
957 513 $activate_url = '';
958 -
959 514 if ( current_user_can( 'activate_plugins' ) ) {
960 515 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
961 516 }
962 517
963 518 $loop_addons = $addons;
964 -
965 519 foreach ( $loop_addons as $id => $addon ) {
966 520 if ( is_numeric( $id ) ) {
967 521 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
968 522 $file_name = $addon['plugin'];
969 523 } else {
970 - $slug = $id;
971 - $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 + }
972 530 $file_name = $base_file . '/' . $base_file . '.php';
973 -
974 531 if ( ! isset( $addon['plugin'] ) ) {
975 532 $addon['plugin'] = $file_name;
976 533 }
977 534 }
978 535
979 - $addon['installed'] = self::is_installed( $file_name );
980 -
981 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
982 - unset( $addons[ $id ] );
983 - continue;
984 - }
985 -
986 - if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
987 - $active_views_version = self::get_active_views_version();
988 -
989 - if ( false !== $active_views_version && $slug !== $active_views_version ) {
990 - $addon['installed'] = false;
991 - }
992 - }
993 -
536 + $addon['installed'] = self::is_installed( $file_name );
994 537 $addon['activate_url'] = '';
995 538
996 - if ( $addon['installed'] && $activate_url && ! self::is_plugin_active( $file_name, $slug ) ) {
539 + if ( $addon['installed'] && ! empty( $activate_url ) && ! is_plugin_active( $file_name ) ) {
997 540 $addon['activate_url'] = add_query_arg(
998 541 array(
999 542 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
1000 543 'plugin' => $file_name,
@@ -1010,62 +553,30 @@
1010 553
1011 554 if ( ! isset( $addon['link'] ) ) {
1012 555 $addon['link'] = 'downloads/' . $slug . '/';
1013 556 }
557 + self::prepare_addon_link( $addon['link'] );
1014 558
1015 - self::prepare_addon_link( $addon['link'] );
1016 559 self::set_addon_status( $addon );
1017 - self::set_categories( $addon );
1018 -
1019 560 $addons[ $id ] = $addon;
1020 - }//end foreach
1021 - }
1022 -
1023 - /**
1024 - * @param string $file_name
1025 - * @param string $slug
1026 - *
1027 - * @return bool
1028 - */
1029 - private static function is_plugin_active( $file_name, $slug ) {
1030 - if ( 'formidable-views/formidable-views.php' === $file_name ) {
1031 - return self::get_active_views_version() === $slug;
1032 561 }
1033 - return is_plugin_active( $file_name );
1034 562 }
1035 563
1036 564 /**
1037 - * @return false|string either 'visual-views' or 'views', false if one is not found.
1038 - */
1039 - private static function get_active_views_version() {
1040 - if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
1041 - return false;
1042 - }
1043 -
1044 - $plugin_version = FrmViewsAppHelper::plugin_version();
1045 - return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
1046 - }
1047 -
1048 - /**
1049 565 * @since 3.04.02
1050 - *
1051 - * @param string $link
1052 - *
1053 - * @return void
1054 566 */
1055 567 protected static function prepare_addon_link( &$link ) {
1056 568 $site_url = 'https://formidableforms.com/';
1057 -
1058 - if ( ! str_starts_with( $link, 'http' ) ) {
569 + if ( strpos( $link, 'http' ) !== 0 ) {
1059 570 $link = $site_url . $link;
1060 571 }
1061 -
1062 - $link = FrmAppHelper::make_affiliate_url( $link );
1063 -
1064 - $utm = array(
1065 - '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',
1066 577 );
1067 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
578 + $link = add_query_arg( $query_args, $link );
1068 579 }
1069 580
1070 581 /**
1071 582 * Add the status to the addon array. Status options are:
@@ -1071,12 +582,8 @@
1071 582 * Add the status to the addon array. Status options are:
1072 583 * installed, active, not installed
1073 584 *
1074 585 * @since 3.04.02
1075 - *
1076 - * @param array $addon
1077 - *
1078 - * @return void
1079 586 */
1080 587 protected static function set_addon_status( &$addon ) {
1081 588 if ( ! empty( $addon['activate_url'] ) ) {
1082 589 $addon['status'] = array(
@@ -1095,110 +602,273 @@
1095 602 );
1096 603 }
1097 604 }
1098 605
1099 - /**
1100 - * @since 5.5.2
1101 - *
1102 - * @param string $plugin
1103 - * @param string $redirect
1104 - * @param bool $network_wide
1105 - * @param bool $silent
1106 - *
1107 - * @return WP_Error|null Null on success, WP_Error on invalid file.
1108 - */
1109 - protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
1110 - if ( ! function_exists( 'activate_plugin' ) ) {
1111 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
1112 - }
1113 - return activate_plugin( $plugin, $redirect, $network_wide, $silent );
1114 - }
606 + public static function upgrade_to_pro() {
607 + FrmAppHelper::include_svg();
1115 608
1116 - /**
1117 - * Deactivate a specified plugin.
1118 - *
1119 - * @since 6.8
1120 - *
1121 - * @param string $plugin
1122 - * @param bool $silent
1123 - *
1124 - * @return void
1125 - */
1126 - protected static function deactivate_plugin( $plugin, $silent = false ) {
1127 - if ( ! function_exists( 'deactivate_plugins' ) ) {
1128 - require_once ABSPATH . 'wp-admin/includes/plugin.php';
1129 - }
1130 - 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' );
1131 811 }
1132 812
1133 813 /**
1134 - * Uninstall a specified plugin.
814 + * Install Pro after connection with Formidable.
1135 815 *
1136 - * @since 6.8
1137 - *
1138 - * @param string $plugin
1139 - *
1140 - * @return true|WP_Error True on success, WP_Error on invalid file.
816 + * @since 4.02.05
1141 817 */
1142 - protected static function uninstall_plugin( $plugin ) {
1143 - if ( ! current_user_can( 'delete_plugins' ) ) {
1144 - return new WP_Error( 'uninstall_failed', __( 'Current user cannot delete plugins.', 'formidable' ) );
1145 - }
818 + public static function connect_pro() {
819 + FrmAppHelper::permission_check( 'install_plugins' );
820 + check_ajax_referer( 'frm_ajax', 'nonce' );
1146 821
1147 - if ( ! function_exists( 'delete_plugins' ) ) {
1148 - 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();
1149 825 }
1150 826
1151 - self::deactivate_plugin( $plugin, true );
1152 - $result = delete_plugins( array( $plugin ) );
827 + $response = array();
1153 828
1154 - return is_wp_error( $result ) ? $result : true;
1155 - }
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 + }
1156 838
1157 - /**
1158 - * @since 5.0.10
1159 - *
1160 - * @return string
1161 - */
1162 - protected static function get_current_plugin() {
1163 - if ( ! self::$plugin ) {
1164 - self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1165 - }
1166 - return self::$plugin;
839 + echo json_encode( $response );
840 + wp_die();
1167 841 }
1168 842
1169 843 /**
1170 844 * @since 4.08
1171 - *
1172 - * @return mixed[]|null
1173 845 */
1174 846 protected static function download_and_activate() {
847 + // Set the current screen to avoid undefined notices.
1175 848 if ( is_admin() ) {
1176 - FrmAppHelper::set_current_screen_and_hook_suffix();
849 + global $hook_suffix;
850 + set_current_screen();
1177 851 }
1178 852
1179 853 self::maybe_show_cred_form();
1180 854
1181 855 $installed = self::install_addon();
1182 -
1183 856 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1184 857 return $installed;
1185 858 }
1186 - self::handle_addon_action( $installed, 'activate' );
1187 - return null;
859 + self::maybe_activate_addon( $installed );
1188 860 }
1189 861
1190 862 /**
1191 863 * @since 3.04.02
1192 - *
1193 - * @return void
1194 864 */
1195 865 protected static function maybe_show_cred_form() {
1196 866 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1197 - include_once ABSPATH . 'wp-admin/includes/file.php';
867 + include_once( ABSPATH . 'wp-admin/includes/file.php' );
1198 868 }
1199 869
1200 - // 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.
1201 871 ob_start();
1202 872
1203 873 $show_form = false;
1204 874 $method = '';
@@ -1215,8 +885,9 @@
1215 885
1216 886 if ( $show_form ) {
1217 887 $form = ob_get_clean();
1218 888 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
889 + $data = $form;
1219 890 $response = array(
1220 891 'success' => false,
1221 892 'message' => $message,
1222 893 'form' => $form,
@@ -1227,252 +898,107 @@
1227 898 ob_end_clean();
1228 899 }
1229 900
1230 901 /**
1231 - * Checks if an addon download url is allowed.
1232 - *
1233 - * @since 6.2
1234 - *
1235 - * @param string $download_url
1236 - *
1237 - * @return bool
1238 - */
1239 - public static function url_is_allowed( $download_url ) {
1240 - return FrmAppHelper::validate_url_is_in_s3_bucket( $download_url, 'zip' ) || in_array( $download_url, self::allowed_external_urls(), true );
1241 - }
1242 -
1243 - /**
1244 902 * We do not need any extra credentials if we have gotten this far,
1245 903 * so let's install the plugin.
1246 904 *
1247 905 * @since 3.04.02
1248 - *
1249 - * @return array|string
1250 906 */
1251 907 protected static function install_addon() {
1252 - require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
908 + require_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' );
1253 909
1254 - $download_url = self::get_current_plugin();
910 + $download_url = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1255 911
1256 - if ( ! self::url_is_allowed( $download_url ) ) {
1257 - return array(
1258 - 'message' => 'Plugin URL is not valid',
1259 - 'success' => false,
1260 - );
1261 - }
1262 -
1263 912 // Create the plugin upgrader with our custom skin.
1264 913 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1265 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
914 + $installer->install( $download_url );
1266 915
1267 916 // Flush the cache and return the newly installed plugin basename.
1268 917 wp_cache_flush();
1269 918
1270 919 $plugin = $installer->plugin_info();
1271 -
1272 - if ( ! $plugin ) {
920 + if ( empty( $plugin ) ) {
1273 921 return array(
1274 922 'message' => 'Plugin was not installed. ' . $installer->result,
1275 923 'success' => false,
1276 924 );
1277 925 }
1278 -
1279 926 return $plugin;
1280 927 }
1281 928
1282 929 /**
1283 - * Handle the AJAX request to activate an add-on.
1284 - *
1285 - * @since 6.8
1286 - *
1287 - * @return void
930 + * @since 3.06.03
1288 931 */
1289 932 public static function ajax_activate_addon() {
1290 - self::process_addon_action(
1291 - function ( $plugin ) {
1292 - return self::handle_addon_action( $plugin, 'activate' );
1293 - },
1294 - array( 'FrmAddonsController', 'get_addon_activation_response' )
1295 - );
1296 - }
1297 933
1298 - /**
1299 - * @since 3.04.02
1300 - *
1301 - * @param string $installed The plugin folder name with file name.
1302 - */
1303 - protected static function maybe_activate_addon( $installed ) {
1304 - self::ajax_activate_addon();
1305 - }
934 + self::install_addon_permissions();
1306 935
1307 - /**
1308 - * Handle the AJAX request to deactivate an add-on.
1309 - *
1310 - * @since 6.8
1311 - *
1312 - * @return void
1313 - */
1314 - public static function ajax_deactivate_addon() {
1315 - self::process_addon_action(
1316 - function ( $plugin ) {
1317 - return self::handle_addon_action( $plugin, 'deactivate' );
1318 - }
1319 - );
1320 - }
936 + // Set the current screen to avoid undefined notices.
937 + global $hook_suffix;
938 + set_current_screen();
1321 939
1322 - /**
1323 - * Handle the AJAX request to uninstall an add-on.
1324 - *
1325 - * @since 6.8
1326 - *
1327 - * @return void
1328 - */
1329 - public static function ajax_uninstall_addon() {
1330 - self::process_addon_action(
1331 - function ( $plugin ) {
1332 - return self::handle_addon_action( $plugin, 'uninstall' );
1333 - }
1334 - );
1335 - }
1336 -
1337 - /**
1338 - * Process a specific action (activate, deactivate, uninstall) on an add-on.
1339 - *
1340 - * @since 6.8
1341 - *
1342 - * @param callable $action_callback The specific add-on action to be executed.
1343 - * @param callable|null $response_callback Optional. The response handling callback. Default null.
1344 - *
1345 - * @return void
1346 - */
1347 - private static function process_addon_action( $action_callback, $response_callback = null ) {
1348 - self::install_addon_permissions();
1349 - FrmAppHelper::set_current_screen_and_hook_suffix();
1350 -
1351 940 $plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'sanitize_text_field' );
1352 - call_user_func( $action_callback, $plugin );
941 + self::maybe_activate_addon( $plugin );
1353 942
1354 - if ( is_callable( $response_callback ) ) {
1355 - wp_send_json_success( call_user_func( $response_callback ) );
1356 - return;
1357 - }
1358 -
1359 - 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();
1360 946 }
1361 947
1362 948 /**
1363 - * Attempt to perform a specific action (activate, deactivate, uninstall) on an add-on.
1364 - *
1365 - * @since 6.8
1366 - *
1367 - * @param string $installed The plugin folder name with file name.
1368 - * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1369 - *
1370 - * @return mixed[]|null
949 + * @since 3.04.02
950 + * @param string $installed The plugin folder name with file name
1371 951 */
1372 - protected static function handle_addon_action( $installed, $action ) {
1373 - if ( ! $installed || ! $action ) {
1374 - return null;
952 + protected static function maybe_activate_addon( $installed ) {
953 + if ( ! $installed ) {
954 + return;
1375 955 }
1376 956
1377 - $result = null;
1378 - switch ( $action ) {
1379 - case 'activate':
1380 - $result = self::activate_plugin( $installed );
1381 - break;
1382 - case 'deactivate':
1383 - self::deactivate_plugin( $installed );
1384 - break;
1385 - case 'uninstall':
1386 - $result = self::uninstall_plugin( $installed );
1387 - break;
1388 - }
1389 -
1390 - if ( is_wp_error( $result ) ) {
957 + $activate = activate_plugin( $installed );
958 + if ( is_wp_error( $activate ) ) {
1391 959 // Ignore the invalid header message that shows with nested plugins.
1392 - if ( $result->get_error_code() !== 'no_plugin_header' ) {
960 + if ( $activate->get_error_code() !== 'no_plugin_header' ) {
1393 961 if ( wp_doing_ajax() ) {
1394 - wp_send_json_error( array( 'error' => $result->get_error_message() ) );
962 + echo json_encode( array( 'error' => $activate->get_error_message() ) );
963 + wp_die();
1395 964 }
1396 -
1397 965 return array(
1398 - 'message' => $result->get_error_message(),
966 + 'message' => $activate->get_error_message(),
1399 967 'success' => false,
1400 968 );
1401 969 }
1402 970 }
1403 -
1404 - return $result;
1405 971 }
1406 972
1407 973 /**
1408 - * @return array
1409 - */
1410 - private static function get_addon_activation_response() {
1411 - $activating_page = self::get_activating_page();
1412 - $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
1413 -
1414 - return array(
1415 - 'message' => $message,
1416 - 'saveAndReload' => $activating_page,
1417 - );
1418 - }
1419 -
1420 - /**
1421 - * Return a string that reflects the page from which the addon is being activated on,
1422 - * if it is from settings or form builder, otherwise return empty string.
1423 - *
1424 - * @return string
1425 - */
1426 - private static function get_activating_page() {
1427 - $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1428 -
1429 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1430 - return 'settings';
1431 - }
1432 -
1433 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1434 - }
1435 -
1436 - /**
1437 974 * Run security checks before installing
1438 975 *
1439 976 * @since 3.04.02
1440 - *
1441 - * @return void
1442 977 */
1443 978 protected static function install_addon_permissions() {
1444 979 check_ajax_referer( 'frm_ajax', 'nonce' );
1445 980
1446 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1447 - return;
981 + if ( ! current_user_can( 'activate_plugins' ) || ! isset( $_POST['plugin'] ) ) {
982 + echo json_encode( true );
983 + wp_die();
1448 984 }
1449 -
1450 - echo json_encode( true );
1451 - wp_die();
1452 985 }
1453 986
1454 987 /**
1455 988 * @since 4.08
1456 - *
1457 - * @return string
1458 989 */
1459 990 public static function connect_link() {
1460 991 $auth = get_option( 'frm_connect_token' );
1461 -
1462 - if ( ! $auth ) {
992 + if ( empty( $auth ) ) {
1463 993 $auth = hash( 'sha512', wp_rand() );
1464 - update_option( 'frm_connect_token', $auth, false );
994 + update_option( 'frm_connect_token', $auth );
1465 995 }
1466 -
1467 - $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1468 - $link = 'https://formidableforms.com/api-connect/';
996 + $link = FrmAppHelper::admin_upgrade_link( 'connect', 'api-connect' );
1469 997 $args = array(
1470 998 'v' => 2,
1471 999 'siteurl' => FrmAppHelper::site_url(),
1472 1000 'url' => get_rest_url(),
1473 - 'inst' => (int) FrmAppHelper::pro_is_included(),
1474 - 'return' => $page,
1475 1001 'token' => $auth,
1476 1002 'l' => self::get_pro_license(),
1477 1003 );
1478 1004
@@ -1490,19 +1016,19 @@
1490 1016 // Verify params present (auth & download link).
1491 1017 $post_auth = FrmAppHelper::get_param( 'token', '', 'request', 'sanitize_text_field' );
1492 1018 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1493 1019
1494 - // The download link is not required if already installed.
1495 - $is_installed = FrmAppHelper::pro_is_included();
1496 - $file_missing = ! $is_installed && ! $post_url;
1497 -
1498 - if ( ! $post_auth || $file_missing ) {
1020 + if ( empty( $post_auth ) || empty( $post_url ) ) {
1499 1021 return false;
1500 1022 }
1501 1023
1502 1024 // Verify auth.
1503 1025 $auth = get_option( 'frm_connect_token' );
1504 - return $auth && hash_equals( $auth, $post_auth );
1026 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1027 + return false;
1028 + }
1029 +
1030 + return true;
1505 1031 }
1506 1032
1507 1033 /**
1508 1034 * Install and/or activate the add-on file.
@@ -1507,35 +1033,34 @@
1507 1033 /**
1508 1034 * Install and/or activate the add-on file.
1509 1035 *
1510 1036 * @since 4.08
1511 - *
1512 - * @return array
1513 1037 */
1514 1038 public static function install_addon_api() {
1515 - 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
1516 1042
1043 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1044 +
1517 1045 // Delete so cannot replay.
1518 1046 delete_option( 'frm_connect_token' );
1519 1047
1520 1048 // It's already installed and active.
1521 - $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1522 -
1049 + $active = activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1523 1050 if ( is_wp_error( $active ) ) {
1524 - $response = self::maybe_download_and_activate();
1525 -
1526 - if ( is_array( $response ) ) {
1527 - // The download failed.
1051 + // Download plugin now.
1052 + $response = self::download_and_activate();
1053 + if ( is_array( $response ) && isset( $response['success'] ) ) {
1528 1054 return $response;
1529 1055 }
1530 1056 }
1531 1057
1532 1058 // If empty license, save it now.
1533 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1059 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1534 1060 load_formidable_pro();
1535 1061 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1536 -
1537 - if ( ! $license ) {
1062 + if ( empty( $license ) ) {
1538 1063 return array(
1539 1064 'success' => false,
1540 1065 'error' => 'That site does not have a valid license key.',
1541 1066 );
@@ -1541,9 +1066,8 @@
1541 1066 );
1542 1067 }
1543 1068
1544 1069 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1545 -
1546 1070 if ( ! $response['success'] ) {
1547 1071 // Could not activate license.
1548 1072 return $response;
1549 1073 }
@@ -1554,60 +1078,22 @@
1554 1078 );
1555 1079 }
1556 1080
1557 1081 /**
1558 - * @since 6.8.3
1559 - *
1560 - * @return array|true
1561 - */
1562 - private static function maybe_download_and_activate() {
1563 - if ( ! self::$plugin ) {
1564 - return array(
1565 - 'success' => false,
1566 - 'message' => __( 'The plugin download was not found.', 'formidable' ),
1567 - );
1568 - }
1569 -
1570 - // Download plugin now.
1571 - $response = self::download_and_activate();
1572 -
1573 - if ( is_array( $response ) && isset( $response['success'] ) ) {
1574 - // The download failed.
1575 - return $response;
1576 - }
1577 -
1578 - return true;
1579 - }
1580 -
1581 - /**
1582 1082 * Render a conditional action button for a specified plugin
1583 1083 *
1084 + * @param string $plugin
1085 + * @param array|string $upgrade_link_args
1584 1086 * @since 4.09
1585 - *
1586 - * @param string $plugin
1587 - * @param array|string $upgrade_link_args
1588 - *
1589 - * @return void
1590 1087 */
1591 1088 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1592 1089 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
1593 - FrmProAddonsController::conditional_action_button( $plugin, $upgrade_link_args );
1594 - return;
1090 + return FrmProAddonsController::conditional_action_button( $plugin, $upgrade_link_args );
1595 1091 }
1596 1092
1597 1093 $addon = self::get_addon( $plugin );
1598 1094 $upgrade_link = FrmAppHelper::admin_upgrade_link( $upgrade_link_args );
1599 -
1600 - if ( ! is_array( $upgrade_link_args ) ) {
1601 - // A string $upgrade_link_args is used for the utm-medium value when calling
1602 - // FrmAppHelper::admin_upgrade_link above.
1603 - // For self::addon_upgrade_link, we'll pass just an empty array with the link key (set below).
1604 - $upgrade_link_args = array();
1605 - }
1606 -
1607 - $upgrade_link_args['link'] = $upgrade_link;
1608 -
1609 - self::addon_upgrade_link( $addon, $upgrade_link_args );
1095 + self::addon_upgrade_link( $addon, $upgrade_link );
1610 1096 }
1611 1097
1612 1098 /**
1613 1099 * Render a conditional action button for an add on
@@ -1612,24 +1098,16 @@
1612 1098 /**
1613 1099 * Render a conditional action button for an add on
1614 1100 *
1615 1101 * @since 4.09.01
1616 - *
1617 - * @param array $atts {
1618 - * Button attributes.
1619 - *
1620 - * @type array $addon
1621 - * @type false|string $license_type
1622 - * @type string $plan_required
1623 - * @type string $upgrade_link
1624 - * }
1625 - *
1626 - * @return void
1102 + * @param array $addon
1103 + * @param string|false $license_type
1104 + * @param string $plan_required
1105 + * @param string $upgrade_link
1627 1106 */
1628 1107 public static function show_conditional_action_button( $atts ) {
1629 1108 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
1630 - FrmProAddonsController::show_conditional_action_button( $atts );
1631 - return;
1109 + return FrmProAddonsController::show_conditional_action_button( $atts );
1632 1110 }
1633 1111
1634 1112 self::addon_upgrade_link( $atts['addon'], $atts['upgrade_link'] );
1635 1113 }
@@ -1635,19 +1113,10 @@
1635 1113 }
1636 1114
1637 1115 /**
1638 1116 * @since 4.09.01
1639 - *
1640 - * @param array|false $addon
1641 - * @param array|string $upgrade_link
1642 - *
1643 - * @return void
1644 1117 */
1645 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1646 - $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1647 - $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1648 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1649 -
1118 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1650 1119 if ( $addon ) {
1651 1120 $upgrade_link .= '&utm_content=' . $addon['slug'];
1652 1121 }
1653 1122
@@ -1654,94 +1123,118 @@
1654 1123 if ( $addon && isset( $addon['categories'] ) && in_array( 'Solution', $addon['categories'], true ) ) {
1655 1124 // Solutions will go to a separate page.
1656 1125 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1657 1126 }
1658 -
1659 - $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1660 -
1661 - if ( ! str_contains( $class, 'frm-button' ) ) {
1662 - $class .= ' frm-button-secondary frm-button-sm';
1663 - }
1664 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1665 1127 ?>
1666 - <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 ?>
1667 - <?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' ); ?>
1668 1130 </a>
1669 1131 <?php
1670 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1671 1132 }
1672 1133
1673 1134 /**
1674 1135 * @since 3.04.02
1675 - *
1676 - * @return void
1677 1136 */
1678 1137 public static function ajax_install_addon() {
1679 1138 self::install_addon_permissions();
1680 1139
1681 - $result = self::download_and_activate();
1140 + self::download_and_activate();
1682 1141
1683 - if ( isset( $result['success'] ) && ! $result['success'] ) {
1684 - echo json_encode( $result );
1685 - wp_die();
1686 - }
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 + }
1687 1146
1688 - echo json_encode( self::get_addon_activation_response() );
1689 - 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();
1690 1153 }
1691 1154
1692 1155 /**
1693 - * 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
1694 1178 *
1695 - * @since 6.3.1
1696 - *
1697 1179 * @return array
1698 1180 */
1699 - private static function allowed_external_urls() {
1700 - $allowed_url_list = array(
1701 - 'https://downloads.wordpress.org/plugin/formidable-gravity-forms-importer.zip',
1702 - 'https://downloads.wordpress.org/plugin/formidable-import-pirate-forms.zip',
1703 - 'https://downloads.wordpress.org/plugin/wp-mail-smtp.zip',
1704 - );
1181 + public static function get_addon_info( $license = '' ) {
1182 + return FrmDeprecated::get_addon_info( $license );
1183 + }
1705 1184
1706 - /**
1707 - * List of URLs used in plugin formidable internal installation.
1708 - *
1709 - * @since 6.3.1
1710 - *
1711 - * @param array $allowed_url_list List of URLs.
1712 - */
1713 - $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 + }
1714 1195
1715 - if ( ! is_array( $allowed_url_list ) ) {
1716 - _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1717 - return array();
1718 - }
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 + }
1719 1204
1720 - 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 );
1721 1217 }
1722 1218
1723 1219 /**
1724 - * Gets required plan for an addon.
1220 + * @since 2.03.08
1221 + * @deprecated 3.04.03
1222 + * @codeCoverageIgnore
1725 1223 *
1726 - * @since 6.4.2
1224 + * @param string $filename
1225 + * @param string $ext
1727 1226 *
1728 - * @param int|string $addon_id
1729 - *
1730 - * @return string Empty string if no plan is required for active license.
1227 + * @return string
1731 1228 */
1732 - public static function get_addon_required_plan( $addon_id ) {
1733 - $api = new FrmFormApi();
1734 - $addons = $api->get_api_info();
1229 + public static function shorten_edd_filename( $filename, $ext ) {
1230 + return FrmDeprecated::shorten_edd_filename( $filename, $ext );
1231 + }
1735 1232
1736 - if ( is_array( $addons ) && array_key_exists( $addon_id, $addons ) ) {
1737 - $dates = $addons[ $addon_id ];
1738 - $requires = FrmFormsHelper::get_plan_required( $dates );
1739 - }
1740 -
1741 - if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1742 - return '';
1743 - }
1744 -
1745 - return $requires;
1233 + /**
1234 + * @deprecated 3.04.03
1235 + * @codeCoverageIgnore
1236 + */
1237 + public static function get_licenses() {
1238 + FrmDeprecated::get_licenses();
1746 1239 }
1747 1240 }