PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.12.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.12.1
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 +329 -339 6.276.12.1 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 }
@@ -517,13 +319,11 @@
517 319 * @return array|false
518 320 */
519 321 public static function get_primary_license_info() {
520 322 $installed_addons = apply_filters( 'frm_installed_addons', array() );
521 -
522 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
323 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
523 324 return false;
524 325 }
525 -
526 326 $installed_addons = array(
527 327 'formidable_pro' => $installed_addons['formidable_pro'],
528 328 );
529 329
@@ -531,12 +331,8 @@
531 331 }
532 332
533 333 /**
534 334 * @since 3.04.03
535 - *
536 - * @param mixed $transient
537 - *
538 - * @return object
539 335 */
540 336 public static function check_update( $transient ) {
541 337 if ( ! FrmAppHelper::pro_is_installed() ) {
542 338 // Don't make any changes if only Lite is installed.
@@ -547,10 +343,9 @@
547 343 $transient = new stdClass();
548 344 }
549 345
550 346 $installed_addons = apply_filters( 'frm_installed_addons', array() );
551 -
552 - if ( ! $installed_addons ) {
347 + if ( empty( $installed_addons ) ) {
553 348 return $transient;
554 349 }
555 350
556 351 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -564,10 +359,9 @@
564 359 continue;
565 360 }
566 361
567 362 $folder = $plugin->plugin;
568 -
569 - if ( ! $folder ) {
363 + if ( empty( $folder ) ) {
570 364 continue;
571 365 }
572 366
573 367 if ( ! self::is_installed( $folder ) ) {
@@ -574,10 +368,10 @@
574 368 // don't show an update if the plugin isn't installed
575 369 continue;
576 370 }
577 371
578 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
579 - $wp_version = $wp_plugin['Version'] ?? '1.0';
372 + $wp_plugin = isset( $wp_plugins[ $folder ] ) ? $wp_plugins[ $folder ] : array();
373 + $wp_version = isset( $wp_plugin['Version'] ) ? $wp_plugin['Version'] : '1.0';
580 374 $plugin->slug = explode( '/', $folder )[0];
581 375
582 376 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
583 377 $transient->response[ $folder ] = $plugin;
@@ -597,9 +391,8 @@
597 391 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
598 392 * This means that trying to access FrmAppHelper::get_plugins when upgrading from a Lite version before v5.5 results in a one-off error.
599 393 *
600 394 * @since 5.5.2
601 - *
602 395 * @return array
603 396 */
604 397 protected static function get_plugins() {
605 398 if ( ! function_exists( 'get_plugins' ) ) {
@@ -639,16 +432,15 @@
639 432 continue;
640 433 }
641 434
642 435 $new_license = $addon->license;
643 -
644 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
436 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
645 437 continue;
646 438 }
647 439
648 440 $checked_licenses[] = $new_license;
649 - $api = new FrmFormApi( $new_license );
650 441
442 + $api = new FrmFormApi( $new_license );
651 443 if ( empty( $version_info ) ) {
652 444 $version_info = $api->get_api_info();
653 445 continue;
654 446 }
@@ -653,21 +445,18 @@
653 445 continue;
654 446 }
655 447
656 448 $plugin = $api->get_addon_for_license( $addon, $version_info );
657 -
658 - if ( ! $plugin ) {
449 + if ( empty( $plugin ) ) {
659 450 continue;
660 451 }
661 452
662 - $download_id = $plugin['id'] ?? 0;
663 -
664 - if ( $download_id && ! isset( $version_info[ $download_id ]['package'] ) ) {
453 + $download_id = isset( $plugin['id'] ) ? $plugin['id'] : 0;
454 + if ( ! empty( $download_id ) && ! isset( $version_info[ $download_id ]['package'] ) ) {
665 455 // if this addon is using its own license, get the update url
666 456 $addon_info = $api->get_api_info();
667 457
668 458 $version_info[ $download_id ] = $addon_info[ $download_id ];
669 -
670 459 if ( isset( $addon_info['error'] ) ) {
671 460 $version_info[ $download_id ]['error'] = array(
672 461 'message' => $addon_info['error']['message'],
673 462 'code' => $addon_info['error']['code'],
@@ -682,11 +471,9 @@
682 471 /**
683 472 * Get the action link for an addon that isn't active.
684 473 *
685 474 * @since 3.06.03
686 - *
687 475 * @param string $plugin The plugin slug.
688 - *
689 476 * @return array
690 477 */
691 478 public static function install_link( $plugin ) {
692 479 $link = array();
@@ -708,9 +495,9 @@
708 495 'categories' => $addon['categories'],
709 496 );
710 497 }
711 498
712 - if ( $link ) {
499 + if ( ! empty( $link ) ) {
713 500 $link['status'] = $addon['status']['type'];
714 501 }
715 502 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
716 503 $link = array(
@@ -723,41 +510,33 @@
723 510 }
724 511
725 512 /**
726 513 * @since 4.09
727 - *
728 514 * @param string $plugin The plugin slug.
729 - *
730 515 * @return array|false
731 516 */
732 517 public static function get_addon( $plugin ) {
733 518 $addons = self::get_api_addons();
734 519 self::prepare_addons( $addons );
735 -
736 520 foreach ( $addons as $addon ) {
737 521 $slug = explode( '/', $addon['plugin'] );
738 -
739 522 if ( $slug[0] === 'formidable-' . $plugin ) {
740 523 return $addon;
741 524 }
742 525 }
743 -
744 526 return false;
745 527 }
746 528
747 529 /**
748 530 * @since 4.09
749 - *
750 531 * @return string
751 532 */
752 533 protected static function get_license_type() {
753 534 $license_type = '';
754 535 $addons = self::get_api_addons();
755 -
756 536 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
757 537 $license_type = $addons['error']['type'];
758 538 }
759 -
760 539 return $license_type;
761 540 }
762 541
763 542 /**
@@ -770,10 +549,9 @@
770 549 */
771 550 public static function get_addon_for_license( $addons, $license ) {
772 551 $download_id = $license->download_id;
773 552 $plugin = array();
774 -
775 - if ( ! $download_id && ! empty( $addons ) ) {
553 + if ( empty( $download_id ) && ! empty( $addons ) ) {
776 554 foreach ( $addons as $addon ) {
777 555 if ( strtolower( $license->plugin_name ) === strtolower( $addon['title'] ) ) {
778 556 return $addon;
779 557 }
@@ -785,33 +563,29 @@
785 563 return $plugin;
786 564 }
787 565
788 566 /**
789 - * @param array $addons
790 - *
791 567 * @return void
792 568 */
793 569 protected static function prepare_addons( &$addons ) {
794 - // Reset categories to prevent count accumulation across multiple calls.
795 - self::$categories = array();
796 -
797 570 $activate_url = '';
798 -
799 571 if ( current_user_can( 'activate_plugins' ) ) {
800 572 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
801 573 }
802 574
803 575 $loop_addons = $addons;
804 -
805 576 foreach ( $loop_addons as $id => $addon ) {
806 577 if ( is_numeric( $id ) ) {
807 578 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
808 579 $file_name = $addon['plugin'];
809 580 } else {
810 - $slug = $id;
811 - $base_file = $addon['file'] ?? 'formidable-' . $slug;
581 + $slug = $id;
582 + if ( isset( $addon['file'] ) ) {
583 + $base_file = $addon['file'];
584 + } else {
585 + $base_file = 'formidable-' . $slug;
586 + }
812 587 $file_name = $base_file . '/' . $base_file . '.php';
813 -
814 588 if ( ! isset( $addon['plugin'] ) ) {
815 589 $addon['plugin'] = $file_name;
816 590 }
817 591 }
@@ -816,12 +590,10 @@
816 590 }
817 591 }
818 592
819 593 $addon['installed'] = self::is_installed( $file_name );
820 -
821 594 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
822 595 $active_views_version = self::get_active_views_version();
823 -
824 596 if ( false !== $active_views_version && $slug !== $active_views_version ) {
825 597 $addon['installed'] = false;
826 598 }
827 599 }
@@ -827,9 +599,9 @@
827 599 }
828 600
829 601 $addon['activate_url'] = '';
830 602
831 - if ( $addon['installed'] && $activate_url && ! self::is_plugin_active( $file_name, $slug ) ) {
603 + if ( $addon['installed'] && ! empty( $activate_url ) && ! self::is_plugin_active( $file_name, $slug ) ) {
832 604 $addon['activate_url'] = add_query_arg(
833 605 array(
834 606 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
835 607 'plugin' => $file_name,
@@ -845,21 +617,16 @@
845 617
846 618 if ( ! isset( $addon['link'] ) ) {
847 619 $addon['link'] = 'downloads/' . $slug . '/';
848 620 }
621 + self::prepare_addon_link( $addon['link'] );
849 622
850 - self::prepare_addon_link( $addon['link'] );
851 623 self::set_addon_status( $addon );
852 - self::set_categories( $addon );
853 -
854 624 $addons[ $id ] = $addon;
855 625 }//end foreach
856 626 }
857 627
858 628 /**
859 - * @param string $file_name
860 - * @param string $slug
861 - *
862 629 * @return bool
863 630 */
864 631 private static function is_plugin_active( $file_name, $slug ) {
865 632 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -874,9 +641,8 @@
874 641 private static function get_active_views_version() {
875 642 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
876 643 return false;
877 644 }
878 -
879 645 $plugin_version = FrmViewsAppHelper::plugin_version();
880 646 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
881 647 }
882 648
@@ -882,25 +648,22 @@
882 648
883 649 /**
884 650 * @since 3.04.02
885 651 *
886 - * @param string $link
887 - *
888 652 * @return void
889 653 */
890 654 protected static function prepare_addon_link( &$link ) {
891 655 $site_url = 'https://formidableforms.com/';
892 -
893 - if ( ! str_starts_with( $link, 'http' ) ) {
656 + if ( strpos( $link, 'http' ) !== 0 ) {
894 657 $link = $site_url . $link;
895 658 }
896 -
897 - $link = FrmAppHelper::make_affiliate_url( $link );
898 -
899 - $utm = array(
900 - 'campaign' => 'addons',
659 + $link = FrmAppHelper::make_affiliate_url( $link );
660 + $query_args = array(
661 + 'utm_source' => 'WordPress',
662 + 'utm_medium' => 'addons',
663 + 'utm_campaign' => 'liteplugin',
901 664 );
902 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
665 + $link = add_query_arg( $query_args, $link );
903 666 }
904 667
905 668 /**
906 669 * Add the status to the addon array. Status options are:
@@ -907,10 +670,8 @@
907 670 * installed, active, not installed
908 671 *
909 672 * @since 3.04.02
910 673 *
911 - * @param array $addon
912 - *
913 674 * @return void
914 675 */
915 676 protected static function set_addon_status( &$addon ) {
916 677 if ( ! empty( $addon['activate_url'] ) ) {
@@ -931,8 +692,218 @@
931 692 }
932 693 }
933 694
934 695 /**
696 + * @return void
697 + */
698 + public static function upgrade_to_pro() {
699 + FrmAppHelper::include_svg();
700 +
701 + $link_parts = array(
702 + 'medium' => 'upgrade',
703 + 'content' => 'button',
704 + );
705 +
706 + $features = array(
707 + 'Display Entries' => array(
708 + array(
709 + 'label' => 'Display form data with virtually limitless views',
710 + 'link' => array(
711 + 'content' => 'views',
712 + 'param' => 'views-display-form-data',
713 + ),
714 + 'lite' => false,
715 + ),
716 + array(
717 + 'label' => 'Generate graphs and stats based on your submitted data',
718 + 'link' => array(
719 + 'content' => 'graphs',
720 + 'param' => 'statistics-graphs-wordpress-forms',
721 + ),
722 + 'lite' => false,
723 + ),
724 + ),
725 + 'Entry Management' => array(
726 + array(
727 + 'label' => 'Import entries from a CSV',
728 + 'link' => array(
729 + 'content' => 'import-entries',
730 + 'param' => 'importing-exporting-wordpress-forms',
731 + ),
732 + 'lite' => false,
733 + ),
734 + array(
735 + 'label' => 'Logged-in users can save drafts and return later',
736 + 'link' => array(
737 + 'content' => 'save-drafts',
738 + 'param' => 'save-drafts-wordpress-form',
739 + ),
740 + 'lite' => false,
741 + ),
742 + array(
743 + 'label' => 'Flexibly and powerfully view, edit, and delete entries from anywhere on your site',
744 + 'link' => array(
745 + 'content' => 'front-edit',
746 + 'param' => 'wordpress-front-end-editing',
747 + ),
748 + 'lite' => false,
749 + ),
750 + array(
751 + 'label' => 'View form submissions from the back-end',
752 + 'lite' => true,
753 + ),
754 + array(
755 + 'label' => 'Export your entries to a CSV',
756 + 'lite' => true,
757 + ),
758 + ),
759 + 'Form Building' => array(
760 + array(
761 + 'label' => 'Save a calculated value into a field',
762 + 'link' => array(
763 + 'content' => 'calculations',
764 + 'param' => 'field-calculations-wordpress-form',
765 + ),
766 + 'lite' => false,
767 + ),
768 + array(
769 + 'label' => 'Allow multiple file uploads',
770 + 'link' => array(
771 + 'content' => 'file-uploads',
772 + 'param' => 'wordpress-multi-file-upload-fields',
773 + ),
774 + 'lite' => false,
775 + ),
776 + array(
777 + 'label' => 'Repeat sections of fields',
778 + 'link' => array(
779 + 'content' => 'repeaters',
780 + 'param' => 'repeatable-sections-forms',
781 + ),
782 + 'lite' => false,
783 + ),
784 + array(
785 + 'label' => 'Hide and show fields conditionally based on other fields or the user\'s role',
786 + 'link' => array(
787 + 'content' => 'conditional-logic',
788 + 'param' => 'conditional-logic-wordpress-forms',
789 + ),
790 + 'lite' => false,
791 + ),
792 + array(
793 + 'label' => 'Confirmation fields',
794 + 'link' => array(
795 + 'content' => 'confirmation-fields',
796 + 'param' => 'confirmation-fields-wordpress-forms',
797 + ),
798 + 'lite' => false,
799 + ),
800 + array(
801 + 'label' => 'Multi-paged forms',
802 + 'link' => array(
803 + 'content' => 'page-breaks',
804 + 'param' => 'wordpress-multi-page-forms',
805 + ),
806 + 'lite' => false,
807 + ),
808 + array(
809 + 'label' => 'Include section headings, page breaks, rich text, dates, times, scales, star ratings, sliders, toggles, dynamic fields populated from other forms, passwords, and tags in advanced forms.',
810 + 'lite' => false,
811 + ),
812 + array(
813 + 'label' => 'Include text, email, url, paragraph text, radio, checkbox, dropdown fields, hidden fields, user ID fields, and HTML blocks in your form.',
814 + 'lite' => true,
815 + ),
816 + array(
817 + 'label' => 'Drag & Drop Form building',
818 + 'link' => array(
819 + 'content' => 'drag-drop',
820 + 'param' => 'drag-drop-forms',
821 + ),
822 + 'lite' => true,
823 + ),
824 + array(
825 + 'label' => 'Create forms from Templates',
826 + 'link' => array(
827 + 'content' => 'form-templates',
828 + 'param' => 'wordpress-form-templates',
829 + ),
830 + 'lite' => true,
831 + ),
832 + array(
833 + 'label' => 'Import and export forms with XML',
834 + 'link' => array(
835 + 'content' => 'import',
836 + 'param' => 'importing-exporting-wordpress-forms',
837 + ),
838 + 'lite' => true,
839 + ),
840 + array(
841 + 'label' => 'Use input placeholder text in your fields that clear when typing starts.',
842 + 'lite' => true,
843 + ),
844 + ),
845 + 'Form Actions' => array(
846 + array(
847 + 'label' => 'Conditionally send your email notifications based on values in your form',
848 + 'link' => array(
849 + 'content' => 'conditional-emails',
850 + ),
851 + 'lite' => false,
852 + ),
853 + array(
854 + 'label' => 'Create and edit WordPress posts or custom posts from the front-end',
855 + 'link' => array(
856 + 'content' => 'create-posts',
857 + 'param' => 'create-posts-pages-wordpress-forms',
858 + ),
859 + 'lite' => false,
860 + ),
861 + array(
862 + 'label' => 'Send multiple emails and autoresponders',
863 + 'link' => array(
864 + 'content' => 'multiple-emails',
865 + 'param' => 'virtually-unlimited-emails',
866 + ),
867 + 'lite' => true,
868 + ),
869 + ),
870 + 'Form Appearance' => array(
871 + array(
872 + 'label' => 'Create Multiple styles for different forms',
873 + 'link' => array(
874 + 'content' => 'multiple-styles',
875 + 'param' => 'wordpress-visual-form-styler',
876 + ),
877 + 'lite' => false,
878 + ),
879 + array(
880 + 'label' => 'Customizable layout with CSS classes',
881 + 'link' => array(
882 + 'content' => 'form-layout',
883 + 'param' => 'wordpress-mobile-friendly-forms',
884 + ),
885 + 'lite' => true,
886 + ),
887 + array(
888 + 'label' => 'Customize the HTML for your forms',
889 + 'link' => array(
890 + 'content' => 'custom-html',
891 + 'param' => 'customizable-html-wordpress-form',
892 + ),
893 + 'lite' => true,
894 + ),
895 + array(
896 + 'label' => 'Style your form with the Visual Form Styler',
897 + 'lite' => true,
898 + ),
899 + ),
900 + );
901 +
902 + include FrmAppHelper::plugin_path() . '/classes/views/addons/upgrade_to_pro.php';
903 + }
904 +
905 + /**
935 906 * @since 5.5.2
936 907 *
937 908 * @param string $plugin
938 909 * @param string $redirect
@@ -937,9 +908,8 @@
937 908 * @param string $plugin
938 909 * @param string $redirect
939 910 * @param bool $network_wide
940 911 * @param bool $silent
941 - *
942 912 * @return WP_Error|null Null on success, WP_Error on invalid file.
943 913 */
944 914 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
945 915 if ( ! function_exists( 'activate_plugin' ) ) {
@@ -954,9 +924,8 @@
954 924 * @since 6.8
955 925 *
956 926 * @param string $plugin
957 927 * @param bool $silent
958 - *
959 928 * @return void
960 929 */
961 930 protected static function deactivate_plugin( $plugin, $silent = false ) {
962 931 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -970,9 +939,8 @@
970 939 *
971 940 * @since 6.8
972 941 *
973 942 * @param string $plugin
974 - *
975 943 * @return true|WP_Error True on success, WP_Error on invalid file.
976 944 */
977 945 protected static function uninstall_plugin( $plugin ) {
978 946 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -985,9 +953,13 @@
985 953
986 954 self::deactivate_plugin( $plugin, true );
987 955 $result = delete_plugins( array( $plugin ) );
988 956
989 - return is_wp_error( $result ) ? $result : true;
957 + if ( is_wp_error( $result ) ) {
958 + return $result;
959 + }
960 +
961 + return true;
990 962 }
991 963
992 964 /**
993 965 * @since 5.0.10
@@ -1003,9 +975,9 @@
1003 975
1004 976 /**
1005 977 * @since 4.08
1006 978 *
1007 - * @return mixed[]|null
979 + * @return array|void
1008 980 */
1009 981 protected static function download_and_activate() {
1010 982 if ( is_admin() ) {
1011 983 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1013,14 +985,12 @@
1013 985
1014 986 self::maybe_show_cred_form();
1015 987
1016 988 $installed = self::install_addon();
1017 -
1018 989 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1019 990 return $installed;
1020 991 }
1021 992 self::handle_addon_action( $installed, 'activate' );
1022 - return null;
1023 993 }
1024 994
1025 995 /**
1026 996 * @since 3.04.02
@@ -1031,9 +1001,9 @@
1031 1001 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1032 1002 include_once ABSPATH . 'wp-admin/includes/file.php';
1033 1003 }
1034 1004
1035 - // Start output buffering to catch the filesystem form if credentials are needed.
1005 + // Start output bufferring to catch the filesystem form if credentials are needed.
1036 1006 ob_start();
1037 1007
1038 1008 $show_form = false;
1039 1009 $method = '';
@@ -1050,8 +1020,9 @@
1050 1020
1051 1021 if ( $show_form ) {
1052 1022 $form = ob_get_clean();
1053 1023 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
1024 + $data = $form;
1054 1025 $response = array(
1055 1026 'success' => false,
1056 1027 'message' => $message,
1057 1028 'form' => $form,
@@ -1079,10 +1050,8 @@
1079 1050 * We do not need any extra credentials if we have gotten this far,
1080 1051 * so let's install the plugin.
1081 1052 *
1082 1053 * @since 3.04.02
1083 - *
1084 - * @return array|string
1085 1054 */
1086 1055 protected static function install_addon() {
1087 1056 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1088 1057
@@ -1102,9 +1071,8 @@
1102 1071 // Flush the cache and return the newly installed plugin basename.
1103 1072 wp_cache_flush();
1104 1073
1105 1074 $plugin = $installer->plugin_info();
1106 -
1107 1075 if ( ! $plugin ) {
1108 1076 return array(
1109 1077 'message' => 'Plugin was not installed. ' . $installer->result,
1110 1078 'success' => false,
@@ -1109,9 +1077,8 @@
1109 1077 'message' => 'Plugin was not installed. ' . $installer->result,
1110 1078 'success' => false,
1111 1079 );
1112 1080 }
1113 -
1114 1081 return $plugin;
1115 1082 }
1116 1083
1117 1084 /**
@@ -1175,9 +1142,8 @@
1175 1142 * @since 6.8
1176 1143 *
1177 1144 * @param callable $action_callback The specific add-on action to be executed.
1178 1145 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1179 - *
1180 1146 * @return void
1181 1147 */
1182 1148 private static function process_addon_action( $action_callback, $response_callback = null ) {
1183 1149 self::install_addon_permissions();
@@ -1200,14 +1166,13 @@
1200 1166 * @since 6.8
1201 1167 *
1202 1168 * @param string $installed The plugin folder name with file name.
1203 1169 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1204 - *
1205 - * @return mixed[]|null
1170 + * @return array|void
1206 1171 */
1207 1172 protected static function handle_addon_action( $installed, $action ) {
1208 1173 if ( ! $installed || ! $action ) {
1209 - return null;
1174 + return;
1210 1175 }
1211 1176
1212 1177 $result = null;
1213 1178 switch ( $action ) {
@@ -1227,9 +1192,8 @@
1227 1192 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1228 1193 if ( wp_doing_ajax() ) {
1229 1194 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1230 1195 }
1231 -
1232 1196 return array(
1233 1197 'message' => $result->get_error_message(),
1234 1198 'success' => false,
1235 1199 );
@@ -1243,14 +1207,17 @@
1243 1207 * @return array
1244 1208 */
1245 1209 private static function get_addon_activation_response() {
1246 1210 $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 1211
1249 - return array(
1212 + $message = $activating_page ? __( 'Your plugin has been activated. Would you like to save and reload the page now?', 'formidable' ) : __( 'Your plugin has been activated.', 'formidable' );
1213 +
1214 + $response = array(
1250 1215 'message' => $message,
1251 1216 'saveAndReload' => $activating_page,
1252 1217 );
1218 +
1219 + return $response;
1253 1220 }
1254 1221
1255 1222 /**
1256 1223 * Return a string that reflects the page from which the addon is being activated on,
@@ -1259,14 +1226,17 @@
1259 1226 * @return string
1260 1227 */
1261 1228 private static function get_activating_page() {
1262 1229 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1230 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1231 + return 'settings';
1232 + }
1263 1233
1264 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1265 - return 'settings';
1234 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1235 + return 'form_builder';
1266 1236 }
1267 1237
1268 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1238 + return '';
1269 1239 }
1270 1240
1271 1241 /**
1272 1242 * Run security checks before installing
@@ -1290,14 +1260,12 @@
1290 1260 * @return string
1291 1261 */
1292 1262 public static function connect_link() {
1293 1263 $auth = get_option( 'frm_connect_token' );
1294 -
1295 - if ( ! $auth ) {
1264 + if ( empty( $auth ) ) {
1296 1265 $auth = hash( 'sha512', wp_rand() );
1297 1266 update_option( 'frm_connect_token', $auth, 'no' );
1298 1267 }
1299 -
1300 1268 $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1301 1269 $link = 'https://formidableforms.com/api-connect/';
1302 1270 $args = array(
1303 1271 'v' => 2,
@@ -1325,10 +1293,9 @@
1325 1293 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1326 1294
1327 1295 // The download link is not required if already installed.
1328 1296 $is_installed = FrmAppHelper::pro_is_included();
1329 - $file_missing = ! $is_installed && ! $post_url;
1330 -
1297 + $file_missing = ! $is_installed && empty( $post_url );
1331 1298 if ( ! $post_auth || $file_missing ) {
1332 1299 return false;
1333 1300 }
1334 1301
@@ -1333,9 +1300,13 @@
1333 1300 }
1334 1301
1335 1302 // Verify auth.
1336 1303 $auth = get_option( 'frm_connect_token' );
1337 - return $auth && hash_equals( $auth, $post_auth );
1304 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1305 + return false;
1306 + }
1307 +
1308 + return true;
1338 1309 }
1339 1310
1340 1311 /**
1341 1312 * Install and/or activate the add-on file.
@@ -1346,17 +1317,17 @@
1346 1317 */
1347 1318 public static function install_addon_api() {
1348 1319 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1349 1320
1321 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1322 +
1350 1323 // Delete so cannot replay.
1351 1324 delete_option( 'frm_connect_token' );
1352 1325
1353 1326 // It's already installed and active.
1354 1327 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1355 -
1356 1328 if ( is_wp_error( $active ) ) {
1357 1329 $response = self::maybe_download_and_activate();
1358 -
1359 1330 if ( is_array( $response ) ) {
1360 1331 // The download failed.
1361 1332 return $response;
1362 1333 }
@@ -1365,9 +1336,8 @@
1365 1336 // If empty license, save it now.
1366 1337 if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1367 1338 load_formidable_pro();
1368 1339 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1369 -
1370 1340 if ( ! $license ) {
1371 1341 return array(
1372 1342 'success' => false,
1373 1343 'error' => 'That site does not have a valid license key.',
@@ -1374,9 +1344,8 @@
1374 1344 );
1375 1345 }
1376 1346
1377 1347 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1378 -
1379 1348 if ( ! $response['success'] ) {
1380 1349 // Could not activate license.
1381 1350 return $response;
1382 1351 }
@@ -1401,9 +1370,8 @@
1401 1370 }
1402 1371
1403 1372 // Download plugin now.
1404 1373 $response = self::download_and_activate();
1405 -
1406 1374 if ( is_array( $response ) && isset( $response['success'] ) ) {
1407 1375 // The download failed.
1408 1376 return $response;
1409 1377 }
@@ -1417,9 +1385,8 @@
1417 1385 * @since 4.09
1418 1386 *
1419 1387 * @param string $plugin
1420 1388 * @param array|string $upgrade_link_args
1421 - *
1422 1389 * @return void
1423 1390 */
1424 1391 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1425 1392 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1454,9 +1421,8 @@
1454 1421 * @type false|string $license_type
1455 1422 * @type string $plan_required
1456 1423 * @type string $upgrade_link
1457 1424 * }
1458 - *
1459 1425 * @return void
1460 1426 */
1461 1427 public static function show_conditional_action_button( $atts ) {
1462 1428 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1474,12 +1440,11 @@
1474 1440 * @param array|string $upgrade_link
1475 1441 *
1476 1442 * @return void
1477 1443 */
1478 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1444 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1479 1445 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1480 1446 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1481 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1482 1447
1483 1448 if ( $addon ) {
1484 1449 $upgrade_link .= '&utm_content=' . $addon['slug'];
1485 1450 }
@@ -1489,15 +1454,14 @@
1489 1454 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1490 1455 }
1491 1456
1492 1457 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1493 -
1494 - if ( ! str_contains( $class, 'frm-button' ) ) {
1458 + if ( strpos( $class, 'frm-button' ) === false ) {
1495 1459 $class .= ' frm-button-secondary frm-button-sm';
1496 1460 }
1497 1461 ?>
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 ); ?>
1462 + <a class="install-now button <?php echo esc_attr( $class ); ?>" href="<?php echo esc_url( $upgrade_link ); ?>" target="_blank" rel="noopener" aria-label="<?php esc_attr_e( 'Upgrade Now', 'formidable' ); ?>">
1463 + <?php esc_html_e( 'Upgrade Now', 'formidable' ); ?>
1500 1464 </a>
1501 1465 <?php
1502 1466 }
1503 1467
@@ -1509,9 +1473,8 @@
1509 1473 public static function ajax_install_addon() {
1510 1474 self::install_addon_permissions();
1511 1475
1512 1476 $result = self::download_and_activate();
1513 -
1514 1477 if ( isset( $result['success'] ) && ! $result['success'] ) {
1515 1478 echo json_encode( $result );
1516 1479 wp_die();
1517 1480 }
@@ -1544,8 +1507,9 @@
1544 1507 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1545 1508
1546 1509 if ( ! is_array( $allowed_url_list ) ) {
1547 1510 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1511 +
1548 1512 return array();
1549 1513 }
1550 1514
1551 1515 return $allowed_url_list;
@@ -1555,10 +1519,8 @@
1555 1519 * Gets required plan for an addon.
1556 1520 *
1557 1521 * @since 6.4.2
1558 1522 *
1559 - * @param int|string $addon_id
1560 - *
1561 1523 * @return string Empty string if no plan is required for active license.
1562 1524 */
1563 1525 public static function get_addon_required_plan( $addon_id ) {
1564 1526 $api = new FrmFormApi();
@@ -1573,6 +1535,34 @@
1573 1535 $requires = '';
1574 1536 }
1575 1537
1576 1538 return $requires;
1539 + }
1540 +
1541 + /**
1542 + * @since 4.02.05
1543 + * @deprecated 6.8.3
1544 + *
1545 + * @codeCoverageIgnore
1546 + *
1547 + * @return void
1548 + */
1549 + public static function connect_pro() {
1550 + _deprecated_function( __METHOD__, '6.8.3' );
1551 + }
1552 +
1553 + /**
1554 + * @since 4.08
1555 + * @deprecated 6.11.1
1556 + *
1557 + * @return bool|int false or the number of days until expiration.
1558 + */
1559 + public static function is_license_expiring() {
1560 + _deprecated_function( __METHOD__, '6.11.1', 'FrmProAddonsController::is_license_expiring' );
1561 +
1562 + if ( is_callable( 'FrmProAddonsController::is_license_expiring' ) ) {
1563 + return FrmProAddonsController::is_license_expiring();
1564 + }
1565 +
1566 + return false;
1577 1567 }
1578 1568 }