WP Staging – DB & File Duplicator & Migration - Version 2.5.4

Version Description

  • Fix: WordFence firewall rule 'local file inclusion' blocks wp staging initial starting cloning sequence
  • Fix: Values of form Extra directories to copy are ignored
Download this release

Release Info

Developer ReneHermi
Plugin Icon 128x128 WP Staging – DB & File Duplicator & Migration
Version 2.5.4
Comparing to
See all releases

Code changes from version 2.5.3 to 2.5.4

apps/Backend/Modules/Jobs/Cloning.php CHANGED
@@ -86,7 +86,7 @@ class Cloning extends Job {
86
87
// Excluded Directories
88
if( isset( $_POST["excludedDirectories"] ) && is_array( $_POST["excludedDirectories"] ) ) {
89
- $this->options->excludedDirectories = $_POST["excludedDirectories"];
90
}
91
92
// Excluded Directories TOTAL
@@ -99,18 +99,18 @@ class Cloning extends Job {
99
\WPStaging\WPStaging::getWPpath() . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'wp-spamshield',
100
);
101
102
- $this->options->excludedDirectories = array_merge( $excludedDirectories, $this->options->excludedDirectories );
103
104
array_unshift( $this->options->directoriesToCopy, \WPStaging\WPStaging::getWPpath() );
105
106
// Included Directories
107
if( isset( $_POST["includedDirectories"] ) && is_array( $_POST["includedDirectories"] ) ) {
108
- $this->options->includedDirectories = $_POST["includedDirectories"];
109
}
110
111
// Extra Directories
112
if( isset( $_POST["extraDirectories"] ) && !empty( $_POST["extraDirectories"] ) ) {
113
- $this->options->extraDirectories = $_POST["extraDirectories"];
114
}
115
116
// Directories to Copy
@@ -141,7 +141,7 @@ class Cloning extends Job {
141
}
142
$this->options->cloneDir = '';
143
if( isset( $_POST["cloneDir"] ) && !empty( $_POST["cloneDir"] ) ) {
144
- $this->options->cloneDir = trailingslashit( $_POST["cloneDir"] );
145
}
146
$this->options->cloneHostname = '';
147
if( isset( $_POST["cloneHostname"] ) && !empty( $_POST["cloneHostname"] ) ) {
@@ -190,59 +190,9 @@ class Cloning extends Job {
190
if( empty( $this->options->cloneDir ) || $this->options->cloneDir == (string)\WPStaging\WPStaging::getWPpath()) {
191
return trailingslashit( \WPStaging\WPStaging::getWPpath() . $this->options->cloneDirectoryName );
192
}
193
- //return trailingslashit($this->options->cloneDir . $this->options->cloneDirectoryName);
194
return trailingslashit( $this->options->cloneDir );
195
}
196
197
- /**
198
- * Check if WP is installed in subdir
199
- * @return boolean
200
- */
201
- // private function isSubDir() {
202
- // // Compare names without scheme to bypass cases where siteurl and home have different schemes http / https
203
- // // This is happening much more often than you would expect
204
- // $siteurl = preg_replace( '#^https?://#', '', rtrim( get_option( 'siteurl' ), '/' ) );
205
- // $home = preg_replace( '#^https?://#', '', rtrim( get_option( 'home' ), '/' ) );
206
- //
207
- // if( $home !== $siteurl ) {
208
- // return true;
209
- // }
210
- // return false;
211
- // }
212
-
213
- /**
214
- * Get the install sub directory if WP is installed in sub directory or return empty string
215
- * Result contains a trailingslash
216
- * @return string
217
- */
218
- // private function getSubDir() {
219
- //
220
- // if(!$this->isSubDir()){
221
- // return '';
222
- // }
223
- //
224
- // $home = get_option( 'home' );
225
- // $siteurl = get_option( 'siteurl' );
226
- //
227
- // if( empty( $home ) || empty( $siteurl ) ) {
228
- // return '';
229
- // }
230
- //
231
- // $dir = str_replace( $home, '', $siteurl );
232
- // return trailingslashit($dir);
233
- // }
234
-
235
- /**
236
- * Get Destination Directory
237
- * @return type
238
- */
239
- // private function getDestinationRoot() {
240
- // if( empty( $this->options->cloneDir ) ) {
241
- // return \WPStaging\WPStaging::getWPpath();
242
- // }
243
- // return $this->options->cloneDir;
244
- // }
245
-
246
/**
247
* Make sure prefix contains appending underscore
248
*
86
87
// Excluded Directories
88
if( isset( $_POST["excludedDirectories"] ) && is_array( $_POST["excludedDirectories"] ) ) {
89
+ $this->options->excludedDirectories = wpstg_urldecode($_POST["excludedDirectories"]);
90
}
91
92
// Excluded Directories TOTAL
99
\WPStaging\WPStaging::getWPpath() . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'wp-spamshield',
100
);
101
102
+ $this->options->excludedDirectories = array_merge( $excludedDirectories, wpstg_urldecode($this->options->excludedDirectories ));
103
104
array_unshift( $this->options->directoriesToCopy, \WPStaging\WPStaging::getWPpath() );
105
106
// Included Directories
107
if( isset( $_POST["includedDirectories"] ) && is_array( $_POST["includedDirectories"] ) ) {
108
+ $this->options->includedDirectories = wpstg_urldecode($_POST["includedDirectories"]);
109
}
110
111
// Extra Directories
112
if( isset( $_POST["extraDirectories"] ) && !empty( $_POST["extraDirectories"] ) ) {
113
+ $this->options->extraDirectories = wpstg_urldecode($_POST["extraDirectories"]);
114
}
115
116
// Directories to Copy
141
}
142
$this->options->cloneDir = '';
143
if( isset( $_POST["cloneDir"] ) && !empty( $_POST["cloneDir"] ) ) {
144
+ $this->options->cloneDir = wpstg_urldecode(trailingslashit( $_POST["cloneDir"] ));
145
}
146
$this->options->cloneHostname = '';
147
if( isset( $_POST["cloneHostname"] ) && !empty( $_POST["cloneHostname"] ) ) {
190
if( empty( $this->options->cloneDir ) || $this->options->cloneDir == (string)\WPStaging\WPStaging::getWPpath()) {
191
return trailingslashit( \WPStaging\WPStaging::getWPpath() . $this->options->cloneDirectoryName );
192
}
193
return trailingslashit( $this->options->cloneDir );
194
}
195
196
/**
197
* Make sure prefix contains appending underscore
198
*
apps/Backend/Modules/Jobs/Scan.php CHANGED
@@ -157,14 +157,16 @@ class Scan extends Job {
157
in_array( $data["path"], $this->options->includedDirectories )
158
);
159
160
161
// Include wp core folders and their sub dirs.
162
// Exclude all other folders (default setting)
163
- $dataPath = isset( $data["path"] ) ? $data["path"] : '';
164
- $dataSize = isset( $data["size"] ) ? $data["size"] : '';
165
$isDisabled = ($name !== 'wp-admin' &&
166
$name !== 'wp-includes' &&
167
- $name !== 'wp-content') &&
168
false === strpos( strrev( $dataPath ), strrev( "wp-admin" ) ) &&
169
false === strpos( strrev( $dataPath ), strrev( "wp-includes" ) ) &&
170
false === strpos( strrev( $dataPath ), strrev( "wp-content" ) ) ? true : false;
157
in_array( $data["path"], $this->options->includedDirectories )
158
);
159
160
+ $dataPath = isset( $data["path"] ) ? $data["path"] : '';
161
+ $dataSize = isset( $data["size"] ) ? $data["size"] : '';
162
+
163
164
// Include wp core folders and their sub dirs.
165
// Exclude all other folders (default setting)
166
$isDisabled = ($name !== 'wp-admin' &&
167
$name !== 'wp-includes' &&
168
+ $name !== 'wp-content' &&
169
+ $name !== 'sites') &&
170
false === strpos( strrev( $dataPath ), strrev( "wp-admin" ) ) &&
171
false === strpos( strrev( $dataPath ), strrev( "wp-includes" ) ) &&
172
false === strpos( strrev( $dataPath ), strrev( "wp-content" ) ) ? true : false;
apps/Backend/Modules/Jobs/Updating.php CHANGED
@@ -2,14 +2,14 @@
2
3
namespace WPStaging\Backend\Modules\Jobs;
4
5
- use WPStaging\Backend\Modules\Jobs\Exceptions\JobNotFoundException;
6
use WPStaging\WPStaging;
7
- use WPStaging\Backend\Modules\Jobs\Multisite\Database as muDatabase;
8
- use WPStaging\Backend\Modules\Jobs\Multisite\SearchReplace as muSearchReplace;
9
- use WPStaging\Backend\Modules\Jobs\Multisite\Data as muData;
10
- use WPStaging\Backend\Modules\Jobs\Multisite\Finish as muFinish;
11
- use WPStaging\Backend\Modules\Jobs\Multisite\Directories as muDirectories;
12
- use WPStaging\Backend\Modules\Jobs\Multisite\Files as muFiles;
13
use WPStaging\Utils\Helper;
14
15
/**
@@ -104,31 +104,33 @@ class Updating extends Job {
104
105
// Excluded Directories
106
if( isset( $_POST["excludedDirectories"] ) && is_array( $_POST["excludedDirectories"] ) ) {
107
- $this->options->excludedDirectories = $_POST["excludedDirectories"];
108
}
109
110
// Excluded Directories TOTAL
111
// Do not copy these folders and plugins
112
$excludedDirectories = array(
113
- ABSPATH . 'wp-content' . DIRECTORY_SEPARATOR . 'cache',
114
- ABSPATH . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'wps-hide-login'
115
);
116
117
$this->options->excludedDirectories = array_merge( $excludedDirectories, $this->options->excludedDirectories );
118
119
// Included Directories
120
if( isset( $_POST["includedDirectories"] ) && is_array( $_POST["includedDirectories"] ) ) {
121
- $this->options->includedDirectories = $_POST["includedDirectories"];
122
}
123
124
// Extra Directories
125
if( isset( $_POST["extraDirectories"] ) && !empty( $_POST["extraDirectories"] ) ) {
126
- $this->options->extraDirectories = $_POST["extraDirectories"];
127
}
128
129
$this->options->cloneDir = '';
130
if( isset( $_POST["cloneDir"] ) && !empty( $_POST["cloneDir"] ) ) {
131
- $this->options->cloneDir = trailingslashit( $_POST["cloneDir"] );
132
}
133
134
//$this->options->destinationDir = !empty( $this->options->cloneDir ) ? trailingslashit( $this->options->cloneDir ) : trailingslashit( $this->options->existingClones[$this->options->clone]['path'] );
@@ -140,9 +142,6 @@ class Updating extends Job {
140
$this->options->cloneHostname = $_POST["cloneHostname"];
141
}
142
143
- $this->options->destinationHostname = $this->getDestinationHostname();
144
-
145
-
146
// Directories to Copy
147
$this->options->directoriesToCopy = array_merge(
148
$this->options->includedDirectories, $this->options->extraDirectories
@@ -156,18 +155,6 @@ class Updating extends Job {
156
return $this->saveOptions();
157
}
158
159
- /**
160
- * Return target hostname
161
- * @return string
162
- */
163
- private function getDestinationHostname() {
164
- if( empty( $this->options->cloneHostname ) ) {
165
- $helper = new Helper();
166
- return $helper->get_home_url_without_scheme();
167
- }
168
- return $this->getHostnameWithoutScheme( $this->options->cloneHostname );
169
- }
170
-
171
/**
172
* Get Destination Directory including staging subdirectory
173
* @return type
@@ -219,123 +206,10 @@ class Updating extends Job {
219
220
/**
221
* Start the cloning job
222
*/
223
public function start() {
224
- if( null === $this->options->currentJob ) {
225
- $this->log( "Cloning job for {$this->options->clone} finished" );
226
- return true;
227
- }
228
-
229
- $methodName = "job" . ucwords( $this->options->currentJob );
230
-
231
- if( !method_exists( $this, $methodName ) ) {
232
- $this->log( "Can't execute job; Job's method {$methodName} is not found" );
233
- throw new JobNotFoundException( $methodName );
234
- }
235
-
236
- // Call the job
237
- //$this->log("execute job: Job's method {$methodName}");
238
- return $this->{$methodName}();
239
- }
240
241
- /**
242
- * @param object $response
243
- * @param string $nextJob
244
- * @return object
245
- */
246
- private function handleJobResponse( $response, $nextJob ) {
247
- // Job is not done
248
- if( true !== $response->status ) {
249
- return $response;
250
}
251
252
- $this->options->currentJob = $nextJob;
253
- $this->options->currentStep = 0;
254
- $this->options->totalSteps = 0;
255
-
256
- // Save options
257
- $this->saveOptions();
258
-
259
- return $response;
260
- }
261
-
262
- /**
263
- * Clone Database
264
- * @return object
265
- */
266
- // public function jobDatabase() {
267
- // if( is_multisite() ) {
268
- // $database = new muDatabase();
269
- // } else {
270
- // $database = new Database();
271
- // }
272
- // return $this->handleJobResponse( $database->start(), "directories" );
273
- // }
274
-
275
- /**
276
- * Clone Database
277
- * @return object
278
- */
279
- public function jobDatabase() {
280
- if( is_multisite() ) {
281
- $database = new muDatabase();
282
- } else {
283
- $database = new Database();
284
- }
285
- return $this->handleJobResponse( $database->start(), "directories" );
286
}
287
-
288
- /**
289
- * Get All Files From Selected Directories Recursively Into a File
290
- * @return object
291
- */
292
- public function jobDirectories() {
293
- if( is_multisite() ) {
294
- $directories = new muDirectories();
295
- } else {
296
- $directories = new Directories();
297
- }
298
- return $this->handleJobResponse( $directories->start(), "files" );
299
- }
300
-
301
- /**
302
- * Copy Files
303
- * @return object
304
- */
305
- public function jobFiles() {
306
- if( is_multisite() ) {
307
- $files = new muFiles();
308
- } else {
309
- $files = new Files();
310
- }
311
- return $this->handleJobResponse( $files->start(), "data" );
312
- }
313
-
314
- /**
315
- * Replace Data
316
- * @return object
317
- */
318
- public function jobData() {
319
- if( is_multisite() ) {
320
- $data = new muData();
321
- } else {
322
- $data = new Data();
323
- }
324
- return $this->handleJobResponse( $data->start(), "finish" );
325
- }
326
-
327
- /**
328
- * Save Clone Data
329
- * @return object
330
- */
331
- public function jobFinish() {
332
- if( is_multisite() ) {
333
- $finish = new muFinish();
334
- } else {
335
- $finish = new Finish();
336
- }
337
- $finish = new Finish();
338
- return $this->handleJobResponse( $finish->start(), '' );
339
- }
340
-
341
- }
2
3
namespace WPStaging\Backend\Modules\Jobs;
4
5
+ //use WPStaging\Backend\Modules\Jobs\Exceptions\JobNotFoundException;
6
use WPStaging\WPStaging;
7
+ //use WPStaging\Backend\Modules\Jobs\Multisite\Database as muDatabase;
8
+ //use WPStaging\Backend\Modules\Jobs\Multisite\SearchReplace as muSearchReplace;
9
+ //use WPStaging\Backend\Modules\Jobs\Multisite\Data as muData;
10
+ //use WPStaging\Backend\Modules\Jobs\Multisite\Finish as muFinish;
11
+ //use WPStaging\Backend\Modules\Jobs\Multisite\Directories as muDirectories;
12
+ //use WPStaging\Backend\Modules\Jobs\Multisite\Files as muFiles;
13
use WPStaging\Utils\Helper;
14
15
/**
104
105
// Excluded Directories
106
if( isset( $_POST["excludedDirectories"] ) && is_array( $_POST["excludedDirectories"] ) ) {
107
+ $this->options->excludedDirectories = wpstg_urldecode($_POST["excludedDirectories"]);
108
}
109
110
// Excluded Directories TOTAL
111
// Do not copy these folders and plugins
112
$excludedDirectories = array(
113
+ \WPStaging\WPStaging::getWPpath() . 'wp-content' . DIRECTORY_SEPARATOR . 'cache',
114
+ \WPStaging\WPStaging::getWPpath() . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'wps-hide-login',
115
+ \WPStaging\WPStaging::getWPpath() . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'wp-super-cache',
116
+ \WPStaging\WPStaging::getWPpath() . 'wp-content' . DIRECTORY_SEPARATOR . 'plugins' . DIRECTORY_SEPARATOR . 'peters-login-redirect',
117
);
118
119
$this->options->excludedDirectories = array_merge( $excludedDirectories, $this->options->excludedDirectories );
120
121
// Included Directories
122
if( isset( $_POST["includedDirectories"] ) && is_array( $_POST["includedDirectories"] ) ) {
123
+ $this->options->includedDirectories = wpstg_urldecode($_POST["includedDirectories"]);
124
}
125
126
// Extra Directories
127
if( isset( $_POST["extraDirectories"] ) && !empty( $_POST["extraDirectories"] ) ) {
128
+ $this->options->extraDirectories = wpstg_urldecode($_POST["extraDirectories"]);
129
}
130
131
$this->options->cloneDir = '';
132
if( isset( $_POST["cloneDir"] ) && !empty( $_POST["cloneDir"] ) ) {
133
+ $this->options->cloneDir = wpstg_urldecode(trailingslashit( $_POST["cloneDir"] ));
134
}
135
136
//$this->options->destinationDir = !empty( $this->options->cloneDir ) ? trailingslashit( $this->options->cloneDir ) : trailingslashit( $this->options->existingClones[$this->options->clone]['path'] );
142
$this->options->cloneHostname = $_POST["cloneHostname"];
143
}
144
145
// Directories to Copy
146
$this->options->directoriesToCopy = array_merge(
147
$this->options->includedDirectories, $this->options->extraDirectories
155
return $this->saveOptions();
156
}
157
158
/**
159
* Get Destination Directory including staging subdirectory
160
* @return type
206
207
/**
208
* Start the cloning job
209
+ * not used but is abstract
210
*/
211
public function start() {
212
213
}
214
215
}
apps/Backend/public/js/wpstg-admin.js CHANGED
@@ -676,10 +676,7 @@ var WPStaging = (function ($)
676
677
$(".wpstg-dir input:checked.wpstg-root").each(function () {
678
var $this = $(this);
679
- //if (!$this.parent(".wpstg-dir").parents(".wpstg-dir").children(".wpstg-expand-dirs").hasClass("disabled"))
680
- //{
681
- includedDirectories.push($this.val());
682
- //}
683
});
684
685
return includedDirectories;
@@ -693,13 +690,9 @@ var WPStaging = (function ($)
693
{
694
var excludedDirectories = [];
695
696
- //$(".wpstg-dir .wpstg-root input:not(:checked)").each(function () {
697
$(".wpstg-dir input:not(:checked).wpstg-root").each(function () {
698
var $this = $(this);
699
- //if (!$this.parent(".wpstg-dir").parents(".wpstg-dir").children(".wpstg-expand-dirs").hasClass("disabled"))
700
- //{
701
- excludedDirectories.push($this.val());
702
- //}
703
});
704
705
return excludedDirectories;
@@ -711,14 +704,22 @@ var WPStaging = (function ($)
711
*/
712
var getIncludedExtraDirectories = function ()
713
{
714
var extraDirectories = [];
715
716
$(".wpstg-dir input:checked.wpstg-extra").each(function () {
717
var $this = $(this);
718
- extraDirectories.push($this.val());
719
});
720
721
return extraDirectories;
722
};
723
724
@@ -766,7 +767,7 @@ var WPStaging = (function ($)
766
that.data.databasePassword = $("#wpstg_db_password").val();
767
that.data.databaseDatabase = $("#wpstg_db_database").val();
768
that.data.databasePrefix = $("#wpstg_db_prefix").val();
769
- that.data.cloneDir = $("#wpstg_clone_dir").val();
770
that.data.cloneHostname = $("#wpstg_clone_hostname").val();
771
//console.log(that.data);
772
676
677
$(".wpstg-dir input:checked.wpstg-root").each(function () {
678
var $this = $(this);
679
+ includedDirectories.push(encodeURIComponent($this.val()));
680
});
681
682
return includedDirectories;
690
{
691
var excludedDirectories = [];
692
693
$(".wpstg-dir input:not(:checked).wpstg-root").each(function () {
694
var $this = $(this);
695
+ excludedDirectories.push(encodeURIComponent($this.val()));
696
});
697
698
return excludedDirectories;
704
*/
705
var getIncludedExtraDirectories = function ()
706
{
707
+ // Add directories from the root level
708
var extraDirectories = [];
709
710
$(".wpstg-dir input:checked.wpstg-extra").each(function () {
711
var $this = $(this);
712
+ extraDirectories.push(encodeURIComponent($this.val()));
713
});
714
715
+ // Add any other custom selected extra directories
716
+ if (!$("#wpstg_extraDirectories").val()) {
717
return extraDirectories;
718
+ }
719
+
720
+ var extraCustomDirectories = encodeURIComponent($("#wpstg_extraDirectories").val().split(/\r?\n/));
721
+
722
+ return extraDirectories.concat(extraCustomDirectories);
723
};
724
725
767
that.data.databasePassword = $("#wpstg_db_password").val();
768
that.data.databaseDatabase = $("#wpstg_db_database").val();
769
that.data.databasePrefix = $("#wpstg_db_prefix").val();
770
+ that.data.cloneDir = encodeURIComponent($("#wpstg_clone_dir").val());
771
that.data.cloneHostname = $("#wpstg_clone_hostname").val();
772
//console.log(that.data);
773
apps/Core/Utils/functions.php CHANGED
@@ -123,13 +123,28 @@ function wpstg_replace_last_match( $needle, $replace, $haystack ) {
123
}
124
125
/**
126
- * Check if string is valid date
127
- * @param type $date
128
- * @param type $format
129
- * @return bool
130
*/
131
- function wpstg_validate_date( $date, $format = 'Y-m-d' ) {
132
- $d = DateTime::createFromFormat( $format, $date );
133
- // The Y ( 4 digits year ) returns TRUE for any integer with any number of digits so changing the comparison from == to === fixes the issue.
134
- return $d && $d->format( $format ) === $date;
135
}
123
}
124
125
/**
126
+ * Convert all values of a string or an array into url decoded values
127
+ * Main use for preventing Wordfence firewall rule 'local file inclusion'
128
+ * @param miced string | array $data
129
+ * @return mixed string | array
130
*/
131
+ function wpstg_urldecode($data){
132
+ if (empty($data)){
133
+ return $data;
134
+ }
135
+
136
+ if ( is_string( $data)){
137
+ return urldecode($data);
138
+ }
139
+
140
+ if( is_array( $data )){
141
+ $array = array();
142
+ foreach ($data as $string){
143
+ $array[] = urldecode($string);
144
+ }
145
+ return $array;
146
+ }
147
+
148
+ return $data;
149
+
150
}
apps/Core/WPStaging.php CHANGED
@@ -29,7 +29,7 @@ final class WPStaging {
29
/**
30
* Plugin version
31
*/
32
- const VERSION = "2.5.3";
33
34
/**
35
* Plugin name
29
/**
30
* Plugin version
31
*/
32
+ const VERSION = "2.5.4";
33
34
/**
35
* Plugin name
readme.txt CHANGED
@@ -9,33 +9,34 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
Tags: staging, duplication, cloning, clone, migration, sandbox, test site, testing, backup, post, admin, administration, duplicate posts
10
Requires at least: 3.6+
11
Tested up to: 5.1
12
- Stable tag: 2.5.3
13
Requires PHP: 5.3
14
15
A duplicator plugin! Clone, duplicate and migrate live sites to independent staging and development sites that are available only to administrators.
16
17
== Description ==
18
19
- <strong>This cloning and staging plugin is well tested and work in progress. <br><br>
20
- If you find any issue, please open a [support ticket](https://wp-staging.com/support/ "support ticket").
21
</strong>
22
<br /><br />
23
- <strong>Note: </strong> For pushing & migrating plugins and theme files to live site, check out the pro version [https://wp-staging.com/](https://wp-staging.com/ "WP Staging Pro")
24
<br /><br />
25
- <blockquote>
26
- <h4> WP Staging for WordPress Migration </h4>
27
This duplicator plugin allows you to create an staging or development environment in seconds* <br /> <br />
28
It creates a clone of your website into a subfolder of your main WordPress installation including an entire copy of your database.
29
- This sounds pretty simple and yes it is! All the hard time-consumptive database and file copying stuff including url replacements is done in the background.
30
<br /> <br />
31
I created this plugin because all other solutions are way too complex, overloaded with dozens of options or having server requirements which are not available on most shared hosting solutions.
32
All these reasons prevent user from testing new plugins and updates first before installing them on their live website, so its time to release a plugin which has the potential to be merged into everyone´s wordpress workflow.
33
<br /><br />
34
- <p><small><em>* Time of creation depends on size of your database and file size</em></small></p>
35
- </blockquote>
36
37
WP Staging helps you to prevent your website from being broken or unavailable because of installing untested plugin updates!
38
- <p>Note: WordPress 5.0 will be shipped with a new visual editor called Gutenberg. Use WP Staging to check if Gutenberg editor is working as intended on your website and that all used plugins are compatible with that new editor.</p>
39
40
41
[youtube https://www.youtube.com/watch?v=Ye3fC6cdB3A]
@@ -43,70 +44,74 @@ WP Staging helps you to prevent your website from being broken or unavailable be
43
= Main Features =
44
45
* <strong>Easy: </strong> Staging migration applicable for everyone. No configuration needed!
46
- * <strong>Fast: </strong> Migration process lasts only a few seconds or minutes, depending on the site's size and server I/O power
47
- * <strong>Safe: </strong> Access to staging site is granted for administrators only.
48
<br /><br />
49
- <strong>More safe:</strong>
50
<br>
51
* Admin bar reflects that you are working on a staging site
52
- * Extensive logging if duplication or migration process should fail.
53
- * New: Compatible to All In One WP Security & Firewall
54
55
- = What does not work or is not tested when running wordpress migration? =
56
57
- * Wordpress migration of wordpress multisites (not tested)
58
- * WordPress duplicating process on windows server (not tested but will probably work)
59
- Edit: Duplication on windows server seems to be working well: [Read more](https://wordpress.org/support/topic/wont-copy-files?replies=5 "Read more")
60
61
62
<strong>Change your workflow of updating themes and plugins data:</strong>
63
64
- 1. Use WP Staging for migration of a production website to a clone site for staging purposes
65
- 2. Customize theme, configuration and plugins or install new plugins
66
- 3. Test everything on your staging site first
67
- 4. Everything running as expected? You are on the save side for migration of all these modifications to your production site!
68
69
70
- <h3> Why should i use a staging website? </h3>
71
72
- Plugin updates and theme customizations should be tested on a staging platform first. Its recommended to have the staging platform on the same server where the production website is located.
73
- When you run a plugin update or plan to install a new one, it is a necessary task to check first the modifications on a clone of your production website.
74
- This makes sure that any modifications is working on your website without throwing unexpected errors or preventing your site from loading. (Better known as the wordpress blank page error)
75
76
- Testing a plugin update before installing it in live environment isn´t done very often by most user because existing staging solutions are too complex and need a lot of time to create a
77
- up-to-date copy of your website.
78
79
- Some people are also afraid of installing plugins updates because they follow the rule "never touch a running system" with having in mind that untested updates are increasing the risk of breaking their site.
80
- I totally understand this and i am guilty as well here, but unfortunately this leads to one of the main reasons why WordPress installations are often outdated, not updated at all and unsecure due to this non-update behavior.
81
82
- <strong> I think its time to change this, so i created "WP Staging" for WordPress migration of staging sites</strong>
83
84
- <h3> Can´t I just use my local wordpress development copy for testing like xampp / lampp? </h3>
85
86
- Nope! If your local hardware and software environment is not a 100% exact clone of your production server there is NO guarantee that every aspect
87
- of your local copy is working on your live website exactely as you would expect it.
88
- There are some obvious things like differences in the config of php and the server you are running but even such non obvious settings like the amount of ram or the
89
- the cpu performance can lead to unexpected results on your production website.
90
- There are dozens of other possible cause of failure which can not be handled well when you are testing your changes on a local staging platform.
91
92
- This is were WP Staging steps in... Site cloning and staging site creation simplified!
93
94
<h3>I just want to migrate the database from one installation to another</h3>
95
- If you want to migrate your local database to a already existing production site you can use a tool like WP Migrate DB.
96
WP Staging is only for creating a staging site with latest data from your production site. So it goes the opposite way of WP Migrate DB.
97
- Both tools are excellent cooperating eachother.
98
99
<h3>What are the benefits compared to a plugin like Duplicator?</h3>
100
- At first, i love the [Duplicator plugin](https://wordpress.org/plugins/duplicator/ "Duplicator plugin"). Duplicator is a great tool for migrating from development site to production one or from production site to development one.
101
- The downside is that Duplicator needs adjustments, manually interventions and prerequirements for this. Duplicator also needs some skills to be able to create a development / staging site, where WP Staging does not need more than a click from you.
102
However, Duplicator is best placed to be a tool for first-time creation of your production site. This is something where it is very handy and powerful.
103
104
- So, if you have created a local or webhosted development site and you need to migrate this site the first time to your production domain than you are doing nothing wrong with using
105
- the Duplicator plugin! If you need all you latest production data like posts, updated plugins, theme data and styles in a testing environment than i recommend to use WP Staging instead!
106
107
- = I need you feedback =
108
- This plugin has been done in hundreds of hours to work on even the smallest shared webhosting package but i am limited in testing this only on a handful of different server so i need your help:
109
- Please open a [support request](https://wordpress.org/support/plugin/wp-staging/ "support request") and describe your problem exactely. In wp-content/wp-staging/logs you find extended logfiles. Have a look at them and let me know the error-thrown lines.
110
111
112
= Important =
@@ -118,13 +123,13 @@ without doing changes to the .htaccess (Apache server) or nginx.conf (Nginx Serv
118
119
= How to install and setup? =
120
Install it via the admin dashboard and to 'Plugins', click 'Add New' and search the plugins for 'Staging'. Install the plugin with 'Install Now'.
121
- After installation goto the settings page 'Staging' and do your adjustments there.
122
123
124
== Frequently Asked Questions ==
125
126
- * I can not login to the staging site
127
- If you are using a security plugin like All In One WP Security & Firewall you need to install latest version of WP Staging.
128
Go to WP Staging > Settings and add the slug to the custom login page which you set up in All In One WP Security & Firewall plugin.
129
130
@@ -139,16 +144,20 @@ https://wp-staging.com
139
140
== Screenshots ==
141
142
- 1. Step 1. Create new WordPress staging site
143
2. Step 2. Scanning your website for files and database tables
144
3. Step 3. Wordpress Staging site creation in progress
145
4. Finish!
146
147
== Changelog ==
148
149
= 2.5.3 =
150
- * Fix: Disable the WP-Spamshield Plugin on staging site because it prevents login to staging site
151
- * Fix: Lower the memory consumption when cloning scan process is started
152
* New: Show PHP user in system info log
153
154
= 2.5.2 =
@@ -160,30 +169,26 @@ https://wp-staging.com
160
161
= 2.5.0 =
162
* Fix: Do not exclude db.php if it is not located in the wp-content folder
163
- * Fix: Select All button for db tables not working properly
164
* New: Add Filter to exclude certain tables from search & replace operation
165
* New: Show PHP user in system info
166
* New: Check if there is already one process running before executing the cloning process
167
* New: Support up to WordPress 5.1
168
169
-
170
-
171
= 2.4.9 =
172
- * New: Add new db table selection manager
173
* Fix: Better warning notices before updating a staging site
174
* Fix: Stop delete process if staging site has been deleted manually before
175
* Fix: Log file folder does not have correct permission 0755
176
* Fix: Continue cloning if siteurl & home in wp_options could not be changed
177
- * Tweak: Better warning for update method
178
* Tweak: DB tables and file verification opened as default option
179
* Tweak: Skip rows larger than 5MB for search & replace operations to keep memory consumption low
180
* Tweak: clean up search & replace method
181
* Tweak: Better FAQ
182
183
-
184
-
185
= 2.4.8 =
186
- * Fix: Prevent throwing error when table prefix of table usermeta can not be changed
187
* Fix: WP Staging does not run with old WordPress version 3.2
188
* Fix: Do not show rating box on posts and pages editor
189
* New: Support WordPress 5.0.3
@@ -199,57 +204,26 @@ https://wp-staging.com
199
* New: Compatible up to WordPress 5.0.1 Gutenberg
200
* New: Show WP version of staging site in the sysinfo log
201
* Fix: Make sure optimizer must-use plugin is updated as well after updating the main plugin
202
- * Fix: Plugin can not be uninstalled if WP Staging Pro is activated
203
* Fix: Prevent error $this not in object context in install.php
204
205
206
= 2.4.4 =
207
- * Fix: Security, prevent downloading wp staging log files by third party users from uploads folder
208
* New: Compatible up to WordPress 5.0 Gutenberg
209
210
= 2.4.3 =
211
* Fix: Updating staging site does not exclude Windows IIS configuration file web.config and can lead to server error
212
- * Fix: Redirect to the correct url after log in to staging site
213
- * Fix: Supports HTML entities in links created by WP Backery Page Builder Plugin
214
* New: Support for custom and non-default wp-content and uploads folder
215
* New: Option to show again the rating notice in a week
216
217
- = 2.4.2 =
218
- * Fix: Error 500 on some systems when files are collected and plugin iterates through the directories
219
-
220
- = 2.4.1 =
221
- * Fix: Error notice if user tries to update staging site located in another database
222
- * Fix: Search & Replace adds staging site subfolder multiple times to replaced string when staging site is updated
223
- * Fix: Missing ajax delay setting
224
-
225
- = 2.4.0 =
226
- * New: Compatible to WP 5.0.0 Gutenberg
227
- * New: Increase file scanning process performance
228
- * New: Preview for external database cloning
229
- * New: Add delay between requests setting to prevent timeouts on rate limited servers
230
- * New: Try again automatically cloning process if ajax request has been killed due to server ressource limit error
231
-
232
- * Fix: Error when removing heartbeat api
233
- * Fix: remove ? parameter from staging site
234
- * Fix: Do not load theme while WP Staging is running. Prevents processing interruption if there are fatal errors in the theme
235
- * Fix: When cloning has been canceled page needs to be reloaded before beeing able to clone again
236
- * Fix: Under rare circumstances plugins are disabled when wp staging runs.
237
- * Fix: Prevent error 503 (firewall/performance timeout) by adding post parameter to the ajax url
238
- * Fix: Adding automatic resume function to the ajax processing to prevent cloning and pushing interruptions due to hitting server ressource or network glitches.
239
- * Fix: Selected folders are not excluded under Windows IIS server
240
- * Fix: Windows IIS server compatibilility issues resolved
241
-
242
243
Complete changelog: [https://wp-staging.com/wp-staging-changelog](https://wp-staging.com/wp-staging-changelog)
244
245
== Upgrade Notice ==
246
247
- = 2.5.0 =
248
- * Fix: Do not exclude db.php if it is not located in the wp-content folder
249
- * Fix: Select All button for db tables not working properly
250
- * New: Add Filter to exclude certain tables from search & replace operation
251
- * New: Show PHP user in system info
252
- * New: Check if there is already one process running before executing the cloning process
253
- * New: Support up to WordPress 5.1
254
-
255
-
9
Tags: staging, duplication, cloning, clone, migration, sandbox, test site, testing, backup, post, admin, administration, duplicate posts
10
Requires at least: 3.6+
11
Tested up to: 5.1
12
+ Stable tag: 2.5.4
13
Requires PHP: 5.3
14
15
A duplicator plugin! Clone, duplicate and migrate live sites to independent staging and development sites that are available only to administrators.
16
17
== Description ==
18
19
+ <strong>This cloning and staging plugin is well tested and work in progress. <br>
20
+ If you find an issue, please open a [support ticket](https://wp-staging.com/support/ "support ticket").
21
</strong>
22
<br /><br />
23
+ <strong>Note: </strong> For pushing & migrating plugins and theme files to live site, check out the pro edition [https://wp-staging.com/](https://wp-staging.com/ "WP Staging Pro")
24
<br /><br />
25
+
26
+ <h3>WP Staging for WordPress Migration & Cloning </h3>
27
This duplicator plugin allows you to create an staging or development environment in seconds* <br /> <br />
28
It creates a clone of your website into a subfolder of your main WordPress installation including an entire copy of your database.
29
+ <br /> <br />
30
+ This sounds pretty simple and yes it is! All the hard time-consumptive database and file copying stuff including URL replacements is done in the background. The plugin even automatically does an entire search & replace of all links.
31
<br /> <br />
32
I created this plugin because all other solutions are way too complex, overloaded with dozens of options or having server requirements which are not available on most shared hosting solutions.
33
+ <br /> <br />
34
All these reasons prevent user from testing new plugins and updates first before installing them on their live website, so its time to release a plugin which has the potential to be merged into everyone´s wordpress workflow.
35
<br /><br />
36
+ <p><small><em>* Time of creation depends on size of your database and files.</em></small></p>
37
38
WP Staging helps you to prevent your website from being broken or unavailable because of installing untested plugin updates!
39
+ <p>Note: WordPress 5.0 has been shipped with a new visual editor called Gutenberg. Use WP Staging to check if Gutenberg editor is working as intended on your website and that all used plugins are compatible with that new editor.</p>
40
41
42
[youtube https://www.youtube.com/watch?v=Ye3fC6cdB3A]
44
= Main Features =
45
46
* <strong>Easy: </strong> Staging migration applicable for everyone. No configuration needed!
47
+ * <strong>Fast: </strong> Migration process takes only a few minutes, depending on the site's size and server I/O power
48
+ * <strong>Safe: </strong> Only administrators have access to the staging website
49
<br /><br />
50
+ <strong>Even safer:</strong>
51
<br>
52
* Admin bar reflects that you are working on a staging site
53
+ * Extensive logging if duplication or migration process has been failed.
54
+ * New: Compatible with WordFence & All In One WP Security & Firewall
55
56
+ Supports all main web servers including Apache, Nginx, and Microsoft IIS
57
58
+ = Additional Features WP Staging Pro Edition =
59
60
+ * Wordpress migration and cloning of WordPress multisites
61
+ * Choose a separate database and select a custom directory for cloning
62
+ * Clone your website into a subdomain
63
+ * Specify certain user roles for accessing the staging site
64
+ * Copy all modifications on staging site to the production website
65
66
<strong>Change your workflow of updating themes and plugins data:</strong>
67
68
+ 1. Use WP Staging to clone a production website for staging, testing or backup purposes
69
+ 2. Create a backup of your website
70
+ 3. Customize theme, configuration, and plugins or install new plugins
71
+ 4. Test everything on your staging site first
72
+ 5. Everything running as intended? Start the migration and copy all modifications to your production site!
73
74
75
+ <h3> Why should I use a staging website? </h3>
76
77
+ Plugin updates and theme customizations should be tested on a staging platform first before they are done on your production website.
78
+ It's recommended having the staging platform on the same server where the production website is located to use the same hardware and software environment for your test website and to catch all possible errors during testing.
79
80
+ Before you update a plugin or going to install a new one, it is highly recommended to check out the modifications on a clone of your production website.
81
+ This makes sure that any modifications work on your production website without throwing unexpected errors or preventing your site from loading. Better known as the "WordPress blank page error".
82
83
+ Testing a plugin update before installing it in a live environment isn´t done very often by most users because existing staging solutions are too complex and need a lot of time to create a
84
+ an up-to-date copy of your website.
85
86
+ Some users are also afraid of installing plugins updates because they follow the rule "never touch a running system" with having in mind that untested updates are increasing the risk of breaking their site.
87
+ This is one of the main reasons why WordPress installations are often outdated, not updated at all and insecure because of this non-update behavior.
88
89
+ <strong> It's time to change this, so use "WP Staging" for cloning and migration of WordPress websites</strong>
90
91
+ <h3> Can´t I just use my local wordpress development system like xampp / lampp for testing purposes? </h3>
92
93
+ You can test your website locally but if your local hardware and software environment is not a 100% exact clone of your production server there is NO guarantee that every aspect of your local copy is working on your production website exactly as you expect it.
94
+ There are some obvious things like differences in the config of PHP and the server you are running but even such non-obvious settings like the amount of ram or the CPU performance which can lead to unexpected results later on your production website.
95
+ There are dozens of other possible cause of failure which can not be handled well when you are testing your changes on a local platform only.
96
+
97
+ This is were WP Staging jumps in... Site cloning and staging site creation simplified!
98
99
<h3>I just want to migrate the database from one installation to another</h3>
100
+ If you want to migrate your local database to an already existing production site you can use a tool like WP Migrate DB.
101
WP Staging is only for creating a staging site with latest data from your production site. So it goes the opposite way of WP Migrate DB.
102
+ Both tools are excellent cooperating each other.
103
104
<h3>What are the benefits compared to a plugin like Duplicator?</h3>
105
+ At first, I really the Duplicator plugin. It is a great tool for migrating from a development site to production one or from production site to development one.
106
+ The downside is that Duplicator needs adjustments, manually interventions and requirements for this. Duplicator also needs some skills to be able to create a development/staging site, where WP Staging does not need more than a click from you.
107
However, Duplicator is best placed to be a tool for first-time creation of your production site. This is something where it is very handy and powerful.
108
109
+ So, if you have created a local or web-hosted development site and you need to migrate this site the first time to your production domain than you are doing nothing wrong with using
110
+ the Duplicator plugin! If you need all your latest production data like posts, updated plugins, theme data and styles in a testing environment than I recommend to use WP Staging instead!
111
112
+ = I need your feedback =
113
+ This plugin has been done in hundreds of hours to work on even the smallest shared web hosting package but I am limited in testing this only on a handful of the different server so I need your help:
114
+ Please open a [support request](https://wordpress.org/support/plugin/wp-staging/ "support request") and describe your problem exactly. In wp-content/wp-staging/logs you find extended logfiles. Have a look at them and let me know the error-thrown lines.
115
116
117
= Important =
123
124
= How to install and setup? =
125
Install it via the admin dashboard and to 'Plugins', click 'Add New' and search the plugins for 'Staging'. Install the plugin with 'Install Now'.
126
+ After installation, go to the settings page 'Staging' and do your adjustments there.
127
128
129
== Frequently Asked Questions ==
130
131
+ * I can not log in to the staging site
132
+ If you are using a security plugin like All In One WP Security & Firewall you need to install the latest version of WP Staging.
133
Go to WP Staging > Settings and add the slug to the custom login page which you set up in All In One WP Security & Firewall plugin.
134
135
144
145
== Screenshots ==
146
147
+ 1. Step 1. Create a new WordPress staging site
148
2. Step 2. Scanning your website for files and database tables
149
3. Step 3. Wordpress Staging site creation in progress
150
4. Finish!
151
152
== Changelog ==
153
154
+ = 2.5.4 =
155
+ * Fix: WordFence firewall rule 'local file inclusion' blocks wp staging initial starting cloning sequence
156
+ * Fix: Values of form Extra directories to copy are ignored
157
+
158
= 2.5.3 =
159
+ * Fix: Disable the WP-Spamshield Plugin on staging site because it prevents login to the staging site
160
+ * Fix: Lower the memory consumption when the cloning scan process is started
161
* New: Show PHP user in system info log
162
163
= 2.5.2 =
169
170
= 2.5.0 =
171
* Fix: Do not exclude db.php if it is not located in the wp-content folder
172
+ * Fix: Select All button for DB tables not working properly
173
* New: Add Filter to exclude certain tables from search & replace operation
174
* New: Show PHP user in system info
175
* New: Check if there is already one process running before executing the cloning process
176
* New: Support up to WordPress 5.1
177
178
= 2.4.9 =
179
+ * New: Add new DB table selection manager
180
* Fix: Better warning notices before updating a staging site
181
* Fix: Stop delete process if staging site has been deleted manually before
182
* Fix: Log file folder does not have correct permission 0755
183
* Fix: Continue cloning if siteurl & home in wp_options could not be changed
184
+ * Tweak: Better warning for the update method
185
* Tweak: DB tables and file verification opened as default option
186
* Tweak: Skip rows larger than 5MB for search & replace operations to keep memory consumption low
187
* Tweak: clean up search & replace method
188
* Tweak: Better FAQ
189
190
= 2.4.8 =
191
+ * Fix: Prevent throwing an error when table prefix of table usermeta cannot be changed
192
* Fix: WP Staging does not run with old WordPress version 3.2
193
* Fix: Do not show rating box on posts and pages editor
194
* New: Support WordPress 5.0.3
204
* New: Compatible up to WordPress 5.0.1 Gutenberg
205
* New: Show WP version of staging site in the sysinfo log
206
* Fix: Make sure optimizer must-use plugin is updated as well after updating the main plugin
207
+ * Fix: Plugin cannot be uninstalled if WP Staging Pro is activated
208
* Fix: Prevent error $this not in object context in install.php
209
210
211
= 2.4.4 =
212
+ * Fix: Security, prevent downloading wp staging log files by third-party users from uploads folder
213
* New: Compatible up to WordPress 5.0 Gutenberg
214
215
= 2.4.3 =
216
* Fix: Updating staging site does not exclude Windows IIS configuration file web.config and can lead to server error
217
+ * Fix: Redirect to the correct URL after login to the staging site
218
+ * Fix: Supports HTML entities in links created by WP Bakery Page Builder Plugin
219
* New: Support for custom and non-default wp-content and uploads folder
220
* New: Option to show again the rating notice in a week
221
222
223
Complete changelog: [https://wp-staging.com/wp-staging-changelog](https://wp-staging.com/wp-staging-changelog)
224
225
== Upgrade Notice ==
226
227
+ = 2.5.4 =
228
+ * Fix: WordFence firewall rule 'local file inclusion' blocks wp staging initial starting cloning sequence
229
+ * Fix: Values of form Extra directories to copy are ignored
wp-staging.php CHANGED
@@ -7,7 +7,7 @@
7
* Author: WP-Staging
8
* Author URI: https://wp-staging.com
9
* Contributors: ReneHermi, ilgityildirim
10
- * Version: 2.5.3
11
* Text Domain: wp-staging
12
* Domain Path: /languages/
13
@@ -51,7 +51,7 @@ if( !defined( 'WPSTG_PLUGIN_URL' ) ) {
51
52
// Version
53
if( !defined( 'WPSTG_VERSION' ) ) {
54
- define( 'WPSTG_VERSION', '2.5.3' );
55
}
56
57
// Must use version of the optimizer
7
* Author: WP-Staging
8
* Author URI: https://wp-staging.com
9
* Contributors: ReneHermi, ilgityildirim
10
+ * Version: 2.5.4
11
* Text Domain: wp-staging
12
* Domain Path: /languages/
13
51
52
// Version
53
if( !defined( 'WPSTG_VERSION' ) ) {
54
+ define( 'WPSTG_VERSION', '2.5.4' );
55
}
56
57
// Must use version of the optimizer