Files
carpseeds.pl/wp-content/plugins/jet-plugins-wizard/includes/class-jet-plugins-wizard-installer.php
2024-07-15 11:28:08 +02:00

532 lines
13 KiB
PHP

<?php
/**
* Installer class
*/
// If this file is called directly, abort.
if ( ! defined( 'WPINC' ) ) {
die;
}
if ( ! class_exists( 'Jet_Plugins_Wizard_Installer' ) ) {
/**
* Define Jet_Plugins_Wizard_Installer class
*/
class Jet_Plugins_Wizard_Installer {
/**
* A reference to an instance of this class.
*
* @since 1.0.0
* @var object
*/
private static $instance = null;
/**
* Installer storage
*
* @var object
*/
public $installer = null;
/**
* Is wizard page trigger
*
* @var boolean
*/
private $is_wizard = false;
/**
* Installation log.
*
* @var null
*/
private $log = null;
/**
* Constructor for the class
*/
function __construct() {
add_action( 'wp_ajax_jet_plugins_wizard_install_plugin', array( $this, 'install_plugin' ) );
add_action( 'wp_ajax_jet_plugins_wizard_process_single_plugin', array( $this, 'process_single_plugin' ) );
}
/**
* Check if currently processing wizard request.
*
* @return bool
*/
public function is_wizard_request() {
return $this->is_wizard;
}
/**
* AJAX-callback for plugin install
*
* @return void
*/
public function install_plugin() {
$this->is_wizard = true;
if ( ! current_user_can( 'install_plugins' ) ) {
wp_send_json_error(
array( 'message' => esc_html__( 'You don\'t have permissions to do this', 'jet-plugins-wizard' ) )
);
}
$plugin = ! empty( $_GET['slug'] ) ? esc_attr( $_GET['slug'] ) : false;
$skin = ! empty( $_GET['skin'] ) ? esc_attr( $_GET['skin'] ) : false;
$type = ! empty( $_GET['type'] ) ? esc_attr( $_GET['type'] ) : false;
$first = ! empty( $_GET['isFirst'] ) ? esc_attr( $_GET['isFirst'] ) : false;
$first = filter_var( $first, FILTER_VALIDATE_BOOLEAN );
if ( ! $plugin || ! $skin || ! $type ) {
wp_send_json_error(
array( 'message' => esc_html__( 'No plugin to install', 'jet-plugins-wizard' ) )
);
}
$this->do_plugin_install( jet_plugins_wizard_data()->get_plugin_data( $plugin ) );
$next = jet_plugins_wizard_data()->get_next_skin_plugin( $plugin, $skin, $type );
$result_type = isset( $this->installer->skin->result_type )
? $this->installer->skin->result_type
: 'success';
if ( $first ) {
$active_skin = get_option( 'tm_active_skin' );
if ( $active_skin ) {
add_filter( 'jet-plugins-wizard/deactivate-skin-plugins', array( $this, 'unset_next_skin_plugins' ) );
$this->deactivate_skin_plugins( $active_skin['skin'], $active_skin['type'] );
remove_filter( 'jet-plugins-wizard/deactivate-skin-plugins', array( $this, 'unset_next_skin_plugins' ) );
}
}
if ( ! $next ) {
$message = esc_html__( 'All plugins are installed. Redirecting to the next step...', 'jet-plugins-wizard' );
$redirect = apply_filters(
'jet-plugins-wizards/install-finish-redirect',
jet_plugins_wizard()->get_page_link( array( 'step' => 4, 'skin' => $skin, 'type' => $type ) )
);
delete_option( 'jet_plugins_wizard_show_notice' );
delete_option( 'tm_active_skin' );
delete_option( jet_plugins_wizard_data()->advances_plugins );
add_option( 'tm_active_skin', array( 'skin' => $skin, 'type' => $type ), '', false );
do_action( 'jet-plugins-wizard/install-finished' );
$data = array(
'isLast' => true,
'message' => sprintf( '<div class="jet-plugins-wizard-installed">%s</div>', $message ),
'redirect' => $redirect,
'log' => $this->log,
'resultType' => $result_type,
);
$this->send_success( $data, $plugin );
}
$registered = jet_plugins_wizard_settings()->get( array( 'plugins' ) );
/**
* HubSpot
*/
if (
jet_plugins_wizard_settings()->has_external()
&& ! jet_plugins_wizard_settings()->is_kava()
&& jet_plugins_wizard_data()->hubspot_allowed
&& ! isset( $registered[ jet_plugins_wizard_data()->hubspot_slug ] )
) {
$registered[ jet_plugins_wizard_data()->hubspot_slug ] = jet_plugins_wizard_data()->hubspot_data;
}
if ( ! isset( $registered[ $next ] ) ) {
wp_send_json_error(
array( 'message' => esc_html__( 'This plugin is not registered', 'jet-plugins-wizard' ) )
);
}
$data = array_merge(
$registered[ $next ],
array(
'isLast' => false,
'skin' => $skin,
'type' => $type,
'slug' => $next,
'log' => $this->log,
'resultType' => $result_type,
)
);
$this->send_success( $data, $plugin );
}
/**
* Send JSON success after plugin instalation.
*
* @param array $data Data to send.
* @param string $plugin Information about current plugin.
* @return void
*/
public function send_success( $data = array(), $plugin = '' ) {
wp_send_json_success( apply_filters( 'jet-plugins-wizard/send-install-data', $data, $plugin ) );
}
/**
* Remove plugins required for next skin from deactivation list.
*
* @param array $plugins Plugins list.
* @return array
*/
public function unset_next_skin_plugins( $plugins = array() ) {
$skin = ! empty( $_GET['skin'] ) ? esc_attr( $_GET['skin'] ) : false;
$type = ! empty( $_GET['type'] ) ? esc_attr( $_GET['type'] ) : false;
if ( ! $type || ! $skin || empty( $plugins ) ) {
return $plugins;
}
$skin_plugins = jet_plugins_wizard_data()->get_skin_plugins( $skin );
$skin_plugins = $skin_plugins[ $type ];
if ( empty( $skin_plugins ) ) {
return $plugins;
}
return array_diff( $plugins, $skin_plugins );
}
/**
* Deactivate current skin plugins.
*
* @param string $skin Skin slug.
* @param string $type Skin type.
* @return null
*/
public function deactivate_skin_plugins( $skin = null, $type = null ) {
$skins = jet_plugins_wizard_settings()->get( array( 'skins' ) );
$plugins = isset( $skins['advanced'][ $skin ][ $type ] ) ? $skins['advanced'][ $skin ][ $type ] : array();
$active = get_option( 'active_plugins' );
$plugins = apply_filters( 'jet-plugins-wizard/deactivate-skin-plugins', $plugins, $skin );
if ( ! $plugins ) {
return;
}
foreach ( $plugins as $plugin ) {
foreach ( $active as $active_plugin ) {
if ( false !== strpos( $active_plugin, $plugin ) ) {
deactivate_plugins( $active_plugin );
}
}
}
}
/**
* Process single plugins installation or activation
*
* @return void
*/
public function process_single_plugin() {
$action = isset( $_REQUEST['pluginAction'] ) ? esc_attr( $_REQUEST['pluginAction'] ) : false;
if ( 'install' === $action ) {
$this->install_single_plugin();
}
if ( 'activate' === $action ) {
$this->activate_single_plugin();
}
wp_send_json_error( array(
'message' => esc_html__( 'Action not provided', 'jet-plugins-wizard' ),
) );
}
/**
* Process single plugin installation
*
* @return void
*/
public function install_single_plugin() {
$slug = isset( $_REQUEST['slug'] ) ? esc_attr( $_REQUEST['slug'] ) : false;
if ( ! $slug ) {
wp_send_json_error( array(
'message' => esc_html__( 'Plugin slug not provided', 'jet-plugins-wizard' ),
) );
}
$this->do_plugin_install( jet_plugins_wizard_data()->get_plugin_data( $slug ), false );
$result_type = isset( $this->installer->skin->result_type )
? $this->installer->skin->result_type
: 'success';
if ( 'success' === $result_type ) {
ob_start();
jet_plugins_wizard_ext()->single_plugin_item( $slug, jet_plugins_wizard_data()->get_plugin_data( $slug ) );
$item = ob_get_clean();
wp_send_json_success( array(
'message' => $item,
) );
} else {
wp_send_json_error( array(
'message' => esc_html__( 'Installation failed', 'jet-plugins-wizard' ),
'log' => $this->log
) );
}
}
/**
* Process single plugin activation
*
* @return void
*/
public function activate_single_plugin() {
$path = isset( $_REQUEST['path'] ) ? esc_attr( $_REQUEST['path'] ) : false;
$slug = isset( $_REQUEST['slug'] ) ? esc_attr( $_REQUEST['slug'] ) : false;
if ( ! $path || ! $slug ) {
wp_send_json_error( array(
'message' => esc_html__( 'Plugin data not provided', 'jet-plugins-wizard' ),
) );
}
$activate = $this->activate_plugin( $path );
if ( ! is_wp_error( $activate ) ) {
ob_start();
jet_plugins_wizard_ext()->single_plugin_item( $slug, jet_plugins_wizard_data()->get_plugin_data( $slug ) );
$item = ob_get_clean();
wp_send_json_success( array(
'message' => $item,
) );
} else {
wp_send_json_error( array(
'message' => esc_html__( 'Can\'t perform plugin activation. Please try again later', 'jet-plugins-wizard' ),
) );
}
}
/**
* Process plugin installation.
*
* @param array $plugin Plugin data.
* @param bool $activate Perform plugin activation or not.
* @return bool
*/
public function do_plugin_install( $plugin = array(), $activate = true ) {
/**
* Hook fires before plugin installation.
*
* @param array $plugin Plugin data array.
*/
do_action( 'jet-plugins-wizard/before-plugin-install', $plugin );
$this->log = null;
ob_start();
$this->dependencies();
$source = $this->locate_source( $plugin );
$this->installer = new Jet_Plugins_Wizard_Plugin_Upgrader(
new Jet_Plugins_Wizard_Plugin_Upgrader_Skin(
array(
'url' => false,
'plugin' => $plugin['slug'],
'source' => $plugin['source'],
'title' => $plugin['name'],
)
)
);
$installed = $this->installer->install( $source );
$this->log = ob_get_clean();
$plugin_activate = $this->installer->plugin_info();
/**
* Hook fires after plugin installation but before activation.
*
* @param array $plugin Plugin data array.
*/
do_action( 'jet-plugins-wizard/after-plugin-install', $plugin );
if ( false !== $activate ) {
$this->activate_plugin( $plugin_activate, $plugin['slug'] );
}
/**
* Hook fires after plugin activation.
*
* @param array $plugin Plugin data array.
*/
do_action( 'jet-plugins-wizard/after-plugin-activation', $plugin );
return $installed;
}
/**
* Activate plugin.
*
* @param string $activation_data Activation data.
* @param string $slug Plugin slug.
* @return WP_Error|null
*/
public function activate_plugin( $activation_data, $slug ) {
if ( ! empty( $activation_data ) ) {
$activate = activate_plugin( $activation_data );
return $activate;
}
$all_plugins = get_plugins();
if ( empty( $all_plugins ) ) {
return null;
}
$all_plugins = array_keys( $all_plugins );
foreach ( $all_plugins as $plugin ) {
if ( false === strpos( $plugin, $slug ) ) {
continue;
}
if ( ! is_plugin_active( $plugin ) ) {
$activate = activate_plugin( $plugin );
return $activate;
}
}
return null;
}
/**
* Returns plugin installation source URL.
*
* @param array $plugin Plugin data.
* @return string
*/
public function locate_source( $plugin = array() ) {
$source = isset( $plugin['source'] ) ? $plugin['source'] : 'wordpress';
$result = false;
switch ( $source ) {
case 'wordpress':
require_once ABSPATH . 'wp-admin/includes/plugin-install.php'; // Need for plugins_api
$api = plugins_api(
'plugin_information',
array( 'slug' => $plugin['slug'], 'fields' => array( 'sections' => false ) )
);
if ( is_wp_error( $api ) ) {
wp_die( $this->installer->strings['oops'] . var_dump( $api ) );
}
if ( isset( $api->download_link ) ) {
$result = $api->download_link;
}
break;
case 'local':
$result = ! empty( $plugin['path'] ) ? $plugin['path'] : false;
break;
case 'remote':
$result = ! empty( $plugin['path'] ) ? esc_url( $plugin['path'] ) : false;
break;
case 'crocoblock':
if ( jet_plugins_wizard_license()->is_enabled() ) {
$api_url = jet_plugins_wizard_settings()->get( array( 'license', 'server' ) );
$result = add_query_arg(
array(
'ct_api_action' => 'get_plugin',
'license' => jet_plugins_wizard_license()->get_license(),
'url' => urlencode( home_url( '/' ) ),
'slug' => $plugin['slug'],
),
$api_url
);
}
break;
}
return $result;
}
/**
* Include dependencies.
*
* @return void
*/
public function dependencies() {
if ( ! class_exists( 'Plugin_Upgrader', false ) ) {
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
}
require_once jet_plugins_wizard()->path( 'includes/class-jet-plugins-wizard-plugin-upgrader-skin.php' );
require_once jet_plugins_wizard()->path( 'includes/class-jet-plugins-wizard-plugin-upgrader.php' );
}
/**
* Returns the instance.
*
* @since 1.0.0
* @return object
*/
public static function get_instance() {
// If the single instance hasn't been set, set it now.
if ( null == self::$instance ) {
self::$instance = new self;
}
return self::$instance;
}
}
}
/**
* Returns instance of Jet_Plugins_Wizard_Installer
*
* @return object
*/
function jet_plugins_wizard_installer() {
return Jet_Plugins_Wizard_Installer::get_instance();
}
jet_plugins_wizard_installer();