All-in-One WP Migration - Version 1.1.0

Version Description

  • Importing files using chunks to overcome any webserver upload size restriction
  • Fixed a bug where HTTP code error was shown to some users
Download this release

Release Info

Developer yani.iliev
Plugin Icon 128x128 All-in-One WP Migration
Version 1.1.0
Comparing to
See all releases

Code changes from version 1.0.0 to 1.1.0

all-in-one-wp-migration.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: Migration tool for all your blog data
6
  * Author: ServMask
7
  * Author URI: http://servmask.com/
8
- * Version: 1.0.0
9
  *
10
  * Copyright (C) 2013 ServMask LLC
11
  *
5
  * Description: Migration tool for all your blog data
6
  * Author: ServMask
7
  * Author URI: http://servmask.com/
8
+ * Version: 1.1.0
9
  *
10
  * Copyright (C) 2013 ServMask LLC
11
  *
lib/controller/class-ai1wm-import-controller.php CHANGED
@@ -26,8 +26,29 @@ class Ai1wm_Import_Controller
26
  $result = array();
27
 
28
  if ( isset( $_FILES['input_file'] ) && ( $input_file = $_FILES['input_file'] ) ) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
29
  $model = new Ai1wm_Import;
30
- $result = $model->import( $input_file );
31
  }
32
 
33
  echo json_encode( $result );
26
  $result = array();
27
 
28
  if ( isset( $_FILES['input_file'] ) && ( $input_file = $_FILES['input_file'] ) ) {
29
+ $options = array(
30
+ 'chunk' => 0,
31
+ 'chunks' => 0,
32
+ 'name' => null,
33
+ );
34
+
35
+ // Ordinal number of the current chunk in the set (starts with zero)
36
+ if ( isset( $_REQUEST['chunk'] ) ) {
37
+ $options['chunk'] = intval( $_REQUEST['chunk'] );
38
+ }
39
+
40
+ // Total number of chunks in the file
41
+ if ( isset( $_REQUEST['chunks'] ) ) {
42
+ $options['chunks'] = intval( $_REQUEST['chunks'] );
43
+ }
44
+
45
+ // Name of partial file
46
+ if ( isset( $_REQUEST['name'] ) ) {
47
+ $options['name'] = $_REQUEST['name'];
48
+ }
49
+
50
  $model = new Ai1wm_Import;
51
+ $result = $model->import( $input_file, $options );
52
  }
53
 
54
  echo json_encode( $result );
lib/controller/class-ai1wm-main-controller.php CHANGED
@@ -291,7 +291,9 @@ class Ai1wm_Main_Controller
291
  'drop_element' => 'ai1wm-drag-drop-area',
292
  'file_data_name' => 'input_file',
293
  'multiple_queues' => false,
294
- 'max_file_size' => wp_max_upload_size() . 'b',
 
 
295
  'url' => admin_url( 'admin-ajax.php' ),
296
  'flash_swf_url' => includes_url(
297
  'js/plupload/plupload.flash.swf'
@@ -309,6 +311,7 @@ class Ai1wm_Main_Controller
309
  'urlstream_upload' => true,
310
  'multipart_params' => array(
311
  'action' => 'upload_file',
 
312
  ),
313
  );
314
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_uploader', $plupload_init );
291
  'drop_element' => 'ai1wm-drag-drop-area',
292
  'file_data_name' => 'input_file',
293
  'multiple_queues' => false,
294
+ 'max_file_size' => Ai1wm_Import::MAX_FILE_SIZE,
295
+ 'chunk_size' => Ai1wm_Import::MAX_CHUNK_SIZE,
296
+ 'max_retries' => Ai1wm_Import::MAX_CHUNK_RETRIES,
297
  'url' => admin_url( 'admin-ajax.php' ),
298
  'flash_swf_url' => includes_url(
299
  'js/plupload/plupload.flash.swf'
311
  'urlstream_upload' => true,
312
  'multipart_params' => array(
313
  'action' => 'upload_file',
314
+ 'name' => uniqid() . '.part',
315
  ),
316
  );
317
  wp_localize_script( 'ai1wm-js-import', 'ai1wm_uploader', $plupload_init );
lib/model/class-ai1wm-import.php CHANGED
@@ -18,6 +18,11 @@
18
 
19
  class Ai1wm_Import
