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