mirror of
https://gh.wpcy.net/https://github.com/mainwp/mainwp-child.git
synced 2026-04-23 10:32:22 +08:00
814 lines
29 KiB
PHP
814 lines
29 KiB
PHP
<?php
|
|
/**
|
|
* MainWP Child Staging.
|
|
*
|
|
* MainWP Staging Extension handler.
|
|
*
|
|
* @link https://mainwp.com/extension/staging/
|
|
*
|
|
* @package MainWP\Child
|
|
*
|
|
* Credits
|
|
*
|
|
* Plugin-Name: WP Staging
|
|
* Plugin URI: https://wordpress.org/plugins/wp-staging
|
|
* Author: WP-Staging
|
|
* Author URI: https://wp-staging.com
|
|
* Contributors: ReneHermi, ilgityildirim
|
|
*
|
|
* The code is used for the MainWP Staging Extension
|
|
* Extension URL: https://mainwp.com/extension/staging/
|
|
*/
|
|
|
|
namespace MainWP\Child;
|
|
|
|
// Exit if accessed directly.
|
|
if ( ! defined( 'ABSPATH' ) ) {
|
|
exit;
|
|
}
|
|
|
|
// phpcs:disable PSR1.Classes.ClassDeclaration, WordPress.WP.AlternativeFunctions -- Required to achieve desired results. Pull requests appreciated.
|
|
|
|
/**
|
|
* Class MainWP_Child_Staging
|
|
*
|
|
* MainWP Staging Extension handler.
|
|
*/
|
|
class MainWP_Child_Staging { //phpcs:ignore -- NOSONAR - multi methods.
|
|
|
|
/**
|
|
* Public static variable to hold the single instance of the class.
|
|
*
|
|
* @var mixed Default null
|
|
*/
|
|
public static $instance = null;
|
|
|
|
/**
|
|
* Public variable to hold the information if the WP Staging plugin is installed on the child site.
|
|
*
|
|
* @var bool If WP Staging intalled, return true, if not, return false.
|
|
*/
|
|
public $is_plugin_installed = false;
|
|
|
|
/**
|
|
* Public variable to hold the plugin slug.
|
|
*
|
|
* @var string slug string.
|
|
*/
|
|
public $the_plugin_slug = 'wp-staging/wp-staging.php';
|
|
|
|
/**
|
|
* Public variable to hold the plugin slug.
|
|
*
|
|
* @var string slug string.
|
|
*/
|
|
public $the_plugin_slug_pro = 'wp-staging-pro/wp-staging-pro.php';
|
|
|
|
/**
|
|
* Public variable to hold the information if the WP Staging plugin is installed on the child site.
|
|
*
|
|
* @var string version string.
|
|
*/
|
|
public $plugin_version = false;
|
|
|
|
/**
|
|
* Public assets variable.
|
|
*
|
|
* @var object assets.
|
|
*/
|
|
public $assets = null;
|
|
|
|
/**
|
|
* Create a public static instance of MainWP_Child_Staging.
|
|
*
|
|
* @return MainWP_Child_Staging|null
|
|
*/
|
|
public static function instance() {
|
|
if ( null === static::$instance ) {
|
|
static::$instance = new self();
|
|
}
|
|
return static::$instance;
|
|
}
|
|
|
|
/**
|
|
* MainWP_Child_Staging constructor.
|
|
*
|
|
* Run any time class is called.
|
|
*/
|
|
public function __construct() {
|
|
require_once ABSPATH . 'wp-admin/includes/plugin.php'; // NOSONAR - WP compatible.
|
|
if ( ( is_plugin_active( $this->the_plugin_slug ) && defined( 'WPSTG_PLUGIN_DIR' ) ) || is_plugin_active( $this->the_plugin_slug_pro ) ) {
|
|
$this->is_plugin_installed = true;
|
|
}
|
|
|
|
if ( ! $this->is_plugin_installed ) {
|
|
return;
|
|
}
|
|
|
|
add_filter( 'mainwp_site_sync_others_data', array( $this, 'sync_others_data' ), 10, 2 );
|
|
}
|
|
|
|
|
|
/**
|
|
* Initiate actions & filters.
|
|
*/
|
|
public function init() {
|
|
if ( 'Y' !== get_option( 'mainwp_wp_staging_ext_enabled' ) ) {
|
|
return;
|
|
}
|
|
|
|
if ( ! $this->is_plugin_installed ) {
|
|
return;
|
|
}
|
|
|
|
if ( 'hide' === get_option( 'mainwp_wp_staging_hide_plugin' ) ) {
|
|
add_filter( 'all_plugins', array( $this, 'all_plugins' ) );
|
|
add_action( 'admin_menu', array( $this, 'remove_menu' ) );
|
|
add_filter( 'site_transient_update_plugins', array( &$this, 'remove_update_nag' ) );
|
|
add_filter( 'mainwp_child_hide_update_notice', array( &$this, 'hide_update_notice' ) );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Sync others data.
|
|
*
|
|
* Get an array of available clones of this Child Sites.
|
|
*
|
|
* @param array $information Holder for available clones.
|
|
* @param array $data Array of existing clones.
|
|
*
|
|
* @uses MainWP_Child_Staging::get_sync_data()
|
|
*
|
|
* @return array $information An array of available clones.
|
|
*/
|
|
public function sync_others_data( $information, $data = array() ) {
|
|
if ( isset( $data['syncWPStaging'] ) && $data['syncWPStaging'] ) {
|
|
try {
|
|
$information['syncWPStaging'] = $this->get_sync_data();
|
|
} catch ( MainWP_Exception $e ) {
|
|
// ok!
|
|
}
|
|
}
|
|
return $information;
|
|
}
|
|
|
|
/**
|
|
* Fires off MainWP_Child_Staging::get_overview().
|
|
*
|
|
* @uses MainWP_Child_Staging::get_overview()
|
|
* @return array An array of available clones.
|
|
*/
|
|
public function get_sync_data() {
|
|
return $this->get_overview();
|
|
}
|
|
|
|
/**
|
|
* Fires of certain WP Staging plugin actions.
|
|
*
|
|
* @uses \WPStaging\WPStaging::getInstance()
|
|
* @uses \MainWP\Child\MainWP_Helper::update_option()
|
|
* @uses \MainWP\Child\MainWP_Helper::write()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::set_showhide()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::save_settings()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::get_overview()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::get_scan()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_check_free_space()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_check_clone_name()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_start_clone()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_clone_database()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_prepare_directories()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_replace_data()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_finish()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_delete_confirmation()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_delete_clone()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_cancel_clone()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_update_process()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::ajax_cancel_update()
|
|
* @uses \MainWP\Child\MainWP_Child_Staging::MainWP_Helper::write()
|
|
*/
|
|
public function action() { // phpcs:ignore -- NOSONAR - ignore complex method notice.
|
|
if ( ! $this->is_plugin_installed ) {
|
|
MainWP_Helper::write( array( 'error' => esc_html__( 'Please install WP Staging plugin on child website', 'mainwp-child' ) ) );
|
|
}
|
|
|
|
if ( ! class_exists( '\WPStaging\WPStaging' ) && ! class_exists( '\WPStaging\Core\WPStaging' ) ) {
|
|
if ( file_exists( WPSTG_PLUGIN_DIR . 'app/Core/WPStaging.php' ) ) {
|
|
require_once WPSTG_PLUGIN_DIR . 'app/Core/WPStaging.php'; // NOSONAR - WP compatible.
|
|
} elseif ( file_exists( WPSTG_PLUGIN_DIR . 'Core/WPStaging.php' ) ) {
|
|
require_once WPSTG_PLUGIN_DIR . 'Core/WPStaging.php'; // NOSONAR - WP compatible.
|
|
}
|
|
}
|
|
|
|
if ( class_exists( '\WPStaging\Core\WPStaging' ) ) {
|
|
$this->plugin_version = '2.8';
|
|
\WPStaging\Core\WPStaging::getInstance();
|
|
} elseif ( class_exists( '\WPStaging\WPStaging' ) ) {
|
|
$this->plugin_version = '2.7';
|
|
\WPStaging\WPStaging::getInstance();
|
|
}
|
|
|
|
$information = array();
|
|
|
|
if ( 'Y' !== get_option( 'mainwp_wp_staging_ext_enabled' ) ) {
|
|
MainWP_Helper::update_option( 'mainwp_wp_staging_ext_enabled', 'Y', 'yes' );
|
|
}
|
|
|
|
$mwp_action = MainWP_System::instance()->validate_params( 'mwp_action' );
|
|
if ( ! empty( $mwp_action ) ) {
|
|
switch ( $mwp_action ) {
|
|
case 'set_showhide':
|
|
$information = $this->set_showhide();
|
|
break;
|
|
case 'save_settings':
|
|
$information = $this->save_settings();
|
|
break;
|
|
case 'get_overview':
|
|
$information = $this->get_overview();
|
|
break;
|
|
case 'get_scan':
|
|
$information = $this->get_scan();
|
|
break;
|
|
case 'check_disk_space':
|
|
$information = $this->ajax_check_free_space();
|
|
break;
|
|
case 'check_clone':
|
|
$information = $this->ajax_check_clone_name();
|
|
break;
|
|
case 'start_clone':
|
|
$information = $this->ajax_start_clone();
|
|
break;
|
|
case 'clone_database':
|
|
$information = $this->ajax_clone_database();
|
|
break;
|
|
case 'prepare_directories':
|
|
$information = $this->ajax_start_files();
|
|
break;
|
|
case 'copy_files':
|
|
$information = $this->ajax_start_files();
|
|
break;
|
|
case 'replace_data':
|
|
$information = $this->ajax_start_files();
|
|
break;
|
|
case 'clone_finish':
|
|
$information = $this->ajax_finish();
|
|
break;
|
|
case 'delete_confirmation':
|
|
$information = $this->ajax_delete_confirmation();
|
|
break;
|
|
case 'delete_clone':
|
|
$information = $this->ajax_delete_clone();
|
|
break;
|
|
case 'cancel_clone':
|
|
$information = $this->ajax_cancel_clone();
|
|
break;
|
|
case 'staging_update':
|
|
$information = $this->ajax_update_process();
|
|
break;
|
|
case 'cancel_update':
|
|
$information = $this->ajax_cancel_update();
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
MainWP_Helper::write( $information );
|
|
}
|
|
|
|
/**
|
|
* Sets whether or not to hide the WP Staging Plugin.
|
|
*
|
|
* @return array $information Action result.
|
|
*
|
|
* @uses \MainWP\Child\MainWP_Helper::update_option()
|
|
*/
|
|
public function set_showhide() {
|
|
$hide = MainWP_System::instance()->validate_params( 'showhide' );
|
|
MainWP_Helper::update_option( 'mainwp_wp_staging_hide_plugin', $hide, 'yes' );
|
|
$information['result'] = 'SUCCESS';
|
|
return $information;
|
|
}
|
|
|
|
/**
|
|
* Save WP Staging settings.
|
|
*
|
|
* @return string[] Return 'Success'.
|
|
*/
|
|
public function save_settings() {
|
|
$settings = isset( $_POST['settings'] ) ? wp_unslash( $_POST['settings'] ) : array(); // phpcs:ignore WordPress.Security.NonceVerification,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
|
|
$filters = array(
|
|
'queryLimit',
|
|
'fileLimit',
|
|
'batchSize',
|
|
'cpuLoad',
|
|
'delayRequests',
|
|
'disableAdminLogin',
|
|
'querySRLimit',
|
|
'maxFileSize',
|
|
'debugMode',
|
|
'unInstallOnDelete',
|
|
'checkDirectorySize',
|
|
'optimizer',
|
|
);
|
|
|
|
$save_fields = array();
|
|
foreach ( $filters as $field ) {
|
|
if ( isset( $settings[ $field ] ) ) {
|
|
$save_fields[ $field ] = $settings[ $field ];
|
|
}
|
|
}
|
|
update_option( 'wpstg_settings', $save_fields );
|
|
return array( 'result' => 'success' );
|
|
}
|
|
|
|
/**
|
|
* Get array of available clones.
|
|
*
|
|
* @return array $return Action result.
|
|
*/
|
|
public function get_overview() {
|
|
if ( defined( '\WPStaging\Staging\Sites::STAGING_SITES_OPTION' ) ) { // new update.
|
|
$return = array(
|
|
'availableClones' => get_option( \WPStaging\Staging\Sites::STAGING_SITES_OPTION, array() ),
|
|
);
|
|
} elseif ( defined( '\WPStaging\Framework\Staging\Sites::STAGING_SITES_OPTION' ) ) {
|
|
$return = array(
|
|
'availableClones' => get_option( \WPStaging\Framework\Staging\Sites::STAGING_SITES_OPTION, array() ),
|
|
);
|
|
} else {
|
|
$return = array(
|
|
'availableClones' => get_option( 'wpstg_existing_clones_beta', array() ),
|
|
);
|
|
}
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Get WP Staging Jobs.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Scan::start()
|
|
* @uses WPStaging\Backend\Modules\Jobs\Scan::getOptions()
|
|
*
|
|
* @return array $return Action result.
|
|
*/
|
|
public function get_scan() {
|
|
$scan = new \WPStaging\Backend\Modules\Jobs\Scan();
|
|
$scan->start();
|
|
|
|
$options = $scan->getOptions();
|
|
|
|
return array(
|
|
'options' => wp_json_encode( $options ), // phpcs:ignore -- to compatible http encoding.
|
|
'prefix' => '2.8' === $this->plugin_version ? \WPStaging\Core\WPStaging::getTablePrefix() : \WPStaging\WPStaging::getTablePrefix(),
|
|
'directoryListing' => $scan->directoryListing(),
|
|
);
|
|
}
|
|
|
|
|
|
/**
|
|
* Check if clone name already exists & it's length.
|
|
*
|
|
* @return array|string[] Action result array[status, message] or return 'success'.
|
|
*/
|
|
public function ajax_check_clone_name() {
|
|
$cloneID = isset( $_POST['cloneID'] ) ? sanitize_key( wp_unslash( $_POST['cloneID'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification
|
|
|
|
if ( defined( '\WPStaging\Staging\Sites::STAGING_SITES_OPTION' ) ) { // new update.
|
|
$clones = get_option( \WPStaging\Staging\Sites::STAGING_SITES_OPTION, array() ); // old option.
|
|
} elseif ( defined( '\WPStaging\Framework\Staging\Sites::STAGING_SITES_OPTION' ) ) {
|
|
$clones = get_option( \WPStaging\Framework\Staging\Sites::STAGING_SITES_OPTION, array() ); // old option.
|
|
} else {
|
|
$clones = get_option( 'wpstg_existing_clones_beta', array() ); // old option.
|
|
}
|
|
|
|
if ( array_key_exists( $cloneID, $clones ) ) {
|
|
return array(
|
|
'status' => 'failed',
|
|
'message' => 'Clone name is already in use, please choose an another clone name',
|
|
);
|
|
}
|
|
|
|
return array( 'status' => 'success' );
|
|
}
|
|
|
|
/**
|
|
* Start clone via ajax.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Cloning::save()
|
|
*
|
|
* @return false|string|void Return FALSE on failure, ajax response string on success, ELSE returns VOID.
|
|
*/
|
|
public function ajax_start_clone() { //phpcs:ignore -- NOSONAR - complex.
|
|
|
|
if ( function_exists( '\WPStaging\Core\WPStaging::make' ) ) {
|
|
require_once WPSTG_PLUGIN_DIR . 'Backend/Modules/Jobs/ProcessLock.php'; // NOSONAR - WP compatible.
|
|
// Check first if there is already a process running.
|
|
$processLock = new \WPStaging\Backend\Modules\Jobs\ProcessLock();
|
|
if ( $this->is_running( $processLock ) ) {
|
|
return;
|
|
}
|
|
|
|
$cloning = \WPStaging\Core\WPStaging::make( \WPStaging\Backend\Modules\Jobs\Cloning::class );
|
|
|
|
if ( ! $cloning->save() ) {
|
|
return;
|
|
}
|
|
} else {
|
|
$this->url = '';
|
|
// phpcs:disable WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput.InputNotSanitized
|
|
// to compatible with new version.
|
|
if ( class_exists( '\WPStaging\Framework\Database\SelectedTables' ) ) {
|
|
|
|
if ( isset( $_POST['includedTables'] ) && is_array( $_POST['includedTables'] ) ) {
|
|
$_POST['includedTables'] = implode( \WPStaging\Framework\Filesystem\Scanning\ScanConst::DIRECTORIES_SEPARATOR, wp_unslash( $_POST['includedTables'] ) );
|
|
}
|
|
|
|
if ( isset( $_POST['excludedTables'] ) && is_array( $_POST['excludedTables'] ) ) {
|
|
$_POST['excludedTables'] = implode( \WPStaging\Framework\Filesystem\Scanning\ScanConst::DIRECTORIES_SEPARATOR, wp_unslash( $_POST['excludedTables'] ) );
|
|
}
|
|
|
|
if ( isset( $_POST['selectedTablesWithoutPrefix'] ) && is_array( $_POST['selectedTablesWithoutPrefix'] ) ) {
|
|
$_POST['selectedTablesWithoutPrefix'] = implode( \WPStaging\Framework\Filesystem\Scanning\ScanConst::DIRECTORIES_SEPARATOR, wp_unslash( $_POST['selectedTablesWithoutPrefix'] ) );
|
|
}
|
|
|
|
if ( isset( $_POST['includedDirectories'] ) && is_array( $_POST['includedDirectories'] ) ) {
|
|
$_POST['includedDirectories'] = implode( \WPStaging\Framework\Filesystem\Scanning\ScanConst::DIRECTORIES_SEPARATOR, wp_unslash( $_POST['includedDirectories'] ) );
|
|
}
|
|
|
|
if ( isset( $_POST['excludedDirectories'] ) && is_array( $_POST['excludedDirectories'] ) ) {
|
|
$_POST['excludedDirectories'] = implode( \WPStaging\Framework\Filesystem\Scanning\ScanConst::DIRECTORIES_SEPARATOR, wp_unslash( $_POST['excludedDirectories'] ) );
|
|
}
|
|
|
|
if ( isset( $_POST['extraDirectories'] ) && is_array( $_POST['extraDirectories'] ) ) {
|
|
$_POST['extraDirectories'] = implode( \WPStaging\Framework\Filesystem\Scanning\ScanConst::DIRECTORIES_SEPARATOR, wp_unslash( $_POST['extraDirectories'] ) );
|
|
}
|
|
}
|
|
// phpcs:enable
|
|
$cloning = new \WPStaging\Backend\Modules\Jobs\Cloning();
|
|
|
|
if ( ! $cloning->save() ) {
|
|
return;
|
|
}
|
|
}
|
|
|
|
$result = array();
|
|
|
|
if ( file_exists( WPSTG_PLUGIN_DIR . 'app/Backend/views/clone/ajax/start.php' ) ) {
|
|
ob_start();
|
|
require_once WPSTG_PLUGIN_DIR . 'app/Backend/views/clone/ajax/start.php'; // NOSONAR - WP compatible.
|
|
$result = ob_get_clean();
|
|
} elseif ( file_exists( WPSTG_PLUGIN_DIR . 'Backend/views/clone/ajax/start.php' ) ) { // new.
|
|
if ( defined( 'WPSTG_VERSION' ) && version_compare( WPSTG_VERSION, '3.0', '>=' ) ) {
|
|
if ( file_exists( WPSTG_PLUGIN_DIR . 'Core/WPStaging.php' ) ) {
|
|
include_once WPSTG_PLUGIN_DIR . 'Core/WPStaging.php'; // NOSONAR -- WP compatible.
|
|
$this->assets = \WPStaging\Core\WPStaging::make( \WPStaging\Framework\Assets\Assets::class ); // to fix error since ver 3.1.3.
|
|
|
|
$subDirectory = str_replace( get_home_path(), '', ABSPATH );
|
|
$urlsHelper = \WPStaging\Core\WPStaging::make( \WPStaging\Framework\Utils\Urls::class );
|
|
$url = $urlsHelper->getHomeUrl() . str_replace( '/', '', $subDirectory );
|
|
$result = array(
|
|
'url' => $url,
|
|
'blog_name' => get_bloginfo( 'name' ),
|
|
'clone' => $cloning->getOptions()->clone,
|
|
'img_src' => $this->assets->getAssetsUrl( 'img/admin_dashboard.png' ),
|
|
'version3' => 1,
|
|
);
|
|
}
|
|
} else {
|
|
// to compatible with version 2.x.
|
|
ob_start();
|
|
$this->assets = new \WPStaging\Framework\Assets\Assets( new \WPStaging\Framework\Security\AccessToken(), new \WPStaging\Core\DTO\Settings() ); // to fix error.
|
|
require_once WPSTG_PLUGIN_DIR . 'Backend/views/clone/ajax/start.php'; // NOSONAR - WP compatible.
|
|
$result = ob_get_clean();
|
|
}
|
|
} elseif ( defined( 'WPSTG_VIEWS_DIR' ) && file_exists( WPSTG_VIEWS_DIR . 'clone/ajax/scan.php' ) ) { // new version >= 3.8.4.
|
|
if ( file_exists( WPSTG_PLUGIN_DIR . 'Core/WPStaging.php' ) ) {
|
|
include_once WPSTG_PLUGIN_DIR . 'Core/WPStaging.php'; // NOSONAR -- WP compatible.
|
|
$this->assets = \WPStaging\Core\WPStaging::make( \WPStaging\Framework\Assets\Assets::class ); // to fix error since ver 3.1.3.
|
|
|
|
$subDirectory = str_replace( get_home_path(), '', ABSPATH );
|
|
$urlsHelper = \WPStaging\Core\WPStaging::make( \WPStaging\Framework\Utils\Urls::class );
|
|
$url = $urlsHelper->getHomeUrl() . str_replace( '/', '', $subDirectory );
|
|
$result = array(
|
|
'url' => $url,
|
|
'blog_name' => get_bloginfo( 'name' ),
|
|
'clone' => $cloning->getOptions()->clone,
|
|
'img_src' => $this->assets->getAssetsUrl( 'img/admin_dashboard.png' ),
|
|
'version3' => 1,
|
|
);
|
|
}
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
*
|
|
* Check process lock running.
|
|
*
|
|
* @param mixed $processlock Process lock object.
|
|
*
|
|
* @return bool
|
|
*/
|
|
protected function is_running( $processlock ) {
|
|
if ( ! isset( $processlock->options ) || ! isset( $processlock->options->isRunning ) || ! isset( $processlock->options->expiresAt ) ) {
|
|
return false;
|
|
}
|
|
|
|
try {
|
|
$now = new \DateTime();
|
|
$expiresAt = new \DateTime( $processlock->options->expiresAt );
|
|
return ( true === $processlock->options->isRunning ) && ( $now < $expiresAt );
|
|
} catch ( MainWP_Exception $e ) {
|
|
// ok.
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Clone database via ajax.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Cloning::start()
|
|
*
|
|
* @return mixed Action result.
|
|
*/
|
|
public function ajax_clone_database() {
|
|
if ( function_exists( '\WPStaging\Core\WPStaging::make' ) ) {
|
|
return \WPStaging\Core\WPStaging::make( \WPStaging\Backend\Modules\Jobs\Cloning::class )->start(); // new.
|
|
} else {
|
|
$cloning = new \WPStaging\Backend\Modules\Jobs\Cloning();
|
|
return $cloning->start();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Ajax Clone Files.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Cloning::start()
|
|
*
|
|
* @return mixed Action result.
|
|
*/
|
|
public function ajax_start_files() {
|
|
$cloning = new \WPStaging\Backend\Modules\Jobs\Cloning();
|
|
return $cloning->start();
|
|
}
|
|
|
|
/**
|
|
* Ajax Finish
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Cloning::start()
|
|
*
|
|
* @return mixed $return Action result.
|
|
*/
|
|
public function ajax_finish() {
|
|
$cloning = new \WPStaging\Backend\Modules\Jobs\Cloning();
|
|
$this->url = '';
|
|
$return = $cloning->start();
|
|
$return->blogInfoName = get_bloginfo( 'name' );
|
|
|
|
return $return;
|
|
}
|
|
|
|
/**
|
|
* Ajax Delete Confirmation.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Delete::getClone()
|
|
* @uses WPStaging\Backend\Modules\Jobs\Delete::getClone()
|
|
*
|
|
* @return array $result Action result.
|
|
*/
|
|
public function ajax_delete_confirmation() {
|
|
$delete = new \WPStaging\Backend\Modules\Jobs\Delete();
|
|
$delete->setData();
|
|
$clone = $delete->getClone();
|
|
return array(
|
|
'clone' => $clone,
|
|
'deleteTables' => $delete->getTables(),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Ajax Delete clone.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Delete::start()
|
|
*
|
|
* @return mixed Action result.
|
|
*/
|
|
public function ajax_delete_clone() {
|
|
$delete = new \WPStaging\Backend\Modules\Jobs\Delete();
|
|
$result = $delete->start();
|
|
if ( null === $result ) {
|
|
$result = wp_json_encode( 'retry' ); // to fix.
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Ajax Cancel clone.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Cancel::start()
|
|
*/
|
|
public function ajax_cancel_clone() {
|
|
$cancel = new \WPStaging\Backend\Modules\Jobs\Cancel();
|
|
$result = $cancel->start();
|
|
if ( null === $result ) {
|
|
$result = wp_json_encode( 'retry' ); // to fix.
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Ajax Cancel Update.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\CancelUpdate::start()
|
|
*
|
|
* @return mixed Action result.
|
|
*/
|
|
public function ajax_cancel_update() {
|
|
$cancel = new \WPStaging\Backend\Modules\Jobs\CancelUpdate();
|
|
|
|
return $cancel->start();
|
|
}
|
|
|
|
/**
|
|
* Ajax Update Process.
|
|
*
|
|
* @uses WPStaging\Backend\Modules\Jobs\Updating::save()
|
|
*
|
|
* @return false|string|void Return FALSE on failure, ajax response string on success, ELSE returns VOID.
|
|
*/
|
|
public function ajax_update_process() {
|
|
$cloning = new \WPStaging\Backend\Modules\Jobs\Updating();
|
|
|
|
if ( ! $cloning->save() ) {
|
|
return '';
|
|
}
|
|
|
|
if ( file_exists( WPSTG_PLUGIN_DIR . 'app/Backend/views/clone/ajax/update.php' ) ) {
|
|
ob_start();
|
|
require_once WPSTG_PLUGIN_DIR . 'app/Backend/views/clone/ajax/update.php'; // NOSONAR - WP compatible.
|
|
$result = ob_get_clean();
|
|
} elseif ( file_exists( WPSTG_PLUGIN_DIR . 'Backend/views/clone/ajax/update.php' ) ) {
|
|
if ( defined( 'WPSTG_VERSION' ) && version_compare( WPSTG_VERSION, '3.0', '>=' ) ) {
|
|
$result = array(
|
|
'clone' => $cloning->getOptions()->clone,
|
|
'mainJob' => $cloning->getOptions()->mainJob,
|
|
'version3' => 1,
|
|
);
|
|
} else {
|
|
ob_start();
|
|
require_once WPSTG_PLUGIN_DIR . 'Backend/views/clone/ajax/update.php'; // NOSONAR - WP compatible.
|
|
$result = ob_get_clean();
|
|
}
|
|
} elseif ( defined( 'WPSTG_VIEWS_DIR' ) && file_exists( WPSTG_VIEWS_DIR . 'clone/ajax/scan.php' ) ) { // new version >= 3.8.4.
|
|
$result = array(
|
|
'clone' => $cloning->getOptions()->clone,
|
|
'mainJob' => $cloning->getOptions()->mainJob,
|
|
'version3' => 1,
|
|
);
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Ajax check for free disk space.
|
|
*
|
|
* @uses MainWP_Child_Staging::has_free_disk_space()
|
|
*
|
|
* @return array|null Action result or null
|
|
*/
|
|
public function ajax_check_free_space() {
|
|
return $this->has_free_disk_space();
|
|
}
|
|
|
|
/**
|
|
* Ajax check for free disk space.
|
|
*
|
|
* @uses MainWP_Child_Staging::format_size()
|
|
* @uses MainWP_Child_Staging::get_directory_size_incl_subdirs()
|
|
*
|
|
* @return array|null Action result or null
|
|
*/
|
|
public function has_free_disk_space() {
|
|
if ( ! function_exists( 'disk_free_space' ) ) {
|
|
return null;
|
|
}
|
|
$freeSpace = disk_free_space( ABSPATH );
|
|
if ( false === $freeSpace ) {
|
|
return array(
|
|
'freespace' => false,
|
|
'usedspace' => $this->format_size( $this->get_directory_size_incl_subdirs( ABSPATH ) ),
|
|
);
|
|
}
|
|
return array(
|
|
'freespace' => $this->format_size( $freeSpace ),
|
|
'usedspace' => $this->format_size( $this->get_directory_size_incl_subdirs( ABSPATH ) ),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Get size of directory & subdirectories.
|
|
*
|
|
* @param string $dir Directory to size.
|
|
*
|
|
* @return false|int FALSE on failure, int $size Directory size,
|
|
*/
|
|
public function get_directory_size_incl_subdirs( $dir ) {
|
|
$size = 0;
|
|
foreach ( glob( rtrim( $dir, '/' ) . '/*', GLOB_NOSORT ) as $each ) {
|
|
$size += is_file( $each ) ? filesize( $each ) : $this->get_directory_size_incl_subdirs( $each );
|
|
}
|
|
return $size;
|
|
}
|
|
|
|
/**
|
|
* Format file size into human readable string.
|
|
*
|
|
* @param string $bytes Original size of file.
|
|
* @param int $precision Number of digits after the decimal point.
|
|
* @return string Returned Size.
|
|
*/
|
|
public function format_size( $bytes, $precision = 2 ) {
|
|
if ( (float) $bytes < 1 ) {
|
|
return '';
|
|
}
|
|
|
|
$units = array( 'B', 'KB', 'MB', 'GB', 'TB' );
|
|
|
|
$bytes = (float) $bytes;
|
|
$base = log( $bytes ) / log( 1000 );
|
|
$pow = pow( 1000, $base - floor( $base ) );
|
|
|
|
return round( $pow, $precision ) . ' ' . $units[ (int) floor( $base ) ];
|
|
}
|
|
|
|
|
|
/**
|
|
* Get list of all plugins except WPStaging.
|
|
*
|
|
* @param array $plugins All installed plugins.
|
|
* @return mixed Returned array of plugins without WPStaging included.
|
|
*/
|
|
public function all_plugins( $plugins ) {
|
|
foreach ( $plugins as $key => $value ) {
|
|
$plugin_slug = basename( $key, '.php' );
|
|
if ( 'wp-staging' === $plugin_slug ) {
|
|
unset( $plugins[ $key ] );
|
|
}
|
|
}
|
|
|
|
return $plugins;
|
|
}
|
|
|
|
/**
|
|
* Remove WPStaging WordPress Menu.
|
|
*/
|
|
public function remove_menu() {
|
|
remove_menu_page( 'wpstg_clone' );
|
|
$pos = isset( $_SERVER['REQUEST_URI'] ) ? stripos( sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ), 'admin.php?page=wpstg_clone' ) : false;
|
|
if ( false !== $pos ) {
|
|
wp_safe_redirect( get_option( 'siteurl' ) . '/wp-admin/index.php' );
|
|
exit();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Hide all admin update notices.
|
|
*
|
|
* @param array $slugs WPStaging plugin slug.
|
|
* @return mixed Returned $slugs.
|
|
*/
|
|
public function hide_update_notice( $slugs ) {
|
|
$slugs[] = $this->the_plugin_slug;
|
|
|
|
return $slugs;
|
|
}
|
|
|
|
/**
|
|
* Remove WPStaging update Nag message.
|
|
*
|
|
* @param array $value WPStaging slug.
|
|
* @return mixed $value Response array.
|
|
*
|
|
* @uses \MainWP\Child\MainWP_Helper::is_updates_screen()
|
|
*/
|
|
public function remove_update_nag( $value ) {
|
|
if ( MainWP_Helper::is_dashboard_request() ) {
|
|
return $value;
|
|
}
|
|
|
|
if ( ! MainWP_Helper::is_updates_screen() ) {
|
|
return $value;
|
|
}
|
|
|
|
if ( isset( $value->response[ $this->the_plugin_slug ] ) ) {
|
|
unset( $value->response[ $this->the_plugin_slug ] );
|
|
}
|
|
|
|
if ( isset( $value->response[ $this->the_plugin_slug_pro ] ) ) {
|
|
unset( $value->response[ $this->the_plugin_slug_pro ] );
|
|
}
|
|
|
|
return $value;
|
|
}
|
|
}
|