PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 3.0.2
WP STAGING – WordPress Backups, Restore, Migration & Clone v3.0.2
4.11.2 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 5 years ago Exceptions 5 years ago Cancel.php 3 years ago CancelUpdate.php 4 years ago Cloning.php 3 years ago CloningProcess.php 3 years ago Data.php 3 years ago Database.php 3 years ago Delete.php 3 years ago Directories.php 3 years ago Files.php 3 years ago Finish.php 3 years ago Job.php 3 years ago JobExecutable.php 3 years ago Logs.php 3 years ago PreserveDataFirstStep.php 3 years ago PreserveDataSecondStep.php 3 years ago ProcessLock.php 3 years ago Scan.php 3 years ago SearchReplace.php 3 years ago TotalStepsAreNumberOfTables.php 5 years ago Updating.php 3 years ago Verify.php 3 years ago
Updating.php
266 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\Core\Utils\Helper;
9 use WPStaging\Framework\Database\SelectedTables;
10 use WPStaging\Framework\Filesystem\PathIdentifier;
11 use WPStaging\Framework\Filesystem\Scanning\ScanConst;
12 use WPStaging\Framework\Utils\Sanitize;
13 use WPStaging\Framework\Utils\WpDefaultDirectories;
14
15 /**
16 * Class Cloning
17 * @package WPStaging\Backend\Modules\Jobs
18 */
19 class Updating extends Job
20 {
21 /**
22 * @var string
23 */
24 const NORMAL_UPDATE = 'updating';
25
26 /**
27 * @var string
28 */
29 const RESET_UPDATE = 'resetting';
30
31 /**
32 * External Database Used
33 * @var bool
34 */
35 public $isExternalDb;
36
37 /**
38 * @var mixed|null
39 */
40 private $db;
41
42 /**
43 * @var string
44 */
45 private $mainJob;
46
47 /**
48 * @var WpDefaultDirectories
49 */
50 private $dirUtils;
51
52 /**
53 * @var Sanitize
54 */
55 private $sanitize;
56
57 /**
58 * Initialize is called in \Job
59 */
60 public function initialize()
61 {
62 $this->db = WPStaging::getInstance()->get("wpdb");
63 $this->mainJob = self::NORMAL_UPDATE;
64 $this->dirUtils = new WpDefaultDirectories();
65 $this->sanitize = WPStaging::make(Sanitize::class);
66 }
67
68 /**
69 * @param $mainJob
70 */
71 public function setMainJob($mainJob)
72 {
73 $this->mainJob = $mainJob;
74 }
75
76 /**
77 * @return string
78 */
79 public function getMainJob()
80 {
81 return $this->mainJob;
82 }
83
84 /**
85 * Save Chosen Cloning Settings
86 * @return bool
87 * @throws Exception
88 */
89 public function save()
90 {
91 if (!isset($_POST) || !isset($_POST["cloneID"])) {
92 return false;
93 }
94
95 // Delete files to copy listing
96 $this->cache->delete("files_to_copy");
97
98 // Generate Options
99 $this->options->clone = preg_replace("#\W+#", '-', strtolower($this->sanitize->sanitizeString($_POST["cloneID"])));
100 $this->options->cloneNumber = 1;
101 $this->options->includedDirectories = [];
102 $this->options->excludedDirectories = [];
103 $this->options->extraDirectories = [];
104 $this->options->excludeGlobRules = [];
105 $this->options->excludeSizeRules = [];
106 $this->options->excludedFiles = [
107 '.htaccess',
108 '.DS_Store',
109 '*.git',
110 '*.svn',
111 '*.tmp',
112 'desktop.ini',
113 '.gitignore',
114 '*.log',
115 'object-cache.php',
116 'web.config', // Important: Windows IIS configuration file. Do not copy this to the staging site is staging site is placed into subfolder
117 '.wp-staging-cloneable', // File which make staging site to be cloneable
118 ];
119
120 $this->options->excludedFilesFullPath = [
121 PathIdentifier::IDENTIFIER_WP_CONTENT . 'db.php',
122 PathIdentifier::IDENTIFIER_WP_CONTENT . 'object-cache.php',
123 PathIdentifier::IDENTIFIER_WP_CONTENT . 'advanced-cache.php'
124 ];
125
126 // Define mainJob to differentiate between cloning, updating and pushing
127 $this->options->mainJob = $this->mainJob;
128
129 // Only exclude wp-config.php during UPDATE not RESET
130 if ($this->excludeWpConfigDuringUpdate()) {
131 $this->options->excludedFilesFullPath[] = 'wp-config.php';
132 }
133
134 // Job
135 $this->options->job = new stdClass();
136
137 // Check if clone data already exists and use that one
138 if (isset($this->options->existingClones[$this->options->clone])) {
139 $this->options->cloneName = $this->options->existingClones[$this->options->clone]['cloneName'];
140 $this->options->cloneDirectoryName = $this->options->existingClones[$this->options->clone]['directoryName'];
141 $this->options->cloneNumber = $this->options->existingClones[$this->options->clone]['number'];
142 $this->options->databaseUser = $this->options->existingClones[$this->options->clone]['databaseUser'];
143 $this->options->databasePassword = $this->options->existingClones[$this->options->clone]['databasePassword'];
144 $this->options->databaseDatabase = $this->options->existingClones[$this->options->clone]['databaseDatabase'];
145 $this->options->databaseServer = $this->options->existingClones[$this->options->clone]['databaseServer'];
146 $this->options->databasePrefix = $this->options->existingClones[$this->options->clone]['databasePrefix'];
147 $this->options->databaseSsl = $this->options->existingClones[$this->options->clone]['databaseSsl'];
148 $this->options->destinationHostname = $this->options->existingClones[$this->options->clone]['url'];
149 $this->options->uploadsSymlinked = isset($this->options->existingClones[strtolower($this->options->clone)]['uploadsSymlinked']) ? $this->options->existingClones[strtolower($this->options->clone)]['uploadsSymlinked'] : false;
150 $this->options->prefix = $this->options->existingClones[$this->options->clone]['prefix'];
151 $this->options->emailsAllowed = $this->options->existingClones[$this->options->clone]['emailsAllowed'];
152 $this->options->networkClone = isset($this->options->existingClones[strtolower($this->options->clone)]['networkClone']) ? $this->options->existingClones[$this->options->clone]['networkClone'] : false;
153 $this->options->networkClone = filter_var($this->options->networkClone, FILTER_VALIDATE_BOOLEAN);
154 //$this->options->prefix = $this->getStagingPrefix();
155 $helper = new Helper();
156 $this->options->homeHostname = $helper->getHomeUrlWithoutScheme();
157 } else {
158 $job = 'update';
159 if ($this->mainJob === self::RESET_UPDATE) {
160 $job = 'reset';
161 }
162
163 wp_die(sprintf("Fatal Error: Can not %s clone because there is no clone data.", esc_html($job)));
164 }
165
166 $this->isExternalDb = !(empty($this->options->databaseUser) && empty($this->options->databasePassword));
167
168 /**
169 * @see /WPStaging/Framework/CloningProcess/ExcludedPlugins.php to exclude plugins
170 * Only add other directories here
171 */
172 $excludedDirectories = [
173 PathIdentifier::IDENTIFIER_WP_CONTENT . 'cache',
174 ];
175
176 // Add upload folder to list of excluded directories for push if symlink option is enabled
177 if ($this->options->uploadsSymlinked) {
178 $excludedDirectories[] = PathIdentifier::IDENTIFIER_UPLOADS;
179 }
180
181 $this->options->excludedDirectories = $excludedDirectories;
182
183 $this->setTablesForUpdateJob();
184 $this->setDirectoriesForUpdateJob();
185
186 // Make sure it is always enabled for free version
187 $this->options->emailsAllowed = true;
188 if (defined('WPSTGPRO_VERSION')) {
189 $this->options->emailsAllowed = isset($_POST['emailsAllowed']) && $this->sanitize->sanitizeBool($_POST['emailsAllowed']);
190 }
191
192 $this->options->cloneDir = $this->options->existingClones[$this->options->clone]['path'];
193 $this->options->destinationDir = $this->getDestinationDir();
194 $this->options->cloneHostname = $this->options->destinationHostname;
195
196 // Process lock state
197 $this->options->isRunning = true;
198
199 return $this->saveOptions();
200 }
201
202 /**
203 * Get Destination Directory including staging subdirectory
204 * @return string
205 */
206 private function getDestinationDir()
207 {
208 if (empty($this->options->cloneDir)) {
209 return trailingslashit(WPStaging::getWPpath() . $this->options->cloneDirectoryName);
210 }
211 return trailingslashit($this->options->cloneDir);
212 }
213
214 private function setDirectoriesForUpdateJob()
215 {
216 // Exclude Glob Rules
217 $this->options->excludeGlobRules = [];
218 if (!empty($_POST["excludeGlobRules"])) {
219 $this->options->excludeGlobRules = $this->sanitize->sanitizeExcludeRules($_POST["excludeGlobRules"]);
220 }
221
222 $this->options->excludeSizeRules = [];
223 if (!empty($_POST["excludeSizeRules"])) {
224 $this->options->excludeSizeRules = $this->sanitize->sanitizeExcludeRules($_POST["excludeSizeRules"]);
225 }
226
227 // Excluded Directories
228 $excludedDirectoriesRequest = isset($_POST["excludedDirectories"]) ? $this->sanitize->sanitizeString($_POST["excludedDirectories"]) : '';
229 $excludedDirectoriesRequest = $this->dirUtils->getExcludedDirectories($excludedDirectoriesRequest);
230 $this->options->excludedDirectories = array_merge($this->options->excludedDirectories, $excludedDirectoriesRequest);
231 // Extra Directories
232 if (isset($_POST["extraDirectories"])) {
233 $this->options->extraDirectories = explode(ScanConst::DIRECTORIES_SEPARATOR, $this->sanitize->sanitizeString($_POST["extraDirectories"]));
234 }
235
236 // delete uploads folder before copying if uploads is not symlinked
237 $this->options->deleteUploadsFolder = !$this->options->uploadsSymlinked && isset($_POST['cleanUploadsDir']) && $this->sanitize->sanitizeBool($_POST['cleanUploadsDir']);
238 // should not backup uploads during update process
239 $this->options->backupUploadsFolder = false;
240 // clean plugins and themes dir before updating
241 $this->options->deletePluginsAndThemes = isset($_POST['cleanPluginsThemes']) && $this->sanitize->sanitizeBool($_POST['cleanPluginsThemes']);
242 // set default statuses for backup of uploads dir and cleaning of uploads, themes and plugins dirs
243 $this->options->statusBackupUploadsDir = 'skipped';
244 $this->options->statusContentCleaner = 'pending';
245 }
246
247 private function setTablesForUpdateJob()
248 {
249 // Included Tables / Prefixed Table - Excluded Tables
250 $includedTables = isset($_POST['includedTables']) ? $this->sanitize->sanitizeString($_POST['includedTables']) : '';
251 $excludedTables = isset($_POST['excludedTables']) ? $this->sanitize->sanitizeString($_POST['excludedTables']) : '';
252 $selectedTablesWithoutPrefix = isset($_POST['selectedTablesWithoutPrefix']) ? $this->sanitize->sanitizeString($_POST['selectedTablesWithoutPrefix']) : '';
253 $selectedTables = new SelectedTables($includedTables, $excludedTables, $selectedTablesWithoutPrefix);
254 $selectedTables->setAllTablesExcluded(empty($_POST['allTablesExcluded']) ? false : $this->sanitize->sanitizeBool($_POST['allTablesExcluded']));
255 $this->options->tables = $selectedTables->getSelectedTables($this->options->networkClone);
256 }
257
258 /**
259 * Start the cloning job
260 * not used but is abstract
261 */
262 public function start()
263 {
264 }
265 }
266