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