All-in-One WP Migration - Version 5.38

Version Description

  • Deactivate mu-plugins if fatal error appears on import
Download this release

Release Info

Developer bangelov
Plugin Icon 128x128 All-in-One WP Migration
Version 5.38
Comparing to
See all releases

Code changes from version 5.37 to 5.38

all-in-one-wp-migration.php CHANGED
@@ -5,7 +5,7 @@
5
* Description: Migration tool for all your blog data. Import or Export your blog content with a single click.
6
* Author: ServMask
7
* Author URI: https://servmask.com/
8
- * Version: 5.37
9
* Text Domain: all-in-one-wp-migration
10
* Domain Path: /languages
11
* Network: True
5
* Description: Migration tool for all your blog data. Import or Export your blog content with a single click.
6
* Author: ServMask
7
* Author URI: https://servmask.com/
8
+ * Version: 5.38
9
* Text Domain: all-in-one-wp-migration
10
* Domain Path: /languages
11
* Network: True
constants.php CHANGED
@@ -39,7 +39,7 @@ if ( function_exists( 'gethostname' ) && in_array( gethostname(), $local ) ) {
39
// ==================
40
// = Plugin Version =
41
// ==================
42
- define( 'AI1WM_VERSION', '5.37' );
43
44
// ===============
45
// = Plugin Name =
@@ -161,6 +161,11 @@ define( 'AI1WM_STATUS_NAME', 'status.js' );
161
// ========================
162
define( 'AI1WM_FILEMAP_NAME', 'filemap.list' );
163
164
// ===================
165
// = Export Log Name =
166
// ===================
39
// ==================
40
// = Plugin Version =
41
// ==================
42
+ define( 'AI1WM_VERSION', '5.38' );
43
44
// ===============
45
// = Plugin Name =
161
// ========================
162
define( 'AI1WM_FILEMAP_NAME', 'filemap.list' );
163
164
+ // =================================
165
+ // = Archive Must-Use Plugins Name =
166
+ // =================================
167
+ define( 'AI1WM_MUPLUGINS_NAME', 'mu-plugins' );
168
+
169
// ===================
170
// = Export Log Name =
171
// ===================
functions.php CHANGED
@@ -174,6 +174,20 @@ function ai1wm_status_path() {
174
return AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . AI1WM_STATUS_NAME;
175
}
176
177
/**
178
* Get archive name
179
*
174
return AI1WM_STORAGE_PATH . DIRECTORY_SEPARATOR . AI1WM_STATUS_NAME;
175
}
176
177
+ /**
178
+ * Get WordPress content directory
179
+ *
180
+ * @param string $path Relative path
181
+ * @return string
182
+ */
183
+ function ai1wm_content_path( $path = null ) {
184
+ if ( empty( $path ) ) {
185
+ return WP_CONTENT_DIR;
186
+ }
187
+
188
+ return WP_CONTENT_DIR . DIRECTORY_SEPARATOR . $path;
189
+ }
190
+
191
/**
192
* Get archive name
193
*
lib/model/class-ai1wm-log.php CHANGED
@@ -32,7 +32,7 @@ class Ai1wm_Log {
32
$data[] = date( 'M d Y H:i:s' );
33
34
// Add params
35
- $data[] = print_r( $params, true );
36
37
// Add empty line
38
$data[] = PHP_EOL;
@@ -53,7 +53,7 @@ class Ai1wm_Log {
53
$data[] = date( 'M d Y H:i:s' );
54
55
// Add params
56
- $data[] = print_r( $params, true );
57
58
// Add empty line
59
$data[] = PHP_EOL;
@@ -74,7 +74,7 @@ class Ai1wm_Log {
74
$data[] = date( 'M d Y H:i:s' );
75
76
// Add params
77
- $data[] = print_r( $params, true );
78
79
// Add empty line
80
$data[] = PHP_EOL;
32
$data[] = date( 'M d Y H:i:s' );
33
34
// Add params
35
+ $data[] = json_encode( $params );
36
37
// Add empty line
38
$data[] = PHP_EOL;
53
$data[] = date( 'M d Y H:i:s' );
54
55
// Add params
56
+ $data[] = json_encode( $params );
57
58
// Add empty line
59
$data[] = PHP_EOL;
74
$data[] = date( 'M d Y H:i:s' );
75
76
// Add params
77
+ $data[] = json_encode( $params );
78
79
// Add empty line
80
$data[] = PHP_EOL;
lib/model/export/class-ai1wm-export-clean.php CHANGED
@@ -32,21 +32,16 @@ class Ai1wm_Export_Clean {
32
33
// Get storage iterator
34
$iterator = new RecursiveIteratorIterator(
35
- new RecursiveDirectoryIterator( ai1wm_storage_path( $params ) ),
36
RecursiveIteratorIterator::CHILD_FIRST
37
);
38
39
foreach ( $iterator as $item ) {
40
-
41
- // Skip dots
42
- if ( $iterator->isDot() ) {
43
- continue;
44
- }
45
-
46
- if ( $item->isFile() ) {
47
- unlink( $item->getPathname() );
48
- } else {
49
rmdir( $item->getPathname() );
50
}
51
}
52
32
33
// Get storage iterator
34
$iterator = new RecursiveIteratorIterator(
35
+ new Ai1wm_Recursive_Directory_Iterator( ai1wm_storage_path( $params ) ),
36
RecursiveIteratorIterator::CHILD_FIRST
37
);
38
39
+ // Remove files and directories
40
foreach ( $iterator as $item ) {
41
+ if ( $item->isDir() ) {
42
rmdir( $item->getPathname() );
43
+ } else {
44
+ unlink( $item->getPathname() );
45
}
46
}
47
lib/model/import/class-ai1wm-import-clean.php CHANGED
@@ -32,21 +32,16 @@ class Ai1wm_Import_Clean {
32
33
// Get storage iterator
34
$iterator = new RecursiveIteratorIterator(
35
- new RecursiveDirectoryIterator( ai1wm_storage_path( $params ) ),
36
RecursiveIteratorIterator::CHILD_FIRST
37
);
38
39
foreach ( $iterator as $item ) {
40
-
41
- // Skip dots
42
- if ( $iterator->isDot() ) {
43
- continue;
44
- }
45
-
46
- if ( $item->isFile() ) {
47
- unlink( $item->getPathname() );
48
- } else {
49
rmdir( $item->getPathname() );
50
}
51
}
52
32
33
// Get storage iterator
34
$iterator = new RecursiveIteratorIterator(
35
+ new Ai1wm_Recursive_Directory_Iterator( ai1wm_storage_path( $params ) ),
36
RecursiveIteratorIterator::CHILD_FIRST
37
);
38
39
+ // Remove files and directories
40
foreach ( $iterator as $item ) {
41
+ if ( $item->isDir() ) {
42
rmdir( $item->getPathname() );
43
+ } else {
44
+ unlink( $item->getPathname() );
45
}
46
}
47
lib/model/import/class-ai1wm-import-content.php CHANGED
@@ -101,7 +101,7 @@ class Ai1wm_Import_Content {
101
try {
102
103
// Extract a file from archive to WP_CONTENT_DIR
104
- if ( ( $content_offset = $archive->extract_one_file_to( WP_CONTENT_DIR, array( AI1WM_PACKAGE_NAME, AI1WM_MULTISITE_NAME, AI1WM_DATABASE_NAME ), $old_paths, $new_paths, $content_offset, 3 ) ) ) {
105
106
// Set progress
107
if ( ( $sub_progress = ( $content_offset / $archive->get_current_filesize() ) ) < 1 ) {
101
try {
102
103
// Extract a file from archive to WP_CONTENT_DIR
104
+ if ( ( $content_offset = $archive->extract_one_file_to( WP_CONTENT_DIR, array( AI1WM_PACKAGE_NAME, AI1WM_MULTISITE_NAME, AI1WM_DATABASE_NAME, AI1WM_MUPLUGINS_NAME ), $old_paths, $new_paths, $content_offset, 3 ) ) ) {
105
106
// Set progress
107
if ( ( $sub_progress = ( $content_offset / $archive->get_current_filesize() ) ) < 1 ) {
lib/model/import/class-ai1wm-import-done.php CHANGED
@@ -27,6 +27,38 @@ class Ai1wm_Import_Done {
27
28
public static function execute( $params ) {
29
30
// Get permalink URL
31
$permalink = admin_url( 'options-permalink.php#submit' );
32
@@ -43,7 +75,5 @@ class Ai1wm_Import_Done {
43
AI1WM_PLUGIN_NAME
44
)
45
);
46
-
47
- return $params;
48
}
49
}
27
28
public static function execute( $params ) {
29
30
+ // Set shutdown handler
31
+ @register_shutdown_function( 'Ai1wm_Import_Done::shutdown' );
32
+
33
+ // Open the archive file for reading
34
+ $archive = new Ai1wm_Extractor( ai1wm_archive_path( $params ) );
35
+
36
+ // Unpack must-use plugins
37
+ $archive->extract_by_files_array( WP_CONTENT_DIR, array( AI1WM_MUPLUGINS_NAME ) );
38
+
39
+ // Close the archive file
40
+ $archive->close();
41
+
42
+ // Load must-use plugins
43
+ foreach ( wp_get_mu_plugins() as $mu_plugin ) {
44
+ include_once( $mu_plugin );
45
+ }
46
+
47
+ return $params;
48
+ }
49
+
50
+ public static function shutdown() {
51
+ $error = error_get_last();
52
+
53
+ // Deactivate must-use plugins on fatal errors
54
+ if ( $error ) {
55
+ if ( $error['type'] === E_ERROR && stripos( $error['file'], AI1WM_MUPLUGINS_NAME ) !== false ) {
56
+ if ( is_dir( ai1wm_content_path( AI1WM_MUPLUGINS_NAME ) ) ) {
57
+ @rename( ai1wm_content_path( AI1WM_MUPLUGINS_NAME ), sprintf( '%s-%s', ai1wm_content_path( AI1WM_MUPLUGINS_NAME ), date( 'YmdHis' ) ) );
58
+ }
59
+ }
60
+ }
61
+
62
// Get permalink URL
63
$permalink = admin_url( 'options-permalink.php#submit' );
64
75
AI1WM_PLUGIN_NAME
76
)
77
);
78
}
79
}
lib/model/import/class-ai1wm-import-validate.php CHANGED
@@ -44,7 +44,7 @@ class Ai1wm_Import_Validate {
44
);
45
}
46
47
- // Unpack package.json and database.sql files
48
$archive->extract_by_files_array(
49
ai1wm_storage_path( $params ),
50
array(
44
);
45
}
46
47
+ // Unpack package.json, multisite.json and database.sql files
48
$archive->extract_by_files_array(
49
ai1wm_storage_path( $params ),
50
array(
lib/vendor/servmask/archiver/class-ai1wm-extractor.php CHANGED
@@ -76,14 +76,14 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
76
}
77
78
public function extract_one_file_to( $location, $exclude = array(), $old_paths = array(), $new_paths = array(), $offset = 0, $timeout = 0 ) {
79
- if ( false === file_exists( $location ) ) {
80
throw new Ai1wm_Not_Readable_Exception( sprintf( __( '%s doesn\'t exist', AI1WM_PLUGIN_NAME ), $location ) );
81
}
82
83
$block = $this->read_from_handle( $this->file_handle, 4377, $this->filename );
84
85
if ( $block === $this->eof ) {
86
- // we reached end of file, set the pointer to the end of the file so that feof returns true
87
@fseek( $this->file_handle, 1, SEEK_END );
88
@fgetc( $this->file_handle );
89
return;
@@ -99,15 +99,19 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
99
$filename = $data['path'] . '/' . $data['filename'];
100
}
101
102
- // should we skip this file?
103
- if ( in_array( $filename, $exclude ) ) {
104
- // we don't have a match, skip file content
105
- $this->set_file_pointer( $this->file_handle, $data['size'], $this->filename );
106
- return;
107
- }
108
109
// we need to build the path for the file
110
- $path = str_replace( '/', DIRECTORY_SEPARATOR, $data['path'] );
111
112
// replace extract paths
113
for ( $i = 0; $i < count( $old_paths ); $i++ ) {
@@ -117,17 +121,14 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
117
}
118
}
119
120
- // append prepend extract location
121
- $path = $location . DIRECTORY_SEPARATOR . $path;
122
-
123
// check if location doesn't exist, then create it
124
- if ( false === file_exists( $path ) ) {
125
- mkdir( $path, 0755, true );
126
}
127
128
try {
129
// we have a match, let's extract the file
130
- if ( ( $offset = $this->extract_to( $path . DIRECTORY_SEPARATOR . $data['filename'], $data, $offset, $timeout ) ) ) {
131
return $offset;
132
}
133
} catch ( Exception $e ) {
@@ -143,15 +144,12 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
143
* @param array $files Files to extract
144
*/
145
public function extract_by_files_array( $location, $files = array(), $offset = 0, $timeout = 0 ) {
146
- if ( false === file_exists( $location ) ) {
147
throw new Ai1wm_Not_Readable_Exception( sprintf( __( '%s doesn\'t exist', AI1WM_PLUGIN_NAME ), $location ) );
148
}
149
150
// we read until we reached the end of the file, or the files we were looking for were found
151
- while (
152
- ($block = $this->read_from_handle( $this->file_handle, 4377, $this->filename )) &&
153
- ( count( $files ) > 0 )
154
- ) {
155
// end block has been reached and we still have files to extract
156
// that means the files don't exist in the archive
157
if ( $block === $this->eof ) {
@@ -170,21 +168,39 @@ class Ai1wm_Extractor extends Ai1wm_Archiver {
170
$filename = $data['path'] . '/' . $data['filename'];
171
}
172
173
// do we have a match?
174
- if ( in_array( $filename, $files ) ) {
175
try {
176
// we have a match, let's extract the file and remove it from the array
177
- if ( ( $offset = $this->extract_to( $location . DIRECTORY_SEPARATOR . $data['filename'], $data, $offset, $timeout ) ) ) {
178
return $offset;
179
}
180
} catch ( Exception $e ) {
181
// we don't have file permissions, skip file content
182
$this->set_file_pointer( $this->file_handle, $data['size'], $this->filename );
183
}
184
-
185
- // let's unset the file from the files array
186
- $key = array_search( $data['filename'], $files );
187
- unset( $files[$key] );
188
} else {
189
// we don't have a match, skip file content
190
$this->set_file_pointer( $this->file_handle, $data['size'], $this->filename );
76
}
77
78
public function extract_one_file_to( $location, $exclude = array(), $old_paths = array(), $new_paths = array(), $offset = 0, $timeout = 0 ) {
79
+ if ( false === is_dir( $location ) ) {
80
throw new Ai1wm_Not_Readable_Exception( sprintf( __( '%s doesn\'t exist', AI1WM_PLUGIN_NAME ), $location ) );
81
}
82
83
$block = $this->read_from_handle( $this->file_handle, 4377, $this->filename );
84
85
+ // we reached end of file, set the pointer to the end of the file so that feof returns true
86
if ( $block === $this->eof ) {
87
@fseek( $this->file_handle, 1, SEEK_END );
88
@fgetc( $this->file_handle );
89
return;
99
$filename = $data['path'] . '/' . $data['filename'];
100
}
101
102
+ // we need to build the path
103
+ $path = str_replace( '/', DIRECTORY_SEPARATOR, $data['path'] );
104
105
// we need to build the path for the file
106
+ $filename = str_replace( '/', DIRECTORY_SEPARATOR, $filename );
107
+
108
+ // should we skip this file?
109
+ for ( $i = 0; $i < count( $exclude ); $i++ ) {
110
+ if ( strpos( $filename . DIRECTORY_SEPARATOR, $exclude[$i] . DIRECTORY_SEPARATOR ) === 0 ) {
111
+ $this->set_file_pointer( $this->file_handle, $data['size'], $this->filename );
112
+ return;
113
+ }
114
+ }
115
116
// replace extract paths
117
for ( $i = 0; $i < count( $old_paths ); $i++ ) {
121
}
122
}
123
124
// check if location doesn't exist, then create it
125
+ if ( false === is_dir( $location . DIRECTORY_SEPARATOR . $path ) ) {
126
+ mkdir( $location . DIRECTORY_SEPARATOR . $path, 0755, true );
127
}
128
129
try {
130
// we have a match, let's extract the file
131
+ if ( ( $offset = $this->extract_to( $location . DIRECTORY_SEPARATOR . $filename, $data, $offset, $timeout ) ) ) {
132
return $offset;
133
}
134
} catch ( Exception $e ) {
144
* @param array $files Files to extract
145
*/
146
public function extract_by_files_array( $location, $files = array(), $offset = 0, $timeout = 0 ) {
147
+ if ( false === is_dir( $location ) ) {
148
throw new Ai1wm_Not_Readable_Exception( sprintf( __( '%s doesn\'t exist', AI1WM_PLUGIN_NAME ), $location ) );
149
}
150
151
// we read until we reached the end of the file, or the files we were looking for were found
152
+ while ( ( $block = $this->read_from_handle( $this->file_handle, 4377, $this->filename ) ) ) {
153
// end block has been reached and we still have files to extract
154
// that means the files don't exist in the archive
155
if ( $block === $this->eof ) {
168
$filename = $data['path'] . '/' . $data['filename'];
169
}
170
171
+ // we need to build the path
172
+ $path = str_replace( '/', DIRECTORY_SEPARATOR, $data['path'] );
173
+
174
+ // we need to build the path for the file
175
+ $filename = str_replace( '/', DIRECTORY_SEPARATOR, $filename );
176
+
177
+ // set include flag
178
+ $include = false;
179
+
180
+ // files to extract
181
+ for ( $i = 0; $i < count( $files ); $i++ ) {
182
+ if ( strpos( $filename . DIRECTORY_SEPARATOR, $files[$i] . DIRECTORY_SEPARATOR ) === 0 ) {
183
+ $include = true;
184
+ break;
185
+ }
186
+ }
187
+
188
// do we have a match?
189
+ if ( $include ) {
190
+ // check if location doesn't exist, then create it
191
+ if ( false === is_dir( $location . DIRECTORY_SEPARATOR . $path ) ) {
192
+ mkdir( $location . DIRECTORY_SEPARATOR . $path, 0755, true );
193
+ }
194
+
195
try {
196
// we have a match, let's extract the file and remove it from the array
197
+ if ( ( $offset = $this->extract_to( $location . DIRECTORY_SEPARATOR . $filename, $data, $offset, $timeout ) ) ) {
198
return $offset;
199
}
200
} catch ( Exception $e ) {
201
// we don't have file permissions, skip file content
202
$this->set_file_pointer( $this->file_handle, $data['size'], $this->filename );
203
}
204
} else {
205
// we don't have a match, skip file content
206
$this->set_file_pointer( $this->file_handle, $data['size'], $this->filename );
lib/vendor/servmask/filesystem/class-ai1wm-file-htaccess.php ADDED
@@ -0,0 +1,40 @@
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_File_Htaccess {
27
+
28
+ /**
29
+ * Create .htaccess file
30
+ *
31
+ * The method will create .htaccess file with contents 'AddType application/octet-stream .wpress'
32
+ *
33
+ * @param string $path Path to the .htaccess file
34
+ * @return boolean|null
35
+ */
36
+ public static function create( $path ) {
37
+ $contents = "<IfModule mod_mime.c>\nAddType application/octet-stream .wpress\n</IfModule>";
38
+ return Ai1wm_File::create( $path, $contents );
39
+ }
40
+ }
lib/vendor/servmask/filesystem/class-ai1wm-file-index.php CHANGED
@@ -23,30 +23,8 @@
23
* ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
*/
25
26
- class Ai1wm_File {
27
- /**
28
- * Create a file with contents
29
- *
30
- * The method will only create the file if it doesn't already exist.
31
- *
32
- * @param string $path Path to the file
33
- * @param string $contents Contents of the file
34
- *
35
- * @return boolean|null
36
- */
37
- public static function create( $path, $contents ) {
38
- if ( ! is_file( $path ) ) {
39
- $handle = fopen( $path, 'w' );
40
- if ( false === $handle ) {
41
- return false;
42
- }
43
- fwrite( $handle, $contents );
44
- fclose( $handle );
45
- }
46
- }
47
- }
48
-
49
class Ai1wm_File_Index {
50
/**
51
* Create a index.php file
52
*
@@ -61,18 +39,3 @@ class Ai1wm_File_Index {
61
return Ai1wm_File::create( $path, $contents );
62
}
63
}
64
-
65
- class Ai1wm_File_Htaccess {
66
- /**
67
- * Create .htaccess file
68
- *
69
- * The method will create .htaccess file with contents 'AddType application/octet-stream .wpress'
70
- *
71
- * @param string $path Path to the .htaccess file
72
- * @return boolean|null
73
- */
74
- public static function create( $path ) {
75
- $contents = "<IfModule mod_mime.c>\nAddType application/octet-stream .wpress\n</IfModule>";
76
- return Ai1wm_File::create( $path, $contents );
77
- }
78
- }
23
* ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
*/
25
26
class Ai1wm_File_Index {
27
+
28
/**
29
* Create a index.php file
30
*
39
return Ai1wm_File::create( $path, $contents );
40
}
41
}
lib/vendor/servmask/filesystem/class-ai1wm-file.php ADDED
@@ -0,0 +1,48 @@
1
+ <?php
2
+ /**
3
+ * Copyright (C) 2014-2016 ServMask Inc.
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU General Public License as published by
7
+ * the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * This program is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
+ * GNU General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU General Public License
16
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
+ *
18
+ * ███████╗███████╗██████╗ ██╗ ██╗███╗ ███╗ █████╗ ███████╗██╗ ██╗
19
+ * ██╔════╝██╔════╝██╔══██╗██║ ██║████╗ ████║██╔══██╗██╔════╝██║ ██╔╝
20
+ * ███████╗█████╗ ██████╔╝██║ ██║██╔████╔██║███████║███████╗█████╔╝
21
+ * ╚════██║██╔══╝ ██╔══██╗╚██╗ ██╔╝██║╚██╔╝██║██╔══██║╚════██║██╔═██╗
22
+ * ███████║███████╗██║ ██║ ╚████╔╝ ██║ ╚═╝ ██║██║ ██║███████║██║ ██╗
23
+ * ╚══════╝╚══════╝╚═╝ ╚═╝ ╚═══╝ ╚═╝ ╚═╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
24
+ */
25
+
26
+ class Ai1wm_File {
27
+
28
+ /**
29
+ * Create a file with contents
30
+ *
31
+ * The method will only create the file if it doesn't already exist.
32
+ *
33
+ * @param string $path Path to the file
34
+ * @param string $contents Contents of the file
35
+ *
36
+ * @return boolean|null
37
+ */
38
+ public static function create( $path, $contents ) {
39
+ if ( ! is_file( $path ) ) {
40
+ $handle = fopen( $path, 'w' );
41
+ if ( false === $handle ) {
42
+ return false;
43
+ }
44
+ fwrite( $handle, $contents );
45
+ fclose( $handle );
46
+ }
47
+ }
48
+ }
loader.php CHANGED
@@ -34,6 +34,14 @@ require_once AI1WM_VENDOR_PATH .
34
DIRECTORY_SEPARATOR .
35
'Bandar.php';
36
37
require_once AI1WM_VENDOR_PATH .
38
DIRECTORY_SEPARATOR .
39
'servmask' .
@@ -42,6 +50,14 @@ require_once AI1WM_VENDOR_PATH .
42
DIRECTORY_SEPARATOR .
43
'class-ai1wm-file-index.php';
44
45
require_once AI1WM_VENDOR_PATH .
46
DIRECTORY_SEPARATOR .
47
'servmask' .
@@ -268,7 +284,7 @@ require_once AI1WM_MODEL_PATH .
268
269
require_once AI1WM_MODEL_PATH .
270
DIRECTORY_SEPARATOR .
271
- 'class-ai1wm-http.php';
272
273
require_once AI1WM_MODEL_PATH .
274
DIRECTORY_SEPARATOR .
@@ -276,11 +292,11 @@ require_once AI1WM_MODEL_PATH .
276
277
require_once AI1WM_MODEL_PATH .
278
DIRECTORY_SEPARATOR .
279
- 'class-ai1wm-streams.php';
280
281
require_once AI1WM_MODEL_PATH .
282
DIRECTORY_SEPARATOR .
283
- 'class-ai1wm-log.php';
284
285
require_once AI1WM_EXCEPTION_PATH .
286
DIRECTORY_SEPARATOR .
34
DIRECTORY_SEPARATOR .
35
'Bandar.php';
36
37
+ require_once AI1WM_VENDOR_PATH .
38
+ DIRECTORY_SEPARATOR .
39
+ 'servmask' .
40
+ DIRECTORY_SEPARATOR .
41
+ 'filesystem' .
42
+ DIRECTORY_SEPARATOR .
43
+ 'class-ai1wm-file.php';
44
+
45
require_once AI1WM_VENDOR_PATH .
46
DIRECTORY_SEPARATOR .
47
'servmask' .
50
DIRECTORY_SEPARATOR .
51
'class-ai1wm-file-index.php';
52
53
+ require_once AI1WM_VENDOR_PATH .
54
+ DIRECTORY_SEPARATOR .
55
+ 'servmask' .
56
+ DIRECTORY_SEPARATOR .
57
+ 'filesystem' .
58
+ DIRECTORY_SEPARATOR .
59
+ 'class-ai1wm-file-htaccess.php';
60
+
61
require_once AI1WM_VENDOR_PATH .
62
DIRECTORY_SEPARATOR .
63
'servmask' .
284
285
require_once AI1WM_MODEL_PATH .
286
DIRECTORY_SEPARATOR .
287
+ 'class-ai1wm-log.php';
288
289
require_once AI1WM_MODEL_PATH .
290
DIRECTORY_SEPARATOR .
292
293
require_once AI1WM_MODEL_PATH .
294
DIRECTORY_SEPARATOR .
295
+ 'class-ai1wm-http.php';
296
297
require_once AI1WM_MODEL_PATH .
298
DIRECTORY_SEPARATOR .
299
+ 'class-ai1wm-streams.php';
300
301
require_once AI1WM_EXCEPTION_PATH .
302
DIRECTORY_SEPARATOR .
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: yani.iliev, bangelov, pimjitsawang
3
Tags: db migration, migration, wordpress migration, db backup, db restore, website backup, website restore, website migration, website deploy, wordpress deploy, db backup, database export, database serialization, database find replace
4
Requires at least: 3.3
5
Tested up to: 4.4
6
- Stable tag: 5.37
7
License: GPLv2 or later
8
9
All-in-One WP Migration is the only tool that you will ever need to migrate a WordPress site.
@@ -75,6 +75,9 @@ All in One WP Plugin is the first plugin to offer true mobile experience on Word
75
3. Plugin Menu
76
77
== Changelog ==
78
= 5.37 =
79
* Validate the archive before import
80
3
Tags: db migration, migration, wordpress migration, db backup, db restore, website backup, website restore, website migration, website deploy, wordpress deploy, db backup, database export, database serialization, database find replace
4
Requires at least: 3.3
5
Tested up to: 4.4
6
+ Stable tag: 5.38
7
License: GPLv2 or later
8
9
All-in-One WP Migration is the only tool that you will ever need to migrate a WordPress site.
75
3. Plugin Menu
76
77
== Changelog ==
78
+ = 5.38 =
79
+ * Deactivate mu-plugins if fatal error appears on import
80
+
81
= 5.37 =
82
* Validate the archive before import
83