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 +469 -415 6.276.8 View file →
@@ -5,95 +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 - self::$request_addon_url = 'https://connect.formidableforms.com/add-on-request/';
39 -
40 - add_action( 'admin_enqueue_scripts', self::class . '::enqueue_assets', 15 );
41 - add_filter( 'frm_show_footer_links', '__return_false' );
42 - }
43 - }
44 -
45 - /**
46 - * Enqueues the Add-Ons page scripts and styles.
47 - *
48 - * @since 6.15
49 - *
50 - * @return void
51 - */
52 - public static function enqueue_assets() {
53 - $plugin_url = FrmAppHelper::plugin_url();
54 - $version = FrmAppHelper::plugin_version();
55 - $js_dependencies = array(
56 - 'wp-i18n',
57 - // This prevents a console error "wp.hooks is undefined" in WP versions older than 5.7.
58 - 'wp-hooks',
59 - 'formidable_dom',
60 - );
61 -
62 - // Enqueue styles that needed.
63 - wp_enqueue_style( 'formidable-admin' );
64 - wp_enqueue_style( 'formidable-grids' );
65 -
66 - // Register and enqueue Add-Ons page style.
67 - wp_register_style( self::SCRIPT_HANDLE, $plugin_url . '/css/admin/addons-page.css', array(), $version );
68 - wp_enqueue_style( self::SCRIPT_HANDLE );
69 -
70 - // Register and enqueue Add-Ons page script.
71 - wp_register_script( self::SCRIPT_HANDLE, $plugin_url . '/js/addons-page.js', $js_dependencies, $version, true );
72 - wp_localize_script( self::SCRIPT_HANDLE, 'frmAddonsVars', self::get_js_variables() );
73 - wp_enqueue_script( self::SCRIPT_HANDLE );
74 - wp_set_script_translations( self::SCRIPT_HANDLE, 'formidable' );
75 -
76 - FrmAppHelper::dequeue_extra_global_scripts();
77 - }
78 -
79 - /**
80 - * Get the Add-Ons page JS variables as an array.
81 - *
82 - * @since 6.15
83 - *
84 - * @return array
85 - */
86 - private static function get_js_variables() {
87 - return array(
88 - 'proIsIncluded' => FrmAppHelper::pro_is_included(),
89 - 'addonRequestURL' => self::$request_addon_url,
90 - );
91 - }
92 -
93 - /**
94 - * @return void
95 - */
96 16 public static function menu() {
97 17 if ( ! current_user_can( 'activate_plugins' ) ) {
98 18 return;
99 19 }
@@ -98,9 +18,9 @@
98 18 return;
99 19 }
100 20
101 21 $label = __( 'Add-Ons', 'formidable' );
102 - $label = '<span style="color:#3FCA89">' . esc_html( $label ) . '</span>';
22 + $label = '<span style="color:#1da867">' . $label . '</span>';
103 23
104 24 add_submenu_page( 'formidable', 'Formidable | ' . __( 'Add-Ons', 'formidable' ), $label, 'frm_view_forms', 'formidable-addons', 'FrmAddonsController::list_addons' );
105 25
106 26 // remove default created subpage, make the page with highest priority as default.
@@ -106,29 +26,20 @@
106 26 // remove default created subpage, make the page with highest priority as default.
107 27 remove_submenu_page( 'formidable', 'formidable' );
108 28
109 29 if ( ! FrmAppHelper::pro_is_installed() ) {
110 - $cta_text = FrmSalesApi::get_best_sale_value( 'menu_cta_text' );
111 -
112 - if ( ! $cta_text ) {
113 - $cta_text = __( 'Upgrade', 'formidable' );
114 - }
115 -
116 30 add_submenu_page(
117 31 'formidable',
118 32 'Formidable | ' . __( 'Upgrade', 'formidable' ),
119 - '<span class="frm-upgrade-submenu">' . esc_html( $cta_text ) . '</span>',
33 + '<span class="frm-upgrade-submenu">' . __( 'Upgrade', 'formidable' ) . '</span>',
120 34 'frm_view_forms',
121 35 'formidable-pro-upgrade',
122 - function () {
123 - // This function doesn't need to do anything.
124 - // The redirect is handled earlier to avoid issues with the headers being sent.
125 - }
36 + 'FrmAddonsController::upgrade_to_pro'
126 37 );
127 38 } elseif ( 'formidable-pro-upgrade' === FrmAppHelper::get_param( 'page' ) ) {
128 39 wp_safe_redirect( admin_url( 'admin.php?page=formidable' ) );
129 40 exit;
130 - }//end if
41 + }
131 42 }
132 43
133 44 /**
134 45 * @return void
@@ -134,31 +45,28 @@
134 45 * @return void
135 46 */
136 47 public static function list_addons() {
137 48 FrmAppHelper::include_svg();
49 + $installed_addons = apply_filters( 'frm_installed_addons', array() );
50 + $license_type = '';
138 51
139 - $view_path = FrmAppHelper::plugin_path() . '/classes/views/addons/';
140 - $installed_addons = apply_filters( 'frm_installed_addons', array() );
141 - $addons = self::get_api_addons();
142 - $errors = array();
143 - $license_type = '';
144 - $request_addon_url = self::$request_addon_url;
52 + $addons = self::get_api_addons();
53 + $errors = array();
145 54
146 55 if ( isset( $addons['error'] ) ) {
147 - $api = new FrmFormApi();
148 - $errors = $api->get_error_from_response( $addons );
149 - $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'] : '';
150 59 unset( $addons['error'] );
151 60 }
152 61
153 - $pro = array(
62 + $pro = array(
154 63 'pro' => array(
155 - 'title' => 'Formidable Forms Pro',
156 - 'slug' => 'formidable-pro',
157 - 'released' => '2011-02-05',
158 - 'docs' => 'knowledgebase/',
159 - 'categories' => array( 'basic', 'plus', 'business', 'elite' ),
160 - '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.',
161 69 ),
162 70 );
163 71 $addons = $pro + $addons;
164 72 self::prepare_addons( $addons );
@@ -164,118 +72,25 @@
164 72 self::prepare_addons( $addons );
165 73
166 74 $pricing = FrmAppHelper::admin_upgrade_link( 'addons' );
167 75
168 - self::organize_and_get_categories();
169 - $categories = self::$categories;
170 -
171 - include $view_path . 'index.php';
76 + include( FrmAppHelper::plugin_path() . '/classes/views/addons/list.php' );
172 77 }
173 78
174 79 /**
175 - * Organize and set categories.
176 - *
177 - * @since 6.15
178 - *
179 80 * @return void
180 81 */
181 - protected static function organize_and_get_categories() {
182 - unset( self::$categories['strategy11'] );
183 - ksort( self::$categories );
184 -
185 - $bottom_categories = array();
186 - $plans = FrmFormsHelper::get_license_types(
187 - array(
188 - 'include_all' => false,
189 - 'case_lower' => true,
190 - )
191 - );
192 -
193 - // Extract the elements to move
194 - foreach ( $plans as $plan ) {
195 - if ( isset( self::$categories[ $plan ] ) ) {
196 - $bottom_categories[ $plan ] = self::$categories[ $plan ];
197 - unset( self::$categories[ $plan ] );
198 - }
199 - }
200 -
201 - $special_categories = array();
202 -
203 - if ( 'elite' !== self::license_type() ) {
204 - $special_categories['available-addons'] = array(
205 - 'name' => __( 'Available', 'formidable' ),
206 - // To be assigned via JavaScript.
207 - 'count' => 0,
208 - );
209 - }
210 -
211 - $special_categories['active-addons'] = array(
212 - 'name' => __( 'Active', 'formidable' ),
213 - // To be assigned via JavaScript.
214 - 'count' => 0,
215 - );
216 -
217 - $special_categories['all-items'] = array(
218 - 'name' => __( 'All Add-Ons', 'formidable' ),
219 - // To be assigned via JavaScript.
220 - 'count' => 0,
221 - );
222 -
223 - self::$categories = array_merge(
224 - $special_categories,
225 - self::$categories,
226 - $bottom_categories
227 - );
228 - }
229 -
230 - /**
231 - * Organize and set categories.
232 - *
233 - * @since 6.15
234 - *
235 - * @param array $addon The addon array that will be modified by reference.
236 - *
237 - * @return void
238 - */
239 - protected static function set_categories( &$addon ) {
240 - if ( ! isset( $addon['categories'] ) ) {
241 - return;
242 - }
243 -
244 - $addon['category-slugs'] = array();
245 -
246 - foreach ( $addon['categories'] as $category ) {
247 - $category = FrmFormsHelper::convert_legacy_package_names( $category );
248 - $category_slug = sanitize_title( $category );
249 -
250 - // Add the slug to the new array.
251 - $addon['category-slugs'][] = $category_slug;
252 -
253 - if ( ! isset( self::$categories[ $category_slug ] ) ) {
254 - self::$categories[ $category_slug ] = array(
255 - 'name' => $category,
256 - 'count' => 0,
257 - );
258 - }
259 -
260 - ++self::$categories[ $category_slug ]['count'];
261 - }
262 - }
263 -
264 - /**
265 - * @return void
266 - */
267 82 public static function license_settings() {
268 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' );
269 86
270 - if ( ! $plugins ) {
271 - esc_html_e( 'There are no plugins on your site that require a license', 'formidable' );
272 87 return;
273 88 }
274 89
275 90 ksort( $plugins );
276 91
277 - include FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php';
92 + include( FrmAppHelper::plugin_path() . '/classes/views/addons/settings.php' );
278 93 }
279 94
280 95 /**
281 96 * @return array
@@ -283,9 +98,9 @@
283 98 protected static function get_api_addons() {
284 99 $api = new FrmFormApi();
285 100 $addons = $api->get_api_info();
286 101
287 - if ( ! $addons ) {
102 + if ( empty( $addons ) ) {
288 103 $addons = self::fallback_plugin_list();
289 104 } else {
290 105 foreach ( $addons as $k => $addon ) {
291 106 if ( empty( $addon['excerpt'] ) && $k !== 'error' ) {
@@ -297,24 +112,11 @@
297 112 return $addons;
298 113 }
299 114
300 115 /**
301 - * Retrieves the count of available addons.
302 - *
303 - * @since 6.9
304 - *
305 - * @return int Count of addons.
306 - */
307 - public static function get_addons_count() {
308 - $addons = self::get_api_addons();
309 - return count( $addons );
310 - }
311 -
312 - /**
313 116 * If the API is unable to connect, show something on the addons page
314 117 *
315 118 * @since 3.04.03
316 - *
317 119 * @return array
318 120 */
319 121 protected static function fallback_plugin_list() {
320 122 $list = array(
@@ -325,19 +127,19 @@
325 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.',
326 128 ),
327 129 'mailchimp' => array(
328 130 'title' => 'Mailchimp Forms',
329 - '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.',
330 132 ),
331 133 'registration' => array(
332 134 'title' => 'User Registration Forms',
333 135 'link' => 'downloads/user-registration/',
334 - '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.',
335 137 ),
336 138 'paypal' => array(
337 139 'title' => 'PayPal Standard Forms',
338 140 'link' => 'downloads/paypal-standard/',
339 - '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.',
340 142 ),
341 143 'stripe' => array(
342 144 'title' => 'Stripe Forms',
343 145 'docs' => 'knowledgebase/stripe/',
@@ -369,9 +171,9 @@
369 171 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
370 172 ),
371 173 'zapier' => array(
372 174 'title' => 'Zapier Forms',
373 - '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.',
374 176 ),
375 177 'signature' => array(
376 178 'title' => 'Digital Signature Forms',
377 179 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -404,9 +206,8 @@
404 206 foreach ( $list as $k => $info ) {
405 207 $info['slug'] = $k;
406 208 $list[ $k ] = array_merge( $defaults, $info );
407 209 }
408 -
409 210 return $list;
410 211 }
411 212
412 213 /**
@@ -412,9 +213,8 @@
412 213 /**
413 214 * If Pro is missing but has been authenticated, include a download URL
414 215 *
415 216 * @since 3.04.03
416 - *
417 217 * @return string
418 218 */
419 219 public static function get_pro_download_url() {
420 220 $license = self::get_pro_license();
@@ -421,20 +221,17 @@
421 221 $api = new FrmFormApi( $license );
422 222 $downloads = $api->get_api_info();
423 223 $pro = self::get_pro_from_addons( $downloads );
424 224
425 - return $pro['url'] ?? '';
225 + return isset( $pro['url'] ) ? $pro['url'] : '';
426 226 }
427 227
428 228 /**
429 229 * @since 4.08
430 - *
431 - * @return string
432 230 */
433 231 public static function get_pro_license() {
434 232 $pro_cred_store = 'frmpro-credentials';
435 233 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
436 -
437 234 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
438 235 $creds = get_site_option( $pro_cred_store );
439 236 } else {
440 237 $creds = get_option( $pro_cred_store );
@@ -444,18 +241,16 @@
444 241 return '';
445 242 }
446 243
447 244 $license = $creds['license'];
448 -
449 - if ( ! $license ) {
245 + if ( empty( $license ) ) {
450 246 return '';
451 247 }
452 248
453 - if ( str_contains( $license, '-' ) ) {
249 + if ( strpos( $license, '-' ) ) {
454 250 // this is a fix for licenses saved in the past
455 251 $license = strtoupper( $license );
456 252 }
457 -
458 253 return $license;
459 254 }
460 255
461 256 /**
@@ -461,19 +256,16 @@
461 256 /**
462 257 * @since 4.08
463 258 *
464 259 * @param array $addons
465 - *
466 260 * @return array
467 261 */
468 262 protected static function get_pro_from_addons( $addons ) {
469 - return $addons['93790'] ?? array();
263 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
470 264 }
471 265
472 266 /**
473 267 * @since 4.06
474 - *
475 - * @return string
476 268 */
477 269 public static function license_type() {
478 270 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
479 271 return FrmProAddonsController::license_type();
@@ -483,32 +275,29 @@
483 275 }
484 276
485 277 /**
486 278 * @since 4.0.01
487 - *
488 - * @return bool
489 279 */
490 280 public static function is_license_expired() {
491 281 $version_info = self::get_primary_license_info();
492 -
493 282 if ( ! isset( $version_info['error'] ) ) {
494 283 return false;
495 284 }
496 285
497 - $expires = $version_info['error']['expires'] ?? 0;
286 + return $version_info['error'];
287 + }
498 288
499 - if ( ! $expires || $expires > time() ) {
500 - 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();
501 297 }
502 298
503 - $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
504 -
505 - if ( $rate_limited ) {
506 - // Do not return false positives for rate limited responses.
507 - return false;
508 - }
509 -
510 - return $version_info['error'];
299 + return false;
511 300 }
512 301
513 302 /**
514 303 * @since 4.08
@@ -517,13 +306,11 @@
517 306 * @return array|false
518 307 */
519 308 public static function get_primary_license_info() {
520 309 $installed_addons = apply_filters( 'frm_installed_addons', array() );
521 -
522 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
310 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
523 311 return false;
524 312 }
525 -
526 313 $installed_addons = array(
527 314 'formidable_pro' => $installed_addons['formidable_pro'],
528 315 );
529 316
@@ -531,12 +318,8 @@
531 318 }
532 319
533 320 /**
534 321 * @since 3.04.03
535 - *
536 - * @param mixed $transient
537 - *
538 - * @return object
539 322 */
540 323 public static function check_update( $transient ) {
541 324 if ( ! FrmAppHelper::pro_is_installed() ) {
542 325 // Don't make any changes if only Lite is installed.
@@ -547,10 +330,9 @@
547 330 $transient = new stdClass();
548 331 }
549 332
550 333 $installed_addons = apply_filters( 'frm_installed_addons', array() );
551 -
552 - if ( ! $installed_addons ) {
334 + if ( empty( $installed_addons ) ) {
553 335 return $transient;
554 336 }
555 337
556 338 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -556,9 +338,9 @@
556 338 $version_info = self::fill_update_addon_info( $installed_addons );
557 339 $transient->last_checked = time();
558 340 $wp_plugins = self::get_plugins();
559 341
560 - foreach ( $version_info as $plugin ) {
342 + foreach ( $version_info as $id => $plugin ) {
561 343 $plugin = (object) $plugin;
562 344
563 345 if ( ! isset( $plugin->new_version ) || ! isset( $plugin->package ) ) {
564 346 continue;
@@ -564,10 +346,9 @@
564 346 continue;
565 347 }
566 348
567 349 $folder = $plugin->plugin;
568 -
569 - if ( ! $folder ) {
350 + if ( empty( $folder ) ) {
570 351 continue;
571 352 }
572 353
573 354 if ( ! self::is_installed( $folder ) ) {
@@ -574,10 +355,10 @@
574 355 // don't show an update if the plugin isn't installed
575 356 continue;
576 357 }
577 358
578 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
579 - $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';
580 361 $plugin->slug = explode( '/', $folder )[0];
581 362
582 363 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
583 364 $transient->response[ $folder ] = $plugin;
@@ -597,9 +378,8 @@
597 378 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
598 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.
599 380 *
600 381 * @since 5.5.2
601 - *
602 382 * @return array
603 383 */
604 384 protected static function get_plugins() {
605 385 if ( ! function_exists( 'get_plugins' ) ) {
@@ -639,16 +419,15 @@
639 419 continue;
640 420 }
641 421
642 422 $new_license = $addon->license;
643 -
644 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
423 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
645 424 continue;
646 425 }
647 426
648 427 $checked_licenses[] = $new_license;
649 - $api = new FrmFormApi( $new_license );
650 428
429 + $api = new FrmFormApi( $new_license );
651 430 if ( empty( $version_info ) ) {
652 431 $version_info = $api->get_api_info();
653 432 continue;
654 433 }
@@ -653,21 +432,18 @@
653 432 continue;
654 433 }
655 434
656 435 $plugin = $api->get_addon_for_license( $addon, $version_info );
657 -
658 - if ( ! $plugin ) {
436 + if ( empty( $plugin ) ) {
659 437 continue;
660 438 }
661 439
662 - $download_id = $plugin['id'] ?? 0;
663 -
664 - if ( $download_id && ! isset( $version_info[ $download_id ]['package'] ) ) {
440 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
441 + if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
665 442 // if this addon is using its own license, get the update url
666 443 $addon_info = $api->get_api_info();
667 444
668 445 $version_info[ $download_id ] = $addon_info[ $download_id ];
669 -
670 446 if ( isset( $addon_info['error'] ) ) {
671 447 $version_info[ $download_id ]['error'] = array(
672 448 'message' => $addon_info['error']['message'],
673 449 'code' => $addon_info['error']['code'],
@@ -682,11 +458,9 @@
682 458 /**
683 459 * Get the action link for an addon that isn't active.
684 460 *
685 461 * @since 3.06.03
686 - *
687 462 * @param string $plugin The plugin slug.
688 - *
689 463 * @return array
690 464 */
691 465 public static function install_link( $plugin ) {
692 466 $link = array();
@@ -697,20 +471,20 @@
697 471 $link = array(
698 472 'url' => $addon['plugin'],
699 473 'class' => 'frm-activate-addon',
700 474 );
701 - } elseif ( ! empty( $addon['url'] ) ) {
475 + } elseif ( isset( $addon['url'] ) && ! empty( $addon['url'] ) ) {
702 476 $link = array(
703 477 'url' => $addon['url'],
704 478 'class' => 'frm-install-addon',
705 479 );
706 - } elseif ( ! empty( $addon['categories'] ) ) {
480 + } elseif ( isset( $addon['categories'] ) && ! empty( $addon['categories'] ) ) {
707 481 $link = array(
708 482 'categories' => $addon['categories'],
709 483 );
710 484 }
711 485
712 - if ( $link ) {
486 + if ( ! empty( $link ) ) {
713 487 $link['status'] = $addon['status']['type'];
714 488 }
715 489 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
716 490 $link = array(
@@ -723,41 +497,33 @@
723 497 }
724 498
725 499 /**
726 500 * @since 4.09
727 - *
728 501 * @param string $plugin The plugin slug.
729 - *
730 502 * @return array|false
731 503 */
732 - public static function get_addon( $plugin ) {
504 + protected static function get_addon( $plugin ) {
733 505 $addons = self::get_api_addons();
734 506 self::prepare_addons( $addons );
735 -
736 507 foreach ( $addons as $addon ) {
737 508 $slug = explode( '/', $addon['plugin'] );
738 -
739 509 if ( $slug[0] === 'formidable-' . $plugin ) {
740 510 return $addon;
741 511 }
742 512 }
743 -
744 513 return false;
745 514 }
746 515
747 516 /**
748 517 * @since 4.09
749 - *
750 518 * @return string
751 519 */
752 520 protected static function get_license_type() {
753 521 $license_type = '';
754 522 $addons = self::get_api_addons();
755 -
756 523 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
757 524 $license_type = $addons['error']['type'];
758 525 }
759 -
760 526 return $license_type;
761 527 }
762 528
763 529 /**
@@ -770,12 +536,11 @@
770 536 */
771 537 public static function get_addon_for_license( $addons, $license ) {
772 538 $download_id = $license->download_id;
773 539 $plugin = array();
774 -
775 - if ( ! $download_id && ! empty( $addons ) ) {
540 + if ( empty( $download_id ) && ! empty( $addons ) ) {
776 541 foreach ( $addons as $addon ) {
777 - if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
542 + if ( strtolower( $license->plugin_name ) == strtolower( $addon['title'] ) ) {
778 543 return $addon;
779 544 }
780 545 }
781 546 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -785,33 +550,29 @@
785 550 return $plugin;
786 551 }
787 552
788 553 /**
789 - * @param array $addons
790 - *
791 554 * @return void
792 555 */
793 556 protected static function prepare_addons( &$addons ) {
794 - // Reset categories to prevent count accumulation across multiple calls.
795 - self::$categories = array();
796 -
797 557 $activate_url = '';
798 -
799 558 if ( current_user_can( 'activate_plugins' ) ) {
800 559 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
801 560 }
802 561
803 562 $loop_addons = $addons;
804 -
805 563 foreach ( $loop_addons as $id => $addon ) {
806 564 if ( is_numeric( $id ) ) {
807 565 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
808 566 $file_name = $addon['plugin'];
809 567 } else {
810 - $slug = $id;
811 - $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 + }
812 574 $file_name = $base_file . '/' . $base_file . '.php';
813 -
814 575 if ( ! isset( $addon['plugin'] ) ) {
815 576 $addon['plugin'] = $file_name;
816 577 }
817 578 }
@@ -816,12 +577,10 @@
816 577 }
817 578 }
818 579
819 580 $addon['installed'] = self::is_installed( $file_name );
820 -
821 581 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
822 582 $active_views_version = self::get_active_views_version();
823 -
824 583 if ( false !== $active_views_version && $slug !== $active_views_version ) {
825 584 $addon['installed'] = false;
826 585 }
827 586 }
@@ -827,9 +586,9 @@
827 586 }
828 587
829 588 $addon['activate_url'] = '';
830 589
831 - 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 ) ) {
832 591 $addon['activate_url'] = add_query_arg(
833 592 array(
834 593 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
835 594 'plugin' => $file_name,
@@ -845,21 +604,16 @@
845 604
846 605 if ( ! isset( $addon['link'] ) ) {
847 606 $addon['link'] = 'downloads/' . $slug . '/';
848 607 }
608 + self::prepare_addon_link( $addon['link'] );
849 609
850 - self::prepare_addon_link( $addon['link'] );
851 610 self::set_addon_status( $addon );
852 - self::set_categories( $addon );
853 -
854 611 $addons[ $id ] = $addon;
855 612 }//end foreach
856 613 }
857 614
858 615 /**
859 - * @param string $file_name
860 - * @param string $slug
861 - *
862 616 * @return bool
863 617 */
864 618 private static function is_plugin_active( $file_name, $slug ) {
865 619 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -868,15 +622,14 @@
868 622 return is_plugin_active( $file_name );
869 623 }
870 624
871 625 /**
872 - * @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.
873 627 */
874 628 private static function get_active_views_version() {
875 629 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
876 630 return false;
877 631 }
878 -
879 632 $plugin_version = FrmViewsAppHelper::plugin_version();
880 633 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
881 634 }
882 635
@@ -882,25 +635,22 @@
882 635
883 636 /**
884 637 * @since 3.04.02
885 638 *
886 - * @param string $link
887 - *
888 639 * @return void
889 640 */
890 641 protected static function prepare_addon_link( &$link ) {
891 642 $site_url = 'https://formidableforms.com/';
892 -
893 - if ( ! str_starts_with( $link, 'http' ) ) {
643 + if ( strpos( $link, 'http' ) !== 0 ) {
894 644 $link = $site_url . $link;
895 645 }
896 -
897 - $link = FrmAppHelper::make_affiliate_url( $link );
898 -
899 - $utm = array(
900 - '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',
901 651 );
902 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
652 + $link = add_query_arg( $query_args, $link );
903 653 }
904 654
905 655 /**
906 656 * Add the status to the addon array. Status options are:
@@ -907,10 +657,8 @@
907 657 * installed, active, not installed
908 658 *
909 659 * @since 3.04.02
910 660 *
911 - * @param array $addon
912 - *
913 661 * @return void
914 662 */
915 663 protected static function set_addon_status( &$addon ) {
916 664 if ( ! empty( $addon['activate_url'] ) ) {
@@ -931,8 +679,250 @@
931 679 }
932 680 }
933 681
934 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 + /**
935 925 * @since 5.5.2
936 926 *
937 927 * @param string $plugin
938 928 * @param string $redirect
@@ -937,10 +927,9 @@
937 927 * @param string $plugin
938 928 * @param string $redirect
939 929 * @param bool $network_wide
940 930 * @param bool $silent
941 - *
942 - * @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.
943 932 */
944 933 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
945 934 if ( ! function_exists( 'activate_plugin' ) ) {
946 935 require_once ABSPATH . 'wp-admin/includes/plugin.php';
@@ -954,9 +943,8 @@
954 943 * @since 6.8
955 944 *
956 945 * @param string $plugin
957 946 * @param bool $silent
958 - *
959 947 * @return void
960 948 */
961 949 protected static function deactivate_plugin( $plugin, $silent = false ) {
962 950 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -970,9 +958,8 @@
970 958 *
971 959 * @since 6.8
972 960 *
973 961 * @param string $plugin
974 - *
975 962 * @return true|WP_Error True on success, WP_Error on invalid file.
976 963 */
977 964 protected static function uninstall_plugin( $plugin ) {
978 965 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -985,9 +972,13 @@
985 972
986 973 self::deactivate_plugin( $plugin, true );
987 974 $result = delete_plugins( array( $plugin ) );
988 975
989 - return is_wp_error( $result ) ? $result : true;
976 + if ( is_wp_error( $result ) ) {
977 + return $result;
978 + }
979 +
980 + return true;
990 981 }
991 982
992 983 /**
993 984 * @since 5.0.10
@@ -1002,10 +993,8 @@
1002 993 }
1003 994
1004 995 /**
1005 996 * @since 4.08
1006 - *
1007 - * @return mixed[]|null
1008 997 */
1009 998 protected static function download_and_activate() {
1010 999 if ( is_admin() ) {
1011 1000 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1013,14 +1002,12 @@
1013 1002
1014 1003 self::maybe_show_cred_form();
1015 1004
1016 1005 $installed = self::install_addon();
1017 -
1018 1006 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1019 1007 return $installed;
1020 1008 }
1021 1009 self::handle_addon_action( $installed, 'activate' );
1022 - return null;
1023 1010 }
1024 1011
1025 1012 /**
1026 1013 * @since 3.04.02
@@ -1028,12 +1015,12 @@
1028 1015 * @return void
1029 1016 */
1030 1017 protected static function maybe_show_cred_form() {
1031 1018 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1032 - include_once ABSPATH . 'wp-admin/includes/file.php';
1019 + include_once( ABSPATH . 'wp-admin/includes/file.php' );
1033 1020 }
1034 1021
1035 - // 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.
1036 1023 ob_start();
1037 1024
1038 1025 $show_form = false;
1039 1026 $method = '';
@@ -1050,8 +1037,9 @@
1050 1037
1051 1038 if ( $show_form ) {
1052 1039 $form = ob_get_clean();
1053 1040 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
1041 + $data = $form;
1054 1042 $response = array(
1055 1043 'success' => false,
1056 1044 'message' => $message,
1057 1045 'form' => $form,
@@ -1071,9 +1059,11 @@
1071 1059 *
1072 1060 * @return bool
1073 1061 */
1074 1062 public static function url_is_allowed( $download_url ) {
1075 - 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 + );
1076 1066 }
1077 1067
1078 1068 /**
1079 1069 * We do not need any extra credentials if we have gotten this far,
@@ -1079,10 +1069,8 @@
1079 1069 * We do not need any extra credentials if we have gotten this far,
1080 1070 * so let's install the plugin.
1081 1071 *
1082 1072 * @since 3.04.02
1083 - *
1084 - * @return array|string
1085 1073 */
1086 1074 protected static function install_addon() {
1087 1075 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1088 1076
@@ -1102,9 +1090,8 @@
1102 1090 // Flush the cache and return the newly installed plugin basename.
1103 1091 wp_cache_flush();
1104 1092
1105 1093 $plugin = $installer->plugin_info();
1106 -
1107 1094 if ( ! $plugin ) {
1108 1095 return array(
1109 1096 'message' => 'Plugin was not installed. ' . $installer->result,
1110 1097 'success' => false,
@@ -1109,9 +1096,8 @@
1109 1096 'message' => 'Plugin was not installed. ' . $installer->result,
1110 1097 'success' => false,
1111 1098 );
1112 1099 }
1113 -
1114 1100 return $plugin;
1115 1101 }
1116 1102
1117 1103 /**
@@ -1122,9 +1108,9 @@
1122 1108 * @return void
1123 1109 */
1124 1110 public static function ajax_activate_addon() {
1125 1111 self::process_addon_action(
1126 - function ( $plugin ) {
1112 + function( $plugin ) {
1127 1113 return self::handle_addon_action( $plugin, 'activate' );
1128 1114 },
1129 1115 array( 'FrmAddonsController', 'get_addon_activation_response' )
1130 1116 );
@@ -1147,9 +1133,9 @@
1147 1133 * @return void
1148 1134 */
1149 1135 public static function ajax_deactivate_addon() {
1150 1136 self::process_addon_action(
1151 - function ( $plugin ) {
1137 + function( $plugin ) {
1152 1138 return self::handle_addon_action( $plugin, 'deactivate' );
1153 1139 }
1154 1140 );
1155 1141 }
@@ -1162,9 +1148,9 @@
1162 1148 * @return void
1163 1149 */
1164 1150 public static function ajax_uninstall_addon() {
1165 1151 self::process_addon_action(
1166 - function ( $plugin ) {
1152 + function( $plugin ) {
1167 1153 return self::handle_addon_action( $plugin, 'uninstall' );
1168 1154 }
1169 1155 );
1170 1156 }
@@ -1175,9 +1161,8 @@
1175 1161 * @since 6.8
1176 1162 *
1177 1163 * @param callable $action_callback The specific add-on action to be executed.
1178 1164 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1179 - *
1180 1165 * @return void
1181 1166 */
1182 1167 private static function process_addon_action( $action_callback, $response_callback = null ) {
1183 1168 self::install_addon_permissions();
@@ -1200,14 +1185,13 @@
1200 1185 * @since 6.8
1201 1186 *
1202 1187 * @param string $installed The plugin folder name with file name.
1203 1188 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1204 - *
1205 - * @return mixed[]|null
1189 + * @return void|array
1206 1190 */
1207 1191 protected static function handle_addon_action( $installed, $action ) {
1208 1192 if ( ! $installed || ! $action ) {
1209 - return null;
1193 + return;
1210 1194 }
1211 1195
1212 1196 $result = null;
1213 1197 switch ( $action ) {
@@ -1227,9 +1211,8 @@
1227 1211 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1228 1212 if ( wp_doing_ajax() ) {
1229 1213 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1230 1214 }
1231 -
1232 1215 return array(
1233 1216 'message' => $result->get_error_message(),
1234 1217 'success' => false,
1235 1218 );
@@ -1243,14 +1226,17 @@
1243 1226 * @return array
1244 1227 */
1245 1228 private static function get_addon_activation_response() {
1246 1229 $activating_page = self::get_activating_page();
1247 - $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
1248 1230
1249 - 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(
1250 1234 'message' => $message,
1251 1235 'saveAndReload' => $activating_page,
1252 1236 );
1237 +
1238 + return $response;
1253 1239 }
1254 1240
1255 1241 /**
1256 1242 * Return a string that reflects the page from which the addon is being activated on,
@@ -1259,14 +1245,17 @@
1259 1245 * @return string
1260 1246 */
1261 1247 private static function get_activating_page() {
1262 1248 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1249 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1250 + return 'settings';
1251 + }
1263 1252
1264 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1265 - return 'settings';
1253 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1254 + return 'form_builder';
1266 1255 }
1267 1256
1268 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1257 + return '';
1269 1258 }
1270 1259
1271 1260 /**
1272 1261 * Run security checks before installing
@@ -1290,22 +1279,17 @@
1290 1279 * @return string
1291 1280 */
1292 1281 public static function connect_link() {
1293 1282 $auth = get_option( 'frm_connect_token' );
1294 -
1295 - if ( ! $auth ) {
1283 + if ( empty( $auth ) ) {
1296 1284 $auth = hash( 'sha512', wp_rand() );
1297 1285 update_option( 'frm_connect_token', $auth, 'no' );
1298 1286 }
1299 -
1300 - $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1301 - $link = 'https://formidableforms.com/api-connect/';
1287 + $link = FrmAppHelper::admin_upgrade_link( 'connect', 'api-connect' );
1302 1288 $args = array(
1303 1289 'v' => 2,
1304 1290 'siteurl' => FrmAppHelper::site_url(),
1305 1291 'url' => get_rest_url(),
1306 - 'inst' => (int) FrmAppHelper::pro_is_included(),
1307 - 'return' => $page,
1308 1292 'token' => $auth,
1309 1293 'l' => self::get_pro_license(),
1310 1294 );
1311 1295
@@ -1323,19 +1307,19 @@
1323 1307 // Verify params present (auth & download link).
1324 1308 $post_auth = FrmAppHelper::get_param( 'token', '', 'request', 'sanitize_text_field' );
1325 1309 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1326 1310
1327 - // The download link is not required if already installed.
1328 - $is_installed = FrmAppHelper::pro_is_included();
1329 - $file_missing = ! $is_installed && ! $post_url;
1330 -
1331 - if ( ! $post_auth || $file_missing ) {
1311 + if ( ! $post_auth || ! $post_url ) {
1332 1312 return false;
1333 1313 }
1334 1314
1335 1315 // Verify auth.
1336 1316 $auth = get_option( 'frm_connect_token' );
1337 - return $auth && hash_equals( $auth, $post_auth );
1317 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1318 + return false;
1319 + }
1320 +
1321 + return true;
1338 1322 }
1339 1323
1340 1324 /**
1341 1325 * Install and/or activate the add-on file.
@@ -1340,25 +1324,23 @@
1340 1324 /**
1341 1325 * Install and/or activate the add-on file.
1342 1326 *
1343 1327 * @since 4.08
1344 - *
1345 - * @return array
1346 1328 */
1347 1329 public static function install_addon_api() {
1348 1330 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1349 1331
1332 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1333 +
1350 1334 // Delete so cannot replay.
1351 1335 delete_option( 'frm_connect_token' );
1352 1336
1353 1337 // It's already installed and active.
1354 1338 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1355 -
1356 1339 if ( is_wp_error( $active ) ) {
1357 - $response = self::maybe_download_and_activate();
1358 -
1359 - if ( is_array( $response ) ) {
1360 - // The download failed.
1340 + // Download plugin now.
1341 + $response = self::download_and_activate();
1342 + if ( is_array( $response ) && isset( $response['success'] ) ) {
1361 1343 return $response;
1362 1344 }
1363 1345 }
1364 1346
@@ -1365,9 +1347,8 @@
1365 1347 // If empty license, save it now.
1366 1348 if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1367 1349 load_formidable_pro();
1368 1350 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1369 -
1370 1351 if ( ! $license ) {
1371 1352 return array(
1372 1353 'success' => false,
1373 1354 'error' => 'That site does not have a valid license key.',
@@ -1374,9 +1355,8 @@
1374 1355 );
1375 1356 }
1376 1357
1377 1358 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1378 -
1379 1359 if ( ! $response['success'] ) {
1380 1360 // Could not activate license.
1381 1361 return $response;
1382 1362 }
@@ -1387,32 +1367,8 @@
1387 1367 );
1388 1368 }
1389 1369
1390 1370 /**
1391 - * @since 6.8.3
1392 - *
1393 - * @return array|true
1394 - */
1395 - private static function maybe_download_and_activate() {
1396 - if ( ! self::$plugin ) {
1397 - return array(
1398 - 'success' => false,
1399 - 'message' => __( 'The plugin download was not found.', 'formidable' ),
1400 - );
1401 - }
1402 -
1403 - // Download plugin now.
1404 - $response = self::download_and_activate();
1405 -
1406 - if ( is_array( $response ) && isset( $response['success'] ) ) {
1407 - // The download failed.
1408 - return $response;
1409 - }
1410 -
1411 - return true;
1412 - }
1413 -
1414 - /**
1415 1371 * Render a conditional action button for a specified plugin
1416 1372 *
1417 1373 * @since 4.09
1418 1374 *
@@ -1417,9 +1373,8 @@
1417 1373 * @since 4.09
1418 1374 *
1419 1375 * @param string $plugin
1420 1376 * @param array|string $upgrade_link_args
1421 - *
1422 1377 * @return void
1423 1378 */
1424 1379 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1425 1380 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1450,13 +1405,12 @@
1450 1405 * @param array $atts {
1451 1406 * Button attributes.
1452 1407 *
1453 1408 * @type array $addon
1454 - * @type false|string $license_type
1409 + * @type string|false $license_type
1455 1410 * @type string $plan_required
1456 1411 * @type string $upgrade_link
1457 1412 * }
1458 - *
1459 1413 * @return void
1460 1414 */
1461 1415 public static function show_conditional_action_button( $atts ) {
1462 1416 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1470,16 +1424,15 @@
1470 1424 /**
1471 1425 * @since 4.09.01
1472 1426 *
1473 1427 * @param array|false $addon
1474 - * @param array|string $upgrade_link
1428 + * @param string|array $upgrade_link
1475 1429 *
1476 1430 * @return void
1477 1431 */
1478 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1432 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1479 1433 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1480 1434 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1481 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1482 1435
1483 1436 if ( $addon ) {
1484 1437 $upgrade_link .= '&utm_content=' . $addon['slug'];
1485 1438 }
@@ -1489,15 +1442,14 @@
1489 1442 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1490 1443 }
1491 1444
1492 1445 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1493 -
1494 - if ( ! str_contains( $class, 'frm-button' ) ) {
1446 + if ( strpos( $class, 'frm-button' ) === false ) {
1495 1447 $class .= ' frm-button-secondary frm-button-sm';
1496 1448 }
1497 1449 ?>
1498 - <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 ?>
1499 - <?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' ); ?>
1500 1452 </a>
1501 1453 <?php
1502 1454 }
1503 1455
@@ -1509,9 +1461,8 @@
1509 1461 public static function ajax_install_addon() {
1510 1462 self::install_addon_permissions();
1511 1463
1512 1464 $result = self::download_and_activate();
1513 -
1514 1465 if ( isset( $result['success'] ) && ! $result['success'] ) {
1515 1466 echo json_encode( $result );
1516 1467 wp_die();
1517 1468 }
@@ -1544,8 +1495,9 @@
1544 1495 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1545 1496
1546 1497 if ( ! is_array( $allowed_url_list ) ) {
1547 1498 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1499 +
1548 1500 return array();
1549 1501 }
1550 1502
1551 1503 return $allowed_url_list;
@@ -1555,10 +1507,8 @@
1555 1507 * Gets required plan for an addon.
1556 1508 *
1557 1509 * @since 6.4.2
1558 1510 *
1559 - * @param int|string $addon_id
1560 - *
1561 1511 * @return string Empty string if no plan is required for active license.
1562 1512 */
1563 1513 public static function get_addon_required_plan( $addon_id ) {
1564 1514 $api = new FrmFormApi();
@@ -1573,6 +1523,110 @@
1573 1523 $requires = '';
1574 1524 }
1575 1525
1576 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();
1577 1631 }
1578 1632 }