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 | 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 +5 -55
- apps/Backend/Modules/Jobs/Scan.php +5 -3
- apps/Backend/Modules/Jobs/Updating.php +16 -142
- apps/Backend/public/js/wpstg-admin.js +12 -11
- apps/Core/Utils/functions.php +23 -8
- apps/Core/WPStaging.php +1 -1
- readme.txt +74 -100
- wp-staging.php +2 -2
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 |
-
|
114 |
-
|
|
|
|
|
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 |
-
|
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 |
-
|
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 |
-
*
|
127 |
-
*
|
128 |
-
* @param
|
129 |
-
* @return
|
130 |
*/
|
131 |
-
function
|
132 |
-
|
133 |
-
|
134 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
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.
|
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
|
21 |
</strong>
|
22 |
<br /><br />
|
23 |
-
<strong>Note: </strong> For pushing & migrating plugins and theme files to live site, check out the pro
|
24 |
<br /><br />
|
25 |
-
|
26 |
-
<
|
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 |
-
|
|
|
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
|
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
|
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
|
47 |
-
* <strong>Safe: </strong>
|
48 |
<br /><br />
|
49 |
-
<strong>
|
50 |
<br>
|
51 |
* Admin bar reflects that you are working on a staging site
|
52 |
-
* Extensive logging if duplication or migration process
|
53 |
-
* New: Compatible
|
54 |
|
55 |
-
|
56 |
|
57 |
-
|
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
|
65 |
-
2.
|
66 |
-
3.
|
67 |
-
4.
|
|
|
68 |
|
69 |
|
70 |
-
<h3> Why should
|
71 |
|
72 |
-
Plugin updates and theme customizations should be tested on a staging platform first
|
73 |
-
|
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 |
-
|
77 |
-
|
78 |
|
79 |
-
|
80 |
-
|
81 |
|
82 |
-
|
|
|
83 |
|
84 |
-
<
|
85 |
|
86 |
-
|
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 |
-
|
|
|
|
|
|
|
|
|
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
|
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
|
98 |
|
99 |
<h3>What are the benefits compared to a plugin like Duplicator?</h3>
|
100 |
-
At first,
|
101 |
-
The downside is that Duplicator needs adjustments, manually interventions and
|
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
|
105 |
-
the Duplicator plugin! If you need all
|
106 |
|
107 |
-
= I need
|
108 |
-
This plugin has been done in hundreds of hours to work on even the smallest shared
|
109 |
-
Please open a [support request](https://wordpress.org/support/plugin/wp-staging/ "support request") and describe your problem
|
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
|
122 |
|
123 |
|
124 |
== Frequently Asked Questions ==
|
125 |
|
126 |
-
* I can not
|
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
|
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
|
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
|
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
|
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
|
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
|
213 |
-
* Fix: Supports HTML entities in links created by WP
|
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.
|
248 |
-
* Fix:
|
249 |
-
* Fix:
|
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.
|
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.
|
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
|