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

Version Description

  • New: Compatible up to WordPress 5.8.1
  • Enh: Refactor the wp_login action hook to work with different parameter count than the one in WordPress Core #1223
  • Enh: Sort new staging backup sites in descending order by creation time #1226
  • Enh: Warn if creating a backup in PHP 32 bit version #1231
  • Enh: Update the backup upload success message #1221
  • Enh: Show a notice if there is a new WP STAGING free version of the backup plugin #1250
  • Enh: Rename db option wpstg_existing_clones_beta to wpstg_staging_sites #1211
  • Enh: Update the warning message shown when the delete process of the staging backup site fails #1257
  • Enh: Allow use of REST API on staging backup sites without login #1287
  • Enh: Add new EDD software licensing updater for the pro version of the WP STAGING backup plugin #1294
  • Fix: New pro version does not recognize staging backup sites created with older free version #1293
  • Fix: Fix a rare issue that could happen when creating a new staging backup site or restoring a backup when there is a row with primary key with value zero #1271
  • Fix: Try to repair MyISAM table if it's corrupt when creating a Backup #1222
  • Fix: Fix an issue on backup creation that would cause a database export to loop when encountering a table with negative integers or zeros as a primary key value #1251
  • Fix: Lock specific tables while exporting a backup, to prevent a rare duplicated row issue #1245
  • Fix: If the memory exhausts during a database export using the Backup feature, lower the memory usage/speed of the export and try again automatically #1230
  • Fix: Prevent failure of adding database to backup from causing a loop #1231
  • Fix: Fix issue when old backup clones from version 1.1.6 or lower replaces the existing clones from later version when upgrading from FREE to PRO version #1233
  • Fix: Fix inconsistent Unselect All Tables button's action #1243
  • Fix: Replace undefined date with proper formatted date during backups for some warning and critical messages #1244
  • Fix: Split file scanning of wp-content into scanning of plugins, themes, uploads and other directories to reduce timeout issues #1247
  • Fix: Rename .user.ini to .user.ini.bak after cloning to reduce fatal errors on staging backup site. Also show a notice. #1255
  • Fix: Skip scanning the root directory if all other directories are unselected before starting a backup staging site #1256
  • Fix: Show correct insufficient space message instead of permission error if unable to copy or create a backup site due to insufficient space #1283
  • Fix: Fix showing of error when unable to count tables rows and wrap table name when fetching rows during backup #1285
  • Fix: Remove custom error handler that could cause errors due to notices being thrown #1292
  • Fix: Fix an error that would occur when PHP lacked permission to get the size of a directory when pushing a staging backup site to production #1295
  • Dev: Set the version of Selenium containers to 3.141.59-20210713 to avoid issues with broken latest version of selenium #1234
Download this release

Release Info

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

Code changes from version 2.8.7 to 2.8.8

.wordpress-org/banner-1544x500.png CHANGED
Binary file
.wordpress-org/banner-772x250.png CHANGED
Binary file
Backend/Modules/Jobs/Files.php CHANGED
@@ -462,8 +462,10 @@ class Files extends JobExecutable
462
  $destinationPath = $this->destination . $relativePath;
463
  $destinationDirectory = dirname($destinationPath);
464
 
465
- if (!is_dir($destinationDirectory) && !(new Filesystem())->mkdir($destinationDirectory) && !is_dir($destinationDirectory)) {
466
- $this->log("Files: Can not create directory {$destinationDirectory}. Possible write permission error!", Logger::TYPE_ERROR);
 
 
467
  return false;
468
  }
469
 
462
  $destinationPath = $this->destination . $relativePath;
463
  $destinationDirectory = dirname($destinationPath);
464
 
