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