PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / 4.9.5
WP STAGING – WordPress Backups, Restore, Migration & Clone v4.9.5
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 / Finish.php
wp-staging / Backend / Modules / Jobs Last commit date
Cleaners 4 months ago Exceptions 5 years ago Cancel.php 8 months ago CancelUpdate.php 8 months ago Cloning.php 5 days ago CloningProcess.php 5 days ago Data.php 8 months ago Database.php 5 days ago Delete.php 5 days ago Directories.php 5 months ago Files.php 1 month ago Finish.php 5 days ago Job.php 5 days ago JobExecutable.php 8 months ago Logs.php 3 years ago PreserveDataFirstStep.php 2 months ago PreserveDataSecondStep.php 2 months ago ProcessLock.php 1 year ago Scan.php 3 weeks ago SearchReplace.php 6 months ago TotalStepsAreNumberOfTables.php 5 years ago Updating.php 5 days ago
Finish.php
197 lines
1 <?php
2
3 namespace WPStaging\Backend\Modules\Jobs;
4
5 use WPStaging\Core\WPStaging;
6 use WPStaging\Framework\Analytics\Actions\AnalyticsStagingCreate;
7 use WPStaging\Framework\Analytics\Actions\AnalyticsStagingReset;
8 use WPStaging\Framework\Analytics\Actions\AnalyticsStagingUpdate;
9 use WPStaging\Framework\Logger\EventLoggerConst;
10 use WPStaging\Staging\Sites;
11 use WPStaging\Framework\Traits\EventLoggerTrait;
12 use WPStaging\Framework\Utils\Urls;
13 use WPStaging\Staging\Jobs\StagingSiteCreate;
14
15 /**
16 * Class Finish
17 * @package WPStaging\Backend\Modules\Jobs
18 */
19 class Finish extends Job
20 {
21 use EventLoggerTrait;
22
23 /**
24 * Clone Key
25 * @var string
26 */
27 private $clone = '';
28
29 /**
30 * @var Urls
31 */
32 private $urls;
33
34 /**
35 * Start Module
36 * @return object
37 * @throws \Exception
38 */
39 public function start()
40 {
41 $this->urls = WPStaging::make(Urls::class);
42
43 // sanitize the clone name before saving
44 $this->clone = preg_replace("#\W+#", '-', strtolower($this->options->clone));
45
46 $this->deleteCacheFiles();
47
48 // Prepare clone records & save scanned directories for delete job later
49 $this->prepareCloneDataRecords();
50
51 $this->options->isRunning = false;
52
53 $return = [
54 "directoryName" => $this->options->cloneDirectoryName,
55 "path" => trailingslashit($this->options->destinationDir),
56 "url" => $this->getDestinationUrl(),
57 "number" => $this->options->cloneNumber,
58 "version" => WPStaging::getVersion(),
59 "status" => 'finished',
60 "prefix" => $this->options->prefix,
61 "last_msg" => $this->logger->getLastLogMsg(),
62 "job" => $this->options->currentJob,
63 "percentage" => 100,
64 ];
65
66 $processType = EventLoggerConst::PROCESS_PREFIX_CLONE;
67 $successMessage = "Staging site successfully created";
68 switch ($this->options->mainJob) {
69 case Job::STAGING:
70 WPStaging::make(AnalyticsStagingCreate::class)->enqueueFinishEvent($this->options->jobIdentifier, $this->options);
71 break;
72 case Job::UPDATE:
73 $processType = EventLoggerConst::PROCESS_PREFIX_CLONE_UPDATE;
74 $successMessage = 'Staging site successfully updated';
75 WPStaging::make(AnalyticsStagingUpdate::class)->enqueueFinishEvent($this->options->jobIdentifier, $this->options);
76 break;
77 case Job::RESET:
78 $processType = EventLoggerConst::PROCESS_PREFIX_CLONE_RESET;
79 $successMessage = 'Staging site successfully reset';
80 WPStaging::make(AnalyticsStagingReset::class)->enqueueFinishEvent($this->options->jobIdentifier, $this->options);
81 break;
82 }
83
84 do_action(StagingSiteCreate::ACTION_CLONING_COMPLETE, $this->options);
85
86 $this->logger->info("" . $successMessage);
87 $this->logCloneCompleted($processType);
88 return (object) $return;
89 }
90
91 /**
92 * Delete Cache Files
93 * @throws \Exception
94 */
95 protected function deleteCacheFiles()
96 {
97 $this->log("Finish: Deleting clone job's cache files...");
98
99 $this->cloneOptionCache->delete();
100 $this->filesIndexCache->delete();
101
102 $this->log("Finish: Clone job's cache files have been deleted!");
103 }
104
105 /**
106 * Prepare clone records. Without this clone data will not get updated in Sites::STAGING_SITES_OPTION during updating process.
107 *
108 * @return bool
109 */
110 protected function prepareCloneDataRecords()
111 {
112 // Check if clones still exist
113 $this->log("Finish: Verifying existing clones...");
114
115 // Clone data already exists
116 if (isset($this->options->existingClones[$this->options->clone])) {
117 if ($this->isMultisiteAndPro()) {
118 $this->options->existingClones[$this->options->clone]['url'] = $this->getDestinationUrl();
119 }
120
121 $this->options->existingClones[$this->options->clone]['datetime'] = time();
122 $this->options->existingClones[$this->options->clone]['status'] = 'finished';
123 $this->options->existingClones[$this->options->clone]['prefix'] = $this->options->prefix;
124 $this->options->existingClones[$this->options->clone]['useCustomDatabase'] = $this->isExternalDatabase();
125 $this->options->existingClones[$this->options->clone]['isCronEnabled'] = empty($this->options->isCronEnabled) ? false : true;
126 $this->options->existingClones[$this->options->clone]['isEmailsAllowed'] = (bool) $this->options->isEmailsAllowed;
127 $this->options->existingClones[$this->options->clone]['uploadsSymlinked'] = (bool) $this->options->uploadsSymlinked;
128 $this->options->existingClones[$this->options->clone]['includedTables'] = $this->options->tables;
129 $this->options->existingClones[$this->options->clone]['excludeSizeRules'] = $this->options->excludeSizeRules;
130 $this->options->existingClones[$this->options->clone]['excludeGlobRules'] = $this->options->excludeGlobRules;
131 $this->options->existingClones[$this->options->clone]['excludedDirectories'] = $this->options->excludedDirectories;
132 $this->options->existingClones[$this->options->clone]['extraDirectories'] = $this->options->extraDirectories;
133 $this->options->existingClones[$this->options->clone]['isWooSchedulerEnabled'] = empty($this->options->isWooSchedulerEnabled) ? false : true;
134 $this->options->existingClones[$this->options->clone]['isEmailsReminderEnabled'] = empty($this->options->isEmailsReminderEnabled) ? false : true;
135 $this->options->existingClones[$this->options->clone]['isAutoUpdatePlugins'] = empty($this->options->isAutoUpdatePlugins) ? false : true;
136 update_option(Sites::STAGING_SITES_OPTION, $this->options->existingClones, false);
137 $this->log("Finish: The job finished!");
138 return true;
139 }
140
141 $this->log("Finish: {$this->options->clone}'s clone job's data is not in database, generating data");
142
143 $this->options->existingClones[$this->clone] = [
144 "directoryName" => $this->options->cloneDirectoryName,
145 "path" => trailingslashit($this->options->destinationDir),
146 "url" => $this->getDestinationUrl(),
147 "number" => $this->options->cloneNumber,
148 "version" => WPStaging::getVersion(),
149 "status" => "finished",
150 "prefix" => $this->options->prefix,
151 "datetime" => time(),
152 "useCustomDatabase" => $this->isExternalDatabase(),
153 "databaseUser" => $this->options->databaseUser,
154 "databasePassword" => $this->options->databasePassword,
155 "databaseDatabase" => $this->options->databaseDatabase,
156 "databaseServer" => $this->options->databaseServer,
157 "databasePrefix" => $this->options->databasePrefix,
158 "databaseSsl" => (bool)$this->options->databaseSsl,
159 "isEmailsAllowed" => (bool) $this->options->isEmailsAllowed,
160 "uploadsSymlinked" => (bool) $this->options->uploadsSymlinked,
161 "includedTables" => $this->options->tables,
162 "excludeSizeRules" => $this->options->excludeSizeRules,
163 "excludeGlobRules" => $this->options->excludeGlobRules,
164 "excludedDirectories" => $this->options->excludedDirectories,
165 "extraDirectories" => $this->options->extraDirectories,
166 "networkClone" => $this->isNetworkClone(),
167 ];
168
169 if (update_option(Sites::STAGING_SITES_OPTION, $this->options->existingClones) === false) {
170 $this->log("Finish: Failed to save {$this->options->clone}'s clone job data to database'");
171 return false;
172 }
173
174 return true;
175 }
176
177 /**
178 * Get destination Hostname depending on whether WP has been installed in sub dir or not
179 * @return string
180 */
181 private function getDestinationUrl()
182 {
183 if (!empty($this->options->cloneHostname)) {
184 return $this->options->cloneHostname;
185 }
186
187 // if this is single site
188 if (!$this->isMultisiteAndPro()) {
189 return trailingslashit(get_site_url()) . $this->options->cloneDirectoryName;
190 }
191
192 // The relative path to the main multisite without appending a trailingslash e.g. wordpress
193 $multisitePath = defined('PATH_CURRENT_SITE') ? PATH_CURRENT_SITE : '/';
194 return rtrim($this->urls->getBaseUrl(), '/\\') . $multisitePath . $this->options->cloneDirectoryName;
195 }
196 }
197