465
+ $fs = new Filesystem();
466
+ $isDirectoryNotCreated = !is_dir($destinationDirectory) && !$fs->mkdir($destinationDirectory) && !is_dir($destinationDirectory);
467
+ if ($isDirectoryNotCreated) {
468
+ $this->log("Files: Can not create directory {$destinationDirectory}." . $fs->getLogs()[0], Logger::TYPE_ERROR);
469
  return false;
470
  }
471
 
Backend/Modules/Jobs/Job.php CHANGED
@@ -100,8 +100,14 @@ abstract class Job implements ShutdownableInterface
100
  // Commit logs
101
  if ($this->logger instanceof Logger) {
102
  if (isset($this->options->mainJob)) {
103
- $timestamp = $this->options->existingClones[$this->options->clone]['datetime'];
104
- $this->logger->setFileName($this->options->mainJob . '_' . date('Y-m-d_H-i-s', $timestamp));
 
 
 
 
 
 
105
  }
106
 
107
  $this->logger->commit();
100
  // Commit logs
101
  if ($this->logger instanceof Logger) {
102
  if (isset($this->options->mainJob)) {
103
+ if (array_key_exists('datetime', $this->options->existingClones[$this->options->clone])) {
104
+ $timestamp = date('Y-m-d_H-i-s', $this->options->existingClones[$this->options->clone]['datetime']);
105
+ } else {
106
+ // This is a fallback for older staging sites that did not have the datetime property.
107
+ $timestamp = sanitize_file_name($this->options->clone) . '_' . date('Y-m-d', time());
108
+ }
109
+
110
+ $this->logger->setFileName($this->options->mainJob . '_' . $timestamp);
111
  }
112
 
113
  $this->logger->commit();
Backend/Notices/BooleanNotice.php CHANGED
@@ -5,7 +5,7 @@ namespace WPStaging\Backend\Notices;
5
  /**
6
  * Class BooleanNotice
7
  *
8
- * This class is used to reduce the boilerplate code for boolean notices
9
  *
10
  * @package WPStaging\Backend\Notices;
11
  */
5
  /**
6
  * Class BooleanNotice
7
  *
8
+ * This class is used to reduce the boilerplate code for dismissible boolean notices
9
  *
10
  * @package WPStaging\Backend\Notices;
11
  */
Backend/Notices/OutdatedWpStagingNotice.php CHANGED
@@ -7,8 +7,7 @@ use WPStaging\Core\WPStaging;
7
  /**
8
  * Class OutdatedWpStagingNotice
9
  *
10
- * Check if using an outdated version of WP Staging Plugin
11
- *
12
  * @see \WPStaging\Backend\Notices\Notices
13
  */
14
  class OutdatedWpStagingNotice
7
  /**
8
  * Class OutdatedWpStagingNotice
9
  *
10
+ * Show a notification if installed WP STAGING free version is outdated and if there is a new plugin update available
 
11
  * @see \WPStaging\Backend\Notices\Notices
12
  */
13
  class OutdatedWpStagingNotice
Backend/Upgrade/Upgrade.php CHANGED
@@ -74,7 +74,9 @@ class Upgrade
74
  */
75
  private function upgrade2_8_7()
76
  {
77
- (new Sites())->upgradeStagingSitesOption();
 
 
78
  }
79
 
80
  /**
74
  */
75
  private function upgrade2_8_7()
76
  {
77
+ if (version_compare($this->previousVersion, '2.8.7', '<')) {
78
+ (new Sites())->upgradeStagingSitesOption();
79
+ }
80
  }
81
 
82
  /**
Framework/Filesystem/DiskWriteCheck.php CHANGED
@@ -55,14 +55,17 @@ class DiskWriteCheck
55
  throw new \RuntimeException('The path must be a directory.');
56
  }
57
 
58
- set_error_handler(function () {
59
- throw new \RuntimeException();
60
- });
61
  $freeSpaceInBytes = @disk_free_space($path);
62
- restore_error_handler();
63
 
64
  if ($freeSpaceInBytes === false) {
65
- throw new \RuntimeException(error_get_last());
 
 
 
 
 
 
 
66
  }
67
 
68
  if (!is_numeric($freeSpaceInBytes)) {
55
  throw new \RuntimeException('The path must be a directory.');
56
  }
57
 
 
 
 
58
  $freeSpaceInBytes = @disk_free_space($path);
 
59
 
60
  if ($freeSpaceInBytes === false) {
61
+ $message = '';
62
+ $error = error_get_last();
63
+
64
+ if (is_array($error) && array_key_exists('message', $error)) {
65
+ $message = $error['message'];
66
+ }
67
+
68
+ throw new \RuntimeException($message);
69
  }
70
 
71
  if (!is_numeric($freeSpaceInBytes)) {
Framework/Filesystem/Filesystem.php CHANGED
@@ -156,7 +156,10 @@ class Filesystem extends FilterableDirectoryIterator
156
  {
157
  $path = $this->findPath($path);
158
 
159
- if (!wp_mkdir_p($path)) {
 
 
 
160
  if (defined('WPSTG_DEBUG') && WPSTG_DEBUG) {
161
  error_log("Failed to create directory $path");
162
  }
@@ -734,4 +737,9 @@ class Filesystem extends FilterableDirectoryIterator
734
 
735
  return $path;
736
  }
 
 
 
 
 
737
  }
156
  {
157
  $path = $this->findPath($path);
158
 
159
+ set_error_handler([$this, 'handleMkdirError']);
160
+ $result = wp_mkdir_p($path);
161
+ restore_error_handler();
162
+ if (!$result) {
163
  if (defined('WPSTG_DEBUG') && WPSTG_DEBUG) {
164
  error_log("Failed to create directory $path");
165
  }
737
 
738
  return $path;
739
  }
740
+
741
+ public function handleMkdirError($errno, $errstr)
742
+ {
743
+ $this->logs[] = "Unable to create directory. Reason: " . $errstr;
744
+ }
745
  }
Framework/Rest/Rest.php ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace WPStaging\Framework\Rest;
4
+
5
+ /**
6
+ * Class Rest
7
+ *
8
+ * @package WPStaging\Framework\Rest
9
+ */
10
+ class Rest
11
+ {
12
+ // Is Rest URL
13
+ public function isRestUrl()
14
+ {
15
+ // Early bail if uri is empty
16
+ if (empty($_SERVER['REQUEST_URI'])) {
17
+ return false;
18
+ }
19
+
20
+ $requestPath = trim($_SERVER['REQUEST_URI'], '/');
21
+
22
+ $url = trailingslashit(get_home_url(get_current_blog_id(), ''));
23
+ // nginx only allows HTTP/1.0 methods when redirecting from / to /index.php.
24
+ // To work around this, we manually add index.php to the URL, avoiding the redirect.
25
+ if ('index.php' !== substr($url, 9)) {
26
+ $url .= 'index.php';
27
+ }
28
+
29
+ $url = add_query_arg('rest_route', '/', $url);
30
+ $restPath = trim(parse_url($url, PHP_URL_PATH), '/');
31
+ if (strpos($requestPath, $restPath) === 0) {
32
+ return true;
33
+ }
34
+
35
+ // Early bail rest url function not exists
36
+ if (!function_exists('rest_url')) {
37
+ return false;
38
+ }
39
+
40
+ $baseRestURL = get_rest_url(get_current_blog_id(), '/');
41
+ $restPath = trim(parse_url($baseRestURL, PHP_URL_PATH), '/');
42
+
43
+ return strpos($requestPath, $restPath) === 0;
44
+ }
45
+ }
Framework/Staging/Sites.php CHANGED
@@ -20,15 +20,10 @@ class Sites
20
 
21
  /**
22
  * The old option that was used to store the staging sites
23
- * @deprecated 4.0.4
24
  */
25
  const OLD_STAGING_SITES_OPTION = 'wpstg_existing_clones_beta';
26
 
27
- /**
28
- * The option that we use to store our existing clone;
29
- */
30
- const CLONE_STRUCTURE_OPTION = 'wpstg_structure_updated';
31
-
32
  /**
33
  * Return list of staging sites in descending order of their creation time.
34
  *
@@ -68,33 +63,50 @@ class Sites
68
  /**
69
  * Upgrade old existing clone beta option to new staging site option
70
  *
71
- * @see WPStaging\Backend\Upgrade\Upgrade::upgrade2_8_7() (Free version)
72
- * @see WPStaging\Backend\Pro\Upgrade\Upgrade::upgrade4_0_4() (Pro version)
73
  */
74
  public function upgradeStagingSitesOption()
75
  {
76
- // Early bail if structure is already updated
77
- $isStagingSiteStructureUpdated = get_option(self::CLONE_STRUCTURE_OPTION, false);
78
- if ($isStagingSiteStructureUpdated !== false) {
 
 
79
  return;
80
  }
81
 
82
- // Get the staging sites from new option
83
  $newSites = get_option(self::STAGING_SITES_OPTION, []);
84
 
85
- // Get the staging sites from old option
86
- $oldSites = get_option(self::OLD_STAGING_SITES_OPTION, []);
87
 
88
- // Early bail if old sites option is empty or new sites option is already populated
89
- if (empty($oldSites) || !empty($newSites)) {
90
- update_option(self::CLONE_STRUCTURE_OPTION, true);
91
- return;
92
- }
 
 
 
 
93
 
94
- // Update staging sites from old option to new option
95
- update_option(self::STAGING_SITES_OPTION, $oldSites);
 
96
 
97
- update_option(self::CLONE_STRUCTURE_OPTION, true);
 
 
 
 
 
 
 
 
 
 
 
98
  }
99
 
100
  /**
20
 
21
  /**
22
  * The old option that was used to store the staging sites
23
+ * @deprecated 4.0.5
24
  */
25
  const OLD_STAGING_SITES_OPTION = 'wpstg_existing_clones_beta';
26
 
 
 
 
 
 
27
  /**
28
  * Return list of staging sites in descending order of their creation time.
29
  *
63
  /**
64
  * Upgrade old existing clone beta option to new staging site option
65
  *
66
+ * @see \WPStaging\Backend\Upgrade\Upgrade::upgrade2_8_7 (Free version)
67
+ * @see \WPStaging\Backend\Pro\Upgrade\Upgrade::upgrade4_0_5 (Pro version)
68
  */
69
  public function upgradeStagingSitesOption()
70
  {
71
+ // Get the staging sites from old option
72
+ $oldSites = get_option(self::OLD_STAGING_SITES_OPTION, []);
73
+
74
+ // Early bail: No sites to migrate
75
+ if (empty($oldSites)) {
76
  return;
77
  }
78
 
 
79
  $newSites = get_option(self::STAGING_SITES_OPTION, []);
80
 
81
+ // Convert old format to new, including when there are staging sites in both formats
82
+ $allStagingSites = $newSites;
83
 
84
+ foreach ($oldSites as $oldSiteSlug => $oldSite) {
85
+ // Migrate old site to new format
86
+ if (!array_key_exists($oldSiteSlug, $allStagingSites)) {
87
+ $allStagingSites[$oldSiteSlug] = $oldSite;
88
+ continue;
89
+ }
90
+
91
+ // Migrate old site to new format when site slug exists in both options
92
+ $i = 0;
93
 
94
+ do {
95
+ $oldSiteSlug = $oldSiteSlug . '_' . $i;
96
+ } while (array_key_exists($oldSiteSlug, $allStagingSites));
97
 
98
+ $allStagingSites[$oldSiteSlug] = $oldSite;
99
+ }
100
+
101
+ if (update_option(self::STAGING_SITES_OPTION, $allStagingSites)) {
102
+ // Keep a backup just in case
103
+ update_option('wpstg_staging_sites_backup', $oldSites, false);
104
+ delete_option(self::OLD_STAGING_SITES_OPTION);
105
+ } else {
106
+ if (defined('WPSTG_DEBUG') && WPSTG_DEBUG) {
107
+ error_log('WPSTAGING DEBUG: update_option for option renaming of staging sites failed.');
108
+ }
109
+ }
110
  }
111
 
112
  /**
Framework/Traits/MySQLRowsGeneratorTrait.php CHANGED
@@ -124,7 +124,7 @@ ORDER BY `{$numericPrimaryKey}` ASC
124
  LIMIT 0, {$batchSize}
125
  SQL;
126
  } else {
127
- $query = "SELECT * FROM {$table} LIMIT {$offset}, {$batchSize}";
128
  }
129
  $jobDataDto->setLastQueryInfoJSON(json_encode([$requestId, $table, $offset, $batchSize]));
130
  $result = $db->query($query);
124
  LIMIT 0, {$batchSize}
125
  SQL;
126
  } else {
127
+ $query = "SELECT * FROM `{$table}` LIMIT {$offset}, {$batchSize}";
128
  }
129
  $jobDataDto->setLastQueryInfoJSON(json_encode([$requestId, $table, $offset, $batchSize]));
130
  $result = $db->query($query);
Frontend/Frontend.php CHANGED
@@ -2,6 +2,7 @@
2
 
3
  namespace WPStaging\Frontend;
4
 
 
5
  use WPStaging\Framework\SiteInfo;
6
 
7
  /**
@@ -89,6 +90,11 @@ class Frontend
89
  {
90
  $this->accessDenied = false;
91
 
 
 
 
 
 
92
  if ($this->isLoginPage() || is_admin()) {
93
  return false;
94
  }
2
 
3
  namespace WPStaging\Frontend;
4
 
5
+ use WPStaging\Framework\Rest\Rest;
6
  use WPStaging\Framework\SiteInfo;
7
 
8
  /**
90
  {
91
  $this->accessDenied = false;
92
 
93
+ // Dont show login form for rest requests
94
+ if ((new Rest())->isRestUrl()) {
95
+ return false;
96
+ }
97
+
98
  if ($this->isLoginPage() || is_admin()) {
99
  return false;
100
  }
constantsFree.php CHANGED
@@ -2,10 +2,10 @@
2
 
3
  // WP STAGING version number
4
  if (!defined('WPSTG_VERSION')) {
5
- define('WPSTG_VERSION', '2.8.7');
6
  }
7
 
8
  // Compatible up to WordPress Version
9
  if (!defined('WPSTG_COMPATIBLE')) {
10
- define('WPSTG_COMPATIBLE', '5.8.0');
11
  }
2
 
3
  // WP STAGING version number
4
  if (!defined('WPSTG_VERSION')) {
5
+ define('WPSTG_VERSION', '2.8.8');
6
  }
7
 
8
  // Compatible up to WordPress Version
9
  if (!defined('WPSTG_COMPATIBLE')) {
10
+ define('WPSTG_COMPATIBLE', '5.8.1');
11
  }
opcacheBootstrap.php CHANGED
@@ -45,7 +45,7 @@ if (!$canInvalidate) {
45
  *
46
  * We use the "Version" from the headers of the main file of the plugin to compare.
47
  */
48
- $runtimeVersionDifferentFromBuildVersion = get_file_data($pluginFilePath, ['Version' => 'Version'])['Version'] !== '2.8.7';
49
  $lastCheckHappenedAfterInterval = current_time('timestamp') > (int)get_site_transient('wpstg.bootstrap.opcache.lastCleared') + 5 * MINUTE_IN_SECONDS;
50
 
51
  $shouldClearOpCache = apply_filters('wpstg.bootstrap.opcache.shouldClear', $runtimeVersionDifferentFromBuildVersion && $lastCheckHappenedAfterInterval);
45
  *
46
  * We use the "Version" from the headers of the main file of the plugin to compare.
47
  */
48
+ $runtimeVersionDifferentFromBuildVersion = get_file_data($pluginFilePath, ['Version' => 'Version'])['Version'] !== '2.8.8';
49
  $lastCheckHappenedAfterInterval = current_time('timestamp') > (int)get_site_transient('wpstg.bootstrap.opcache.lastCleared') + 5 * MINUTE_IN_SECONDS;
50
 
51
  $shouldClearOpCache = apply_filters('wpstg.bootstrap.opcache.shouldClear', $runtimeVersionDifferentFromBuildVersion && $lastCheckHappenedAfterInterval);
readme.txt CHANGED
@@ -9,7 +9,7 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
  Tags: backup, database backup, staging, duplication, clone
10
  Requires at least: 3.6+
11
  Tested up to: 5.8
12
- Stable tag: 2.8.7
13
  Requires PHP: 5.5
14
 
15
  A backup & duplicator plugin - clone, move, duplicate & migrate websites to staging, backup, and development sites for authorized users only.
@@ -179,6 +179,36 @@ https://wp-staging.com
179
 
180
  == Changelog ==
181
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
182
  = 2.8.7 =
183
  * Enh: Refactor our wp_login action hook to work with custom calls to this action with different parameter count than the one in WordPress Core #1223
184
  * Enh: Sort new staging sites in descending order by creation time #1226
@@ -469,6 +499,34 @@ SKIP VERSION
469
  Full changelog: [https://wp-staging.com/wp-staging-changelog](https://wp-staging.com/wp-staging-changelog)
470
 
471
  == Upgrade Notice ==
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
472
  * Enh: Refactor our wp_login action hook to work with custom calls to this action with different parameter count than the one in WordPress Core #1223
473
  * Enh: Sort new staging sites in descending order by creation time #1226
474
  * Enh: Warn if creating a backup in PHP 32 bits #1231
9
  Tags: backup, database backup, staging, duplication, clone
10
  Requires at least: 3.6+
11
  Tested up to: 5.8
12
+ Stable tag: 2.8.8
13
  Requires PHP: 5.5
14
 
15
  A backup & duplicator plugin - clone, move, duplicate & migrate websites to staging, backup, and development sites for authorized users only.
179
 
180
  == Changelog ==
181
 
182
+ = 2.8.8 =
183
+ * New: Compatible up to WordPress 5.8.1
184
+ * Enh: Refactor the wp_login action hook to work with different parameter count than the one in WordPress Core #1223
185
+ * Enh: Sort new staging backup sites in descending order by creation time #1226
186
+ * Enh: Warn if creating a backup in PHP 32 bit version #1231
187
+ * Enh: Update the backup upload success message #1221
188
+ * Enh: Show a notice if there is a new WP STAGING free version of the backup plugin #1250
189
+ * Enh: Rename db option wpstg_existing_clones_beta to wpstg_staging_sites #1211
190
+ * Enh: Update the warning message shown when the delete process of the staging backup site fails #1257
191
+ * Enh: Allow use of REST API on staging backup sites without login #1287
192
+ * Enh: Add new EDD software licensing updater for the pro version of the WP STAGING backup plugin #1294
193
+ * Fix: New pro version does not recognize staging backup sites created with older free version #1293
194
+ * Fix: Fix a rare issue that could happen when creating a new staging backup site or restoring a backup when there is a row with primary key with value zero #1271
195
+ * Fix: Try to repair MyISAM table if it's corrupt when creating a Backup #1222
196
+ * Fix: Fix an issue on backup creation that would cause a database export to loop when encountering a table with negative integers or zeros as a primary key value #1251
197
+ * Fix: Lock specific tables while exporting a backup, to prevent a rare duplicated row issue #1245
198
+ * Fix: If the memory exhausts during a database export using the Backup feature, lower the memory usage/speed of the export and try again automatically #1230
199
+ * Fix: Prevent failure of adding database to backup from causing a loop #1231
200
+ * Fix: Fix issue when old backup clones from version 1.1.6 or lower replaces the existing clones from later version when upgrading from FREE to PRO version #1233
201
+ * Fix: Fix inconsistent Unselect All Tables button's action #1243
202
+ * Fix: Replace undefined date with proper formatted date during backups for some warning and critical messages #1244
203
+ * Fix: Split file scanning of wp-content into scanning of plugins, themes, uploads and other directories to reduce timeout issues #1247
204
+ * Fix: Rename .user.ini to .user.ini.bak after cloning to reduce fatal errors on staging backup site. Also show a notice. #1255
205
+ * Fix: Skip scanning the root directory if all other directories are unselected before starting a backup staging site #1256
206
+ * Fix: Show correct insufficient space message instead of permission error if unable to copy or create a backup site due to insufficient space #1283
207
+ * Fix: Fix showing of error when unable to count tables rows and wrap table name when fetching rows during backup #1285
208
+ * Fix: Remove custom error handler that could cause errors due to notices being thrown #1292
209
+ * Fix: Fix an error that would occur when PHP lacked permission to get the size of a directory when pushing a staging backup site to production #1295
210
+ * Dev: Set the version of Selenium containers to 3.141.59-20210713 to avoid issues with broken latest version of selenium #1234
211
+
212
  = 2.8.7 =
213
  * Enh: Refactor our wp_login action hook to work with custom calls to this action with different parameter count than the one in WordPress Core #1223
214
  * Enh: Sort new staging sites in descending order by creation time #1226
499
  Full changelog: [https://wp-staging.com/wp-staging-changelog](https://wp-staging.com/wp-staging-changelog)
500
 
501
  == Upgrade Notice ==
502
+ * Enh: Refactor the wp_login action hook to work with different parameter count than the one in WordPress Core #1223
503
+ * Enh: Sort new staging backup sites in descending order by creation time #1226
504
+ * Enh: Warn if creating a backup in PHP 32 bit version #1231
505
+ * Enh: Update the backup upload success message #1221
506
+ * Enh: Show a notice if there is a new WP STAGING free version of the backup plugin #1250
507
+ * Enh: Rename db option wpstg_existing_clones_beta to wpstg_staging_sites #1211
508
+ * Enh: Update the warning message shown when the delete process of the staging backup site fails #1257
509
+ * Enh: Allow use of REST API on staging backup sites without login #1287
510
+ * Enh: Add new EDD software licensing updater for the pro version of the WP STAGING backup plugin #1294
511
+ * Fix: New pro version does not recognize staging backup sites created with older free version #1293
512
+ * Fix: Fix a rare issue that could happen when creating a new staging backup site or restoring a backup when there is a row with primary key with value zero #1271
513
+ * Fix: Try to repair MyISAM table if it's corrupt when creating a Backup #1222
514
+ * Fix: Fix an issue on backup creation that would cause a database export to loop when encountering a table with negative integers or zeros as a primary key value #1251
515
+ * Fix: Lock specific tables while exporting a backup, to prevent a rare duplicated row issue #1245
516
+ * Fix: If the memory exhausts during a database export using the Backup feature, lower the memory usage/speed of the export and try again automatically #1230
517
+ * Fix: Prevent failure of adding database to backup from causing a loop #1231
518
+ * Fix: Fix issue when old backup clones from version 1.1.6 or lower replaces the existing clones from later version when upgrading from FREE to PRO version #1233
519
+ * Fix: Fix inconsistent Unselect All Tables button's action #1243
520
+ * Fix: Replace undefined date with proper formatted date during backups for some warning and critical messages #1244
521
+ * Fix: Split file scanning of wp-content into scanning of plugins, themes, uploads and other directories to reduce timeout issues #1247
522
+ * Fix: Rename .user.ini to .user.ini.bak after cloning to reduce fatal errors on staging backup site. Also show a notice. #1255
523
+ * Fix: Skip scanning the root directory if all other directories are unselected before starting a backup staging site #1256
524
+ * Fix: Show correct insufficient space message instead of permission error if unable to copy or create a backup site due to insufficient space #1283
525
+ * Fix: Fix showing of error when unable to count tables rows and wrap table name when fetching rows during backup #1285
526
+ * Fix: Remove custom error handler that could cause errors due to notices being thrown #1292
527
+ * Fix: Fix an error that would occur when PHP lacked permission to get the size of a directory when pushing a staging backup site to production #1295
528
+ * Dev: Set the version of Selenium containers to 3.141.59-20210713 to avoid issues with broken latest version of selenium #1234
529
+
530
  * Enh: Refactor our wp_login action hook to work with custom calls to this action with different parameter count than the one in WordPress Core #1223
531
  * Enh: Sort new staging sites in descending order by creation time #1226
532
  * Enh: Warn if creating a backup in PHP 32 bits #1231
vendor_wpstg/autoload/src.php CHANGED
@@ -199,6 +199,7 @@ return array(
199
  'WPStaging\\Framework\\Queue\\Storage\\QueueStorageException' => $baseDir . '/Framework/Queue/Storage/QueueStorageException.php',
200
  'WPStaging\\Framework\\Queue\\Storage\\SPL\\JsonDoublyLinkedList' => $baseDir . '/Framework/Queue/Storage/SPL/JsonDoublyLinkedList.php',
201
  'WPStaging\\Framework\\Queue\\Storage\\StorageInterface' => $baseDir . '/Framework/Queue/Storage/StorageInterface.php',
 
202
  'WPStaging\\Framework\\Security\\AccessToken' => $baseDir . '/Framework/Security/AccessToken.php',
203
  'WPStaging\\Framework\\Security\\Auth' => $baseDir . '/Framework/Security/Auth.php',
204
  'WPStaging\\Framework\\Security\\Capabilities' => $baseDir . '/Framework/Security/Capabilities.php',
199
  'WPStaging\\Framework\\Queue\\Storage\\QueueStorageException' => $baseDir . '/Framework/Queue/Storage/QueueStorageException.php',
200
  'WPStaging\\Framework\\Queue\\Storage\\SPL\\JsonDoublyLinkedList' => $baseDir . '/Framework/Queue/Storage/SPL/JsonDoublyLinkedList.php',
201
  'WPStaging\\Framework\\Queue\\Storage\\StorageInterface' => $baseDir . '/Framework/Queue/Storage/StorageInterface.php',
202
+ 'WPStaging\\Framework\\Rest\\Rest' => $baseDir . '/Framework/Rest/Rest.php',
203
  'WPStaging\\Framework\\Security\\AccessToken' => $baseDir . '/Framework/Security/AccessToken.php',
204
  'WPStaging\\Framework\\Security\\Auth' => $baseDir . '/Framework/Security/Auth.php',
205
  'WPStaging\\Framework\\Security\\Capabilities' => $baseDir . '/Framework/Security/Capabilities.php',
wp-staging.php CHANGED
@@ -7,7 +7,7 @@
7
  * Author: WP-STAGING
8
  * Author URI: https://wp-staging.com
9
  * Contributors: ReneHermi
10
- * Version: 2.8.7
11
  * Text Domain: wp-staging
12
  * Domain Path: /languages/
13
  *
7
  * Author: WP-STAGING
8
  * Author URI: https://wp-staging.com
9
  * Contributors: ReneHermi
10
+ * Version: 2.8.8
11
  * Text Domain: wp-staging
12
  * Domain Path: /languages/
13
  *