388 lines
16 KiB
PHP
388 lines
16 KiB
PHP
<?php
|
|
|
|
if (!defined('WPVIVID_PLUGIN_DIR')){
|
|
die;
|
|
}
|
|
include_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-zipclass.php';
|
|
include_once plugin_dir_path( dirname( __FILE__ ) ) .'includes/class-wpvivid-backup.php';
|
|
class WPvivid_RestoreSite
|
|
{
|
|
|
|
public function restore($option,$files)
|
|
{
|
|
global $wpvivid_plugin;
|
|
if(isset($option['has_child']))
|
|
{
|
|
$backup=$wpvivid_plugin->restore_data->get_backup_data();
|
|
$backup_item=new WPvivid_Backup_Item($backup);
|
|
$root_path = $wpvivid_plugin->get_backup_folder();
|
|
//$root_path=$backup_item->get_local_path();
|
|
|
|
if(!file_exists($root_path))
|
|
{
|
|
@mkdir($root_path);
|
|
}
|
|
$wpvivid_plugin->restore_data->write_log('extract root:'.$root_path,'notice');
|
|
$zip = new WPvivid_ZipClass();
|
|
$all_files = array();
|
|
foreach ($files as $file)
|
|
{
|
|
$all_files[] =$root_path.$file;
|
|
}
|
|
|
|
if(isset($option['extract_child_files']))
|
|
{
|
|
return $zip -> extract_ex($all_files,untrailingslashit($root_path),$option['extract_child_files']);
|
|
}
|
|
else
|
|
{
|
|
return $zip -> extract($all_files,untrailingslashit($root_path));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
$backup=$wpvivid_plugin->restore_data->get_backup_data();
|
|
$backup_item=new WPvivid_Backup_Item($backup);
|
|
$local_path = $wpvivid_plugin->get_backup_folder();
|
|
//$local_path=$backup_item->get_local_path();
|
|
|
|
$is_type_db = false;
|
|
$is_type_db = apply_filters('wpvivid_check_type_database', $is_type_db, $option);
|
|
if($is_type_db)
|
|
{
|
|
$path = $local_path.WPVIVID_DEFAULT_ROLLBACK_DIR.DIRECTORY_SEPARATOR.'wpvivid_old_database';
|
|
if(file_exists($path))
|
|
{
|
|
@mkdir($path);
|
|
}
|
|
|
|
$zip = new WPvivid_ZipClass();
|
|
$all_files = array();
|
|
foreach ($files as $file)
|
|
{
|
|
$all_files[] = $local_path.$file;
|
|
}
|
|
|
|
$ret= $zip -> extract($all_files,$path);
|
|
|
|
unset($zip);
|
|
}
|
|
else {
|
|
$root_path = '';
|
|
if (isset($option['root']))
|
|
{
|
|
$root_path = $this->transfer_path(get_home_path() . $option['root']);
|
|
}
|
|
else if (isset($option['root_flag']))
|
|
{
|
|
if ($option['root_flag'] == WPVIVID_BACKUP_ROOT_WP_CONTENT)
|
|
{
|
|
$root_path = $this->transfer_path(WP_CONTENT_DIR);
|
|
}
|
|
else if ($option['root_flag'] == WPVIVID_BACKUP_ROOT_CUSTOM)
|
|
{
|
|
$root_path = $this->transfer_path(WP_CONTENT_DIR . DIRECTORY_SEPARATOR . WPvivid_Setting::get_backupdir());
|
|
}
|
|
else if ($option['root_flag'] == WPVIVID_BACKUP_ROOT_WP_ROOT)
|
|
{
|
|
$root_path = $this->transfer_path(ABSPATH);
|
|
}
|
|
else if($option['root_flag'] == WPVIVID_BACKUP_ROOT_WP_UPLOADS)
|
|
{
|
|
$upload_dir = wp_upload_dir();
|
|
$upload_path = $upload_dir['basedir'];
|
|
|
|
$root_path = $this->transfer_path($upload_path);
|
|
}
|
|
else if($option['root_flag'] == 'wpvivid_mu_upload')
|
|
{
|
|
if($option['overwrite'])
|
|
{
|
|
$upload_dir =$this->get_site_upload_dir($option['overwrite_site']);
|
|
}
|
|
else
|
|
{
|
|
$upload_dir =$this->get_site_upload_dir($option['site_id']);
|
|
}
|
|
$root_path=$upload_dir['basedir'];
|
|
$wpvivid_plugin->restore_data->write_log('restore root path:' .$root_path, 'notice');
|
|
}
|
|
}
|
|
|
|
$root_path = rtrim($root_path, '/');
|
|
$root_path = rtrim($root_path, DIRECTORY_SEPARATOR);
|
|
//$wpvivid_plugin->restore_data->write_log('root_path:' . $root_path.' root_flag:'.$option['root_flag'], 'notice');
|
|
$exclude_path[] = $this->transfer_path(WP_CONTENT_DIR . DIRECTORY_SEPARATOR . WPvivid_Setting::get_backupdir());
|
|
|
|
if (isset($option['include_path'])) {
|
|
$include_path = $option['include_path'];
|
|
} else {
|
|
$include_path = array();
|
|
}
|
|
|
|
$zip = new WPvivid_ZipClass();
|
|
$all_files = array();
|
|
foreach ($files as $file) {
|
|
$all_files[] = $local_path. $file;
|
|
}
|
|
|
|
$wpvivid_plugin->restore_data->write_log('restore from files:' . json_encode($all_files), 'notice');
|
|
|
|
if (isset($option['wp_core']) && isset($option['is_migrate'])&&is_multisite())
|
|
{
|
|
@rename(get_home_path() . '.htaccess', get_home_path() . '.htaccess_old');
|
|
}
|
|
$ret = $zip->extract($all_files, $root_path, $option);
|
|
|
|
if (isset($option['file_type'])) {
|
|
if ($option['file_type'] == 'themes') {
|
|
if (isset($option['remove_themes'])) {
|
|
foreach ($option['remove_themes'] as $slug => $themes) {
|
|
if (empty($slug))
|
|
continue;
|
|
$wpvivid_plugin->restore_data->write_log('remove ' . get_theme_root() . DIRECTORY_SEPARATOR . $slug, 'notice');
|
|
//$this->delTree(get_theme_root() . DIRECTORY_SEPARATOR . $slug);
|
|
}
|
|
}
|
|
} else if ($option['file_type'] == 'plugin') {
|
|
if (isset($option['remove_plugin'])) {
|
|
foreach ($option['remove_plugin'] as $slug => $plugin) {
|
|
if (empty($slug))
|
|
continue;
|
|
$wpvivid_plugin->restore_data->write_log('remove ' . WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $slug, 'notice');
|
|
//$this->delTree(WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $slug);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
unset($zip);
|
|
|
|
if (isset($option['wp_core']) && isset($option['is_migrate'])&&is_multisite())
|
|
{
|
|
@rename(get_home_path() . '.htaccess_old', get_home_path() . '.htaccess');
|
|
}
|
|
if (isset($option['wp_core']) && isset($option['is_migrate']))
|
|
{
|
|
if ($option['is_migrate'] == 1&&!is_multisite())
|
|
{
|
|
if (function_exists('save_mod_rewrite_rules'))
|
|
{
|
|
if (file_exists(get_home_path() . '.htaccess'))
|
|
{
|
|
$htaccess_data = file_get_contents(get_home_path() . '.htaccess');
|
|
$line = '';
|
|
if (preg_match('#AddHandler application/x-httpd-php.*#', $htaccess_data, $matcher))
|
|
{
|
|
$line = PHP_EOL . $matcher[0];
|
|
|
|
if (preg_match('#<IfModule mod_suphp.c>#', $htaccess_data, $matcher)) {
|
|
$line .= PHP_EOL . '<IfModule mod_suphp.c>';
|
|
if (preg_match('#suPHP_ConfigPath .*#', $htaccess_data, $matcher)) {
|
|
$line .= PHP_EOL . $matcher[0];
|
|
}
|
|
$line .= PHP_EOL . '</IfModule>';
|
|
}
|
|
$wpvivid_plugin->restore_data->write_log('find php selector:' . $line, 'notice');
|
|
}
|
|
else if (preg_match('#AddHandler application/x-httpd-ea-php.*#', $htaccess_data, $matcher))
|
|
{
|
|
$line_temp = PHP_EOL . $matcher[0];
|
|
|
|
if (preg_match('#<IfModule mime_module>#', $htaccess_data, $matcher))
|
|
{
|
|
$line .= PHP_EOL . '<IfModule mime_module>';
|
|
$line .= $line_temp.PHP_EOL;
|
|
$line .= PHP_EOL . '</IfModule>';
|
|
}
|
|
$wpvivid_plugin->restore_data->write_log('find php selector:' . $line, 'notice');
|
|
}
|
|
@rename(get_home_path() . '.htaccess', get_home_path() . '.htaccess_old');
|
|
save_mod_rewrite_rules();
|
|
if (!empty($line))
|
|
file_put_contents(get_home_path() . '.htaccess', $line, FILE_APPEND);
|
|
}
|
|
else
|
|
{
|
|
save_mod_rewrite_rules();
|
|
}
|
|
if(file_exists(get_home_path() . '.user.ini'))
|
|
{
|
|
@rename(get_home_path() . '.user.ini', get_home_path() . '.user.ini_old');
|
|
save_mod_rewrite_rules();
|
|
}
|
|
}
|
|
WPvivid_Setting::update_option('wpvivid_migrate_status', 'completed');
|
|
}
|
|
}
|
|
}
|
|
return $ret;
|
|
}
|
|
}
|
|
|
|
public function delTree($dir)
|
|
{
|
|
$files = array_diff(scandir($dir), array('.','..'));
|
|
foreach ($files as $file)
|
|
{
|
|
(is_dir("$dir/$file")) ? $this->delTree("$dir/$file") : unlink("$dir/$file");
|
|
}
|
|
return rmdir($dir);
|
|
}
|
|
|
|
private function transfer_path($path)
|
|
{
|
|
$path = str_replace('\\','/',$path);
|
|
$values = explode('/',$path);
|
|
return implode(DIRECTORY_SEPARATOR,$values);
|
|
}
|
|
|
|
public function get_site_upload_dir($site_id, $time = null, $create_dir = true, $refresh_cache = false)
|
|
{
|
|
static $cache = array(), $tested_paths = array();
|
|
|
|
$key = sprintf( '%d-%s',$site_id, (string) $time );
|
|
|
|
if ( $refresh_cache || empty( $cache[ $key ] ) ) {
|
|
$cache[ $key ] = $this->_wp_upload_dir( $site_id,$time );
|
|
}
|
|
|
|
/**
|
|
* Filters the uploads directory data.
|
|
*
|
|
* @since 2.0.0
|
|
*
|
|
* @param array $uploads Array of upload directory data with keys of 'path',
|
|
* 'url', 'subdir, 'basedir', and 'error'.
|
|
*/
|
|
$uploads = apply_filters( 'upload_dir', $cache[ $key ] );
|
|
|
|
if ( $create_dir ) {
|
|
$path = $uploads['path'];
|
|
|
|
if ( array_key_exists( $path, $tested_paths ) ) {
|
|
$uploads['error'] = $tested_paths[ $path ];
|
|
} else {
|
|
if ( ! wp_mkdir_p( $path ) ) {
|
|
if ( 0 === strpos( $uploads['basedir'], ABSPATH ) ) {
|
|
$error_path = str_replace( ABSPATH, '', $uploads['basedir'] ) . $uploads['subdir'];
|
|
} else {
|
|
$error_path = basename( $uploads['basedir'] ) . $uploads['subdir'];
|
|
}
|
|
|
|
$uploads['error'] = sprintf(
|
|
/* translators: %s: directory path */
|
|
__( 'Unable to create directory %s. Is its parent directory writable by the server?', 'wpvivid-backuprestore' ),
|
|
esc_html( $error_path )
|
|
);
|
|
}
|
|
|
|
$tested_paths[ $path ] = $uploads['error'];
|
|
}
|
|
}
|
|
|
|
return $uploads;
|
|
}
|
|
|
|
public function _wp_upload_dir($site_id, $time = null ) {
|
|
$siteurl = get_option( 'siteurl' );
|
|
$upload_path = trim( get_option( 'upload_path' ) );
|
|
|
|
if ( empty( $upload_path ) || 'wp-content/uploads' == $upload_path ) {
|
|
$dir = WP_CONTENT_DIR . '/uploads';
|
|
} elseif ( 0 !== strpos( $upload_path, ABSPATH ) ) {
|
|
// $dir is absolute, $upload_path is (maybe) relative to ABSPATH
|
|
$dir = path_join( ABSPATH, $upload_path );
|
|
} else {
|
|
$dir = $upload_path;
|
|
}
|
|
|
|
if ( ! $url = get_option( 'upload_url_path' ) ) {
|
|
if ( empty( $upload_path ) || ( 'wp-content/uploads' == $upload_path ) || ( $upload_path == $dir ) ) {
|
|
$url = WP_CONTENT_URL . '/uploads';
|
|
} else {
|
|
$url = trailingslashit( $siteurl ) . $upload_path;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Honor the value of UPLOADS. This happens as long as ms-files rewriting is disabled.
|
|
* We also sometimes obey UPLOADS when rewriting is enabled -- see the next block.
|
|
*/
|
|
if ( defined( 'UPLOADS' ) && ! ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) ) {
|
|
$dir = ABSPATH . UPLOADS;
|
|
$url = trailingslashit( $siteurl ) . UPLOADS;
|
|
}
|
|
|
|
// If multisite (and if not the main site in a post-MU network)
|
|
if ( is_multisite() && ! ( is_main_network() && is_main_site($site_id) && defined( 'MULTISITE' ) ) ) {
|
|
if ( ! get_site_option( 'ms_files_rewriting' ) ) {
|
|
/*
|
|
* If ms-files rewriting is disabled (networks created post-3.5), it is fairly
|
|
* straightforward: Append sites/%d if we're not on the main site (for post-MU
|
|
* networks). (The extra directory prevents a four-digit ID from conflicting with
|
|
* a year-based directory for the main site. But if a MU-era network has disabled
|
|
* ms-files rewriting manually, they don't need the extra directory, as they never
|
|
* had wp-content/uploads for the main site.)
|
|
*/
|
|
|
|
if ( defined( 'MULTISITE' ) ) {
|
|
$ms_dir = '/sites/' . $site_id;
|
|
} else {
|
|
$ms_dir = '/' . $site_id;
|
|
}
|
|
|
|
$dir .= $ms_dir;
|
|
$url .= $ms_dir;
|
|
} elseif ( defined( 'UPLOADS' ) && ! ms_is_switched() ) {
|
|
/*
|
|
* Handle the old-form ms-files.php rewriting if the network still has that enabled.
|
|
* When ms-files rewriting is enabled, then we only listen to UPLOADS when:
|
|
* 1) We are not on the main site in a post-MU network, as wp-content/uploads is used
|
|
* there, and
|
|
* 2) We are not switched, as ms_upload_constants() hardcodes these constants to reflect
|
|
* the original blog ID.
|
|
*
|
|
* Rather than UPLOADS, we actually use BLOGUPLOADDIR if it is set, as it is absolute.
|
|
* (And it will be set, see ms_upload_constants().) Otherwise, UPLOADS can be used, as
|
|
* as it is relative to ABSPATH. For the final piece: when UPLOADS is used with ms-files
|
|
* rewriting in multisite, the resulting URL is /files. (#WP22702 for background.)
|
|
*/
|
|
|
|
if ( defined( 'BLOGUPLOADDIR' ) ) {
|
|
$dir = untrailingslashit( BLOGUPLOADDIR );
|
|
} else {
|
|
$dir = ABSPATH . UPLOADS;
|
|
}
|
|
$url = trailingslashit( $siteurl ) . 'files';
|
|
}
|
|
}
|
|
|
|
$basedir = $dir;
|
|
$baseurl = $url;
|
|
|
|
$subdir = '';
|
|
if ( get_option( 'uploads_use_yearmonth_folders' ) ) {
|
|
// Generate the yearly and monthly dirs
|
|
if ( ! $time ) {
|
|
$time = current_time( 'mysql' );
|
|
}
|
|
$y = substr( $time, 0, 4 );
|
|
$m = substr( $time, 5, 2 );
|
|
$subdir = "/$y/$m";
|
|
}
|
|
|
|
$dir .= $subdir;
|
|
$url .= $subdir;
|
|
|
|
return array(
|
|
'path' => $dir,
|
|
'url' => $url,
|
|
'subdir' => $subdir,
|
|
'basedir' => $basedir,
|
|
'baseurl' => $baseurl,
|
|
'error' => false,
|
|
);
|
|
}
|
|
} |