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