20
  {
 
 
 
 
 
21
 
22
  public function __construct() {
23
  $this->connection = new Mysqldump( DB_NAME, DB_USER, DB_PASSWORD, DB_HOST, 'mysql' );
@@ -27,116 +32,158 @@ class Ai1wm_Import
27
  * Import archive file (database, media, package.json)
28
  *
29
  * @param array $input_file Upload file parameters
 
30
  * @return array List of messages
31
  */
32
- public function import( $input_file ) {
33
  $errors = array();
34
 
35
  if ( empty( $input_file['error'] ) ) {
36
- // Create temporary directory
37
- $extract_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
38
- . uniqid()
39
- . DIRECTORY_SEPARATOR;
40
- if ( ! is_dir( $extract_to ) ) {
41
- mkdir( $extract_to );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  }
43
 
44
- // Extract archive to a temporary directory
45
- $archive = new Zipper( $input_file['tmp_name'] );
46
- $archive->extractTo( $extract_to );
47
- $archive->close();
48
-
49
- // Verify whether this arhive is valid
50
- if ( $this->is_valid( $extract_to ) ) {
51
- // Enable maintenance mode
52
- $this->maintenance_mode( true );
53
-
54
- // Media base directory
55
- $upload_dir = wp_upload_dir();
56
- $upload_basedir = $upload_dir['basedir'] . DIRECTORY_SEPARATOR;
57
- if ( ! is_dir( $upload_basedir ) ) {
58
- mkdir( $upload_basedir );
59
  }
60
 
61
- // Themes base directory
62
- $themes_dir = get_theme_root();
63
- $themes_basedir = $themes_dir . DIRECTORY_SEPARATOR;
64
- if ( ! is_dir( $themes_basedir ) ) {
65
- mkdir( $themes_basedir );
66
- }
 
 
 
 
 
 
 
 
 
 
67
 
68
- // Backup database
69
- $model = new Ai1wm_Export;
70
- $database_file = tmpfile();
71
- $options = array( 'add-drop-table' => true, 'export-single-transaction' => true );
72
- $model->prepare_database( $database_file, $options );
 
73
 
74
- // Truncate database
75
- $this->connection->truncateDatabase();
 
 
 
 
76
 
77
- // Import database
78
- $this->connection->importFromFile( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME );
79
 
80
- // Backup media files
81
- $backup_media_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
82
- . uniqid()
83
- . DIRECTORY_SEPARATOR;
84
- if ( ! is_dir( $backup_media_to ) ) {
85
- mkdir( $backup_media_to );
86
- }
87
 
88
- $this->copy_dir( $upload_basedir, $backup_media_to );
 
 
 
 
 
 
 
 
89
 
90
- // Truncate media files
91
- $this->truncate_dir( $upload_basedir );
92
 
93
- // Import media files
94
- $this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME, $upload_basedir );
95
 
96
- // Backup themes files
97
- $backup_themes_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
98
- . uniqid()
99
- . DIRECTORY_SEPARATOR;
100
- if ( ! is_dir( $backup_themes_to ) ) {
101
- mkdir( $backup_themes_to );
102
- }
103
 
104
- $this->copy_dir( $themes_basedir, $backup_themes_to );
 
 
 
 
 
 
 
105
 
106
- // Truncate themes files
107
- $this->truncate_dir( $themes_basedir );
108
 
109
- // Import themes files
110
- $this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME, $themes_basedir );
111
 
112
- // Install selected plugins
113
- $this->install_plugins( $extract_to . Ai1wm_Export::EXPORT_PACKAGE_NAME );
 
114
 
115
- // Test website
116
- if ( ! $this->test_website( get_option( 'siteurl' ) ) ) {
117
- // Truncate database
118
- $this->connection->truncateDatabase();
119
 
120
- // Import "OLD" database
121
- $this->connection->importFromFile( $database_file );
 
122
 
123
- // Truncate media files
124
- $this->truncate_dir( $upload_basedir );
 
 
 
125
 
126
- // Import "OLD" media files
127
- $this->copy_dir( $backup_media_to, $upload_basedir );
 
128
 
129
- // Truncate themes files
130
- $this->truncate_dir( $themes_basedir );
 
131
 
132
- // Import "OLD" themes files
133
- $this->copy_dir( $backup_themes_to, $themes_basedir );
134
- }
135
 
136
- // Disable maintenance mode
137
- $this->maintenance_mode( false );
138
- } else {
139
- $errors[] = _( 'File is not compatible with "All In One WP Migration" plugin! Please verify your archive file.' );
 
 
 
 
 
 
 
 
 
 
140
  }
141
  } else {
142
  $errors[] = $this->code_to_message( $input_file['error'] );
18
 
19
  class Ai1wm_Import
20
  {
21
+ const MAX_FILE_SIZE = '128MB';
22
+
23
+ const MAX_CHUNK_SIZE = '1MB';
24
+
25
+ const MAX_CHUNK_RETRIES = 10;
26
 
27
  public function __construct() {
28
  $this->connection = new Mysqldump( DB_NAME, DB_USER, DB_PASSWORD, DB_HOST, 'mysql' );
32
  * Import archive file (database, media, package.json)
33
  *
34
  * @param array $input_file Upload file parameters
35
+ * @param array $options Additional upload settings
36
  * @return array List of messages
37
  */
38
+ public function import( $input_file, $options = array() ) {
39
  $errors = array();
40
 
41
  if ( empty( $input_file['error'] ) ) {
42
+ // Partial file path
43
+ $uploadfile = sys_get_temp_dir() . DIRECTORY_SEPARATOR
44
+ . $options['name'];
45
+
46
+ // Open partial file
47
+ $out = fopen( $uploadfile, $options['chunk'] == 0 ? 'wb' : 'ab' );
48
+ if ( $out ) {
49
+ // Read binary input stream and append it to temp file
50
+ $in = fopen( $input_file['tmp_name'], 'rb' );
51
+ if ( $in ) {
52
+ while ( $buff = fread( $in, 4096 ) ) {
53
+ fwrite( $out, $buff );
54
+ }
55
+ }
56
+
57
+ fclose( $in );
58
+ fclose( $out );
59
+
60
+ // Remove temporary uploaded file
61
+ unlink( $input_file['tmp_name'] );
62
  }
63
 
64
+ // Check if file has been uploaded
65
+ if ( ! $options['chunks'] || $options['chunk'] == $options['chunks'] - 1 ) {
66
+ // Create temporary directory
67
+ $extract_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
68
+ . uniqid()
69
+ . DIRECTORY_SEPARATOR;
70
+ if ( ! is_dir( $extract_to ) ) {
71
+ mkdir( $extract_to );
 
 
 
 
 
 
 
72
  }
73
 
74
+ // Extract archive to a temporary directory
75
+ $archive = new Zipper( $uploadfile );
76
+ $archive->extractTo( $extract_to );
77
+ $archive->close();
78
+
79
+ // Verify whether this arhive is valid
80
+ if ( $this->is_valid( $extract_to ) ) {
81
+ // Enable maintenance mode
82
+ $this->maintenance_mode( true );
83
+
84
+ // Media base directory
85
+ $upload_dir = wp_upload_dir();
86
+ $upload_basedir = $upload_dir['basedir'] . DIRECTORY_SEPARATOR;
87
+ if ( ! is_dir( $upload_basedir ) ) {
88
+ mkdir( $upload_basedir );
89
+ }
90
 
91
+ // Themes base directory
92
+ $themes_dir = get_theme_root();
93
+ $themes_basedir = $themes_dir . DIRECTORY_SEPARATOR;
94
+ if ( ! is_dir( $themes_basedir ) ) {
95
+ mkdir( $themes_basedir );
96
+ }
97
 
98
+ if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME ) ) {
99
+ // Backup database
100
+ $model = new Ai1wm_Export;
101
+ $database_file = tmpfile();
102
+ $options = array( 'add-drop-table' => true, 'export-single-transaction' => true );
103
+ $model->prepare_database( $database_file, $options );
104
 
105
+ // Truncate database
106
+ $this->connection->truncateDatabase();
107
 
108
+ // Import database
109
+ $this->connection->importFromFile( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME );
110
+ }
 
 
 
 
111
 
112
+ // Check if media files are present
113
+ if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME ) ) {
114
+ // Backup media files
115
+ $backup_media_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
116
+ . uniqid()
117
+ . DIRECTORY_SEPARATOR;
118
+ if ( ! is_dir( $backup_media_to ) ) {
119
+ mkdir( $backup_media_to );
120
+ }
121
 
122
+ $this->copy_dir( $upload_basedir, $backup_media_to );
 
123
 
124
+ // Truncate media files
125
+ $this->truncate_dir( $upload_basedir );
126
 
127
+ // Import media files
128
+ $this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME, $upload_basedir );
129
+ }
 
 
 
 
130
 
131
+ if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME ) ) {
132
+ // Backup themes files
133
+ $backup_themes_to = sys_get_temp_dir() . DIRECTORY_SEPARATOR
134
+ . uniqid()
135
+ . DIRECTORY_SEPARATOR;
136
+ if ( ! is_dir( $backup_themes_to ) ) {
137
+ mkdir( $backup_themes_to );
138
+ }
139
 
140
+ $this->copy_dir( $themes_basedir, $backup_themes_to );
 
141
 
142
+ // Truncate themes files
143
+ $this->truncate_dir( $themes_basedir );
144
 
145
+ // Import themes files
146
+ $this->copy_dir( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME, $themes_basedir );
147
+ }
148
 
149
+ if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_PACKAGE_NAME ) ) {
 
 
 
150
 
151
+ // Install selected plugins
152
+ $this->install_plugins( $extract_to . Ai1wm_Export::EXPORT_PACKAGE_NAME );
153
+ }
154
 
