user_can_install( $pid ) ) { $installed = WPMUDEV_Dashboard::$upgrader->is_project_installed( $pid ); if ( ! $installed ) { $success = WPMUDEV_Dashboard::$upgrader->install( $pid ); if ( $success ) { $html_addons = $this->addons_html( $pid ); $button_html = $this->addon_details_cta( $pid ); if ( 'addons-install-activate' === $action ) { $this->activate_addon( $pid, $is_network ); } wp_send_json_success( array( 'message' => /* translators: %s: Add-on name */ sprintf( esc_html__( '%s was successfully installed', 'forminator' ), $this->get_addon_value( $pid, 'name' ) ), 'html' => $html_addons, 'button' => $button_html, ) ); } } } else { wp_send_json_error( array( 'error' => array( 'message' => esc_html__( 'Unfortunately, you do not have the required permissions to perform this action.', 'forminator' ), ), ) ); } } $err = WPMUDEV_Dashboard::$upgrader->get_error(); wp_send_json_error( array( 'error' => $err, ) ); break; case 'addons-activate': if ( $pid ) { $this->activate_addon( $pid, $is_network ); } break; case 'addons-deactivate': if ( $pid ) { $local = WPMUDEV_Dashboard::$site->get_cached_projects( $pid ); if ( empty( $local ) ) { $errors['error'] = array( 'message' => esc_html__( 'Not installed', 'forminator' ), ); wp_send_json_error( $errors ); } // Check that it's a valid plugin. $valid = validate_plugin( $local['filename'] ); if ( is_wp_error( $valid ) ) { $errors['error'] = array( 'file' => $pid, 'code' => $valid->get_error_code(), 'message' => $valid->get_error_message(), ); wp_send_json_error( $errors ); } deactivate_plugins( $local['filename'], false, $is_network ); // there is no return so we always call it a success. WPMUDEV_Dashboard::$site->schedule_shutdown_refresh(); $html_addons = $this->addons_html( $pid ); $button_html = $this->addon_details_cta( $pid ); wp_send_json_success( array( 'message' => /* translators: %s: Add-on name */ sprintf( esc_html__( '%s was successfully deactivated', 'forminator' ), $this->get_addon_value( $pid, 'name' ) ), 'html' => $html_addons, 'button' => $button_html, ) ); } break; case 'addons-delete': if ( $pid ) { if ( WPMUDEV_Dashboard::$upgrader->delete_plugin( $pid ) ) { $html_addons = $this->addons_html( $pid ); $button_html = $this->addon_details_cta( $pid ); wp_send_json_success( array( 'message' => /* translators: %s: Add-on name */ sprintf( esc_html__( '%s was successfully deleted', 'forminator' ), $this->get_addon_value( $pid, 'name' ) ), 'html' => $html_addons, 'button' => $button_html, ) ); } else { $err = WPMUDEV_Dashboard::$upgrader->get_error(); wp_send_json_error( $err ); } } break; case 'addons-update': if ( $pid ) { $success = WPMUDEV_Dashboard::$upgrader->upgrade( $pid ); if ( ! $success ) { $error = WPMUDEV_Dashboard::$upgrader->get_error(); $errors['error'] = array( 'message' => $error['message'], ); wp_send_json_error( $errors ); } $html_addons = $this->addons_html( $pid ); $button_html = $this->addon_details_cta( $pid ); wp_send_json_success( array( 'message' => /* translators: %s: Add-on name */ sprintf( esc_html__( '%s was successfully updated', 'forminator' ), $this->get_addon_value( $pid, 'name' ) ), 'html' => $html_addons, 'button' => $button_html, ) ); } break; default: wp_send_json_error( array( 'message' => sprintf( /* translators: %s: Action */ esc_html__( 'Unknown action: %s', 'forminator' ), esc_html( $action ) ), ) ); break; } } /** * Activate addon * * @param string $pid The Project ID. * @param bool $is_network Whether the addon is network activated. */ private function activate_addon( $pid, $is_network ) { $local = WPMUDEV_Dashboard::$site->get_cached_projects( $pid ); if ( empty( $local ) ) { $errors['error'] = array( 'message' => esc_html__( 'Not installed', 'forminator' ), ); wp_send_json_error( $errors ); } $result = activate_plugin( $local['filename'], '', $is_network ); if ( is_wp_error( $result ) ) { $errors['error'] = array( 'file' => $pid, 'code' => $result->get_error_code(), 'message' => $result->get_error_message(), ); wp_send_json_error( $errors ); } else { WPMUDEV_Dashboard::$site->schedule_shutdown_refresh(); $html_addons = $this->addons_html( $pid ); $button_html = $this->addon_details_cta( $pid ); wp_send_json_success( array( 'message' => /* translators: %s: Add-on name */ sprintf( esc_html__( '%s was successfully activated', 'forminator' ), $this->get_addon_value( $pid, 'name' ) ), 'html' => $html_addons, 'button' => $button_html, ) ); } } /** * Render addons content * * @param string $name Name. * @param string $pid The Project ID. * @param array $addons Addons. */ public function addons_render( $name, $pid, $addons = array() ) { $file_name = $name . '.php'; $file_path = forminator_plugin_dir() . 'admin/views/addons/' . $file_name; $path = false; if ( file_exists( $file_path ) ) { $path = $file_path; } if ( $path ) { if ( empty( $addons ) ) { $addons = $this->get_addons( $pid ); } /** * Output some content before the template is loaded, or modify the * variables passed to the file. * * @var array $data The */ $new_data = apply_filters( 'forminator_before-' . $name, $addons ); if ( isset( $new_data ) && is_array( $new_data ) ) { $addons = $new_data; } require $path; /** * Output code or do stuff after the template was loaded. */ do_action( 'forminator_after-' . $name ); } else { printf( '
%s
- First public release
', ), ); $stripe_addon->pro_url = 'https://wpmudev.com/project/forminator-pro/?utm_source=forminator&utm_medium=plugin&utm_campaign=forminator_stripe-addon'; // PDF Addon. $pdf_addon = new stdClass(); $pdf_addon->pid = 4262971; $pdf_addon->name = esc_html__( 'PDF Generator Add-on', 'forminator' ); $pdf_addon->info = esc_html__( 'Generate and send PDF files (e.g. form entries, receipts, invoices, quotations) to users after form submission.', 'forminator' ); $pdf_addon->version_latest = '1.0'; $pdf_addon->version_installed = '1.0'; $pdf_addon->is_network_admin = is_network_admin(); $pdf_addon->has_config = false; $pdf_addon->is_hidden = false; $pdf_addon->is_installed = false; $pdf_addon->features = array( esc_html__( 'No limit on the number of PDFs you can generate for your forms.', 'forminator' ), esc_html__( 'Generate PDF files in seconds with our easy-to-use pre-designed templates.', 'forminator' ), esc_html__( 'Send customized email Notifications to admins and visitors with PDF attachments.', 'forminator' ), esc_html__( 'Download the PDFs of the form submissions on the Submissions page.', 'forminator' ), esc_html__( 'Generate payment receipts and invoices.', 'forminator' ), ); $pdf_addon->url = (object) array( 'thumbnail' => esc_url( forminator_plugin_url() . 'assets/images/pdf-logo@2x.png' ), ); $pdf_addon->changelog = array( array( 'time' => '1691653012', 'version' => '1.0', 'log' => '- First public release
', ), ); $pdf_addon->pro_url = 'https://wpmudev.com/project/forminator-pro/?utm_source=forminator&utm_medium=plugin&utm_campaign=forminator_pdf-addon'; // Geolocation Addon. $geo_addon = new stdClass(); $geo_addon->pid = self::GEOLOCATION_PID; $geo_addon->name = esc_html__( 'Geolocation Add-on', 'forminator' ); $geo_addon->info = esc_html__( 'Collect your form submitter’s location information and provide address auto-completion using Google Maps API.', 'forminator' ); $geo_addon->version_latest = '1.0'; $geo_addon->version_installed = '1.0'; $geo_addon->is_network_admin = is_network_admin(); $geo_addon->has_config = true; $geo_addon->is_hidden = false; $geo_addon->is_installed = false; $geo_addon->features = array( esc_html__( 'Collect and store your users\' geolocation information.', 'forminator' ), esc_html__( 'Add address auto-completion to your forms\' address field(s).', 'forminator' ), esc_html__( 'See your users\' geolocation on Google Maps.', 'forminator' ), ); $geo_addon->url = (object) array( 'thumbnail' => esc_url( forminator_plugin_url() . 'assets/images/geolocation-logo@2x.png' ), ); $geo_addon->changelog = array( array( 'time' => '1688169600', 'version' => '1.0', 'log' => '- First public release
', ), ); $geo_addon->pro_url = 'https://wpmudev.com/project/forminator-pro/?utm_source=forminator&utm_medium=plugin&utm_campaign=forminator_geolocation-addon'; // Extension Pack Addon. $extension_pack_addon = new stdClass(); $extension_pack_addon->pid = self::EXTENSION_PACK_PID; $extension_pack_addon->name = esc_html__( 'Extension Pack Add-on', 'forminator' ); $extension_pack_addon->info = esc_html__( 'Add powerful enhancements to your forms with this growing set of advanced features — designed to boost engagement, reduce abandonment, and help you capture more data effortlessly.', 'forminator' ); $extension_pack_addon->version_latest = '1.0'; $extension_pack_addon->version_installed = '1.0'; $extension_pack_addon->is_network_admin = is_network_admin(); $extension_pack_addon->has_config = false; $extension_pack_addon->is_hidden = false; $extension_pack_addon->is_installed = false; $extension_pack_addon->is_free = true; $extension_pack_addon->features = array( esc_html__( 'Form Abandonment', 'forminator' ), esc_html__( 'More features coming soon', 'forminator' ), ); $extension_pack_addon->url = (object) array( 'thumbnail' => esc_url( forminator_plugin_url() . 'assets/images/extension-pack-logo@2x.png' ), ); $extension_pack_addon->changelog = array( array( 'time' => '1756753985', 'version' => '1.0', 'log' => '- First public release
', ), ); $extension_pack_addon->pro_url = 'https://wpmudev.com/project/forminator-pro/?utm_source=forminator&utm_medium=plugin&utm_campaign=forminator_extension-pack-addon'; $addons = array( $geo_addon, $pdf_addon, $stripe_addon, ); if ( ! forminator_form_abandonment_disabled() ) { $addons[] = $extension_pack_addon; } return $addons; } }