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