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