155
+ // Test website
156
+ if ( ! $this->test_website( get_option( 'siteurl' ) ) ) {
157
+ if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_DATABASE_NAME ) ) {
158
+ // Truncate database
159
+ $this->connection->truncateDatabase();
160
 
161
+ // Import "OLD" database
162
+ $this->connection->importFromFile( $database_file );
163
+ }
164
 
165
+ if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_MEDIA_NAME ) ) {
166
+ // Truncate media files
167
+ $this->truncate_dir( $upload_basedir );
168
 
169
+ // Import "OLD" media files
170
+ $this->copy_dir( $backup_media_to, $upload_basedir );
171
+ }
172
 
173
+ if ( file_exists( $extract_to . Ai1wm_Export::EXPORT_THEMES_NAME ) ) {
174
+ // Truncate themes files
175
+ $this->truncate_dir( $themes_basedir );
176
+
177
+ // Import "OLD" themes files
178
+ $this->copy_dir( $backup_themes_to, $themes_basedir );
179
+ }
180
+ }
181
+
182
+ // Disable maintenance mode
183
+ $this->maintenance_mode( false );
184
+ } else {
185
+ $errors[] = _( 'File is not compatible with "All In One WP Migration" plugin! Please verify your archive file.' );
186
+ }
187
  }
