PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.11.1
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.11.1
4.11.1 4.11.0 4.10.0 4.9.5 4.9.4 4.9.3 4.9.2 4.9.1 4.9.0 4.8.1 trunk 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.1.1 3.1.2 3.1.3 3.1.4 3.10.0 3.2.0 3.3.1 3.3.2 3.3.3 3.4.1 3.4.3 3.5.0 3.6.0 3.7.1 3.8.0 3.8.1 3.8.2 3.8.3 3.8.4 3.8.5 3.8.6 3.8.7 3.9.0 3.9.1 3.9.2 3.9.3 3.9.4 4.0.0 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.8.0
wp-staging / Backend / Modules / Jobs / Updating.php
wp-staging / Backend / Modules / Jobs Last commit date
Cleaners 1 week ago Exceptions 1 week ago Cancel.php 1 week ago CancelUpdate.php 1 week ago Cloning.php 6 days ago CloningProcess.php 1 week ago Data.php 1 week ago Database.php 6 days ago Delete.php 1 week ago Directories.php 1 week ago Files.php 1 week ago Finish.php 1 week ago Job.php 6 days ago JobExecutable.php 1 week ago Logs.php 1 week ago PreserveDataFirstStep.php 1 week ago PreserveDataSecondStep.php 1 week ago ProcessLock.php 1 week ago Scan.php 1 week ago SearchReplace.php 1 week ago TotalStepsAreNumberOfTables.php 1 week ago Updating.php 6 days ago
Updating.php
284 lines
1 <?php
2
3 namespace WPStaging\Backend\Modules\Jobs;
4
5 use Exception;
6 use stdClass;
7 use WPStaging\Core\WPStaging;
8 use WPStaging\Framework\Database\SelectedTables;
9 use WPStaging\Framework\Filesystem\PathIdentifier;
10 use WPStaging\Framework\Filesystem\Scanning\ScanConst;
11 use WPStaging\Framework\Utils\Urls;
12 use WPStaging\Framework\Utils\Sanitize;
13 use WPStaging\Framework\Utils\WpDefaultDirectories;
14 use WPStaging\Framework\Traits\ValueGetterTrait;
15
16
17
18
19
20 class Updating extends Job
21 {
22 use ValueGetterTrait;
23
24
25
26
27
28 public $isExternalDb;
29
30
31
32
33 private $mainJob;
34
35
36
37
38 private $dirUtils;
39
40
41
42
43 private $sanitize;
44
45
46
47
48 private $urls;
49
50
51
52
53 public function initialize()
54 {
55 $this->mainJob = Job::UPDATE;
56 $this->dirUtils = new WpDefaultDirectories();
57 $this->sanitize = WPStaging::make(Sanitize::class);
58 $this->urls = WPStaging::make(Urls::class);
59 }
60
61
62
63
64 public function setMainJob($mainJob)
65 {
66 $this->mainJob = $mainJob;
67 }
68
69
70
71
72 public function getMainJob()
73 {
74 return $this->mainJob;
75 }
76
77
78
79
80
81
82 public function save()
83 {
84 if (!isset($_POST) || !isset($_POST["cloneID"])) {
85 return false;
86 }
87
88
89 $this->filesIndexCache->delete();
90
91
92 $this->options->clone = preg_replace("#\W+#", '-', strtolower($this->sanitize->sanitizeString($_POST["cloneID"])));
93 $this->options->cloneNumber = 1;
94 $this->options->includedDirectories = [];
95 $this->options->excludedDirectories = [];
96 $this->options->extraDirectories = [];
97 $this->options->excludeGlobRules = [];
98 $this->options->excludeSizeRules = [];
99 $this->options->excludedFiles = [
100 '.htaccess',
101 '.DS_Store',
102 '*.git',
103 '*.svn',
104 '*.tmp',
105 'desktop.ini',
106 '.gitignore',
107 '*.log',
108 'object-cache.php',
109 'web.config',
110 '.wp-staging-cloneable',
111 ];
112
113 $hostingExclusions = $this->getHostingProviderExclusions();
114 $this->options->tmpExcludedHostingFiles = $hostingExclusions['absolutePaths'];
115
116 $this->options->excludedFilesFullPath = array_merge([
117 PathIdentifier::IDENTIFIER_WP_CONTENT . 'db.php',
118 PathIdentifier::IDENTIFIER_WP_CONTENT . 'object-cache.php',
119 PathIdentifier::IDENTIFIER_WP_CONTENT . 'advanced-cache.php',
120 ], $hostingExclusions['files']);
121
122
123 $this->options->mainJob = $this->mainJob;
124
125
126 if ($this->excludeWpConfigDuringUpdate()) {
127 $this->options->excludedFilesFullPath[] = 'wp-config.php';
128 }
129
130
131 $this->options->job = new stdClass();
132 $this->loadLegacyExistingClones();
133
134
135 $this->options->isEmailsAllowed = true;
136
137 if (isset($this->options->existingClones[$this->options->clone])) {
138 $currentStagingSite = $this->options->existingClones[$this->options->clone];
139 $this->options->current = $this->options->clone;
140 $this->options->currentClone = $currentStagingSite;
141 $this->options->cloneName = $this->getValueFromArray('cloneName', $currentStagingSite);
142 $this->options->cloneDirectoryName = $this->getValueFromArray('directoryName', $currentStagingSite);
143 $this->options->cloneNumber = $this->getValueFromArray('number', $currentStagingSite);
144 $this->options->databaseUser = $this->getValueFromArray('databaseUser', $currentStagingSite);
145 $this->options->databasePassword = $this->getValueFromArray('databasePassword', $currentStagingSite);
146 $this->options->databaseDatabase = $this->getValueFromArray('databaseDatabase', $currentStagingSite);
147 $this->options->databaseServer = $this->getValueFromArray('databaseServer', $currentStagingSite);
148 $this->options->databasePrefix = $this->getValueFromArray('databasePrefix', $currentStagingSite);
149 $this->options->databaseSsl = $this->getValueFromArray('databaseSsl', $currentStagingSite);
150 $this->options->useCustomDatabase = $this->externalDatabaseConfiguration->isEnabled($currentStagingSite);
151 $this->options->destinationHostname = $this->getValueFromArray('url', $currentStagingSite);
152 $this->options->uploadsSymlinked = $this->getValueFromArray('uploadsSymlinked', $currentStagingSite);
153 $this->options->prefix = $this->getValueFromArray('prefix', $currentStagingSite);
154 $this->options->isEmailsAllowed = $this->getValueFromArray('isEmailsAllowed', $currentStagingSite);
155 $this->options->networkClone = filter_var($this->getValueFromArray('networkClone', $currentStagingSite), FILTER_VALIDATE_BOOLEAN);
156 $this->options->homeHostname = $this->urls->getHomeUrlWithoutScheme();
157 $this->options->useNewAdminAccount = $this->getValueFromArray('useNewAdminAccount', $currentStagingSite);
158 $this->options->adminEmail = $this->getValueFromArray('adminEmail', $currentStagingSite);
159 $this->options->adminPassword = $this->getValueFromArray('adminPassword', $currentStagingSite);
160 $this->options->isWooSchedulerEnabled = $this->getValueFromArray('isWooSchedulerEnabled', $currentStagingSite);
161 $this->options->isEmailsReminderEnabled = $this->getValueFromArray('isEmailsReminderEnabled', $currentStagingSite);
162 $this->options->isAutoUpdatePlugins = $this->getValueFromArray('isAutoUpdatePlugins', $currentStagingSite);
163 } else {
164 $job = 'update';
165 if ($this->mainJob === Job::RESET) {
166 $job = 'reset';
167 }
168
169 wp_die(sprintf("Fatal Error: Can not %s clone because there is no clone data.", esc_html($job)));
170 }
171
172 if (!$this->options->useCustomDatabase) {
173 $this->options->databaseUser = '';
174 $this->options->databasePassword = '';
175 $this->options->databaseDatabase = '';
176 $this->options->databaseServer = 'localhost';
177 $this->options->databasePrefix = '';
178 $this->options->databaseSsl = false;
179 }
180
181 $this->isExternalDb = (bool)$this->options->useCustomDatabase;
182
183
184
185
186
187 $excludedDirectories = array_merge([
188 PathIdentifier::IDENTIFIER_WP_CONTENT . 'cache',
189 ], $hostingExclusions['directories']);
190
191
192 if ($this->options->uploadsSymlinked) {
193 $excludedDirectories[] = PathIdentifier::IDENTIFIER_UPLOADS;
194 }
195
196 $this->options->excludedDirectories = $excludedDirectories;
197
198 $this->setTablesForUpdateJob();
199 $this->setDirectoriesForUpdateJob();
200
201 if (defined('WPSTGPRO_VERSION') && $this->mainJob !== Job::RESET) {
202 $this->options->isEmailsAllowed = isset($_POST['isEmailsAllowed']) && $this->sanitize->sanitizeBool($_POST['isEmailsAllowed']);
203 $this->options->isWooSchedulerEnabled = isset($_POST['isWooSchedulerEnabled']) && $this->sanitize->sanitizeBool($_POST['isWooSchedulerEnabled']);
204 $this->options->isEmailsReminderEnabled = isset($_POST['isEmailsReminderEnabled']) && $this->sanitize->sanitizeBool($_POST['isEmailsReminderEnabled']);
205 $this->options->isAutoUpdatePlugins = isset($_POST['isAutoUpdatePlugins']) && $this->sanitize->sanitizeBool($_POST['isAutoUpdatePlugins']);
206 }
207
208 $this->options->cloneDir = $this->options->existingClones[$this->options->clone]['path'];
209 $this->options->destinationDir = $this->getDestinationDir();
210 $this->options->cloneHostname = $this->options->destinationHostname;
211
212
213 $this->options->isRunning = true;
214 $this->initializeLegacyStagingRun($this->mainJob);
215
216 return $this->saveOptions();
217 }
218
219
220
221
222
223 private function getDestinationDir()
224 {
225 if (empty($this->options->cloneDir)) {
226 return trailingslashit(WPStaging::getWPpath() . $this->options->cloneDirectoryName);
227 }
228
229 return trailingslashit($this->options->cloneDir);
230 }
231
232 private function setDirectoriesForUpdateJob()
233 {
234
235 $this->options->excludeGlobRules = [];
236 if (!empty($_POST["excludeGlobRules"])) {
237 $this->options->excludeGlobRules = $this->sanitize->sanitizeExcludeRules($_POST["excludeGlobRules"]);
238 }
239
240 $this->options->excludeSizeRules = [];
241 if (!empty($_POST["excludeSizeRules"])) {
242 $this->options->excludeSizeRules = $this->sanitize->sanitizeExcludeRules($_POST["excludeSizeRules"]);
243 }
244
245
246 $excludedDirectoriesRequest = isset($_POST["excludedDirectories"]) ? $this->sanitize->sanitizeString($_POST["excludedDirectories"]) : '';
247 $excludedDirectoriesRequest = $this->dirUtils->getExcludedDirectories($excludedDirectoriesRequest);
248 $this->options->excludedDirectories = array_merge($this->options->excludedDirectories, $excludedDirectoriesRequest);
249
250 if (isset($_POST["extraDirectories"])) {
251 $this->options->extraDirectories = explode(ScanConst::DIRECTORIES_SEPARATOR, $this->sanitize->sanitizeString($_POST["extraDirectories"]));
252 }
253
254
255 $this->options->deleteUploadsFolder = !$this->options->uploadsSymlinked && isset($_POST['cleanUploadsDir']) && $this->sanitize->sanitizeBool($_POST['cleanUploadsDir']);
256
257 $this->options->backupUploadsFolder = false;
258
259 $this->options->deletePluginsAndThemes = isset($_POST['cleanPluginsThemes']) && $this->sanitize->sanitizeBool($_POST['cleanPluginsThemes']);
260
261 $this->options->statusBackupUploadsDir = 'skipped';
262 $this->options->statusContentCleaner = 'pending';
263 }
264
265 private function setTablesForUpdateJob()
266 {
267
268 $includedTables = isset($_POST['includedTables']) ? $this->sanitize->sanitizeString($_POST['includedTables']) : '';
269 $excludedTables = isset($_POST['excludedTables']) ? $this->sanitize->sanitizeString($_POST['excludedTables']) : '';
270 $selectedTablesWithoutPrefix = isset($_POST['selectedTablesWithoutPrefix']) ? $this->sanitize->sanitizeString($_POST['selectedTablesWithoutPrefix']) : '';
271 $selectedTables = new SelectedTables($includedTables, $excludedTables, $selectedTablesWithoutPrefix);
272 $selectedTables->setAllTablesExcluded(empty($_POST['allTablesExcluded']) ? false : $this->sanitize->sanitizeBool($_POST['allTablesExcluded']));
273 $this->options->tables = $selectedTables->getSelectedTables($this->options->networkClone);
274 }
275
276
277
278
279
280 public function start()
281 {
282 }
283 }
284