cl01/wp-content/plugins/blaze-demo-importer/classes/class-demo-importer.php
2025-02-24 12:39:24 +08:00

307 lines
11 KiB
PHP
Executable File

<?php
// Exit if accessed directly
if (!defined('ABSPATH')) {
die();
}
if (!class_exists('BLAZE_DEMO_IMPORTER_Demo_Importer')) {
final class BLAZE_DEMO_IMPORTER_Demo_Importer {
/**
* A reference to an instance of this class.
*
* @since 1.0.0
* @access private
* @var object
*/
private static $instance = null;
/**
* Initiator
*
* @since 1.0.0
* @return object
*/
public static function get_instance() {
if (!isset(self::$instance)) {
self::$instance = new self;
}
return self::$instance;
}
public function __construct() {
/** WordPress Plugin Installation Ajax * */
add_action('wp_ajax_plugin_installer', array($this, 'plugin_installer_callback'));
/** Bundled & Remote Plugin Installation Ajax * */
add_action('wp_ajax_plugin_offline_installer', array($this, 'plugin_offline_installer_callback'));
/** Plugin Activation Ajax * */
add_action('wp_ajax_plugin_activation', array($this, 'plugin_activation_callback'));
/** Plugin Deactivation Ajax * */
add_action('wp_ajax_plugin_deactivation', array($this, 'plugin_deactivation_callback'));
}
/** Plugin API * */
public static function call_plugin_api($plugin) {
include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
$call_api = plugins_api('plugin_information', array(
'slug' => $plugin,
'fields' => array(
'downloaded' => false,
'rating' => false,
'description' => false,
'short_description' => false,
'donate_link' => false,
'tags' => false,
'sections' => true,
'homepage' => true,
'added' => false,
'last_updated' => false,
'compatibility' => false,
'tested' => false,
'requires' => false,
'downloadlink' => false,
'icons' => true
)));
return $call_api;
}
/** Check if Plugin is active or not * */
public static function plugin_active_status($file_path) {
$status = 'install';
$plugin_path = WP_PLUGIN_DIR . '/' . esc_attr($file_path);
if (file_exists($plugin_path)) {
$status = is_plugin_active($file_path) ? 'active' : 'inactive';
}
return $status;
}
/** Generate Url for the Plugin Button * */
public static function generate_plugin_url($plugin) {
$status = self::plugin_active_status($plugin);
$url = 'javascript:void()';
if ($status == 'install' && $source == 'remote') {
$url = $plugin['location'];
}
return $url;
}
/** Generate Class for the Plugin Button * */
public static function generate_plugin_class($plugin) {
$status = self::plugin_active_status($plugin);
switch ($status) {
case 'install' :
$btn_class = 'install button button-primary';
break;
case 'inactive' :
$btn_class = 'activate button button-primary';
break;
case 'active' :
$btn_class = 'installed button';
break;
}
return $btn_class;
}
/** Generate Label for the Plugin Button * */
public static function generate_plugin_label($plugin) {
$status = self::plugin_active_status($plugin);
switch ($status) {
case 'install' :
$btn_label = esc_html__('Install', 'blaze-demo-importer');
break;
case 'inactive' :
$btn_label = esc_html__('Activate', 'blaze-demo-importer');
break;
case 'active' :
$btn_label = esc_html__('Installed', 'blaze-demo-importer');
break;
}
return $btn_label;
}
/* ========== Plugin Installation Ajax =========== */
public function plugin_installer_callback() {
if (!current_user_can('install_plugins')) {
wp_send_json(
array(
'success' => false,
'message' => esc_html__('Sorry, you are not allowed to install plugins on this site.', 'blaze-demo-importer')
)
);
die();
}
$nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';
$plugin = isset($_POST['slug']) ? sanitize_text_field(wp_unslash($_POST['slug'])) : '';
$plugin_file = isset($_POST['plugin_file']) ? sanitize_text_field(wp_unslash($_POST['plugin_file'])) : '';
// Check our nonce, if they don't match then bounce!
if (!wp_verify_nonce($nonce, 'plugin_installer_nonce')) {
wp_send_json(
array(
'success' => false,
'message' => esc_html__('Error - unable to verify nonce, please try again.', 'blaze-demo-importer')
)
);
die();
}
// Include required libs for installation
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
require_once ABSPATH . 'wp-admin/includes/class-wp-ajax-upgrader-skin.php';
require_once ABSPATH . 'wp-admin/includes/class-plugin-upgrader.php';
// Get Plugin Info
$api = self::call_plugin_api($plugin);
$skin = new WP_Ajax_Upgrader_Skin();
$upgrader = new Plugin_Upgrader($skin);
$upgrader->install($api->download_link);
$plugin_file = esc_html($plugin) . '/' . esc_html($plugin_file);
if ($plugin_file) {
$activate = activate_plugin($plugin_file, '', false, true);
wp_send_json_success();
}
die();
}
/** Plugin Offline Installation Ajax * */
public function plugin_offline_installer_callback() {
if (!current_user_can('install_plugins')) {
wp_send_json(
array(
'success' => false,
'message' => esc_html__('Sorry, you are not allowed to install plugins on this site.', 'blaze-demo-importer')
)
);
die();
}
$file_location = isset($_POST['file_location']) ? sanitize_text_field(wp_unslash($_POST['file_location'])) : '';
$nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';
$plugin = isset($_POST['slug']) ? sanitize_text_field(wp_unslash($_POST['slug'])) : '';
$plugin_file = isset($_POST['plugin_file']) ? sanitize_text_field(wp_unslash($_POST['plugin_file'])) : '';
// Check our nonce, if they don't match then bounce!
if (!wp_verify_nonce($nonce, 'plugin_installer_nonce')) {
wp_send_json(
array(
'success' => false,
'message' => esc_html__('Error - unable to verify nonce, please try again.', 'blaze-demo-importer')
)
);
die();
}
if ($file_location) {
$upload_path = $this->get_local_dir_path($file_location, $plugin);
$plugin_file = WP_PLUGIN_DIR . '/' . esc_html($plugin) . '/' . esc_html($plugin_file);
$zip = new ZipArchive();
if ($zip->open($upload_path) === TRUE) {
$zip->extractTo(WP_PLUGIN_DIR);
$zip->close();
if (file_exists($plugin_file)) {
activate_plugin($plugin_file);
}
unlink($upload_path);
wp_send_json_success();
}
} else {
wp_send_json(
array(
'success' => false,
'message' => __('Missing File Location.', 'blaze-demo-importer')
)
);
}
die();
}
/** Plugin Offline Activation Ajax * */
public function plugin_activation_callback() {
$plugin = isset($_POST['plugin']) ? sanitize_text_field(wp_unslash($_POST['plugin'])) : '';
$plugin_file = isset($_POST['plugin_file']) ? sanitize_text_field(wp_unslash($_POST['plugin_file'])) : '';
$plugin_file = WP_PLUGIN_DIR . '/' . esc_html($plugin) . '/' . esc_html($plugin_file);
$nonce = isset($_POST['nonce']) ? sanitize_text_field(wp_unslash($_POST['nonce'])) : '';
// Check our nonce, if they don't match then bounce!
if (!wp_verify_nonce($nonce, 'plugin_activate_nonce')) {
wp_send_json(
array(
'success' => false,
'message' => esc_html__('Error - unable to verify nonce, please try again.', 'blaze-demo-importer')
)
);
die();
}
if (file_exists($plugin_file)) {
activate_plugin($plugin_file);
wp_send_json_success();
} else {
wp_send_json(
array(
'success' => false,
'message' => __('Error!! Plugin not activated.', 'blaze-demo-importer')
)
);
}
die();
}
public function get_local_dir_path($file_location, $plugin) {
if (isset($file_location)) {
$upload_dir = wp_upload_dir();
$upload_path = $upload_dir['path'] . '/' . $plugin . '.zip';
$url = wp_nonce_url(admin_url('themes.php?page=blaze-demo-importer-recommended-plugins'), 'remote-file-installation');
if (false === ($creds = request_filesystem_credentials($url, '', false, false, null) )) {
return; // stop processing here
}
if (!WP_Filesystem($creds)) {
request_filesystem_credentials($url, '', true, false, null);
return;
}
global $wp_filesystem;
$file = $wp_filesystem->get_contents($file_location);
$wp_filesystem->put_contents($upload_path, $file, FS_CHMOD_FILE);
return $upload_path;
}
}
}
}
BLAZE_DEMO_IMPORTER_Demo_Importer::get_instance();