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