PluginProbe
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More / 6.8.1
Formidable Forms – WordPress Form Builder for Contact Forms, Calculators, Quizzes & More v6.8.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 +500 -499 6.296.8.1 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,24 +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 - $addons = self::get_api_addons();
313 - return count( $addons );
314 - }
315 -
316 - /**
317 116 * If the API is unable to connect, show something on the addons page
318 117 *
319 118 * @since 3.04.03
320 - *
321 119 * @return array
322 120 */
323 121 protected static function fallback_plugin_list() {
324 122 $list = array(
@@ -329,19 +127,19 @@
329 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.',
330 128 ),
331 129 'mailchimp' => array(
332 130 'title' => 'Mailchimp Forms',
333 - 'excerpt' => 'Get on the path to more sales and leads in a matter of minutes. Add leads to a Mailchimp mailing list when they submit forms and update their information along with the entry.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
334 132 ),
335 133 'registration' => array(
336 134 'title' => 'User Registration Forms',
337 135 'link' => 'downloads/user-registration/',
338 - 'excerpt' => 'Give new users access to your site as quickly and painlessly as possible. Allow users to register, edit and be able to login to their profiles on your site from the front end in a clean, customized registration form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
339 137 ),
340 138 'paypal' => array(
341 139 'title' => 'PayPal Standard Forms',
342 140 'link' => 'downloads/paypal-standard/',
343 - 'excerpt' => 'Automate your business by collecting instant payments from your clients. Collect information, calculate a total, and send them on to PayPal. Require a payment before publishing content on your site.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
344 142 ),
345 143 'stripe' => array(
346 144 'title' => 'Stripe Forms',
347 145 'docs' => 'knowledgebase/stripe/',
@@ -373,9 +171,9 @@
373 171 'excerpt' => 'Instantly add Bootstrap styling to all your Formidable forms.',
374 172 ),
375 173 'zapier' => array(
376 174 'title' => 'Zapier Forms',
377 - 'excerpt' => 'Connect with hundreds of different applications through Zapier. Insert a new row in a Google docs spreadsheet, post on Twitter, or add a new Dropbox file with your form.', // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
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.',
378 176 ),
379 177 'signature' => array(
380 178 'title' => 'Digital Signature Forms',
381 179 'excerpt' => 'Add a signature field to your form. The user may write their signature with a trackpad/mouse or just type it.',
@@ -408,9 +206,8 @@
408 206 foreach ( $list as $k => $info ) {
409 207 $info['slug'] = $k;
410 208 $list[ $k ] = array_merge( $defaults, $info );
411 209 }
412 -
413 210 return $list;
414 211 }
415 212
416 213 /**
@@ -416,9 +213,8 @@
416 213 /**
417 214 * If Pro is missing but has been authenticated, include a download URL
418 215 *
419 216 * @since 3.04.03
420 - *
421 217 * @return string
422 218 */
423 219 public static function get_pro_download_url() {
424 220 $license = self::get_pro_license();
@@ -425,20 +221,17 @@
425 221 $api = new FrmFormApi( $license );
426 222 $downloads = $api->get_api_info();
427 223 $pro = self::get_pro_from_addons( $downloads );
428 224
429 - return $pro['url'] ?? '';
225 + return isset( $pro['url'] ) ? $pro['url'] : '';
430 226 }
431 227
432 228 /**
433 229 * @since 4.08
434 - *
435 - * @return string
436 230 */
437 231 public static function get_pro_license() {
438 232 $pro_cred_store = 'frmpro-credentials';
439 233 $pro_wpmu_store = 'frmpro-wpmu-sitewide';
440 -
441 234 if ( is_multisite() && get_site_option( $pro_wpmu_store ) ) {
442 235 $creds = get_site_option( $pro_cred_store );
443 236 } else {
444 237 $creds = get_option( $pro_cred_store );
@@ -448,18 +241,16 @@
448 241 return '';
449 242 }
450 243
451 244 $license = $creds['license'];
452 -
453 - if ( ! $license ) {
245 + if ( empty( $license ) ) {
454 246 return '';
455 247 }
456 248
457 - if ( str_contains( $license, '-' ) ) {
458 - // This is a fix for licenses saved in the past
459 - return strtoupper( $license );
249 + if ( strpos( $license, '-' ) ) {
250 + // this is a fix for licenses saved in the past
251 + $license = strtoupper( $license );
460 252 }
461 -
462 253 return $license;
463 254 }
464 255
465 256 /**
@@ -465,19 +256,16 @@
465 256 /**
466 257 * @since 4.08
467 258 *
468 259 * @param array $addons
469 - *
470 260 * @return array
471 261 */
472 262 protected static function get_pro_from_addons( $addons ) {
473 - return $addons['93790'] ?? array();
263 + return isset( $addons['93790'] ) ? $addons['93790'] : array();
474 264 }
475 265
476 266 /**
477 267 * @since 4.06
478 - *
479 - * @return string
480 268 */
481 269 public static function license_type() {
482 270 if ( is_callable( 'FrmProAddonsController::license_type' ) ) {
483 271 return FrmProAddonsController::license_type();
@@ -487,32 +275,29 @@
487 275 }
488 276
489 277 /**
490 278 * @since 4.0.01
491 - *
492 - * @return bool
493 279 */
494 280 public static function is_license_expired() {
495 281 $version_info = self::get_primary_license_info();
496 -
497 282 if ( ! isset( $version_info['error'] ) ) {
498 283 return false;
499 284 }
500 285
501 - $expires = $version_info['error']['expires'] ?? 0;
286 + return $version_info['error'];
287 + }
502 288
503 - if ( ! $expires || $expires > time() ) {
504 - 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();
505 297 }
506 298
507 - $rate_limited = ! empty( $version_info['response_code'] ) && 429 === (int) $version_info['response_code'];
508 -
509 - if ( $rate_limited ) {
510 - // Do not return false positives for rate limited responses.
511 - return false;
512 - }
513 -
514 - return $version_info['error'];
299 + return false;
515 300 }
516 301
517 302 /**
518 303 * @since 4.08
@@ -521,13 +306,11 @@
521 306 * @return array|false
522 307 */
523 308 public static function get_primary_license_info() {
524 309 $installed_addons = apply_filters( 'frm_installed_addons', array() );
525 -
526 - if ( ! $installed_addons || ! isset( $installed_addons['formidable_pro'] ) ) {
310 + if ( empty( $installed_addons ) || ! isset( $installed_addons['formidable_pro'] ) ) {
527 311 return false;
528 312 }
529 -
530 313 $installed_addons = array(
531 314 'formidable_pro' => $installed_addons['formidable_pro'],
532 315 );
533 316
@@ -535,12 +318,8 @@
535 318 }
536 319
537 320 /**
538 321 * @since 3.04.03
539 - *
540 - * @param mixed $transient
541 - *
542 - * @return object
543 322 */
544 323 public static function check_update( $transient ) {
545 324 if ( ! FrmAppHelper::pro_is_installed() ) {
546 325 // Don't make any changes if only Lite is installed.
@@ -551,10 +330,9 @@
551 330 $transient = new stdClass();
552 331 }
553 332
554 333 $installed_addons = apply_filters( 'frm_installed_addons', array() );
555 -
556 - if ( ! $installed_addons ) {
334 + if ( empty( $installed_addons ) ) {
557 335 return $transient;
558 336 }
559 337
560 338 $version_info = self::fill_update_addon_info( $installed_addons );
@@ -560,9 +338,9 @@
560 338 $version_info = self::fill_update_addon_info( $installed_addons );
561 339 $transient->last_checked = time();
562 340 $wp_plugins = self::get_plugins();
563 341
564 - foreach ( $version_info as $plugin ) {
342 + foreach ( $version_info as $id => $plugin ) {
565 343 $plugin = (object) $plugin;
566 344
567 345 if ( ! isset( $plugin->new_version ) || ! isset( $plugin->package ) ) {
568 346 continue;
@@ -568,20 +346,19 @@
568 346 continue;
569 347 }
570 348
571 349 $folder = $plugin->plugin;
572 -
573 - if ( ! $folder ) {
350 + if ( empty( $folder ) ) {
574 351 continue;
575 352 }
576 353
577 354 if ( ! self::is_installed( $folder ) ) {
578 - // Don't show an update if the plugin isn't installed
355 + // don't show an update if the plugin isn't installed
579 356 continue;
580 357 }
581 358
582 - $wp_plugin = $wp_plugins[ $folder ] ?? array();
583 - $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';
584 361 $plugin->slug = explode( '/', $folder )[0];
585 362
586 363 if ( version_compare( $wp_version, $plugin->new_version, '<' ) ) {
587 364 $transient->response[ $folder ] = $plugin;
@@ -589,8 +366,9 @@
589 366 $transient->no_update[ $folder ] = $plugin;
590 367 }
591 368
592 369 $transient->checked[ $folder ] = $wp_version;
370 +
593 371 }//end foreach
594 372
595 373 return $transient;
596 374 }
@@ -600,9 +378,8 @@
600 378 * Because this gets called on "pre_set_site_transient_update_plugins" an old version of FrmAppHelper may be loaded on plugin update.
601 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.
602 380 *
603 381 * @since 5.5.2
604 - *
605 382 * @return array
606 383 */
607 384 protected static function get_plugins() {
608 385 if ( ! function_exists( 'get_plugins' ) ) {
@@ -637,49 +414,43 @@
637 414 $version_info = array();
638 415
639 416 foreach ( $installed_addons as $addon ) {
640 417 if ( $addon->store_url !== 'https://formidableforms.com' ) {
641 - // Check if this is a third-party addon
418 + // check if this is a third-party addon
642 419 continue;
643 420 }
644 421
645 422 $new_license = $addon->license;
646 -
647 - if ( ! $new_license || in_array( $new_license, $checked_licenses, true ) ) {
423 + if ( empty( $new_license ) || in_array( $new_license, $checked_licenses ) ) {
648 424 continue;
649 425 }
650 426
651 427 $checked_licenses[] = $new_license;
652 - $api = new FrmFormApi( $new_license );
653 428
654 - if ( ! $version_info ) {
429 + $api = new FrmFormApi( $new_license );
430 + if ( empty( $version_info ) ) {
655 431 $version_info = $api->get_api_info();
656 432 continue;
657 433 }
658 434
659 435 $plugin = $api->get_addon_for_license( $addon, $version_info );
660 -
661 - if ( ! $plugin ) {
436 + if ( empty( $plugin ) ) {
662 437 continue;
663 438 }
664 439
665 - $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();
666 444
667 - if ( ! $download_id || isset( $version_info[ $download_id ]['package'] ) ) {
668 - 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 + }
669 452 }
670 -
671 - // If this addon is using its own license, get the update url
672 - $addon_info = $api->get_api_info();
673 -
674 - $version_info[ $download_id ] = $addon_info[ $download_id ];
675 -
676 - if ( isset( $addon_info['error'] ) ) {
677 - $version_info[ $download_id ]['error'] = array(
678 - 'message' => $addon_info['error']['message'],
679 - 'code' => $addon_info['error']['code'],
680 - );
681 - }
682 453 }//end foreach
683 454
684 455 return $version_info;
685 456 }
@@ -687,11 +458,9 @@
687 458 /**
688 459 * Get the action link for an addon that isn't active.
689 460 *
690 461 * @since 3.06.03
691 - *
692 462 * @param string $plugin The plugin slug.
693 - *
694 463 * @return array
695 464 */
696 465 public static function install_link( $plugin ) {
697 466 $link = array();
@@ -702,20 +471,20 @@
702 471 $link = array(
703 472 'url' => $addon['plugin'],
704 473 'class' => 'frm-activate-addon',
705 474 );
706 - } elseif ( ! empty( $addon['url'] ) ) {
475 + } elseif ( isset( $addon['url'] ) && ! empty( $addon['url'] ) ) {
707 476 $link = array(
708 477 'url' => $addon['url'],
709 478 'class' => 'frm-install-addon',
710 479 );
711 - } elseif ( ! empty( $addon['categories'] ) ) {
480 + } elseif ( isset( $addon['categories'] ) && ! empty( $addon['categories'] ) ) {
712 481 $link = array(
713 482 'categories' => $addon['categories'],
714 483 );
715 484 }
716 485
717 - if ( $link ) {
486 + if ( ! empty( $link ) ) {
718 487 $link['status'] = $addon['status']['type'];
719 488 }
720 489 } elseif ( current_user_can( 'activate_plugins' ) && self::is_installed( 'formidable-' . $plugin . '/formidable-' . $plugin . '.php' ) ) {
721 490 $link = array(
@@ -727,81 +496,34 @@
727 496 return $link;
728 497 }
729 498
730 499 /**
731 - * Get the JSON-encoded install data for a plugin update.
732 - *
733 - * @since 6.29
734 - *
735 - * @param string $addon_slug The addon slug (e.g. 'pro', 'dates').
736 - *
737 - * @return string JSON-encoded install data, or empty string if no URL is available.
738 - */
739 - public static function get_update_install_data( $addon_slug ) {
740 - $upgrading = self::install_link( $addon_slug );
741 -
742 - if ( isset( $upgrading['class'] ) && 'frm-install-addon' === $upgrading['class'] ) {
743 - return (string) json_encode( $upgrading );
744 - }
745 -
746 - if ( 'pro' === $addon_slug ) {
747 - $download_url = self::get_pro_download_url();
748 - $plugin_file = 'formidable-pro/formidable-pro.php';
749 - } else {
750 - $addon_data = self::get_addon( $addon_slug );
751 - $download_url = $addon_data && ! empty( $addon_data['url'] ) ? $addon_data['url'] : '';
752 - $plugin_file = $addon_data && ! empty( $addon_data['plugin'] ) ? $addon_data['plugin'] : 'formidable-' . $addon_slug . '/formidable-' . $addon_slug . '.php';
753 - }
754 -
755 - if ( ! $download_url ) {
756 - $update_plugins = get_site_transient( 'update_plugins' );
757 - $plugin_update = $update_plugins->response[ $plugin_file ] ?? null;
758 - $download_url = $plugin_update && ! empty( $plugin_update->package ) ? $plugin_update->package : '';
759 - }
760 -
761 - return $download_url ? (string) json_encode(
762 - array(
763 - 'url' => $download_url,
764 - 'class' => 'frm-install-addon',
765 - )
766 - ) : '';
767 - }
768 -
769 - /**
770 500 * @since 4.09
771 - *
772 501 * @param string $plugin The plugin slug.
773 - *
774 502 * @return array|false
775 503 */
776 - public static function get_addon( $plugin ) {
504 + protected static function get_addon( $plugin ) {
777 505 $addons = self::get_api_addons();
778 506 self::prepare_addons( $addons );
779 -
780 507 foreach ( $addons as $addon ) {
781 508 $slug = explode( '/', $addon['plugin'] );
782 -
783 509 if ( $slug[0] === 'formidable-' . $plugin ) {
784 510 return $addon;
785 511 }
786 512 }
787 -
788 513 return false;
789 514 }
790 515
791 516 /**
792 517 * @since 4.09
793 - *
794 518 * @return string
795 519 */
796 520 protected static function get_license_type() {
797 521 $license_type = '';
798 522 $addons = self::get_api_addons();
799 -
800 523 if ( isset( $addons['error'] ) && isset( $addons['error']['type'] ) ) {
801 - return $addons['error']['type'];
524 + $license_type = $addons['error']['type'];
802 525 }
803 -
804 526 return $license_type;
805 527 }
806 528
807 529 /**
@@ -814,12 +536,11 @@
814 536 */
815 537 public static function get_addon_for_license( $addons, $license ) {
816 538 $download_id = $license->download_id;
817 539 $plugin = array();
818 -
819 - if ( ! $download_id && $addons ) {
540 + if ( empty( $download_id ) && ! empty( $addons ) ) {
820 541 foreach ( $addons as $addon ) {
821 - if ( 0 === strcasecmp( $license->plugin_name, $addon['title'] ) ) {
542 + if ( strtolower( $license->plugin_name ) == strtolower( $addon['title'] ) ) {
822 543 return $addon;
823 544 }
824 545 }
825 546 } elseif ( isset( $addons[ $download_id ] ) ) {
@@ -829,33 +550,29 @@
829 550 return $plugin;
830 551 }
831 552
832 553 /**
833 - * @param array $addons
834 - *
835 554 * @return void
836 555 */
837 556 protected static function prepare_addons( &$addons ) {
838 - // Reset categories to prevent count accumulation across multiple calls.
839 - self::$categories = array();
840 -
841 557 $activate_url = '';
842 -
843 558 if ( current_user_can( 'activate_plugins' ) ) {
844 559 $activate_url = add_query_arg( array( 'action' => 'activate' ), admin_url( 'plugins.php' ) );
845 560 }
846 561
847 562 $loop_addons = $addons;
848 -
849 563 foreach ( $loop_addons as $id => $addon ) {
850 564 if ( is_numeric( $id ) ) {
851 565 $slug = str_replace( array( '-wordpress-plugin', '-wordpress' ), '', $addon['slug'] );
852 566 $file_name = $addon['plugin'];
853 567 } else {
854 - $slug = $id;
855 - $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 + }
856 574 $file_name = $base_file . '/' . $base_file . '.php';
857 -
858 575 if ( ! isset( $addon['plugin'] ) ) {
859 576 $addon['plugin'] = $file_name;
860 577 }
861 578 }
@@ -860,17 +577,10 @@
860 577 }
861 578 }
862 579
863 580 $addon['installed'] = self::is_installed( $file_name );
864 -
865 - if ( 'highrise' === $slug && ! $addon['installed'] ) {
866 - unset( $addons[ $id ] );
867 - continue;
868 - }
869 -
870 581 if ( $addon['installed'] && 'formidable-views/formidable-views.php' === $file_name ) {
871 582 $active_views_version = self::get_active_views_version();
872 -
873 583 if ( false !== $active_views_version && $slug !== $active_views_version ) {
874 584 $addon['installed'] = false;
875 585 }
876 586 }
@@ -876,9 +586,9 @@
876 586 }
877 587
878 588 $addon['activate_url'] = '';
879 589
880 - 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 ) ) {
881 591 $addon['activate_url'] = add_query_arg(
882 592 array(
883 593 '_wpnonce' => wp_create_nonce( 'activate-plugin_' . $file_name ),
884 594 'plugin' => $file_name,
@@ -894,21 +604,16 @@
894 604
895 605 if ( ! isset( $addon['link'] ) ) {
896 606 $addon['link'] = 'downloads/' . $slug . '/';
897 607 }
608 + self::prepare_addon_link( $addon['link'] );
898 609
899 - self::prepare_addon_link( $addon['link'] );
900 610 self::set_addon_status( $addon );
901 - self::set_categories( $addon );
902 -
903 611 $addons[ $id ] = $addon;
904 612 }//end foreach
905 613 }
906 614
907 615 /**
908 - * @param string $file_name
909 - * @param string $slug
910 - *
911 616 * @return bool
912 617 */
913 618 private static function is_plugin_active( $file_name, $slug ) {
914 619 if ( 'formidable-views/formidable-views.php' === $file_name ) {
@@ -917,15 +622,14 @@
917 622 return is_plugin_active( $file_name );
918 623 }
919 624
920 625 /**
921 - * @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.
922 627 */
923 628 private static function get_active_views_version() {
924 629 if ( ! is_callable( 'FrmViewsAppHelper::plugin_version' ) ) {
925 630 return false;
926 631 }
927 -
928 632 $plugin_version = FrmViewsAppHelper::plugin_version();
929 633 return version_compare( $plugin_version, '5.0', '>=' ) ? 'visual-views' : 'views';
930 634 }
931 635
@@ -931,25 +635,22 @@
931 635
932 636 /**
933 637 * @since 3.04.02
934 638 *
935 - * @param string $link
936 - *
937 639 * @return void
938 640 */
939 641 protected static function prepare_addon_link( &$link ) {
940 642 $site_url = 'https://formidableforms.com/';
941 -
942 - if ( ! str_starts_with( $link, 'http' ) ) {
643 + if ( strpos( $link, 'http' ) !== 0 ) {
943 644 $link = $site_url . $link;
944 645 }
945 -
946 - $link = FrmAppHelper::make_affiliate_url( $link );
947 -
948 - $utm = array(
949 - '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',
950 651 );
951 - $link = FrmAppHelper::maybe_add_missing_utm( $link, $utm );
652 + $link = add_query_arg( $query_args, $link );
952 653 }
953 654
954 655 /**
955 656 * Add the status to the addon array. Status options are:
@@ -956,10 +657,8 @@
956 657 * installed, active, not installed
957 658 *
958 659 * @since 3.04.02
959 660 *
960 - * @param array $addon
961 - *
962 661 * @return void
963 662 */
964 663 protected static function set_addon_status( &$addon ) {
965 664 if ( ! empty( $addon['activate_url'] ) ) {
@@ -980,8 +679,250 @@
980 679 }
981 680 }
982 681
983 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 + /**
984 925 * @since 5.5.2
985 926 *
986 927 * @param string $plugin
987 928 * @param string $redirect
@@ -986,10 +927,9 @@
986 927 * @param string $plugin
987 928 * @param string $redirect
988 929 * @param bool $network_wide
989 930 * @param bool $silent
990 - *
991 - * @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.
992 932 */
993 933 protected static function activate_plugin( $plugin, $redirect = '', $network_wide = false, $silent = false ) {
994 934 if ( ! function_exists( 'activate_plugin' ) ) {
995 935 require_once ABSPATH . 'wp-admin/includes/plugin.php';
@@ -1003,9 +943,8 @@
1003 943 * @since 6.8
1004 944 *
1005 945 * @param string $plugin
1006 946 * @param bool $silent
1007 - *
1008 947 * @return void
1009 948 */
1010 949 protected static function deactivate_plugin( $plugin, $silent = false ) {
1011 950 if ( ! function_exists( 'deactivate_plugins' ) ) {
@@ -1019,9 +958,8 @@
1019 958 *
1020 959 * @since 6.8
1021 960 *
1022 961 * @param string $plugin
1023 - *
1024 962 * @return true|WP_Error True on success, WP_Error on invalid file.
1025 963 */
1026 964 protected static function uninstall_plugin( $plugin ) {
1027 965 if ( ! current_user_can( 'delete_plugins' ) ) {
@@ -1034,9 +972,13 @@
1034 972
1035 973 self::deactivate_plugin( $plugin, true );
1036 974 $result = delete_plugins( array( $plugin ) );
1037 975
1038 - return is_wp_error( $result ) ? $result : true;
976 + if ( is_wp_error( $result ) ) {
977 + return $result;
978 + }
979 +
980 + return true;
1039 981 }
1040 982
1041 983 /**
1042 984 * @since 5.0.10
@@ -1043,9 +985,9 @@
1043 985 *
1044 986 * @return string
1045 987 */
1046 988 protected static function get_current_plugin() {
1047 - if ( ! self::$plugin ) {
989 + if ( empty( self::$plugin ) ) {
1048 990 self::$plugin = FrmAppHelper::get_param( 'plugin', '', 'post', 'esc_url_raw' );
1049 991 }
1050 992 return self::$plugin;
1051 993 }
@@ -1051,10 +993,8 @@
1051 993 }
1052 994
1053 995 /**
1054 996 * @since 4.08
1055 - *
1056 - * @return mixed[]|null
1057 997 */
1058 998 protected static function download_and_activate() {
1059 999 if ( is_admin() ) {
1060 1000 FrmAppHelper::set_current_screen_and_hook_suffix();
@@ -1062,14 +1002,12 @@
1062 1002
1063 1003 self::maybe_show_cred_form();
1064 1004
1065 1005 $installed = self::install_addon();
1066 -
1067 1006 if ( is_array( $installed ) && isset( $installed['message'] ) ) {
1068 1007 return $installed;
1069 1008 }
1070 1009 self::handle_addon_action( $installed, 'activate' );
1071 - return null;
1072 1010 }
1073 1011
1074 1012 /**
1075 1013 * @since 3.04.02
@@ -1077,12 +1015,12 @@
1077 1015 * @return void
1078 1016 */
1079 1017 protected static function maybe_show_cred_form() {
1080 1018 if ( ! function_exists( 'request_filesystem_credentials' ) ) {
1081 - include_once ABSPATH . 'wp-admin/includes/file.php';
1019 + include_once( ABSPATH . 'wp-admin/includes/file.php' );
1082 1020 }
1083 1021
1084 - // 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.
1085 1023 ob_start();
1086 1024
1087 1025 $show_form = false;
1088 1026 $method = '';
@@ -1099,8 +1037,9 @@
1099 1037
1100 1038 if ( $show_form ) {
1101 1039 $form = ob_get_clean();
1102 1040 $message = __( 'Sorry, your site requires FTP authentication. Please download plugins from FormidableForms.com and install them manually.', 'formidable' );
1041 + $data = $form;
1103 1042 $response = array(
1104 1043 'success' => false,
1105 1044 'message' => $message,
1106 1045 'form' => $form,
@@ -1120,9 +1059,11 @@
1120 1059 *
1121 1060 * @return bool
1122 1061 */
1123 1062 public static function url_is_allowed( $download_url ) {
1124 - 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 + );
1125 1066 }
1126 1067
1127 1068 /**
1128 1069 * We do not need any extra credentials if we have gotten this far,
@@ -1128,10 +1069,8 @@
1128 1069 * We do not need any extra credentials if we have gotten this far,
1129 1070 * so let's install the plugin.
1130 1071 *
1131 1072 * @since 3.04.02
1132 - *
1133 - * @return array|string
1134 1073 */
1135 1074 protected static function install_addon() {
1136 1075 require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
1137 1076
@@ -1145,15 +1084,14 @@
1145 1084 }
1146 1085
1147 1086 // Create the plugin upgrader with our custom skin.
1148 1087 $installer = new Plugin_Upgrader( new FrmInstallerSkin() );
1149 - $installer->install( $download_url, array( 'overwrite_package' => true ) );
1088 + $installer->install( $download_url );
1150 1089
1151 1090 // Flush the cache and return the newly installed plugin basename.
1152 1091 wp_cache_flush();
1153 1092
1154 1093 $plugin = $installer->plugin_info();
1155 -
1156 1094 if ( ! $plugin ) {
1157 1095 return array(
1158 1096 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1097 'success' => false,
@@ -1158,9 +1096,8 @@
1158 1096 'message' => 'Plugin was not installed. ' . $installer->result,
1159 1097 'success' => false,
1160 1098 );
1161 1099 }
1162 -
1163 1100 return $plugin;
1164 1101 }
1165 1102
1166 1103 /**
@@ -1171,9 +1108,9 @@
1171 1108 * @return void
1172 1109 */
1173 1110 public static function ajax_activate_addon() {
1174 1111 self::process_addon_action(
1175 - function ( $plugin ) {
1112 + function( $plugin ) {
1176 1113 return self::handle_addon_action( $plugin, 'activate' );
1177 1114 },
1178 1115 array( 'FrmAddonsController', 'get_addon_activation_response' )
1179 1116 );
@@ -1196,9 +1133,9 @@
1196 1133 * @return void
1197 1134 */
1198 1135 public static function ajax_deactivate_addon() {
1199 1136 self::process_addon_action(
1200 - function ( $plugin ) {
1137 + function( $plugin ) {
1201 1138 return self::handle_addon_action( $plugin, 'deactivate' );
1202 1139 }
1203 1140 );
1204 1141 }
@@ -1211,9 +1148,9 @@
1211 1148 * @return void
1212 1149 */
1213 1150 public static function ajax_uninstall_addon() {
1214 1151 self::process_addon_action(
1215 - function ( $plugin ) {
1152 + function( $plugin ) {
1216 1153 return self::handle_addon_action( $plugin, 'uninstall' );
1217 1154 }
1218 1155 );
1219 1156 }
@@ -1224,9 +1161,8 @@
1224 1161 * @since 6.8
1225 1162 *
1226 1163 * @param callable $action_callback The specific add-on action to be executed.
1227 1164 * @param callable|null $response_callback Optional. The response handling callback. Default null.
1228 - *
1229 1165 * @return void
1230 1166 */
1231 1167 private static function process_addon_action( $action_callback, $response_callback = null ) {
1232 1168 self::install_addon_permissions();
@@ -1249,14 +1185,13 @@
1249 1185 * @since 6.8
1250 1186 *
1251 1187 * @param string $installed The plugin folder name with file name.
1252 1188 * @param string $action The action type ('activate', 'deactivate', 'uninstall').
1253 - *
1254 - * @return mixed[]|null
1189 + * @return void|array
1255 1190 */
1256 1191 protected static function handle_addon_action( $installed, $action ) {
1257 1192 if ( ! $installed || ! $action ) {
1258 - return null;
1193 + return;
1259 1194 }
1260 1195
1261 1196 $result = null;
1262 1197 switch ( $action ) {
@@ -1276,9 +1211,8 @@
1276 1211 if ( $result->get_error_code() !== 'no_plugin_header' ) {
1277 1212 if ( wp_doing_ajax() ) {
1278 1213 wp_send_json_error( array( 'error' => $result->get_error_message() ) );
1279 1214 }
1280 -
1281 1215 return array(
1282 1216 'message' => $result->get_error_message(),
1283 1217 'success' => false,
1284 1218 );
@@ -1292,14 +1226,17 @@
1292 1226 * @return array
1293 1227 */
1294 1228 private static function get_addon_activation_response() {
1295 1229 $activating_page = self::get_activating_page();
1296 - $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
1297 1230
1298 - 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(
1299 1234 'message' => $message,
1300 1235 'saveAndReload' => $activating_page,
1301 1236 );
1237 +
1238 + return $response;
1302 1239 }
1303 1240
1304 1241 /**
1305 1242 * Return a string that reflects the page from which the addon is being activated on,
@@ -1308,14 +1245,17 @@
1308 1245 * @return string
1309 1246 */
1310 1247 private static function get_activating_page() {
1311 1248 $referer = FrmAppHelper::get_server_value( 'HTTP_REFERER' );
1249 + if ( false !== strpos( $referer, 'frm_action=settings' ) ) {
1250 + return 'settings';
1251 + }
1312 1252
1313 - if ( str_contains( $referer, 'frm_action=settings' ) ) {
1314 - return 'settings';
1253 + if ( false !== strpos( $referer, 'frm_action=edit' ) ) {
1254 + return 'form_builder';
1315 1255 }
1316 1256
1317 - return str_contains( $referer, 'frm_action=edit' ) ? 'form_builder' : '';
1257 + return '';
1318 1258 }
1319 1259
1320 1260 /**
1321 1261 * Run security checks before installing
@@ -1326,14 +1266,12 @@
1326 1266 */
1327 1267 protected static function install_addon_permissions() {
1328 1268 check_ajax_referer( 'frm_ajax', 'nonce' );
1329 1269
1330 - if ( current_user_can( 'activate_plugins' ) && self::get_current_plugin() ) {
1331 - return;
1270 + if ( ! current_user_can( 'activate_plugins' ) || ! self::get_current_plugin() ) {
1271 + echo json_encode( true );
1272 + wp_die();
1332 1273 }
1333 -
1334 - echo json_encode( true );
1335 - wp_die();
1336 1274 }
1337 1275
1338 1276 /**
1339 1277 * @since 4.08
@@ -1341,22 +1279,17 @@
1341 1279 * @return string
1342 1280 */
1343 1281 public static function connect_link() {
1344 1282 $auth = get_option( 'frm_connect_token' );
1345 -
1346 - if ( ! $auth ) {
1283 + if ( empty( $auth ) ) {
1347 1284 $auth = hash( 'sha512', wp_rand() );
1348 - update_option( 'frm_connect_token', $auth, false );
1285 + update_option( 'frm_connect_token', $auth, 'no' );
1349 1286 }
1350 -
1351 - $page = FrmAppHelper::simple_get( 'page', 'sanitize_title', 'formidable-settings' );
1352 - $link = 'https://formidableforms.com/api-connect/';
1287 + $link = FrmAppHelper::admin_upgrade_link( 'connect', 'api-connect' );
1353 1288 $args = array(
1354 1289 'v' => 2,
1355 1290 'siteurl' => FrmAppHelper::site_url(),
1356 1291 'url' => get_rest_url(),
1357 - 'inst' => (int) FrmAppHelper::pro_is_included(),
1358 - 'return' => $page,
1359 1292 'token' => $auth,
1360 1293 'l' => self::get_pro_license(),
1361 1294 );
1362 1295
@@ -1374,19 +1307,19 @@
1374 1307 // Verify params present (auth & download link).
1375 1308 $post_auth = FrmAppHelper::get_param( 'token', '', 'request', 'sanitize_text_field' );
1376 1309 $post_url = FrmAppHelper::get_param( 'file_url', '', 'request', 'sanitize_text_field' );
1377 1310
1378 - // The download link is not required if already installed.
1379 - $is_installed = FrmAppHelper::pro_is_included();
1380 - $file_missing = ! $is_installed && ! $post_url;
1381 -
1382 - if ( ! $post_auth || $file_missing ) {
1311 + if ( ! $post_auth || ! $post_url ) {
1383 1312 return false;
1384 1313 }
1385 1314
1386 1315 // Verify auth.
1387 1316 $auth = get_option( 'frm_connect_token' );
1388 - return $auth && hash_equals( $auth, $post_auth );
1317 + if ( empty( $auth ) || ! hash_equals( $auth, $post_auth ) ) {
1318 + return false;
1319 + }
1320 +
1321 + return true;
1389 1322 }
1390 1323
1391 1324 /**
1392 1325 * Install and/or activate the add-on file.
@@ -1391,34 +1324,31 @@
1391 1324 /**
1392 1325 * Install and/or activate the add-on file.
1393 1326 *
1394 1327 * @since 4.08
1395 - *
1396 - * @return array
1397 1328 */
1398 1329 public static function install_addon_api() {
1399 1330 self::$plugin = FrmAppHelper::get_param( 'file_url', '', 'request', 'esc_url_raw' );
1400 1331
1332 + $error = esc_html__( 'Could not install an upgrade. Please download from formidableforms.com and install manually.', 'formidable' );
1333 +
1401 1334 // Delete so cannot replay.
1402 1335 delete_option( 'frm_connect_token' );
1403 1336
1404 1337 // It's already installed and active.
1405 1338 $active = self::activate_plugin( 'formidable-pro/formidable-pro.php', false, false, true );
1406 -
1407 1339 if ( is_wp_error( $active ) ) {
1408 - $response = self::maybe_download_and_activate();
1409 -
1410 - if ( is_array( $response ) ) {
1411 - // The download failed.
1340 + // Download plugin now.
1341 + $response = self::download_and_activate();
1342 + if ( is_array( $response ) && isset( $response['success'] ) ) {
1412 1343 return $response;
1413 1344 }
1414 1345 }
1415 1346
1416 1347 // If empty license, save it now.
1417 - if ( ! self::get_pro_license() && function_exists( 'load_formidable_pro' ) ) {
1348 + if ( empty( self::get_pro_license() ) && function_exists( 'load_formidable_pro' ) ) {
1418 1349 load_formidable_pro();
1419 1350 $license = stripslashes( FrmAppHelper::get_param( 'key', '', 'request', 'sanitize_text_field' ) );
1420 -
1421 1351 if ( ! $license ) {
1422 1352 return array(
1423 1353 'success' => false,
1424 1354 'error' => 'That site does not have a valid license key.',
@@ -1425,9 +1355,8 @@
1425 1355 );
1426 1356 }
1427 1357
1428 1358 $response = FrmAddon::activate_license_for_plugin( $license, 'formidable_pro' );
1429 -
1430 1359 if ( ! $response['success'] ) {
1431 1360 // Could not activate license.
1432 1361 return $response;
1433 1362 }
@@ -1438,32 +1367,8 @@
1438 1367 );
1439 1368 }
1440 1369
1441 1370 /**
1442 - * @since 6.8.3
1443 - *
1444 - * @return array|true
1445 - */
1446 - private static function maybe_download_and_activate() {
1447 - if ( ! self::$plugin ) {
1448 - return array(
1449 - 'success' => false,
1450 - 'message' => __( 'The plugin download was not found.', 'formidable' ),
1451 - );
1452 - }
1453 -
1454 - // Download plugin now.
1455 - $response = self::download_and_activate();
1456 -
1457 - if ( is_array( $response ) && isset( $response['success'] ) ) {
1458 - // The download failed.
1459 - return $response;
1460 - }
1461 -
1462 - return true;
1463 - }
1464 -
1465 - /**
1466 1371 * Render a conditional action button for a specified plugin
1467 1372 *
1468 1373 * @since 4.09
1469 1374 *
@@ -1468,9 +1373,8 @@
1468 1373 * @since 4.09
1469 1374 *
1470 1375 * @param string $plugin
1471 1376 * @param array|string $upgrade_link_args
1472 - *
1473 1377 * @return void
1474 1378 */
1475 1379 public static function conditional_action_button( $plugin, $upgrade_link_args ) {
1476 1380 if ( is_callable( 'FrmProAddonsController::conditional_action_button' ) ) {
@@ -1501,13 +1405,12 @@
1501 1405 * @param array $atts {
1502 1406 * Button attributes.
1503 1407 *
1504 1408 * @type array $addon
1505 - * @type false|string $license_type
1409 + * @type string|false $license_type
1506 1410 * @type string $plan_required
1507 1411 * @type string $upgrade_link
1508 1412 * }
1509 - *
1510 1413 * @return void
1511 1414 */
1512 1415 public static function show_conditional_action_button( $atts ) {
1513 1416 if ( is_callable( 'FrmProAddonsController::show_conditional_action_button' ) ) {
@@ -1521,16 +1424,15 @@
1521 1424 /**
1522 1425 * @since 4.09.01
1523 1426 *
1524 1427 * @param array|false $addon
1525 - * @param array|string $upgrade_link
1428 + * @param string|array $upgrade_link
1526 1429 *
1527 1430 * @return void
1528 1431 */
1529 - public static function addon_upgrade_link( $addon, $upgrade_link ) {
1432 + protected static function addon_upgrade_link( $addon, $upgrade_link ) {
1530 1433 $atts = is_array( $upgrade_link ) ? $upgrade_link : array();
1531 1434 $upgrade_link = is_array( $upgrade_link ) ? $upgrade_link['link'] : $upgrade_link;
1532 - $text = ! empty( $atts['text'] ) ? $atts['text'] : __( 'Upgrade Now', 'formidable' );
1533 1435
1534 1436 if ( $addon ) {
1535 1437 $upgrade_link .= '&utm_content=' . $addon['slug'];
1536 1438 }
@@ -1540,19 +1442,16 @@
1540 1442 $upgrade_link = FrmAppHelper::admin_upgrade_link( 'addons', $addon['link'] );
1541 1443 }
1542 1444
1543 1445 $class = ! empty( $atts['class'] ) ? $atts['class'] : '';
1544 -
1545 - if ( ! str_contains( $class, 'frm-button' ) ) {
1446 + if ( strpos( $class, 'frm-button' ) === false ) {
1546 1447 $class .= ' frm-button-secondary frm-button-sm';
1547 1448 }
1548 - // phpcs:disable Generic.WhiteSpace.ScopeIndent
1549 1449 ?>
1550 - <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 ?>
1551 - <?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' ); ?>
1552 1452 </a>
1553 1453 <?php
1554 - // phpcs:enable Generic.WhiteSpace.ScopeIndent
1555 1454 }
1556 1455
1557 1456 /**
1558 1457 * @since 3.04.02
@@ -1562,9 +1461,8 @@
1562 1461 public static function ajax_install_addon() {
1563 1462 self::install_addon_permissions();
1564 1463
1565 1464 $result = self::download_and_activate();
1566 -
1567 1465 if ( isset( $result['success'] ) && ! $result['success'] ) {
1568 1466 echo json_encode( $result );
1569 1467 wp_die();
1570 1468 }
@@ -1597,8 +1495,9 @@
1597 1495 $allowed_url_list = apply_filters( 'frm_allowed_external_urls', $allowed_url_list );
1598 1496
1599 1497 if ( ! is_array( $allowed_url_list ) ) {
1600 1498 _doing_it_wrong( __METHOD__, 'Only an array of URLs could be used within this filter.', '6.3.1' );
1499 +
1601 1500 return array();
1602 1501 }
1603 1502
1604 1503 return $allowed_url_list;
@@ -1608,10 +1507,8 @@
1608 1507 * Gets required plan for an addon.
1609 1508 *
1610 1509 * @since 6.4.2
1611 1510 *
1612 - * @param int|string $addon_id
1613 - *
1614 1511 * @return string Empty string if no plan is required for active license.
1615 1512 */
1616 1513 public static function get_addon_required_plan( $addon_id ) {
1617 1514 $api = new FrmFormApi();
@@ -1622,10 +1519,114 @@
1622 1519 $requires = FrmFormsHelper::get_plan_required( $dates );
1623 1520 }
1624 1521
1625 1522 if ( ! isset( $requires ) || ! is_string( $requires ) ) {
1626 - return '';
1523 + $requires = '';
1627 1524 }
1628 1525
1629 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();
1630 1631 }
1631 1632 }