188
  } else {
189
  $errors[] = $this->code_to_message( $input_file['error'] );
lib/view/import/index.php CHANGED
@@ -47,7 +47,7 @@
47
 
48
  <p class="max-upload-size">
49
  <?php _e( 'Maximum upload file size:' ); ?>
50
- <strong><?php _e( wp_max_upload_size() / 1024 / 1024 ); ?> <?php _e( 'MB' ); ?></strong>
51
  </p>
52
  </form>
53
  </div>
47
 
48
  <p class="max-upload-size">
49
  <?php _e( 'Maximum upload file size:' ); ?>
50
+ <strong><?php echo Ai1wm_Import::MAX_FILE_SIZE; ?></strong>
51
  </p>
52
  </form>
53
  </div>
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: yani.iliev, bangelov, mirkov
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: 3.8
6
- Stable tag: 1.0.0
7
  License: GPLv2 or later
8
 
9
  All-in-One WP Migration is the only tools that you will ever needs when you need to perform site migration of your WordPress blog.
@@ -15,6 +15,11 @@ You can apply unlimited find and replace operations on your database and the plu
15
 
16
  All in One WP Plugin is the first plugin to offer true mobile experience on WordPress versions 3.3 and up.
17
 
 
 
 
 
 
18
  == Installation ==
19
 
20
  1. Upload the `all-in-one-wp-migration` folder to the `/wp-content/plugins/` directory
@@ -29,6 +34,10 @@ All in One WP Plugin is the first plugin to offer true mobile experience on Word
29
 
30
  == Changelog ==
31
 
 
 
 
 
32
  = 1.0.0 =
33
 
34
  * Export database as SQL file
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: 3.8
6
+ Stable tag: 1.1.0
7
  License: GPLv2 or later
8
 
9
  All-in-One WP Migration is the only tools that you will ever needs when you need to perform site migration of your WordPress blog.
15
 
16
  All in One WP Plugin is the first plugin to offer true mobile experience on WordPress versions 3.3 and up.
17
 
18
+ = Bypass all upload size restriction =
19
+ We use chunks to import your data and that way we bypass any webserver upload size restrictions
20
+
21
+ [youtube http://www.youtube.com/watch?v=5FMzLf9a4Dc]
22
+
23
  == Installation ==
24
 
25
  1. Upload the `all-in-one-wp-migration` folder to the `/wp-content/plugins/` directory
34
 
35
  == Changelog ==
36
 
37
+ = 1.1.0 =
38
+ * Importing files using chunks to overcome any webserver upload size restriction
39
+ * Fixed a bug where HTTP code error was shown to some users
40
+
41
  = 1.0.0 =
42
 
43
  * Export database as SQL file