PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backups, Restore, Migration & Clone / trunk
WP STAGING – WordPress Backups, Restore, Migration & Clone vtrunk
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 / Backup / Ajax / Parts.php
wp-staging / Backup / Ajax Last commit date
Backup 5 days ago FileList 5 days ago Restore 5 days ago Backup.php 5 days ago BackupDownloader.php 5 days ago BackupSizeCalculator.php 5 days ago BackupSpeedIndex.php 5 days ago BaseFileList.php 5 days ago BaseListing.php 5 days ago Delete.php 5 days ago Edit.php 1 day ago Explore.php 5 days ago ExploreCache.php 5 days ago FileInfo.php 5 days ago FileList.php 5 days ago Listing.php 5 days ago Parts.php 5 days ago Restore.php 5 days ago ScheduleList.php 5 days ago Upload.php 5 days ago
Parts.php
200 lines
1 <?php
2
3
4
5 namespace WPStaging\Backup\Ajax;
6
7 use WPStaging\Backup\Entity\BackupMetadata;
8 use WPStaging\Backup\Exceptions\BackupRuntimeException;
9 use WPStaging\Backup\Service\BackupsFinder;
10 use WPStaging\Backup\Utils\BackupPathResolver;
11 use WPStaging\Framework\Component\AbstractTemplateComponent;
12 use WPStaging\Framework\Facades\Sanitize;
13 use WPStaging\Framework\TemplateEngine\TemplateEngine;
14 use WPStaging\Framework\Utils\Urls;
15
16 class Parts extends AbstractTemplateComponent
17 {
18
19
20
21 private $backupsFinder;
22
23
24
25
26 private $backupPathResolver;
27
28
29
30
31 private $urls;
32
33 public function __construct(TemplateEngine $templateEngine, BackupsFinder $backupsFinder, BackupPathResolver $backupPathResolver, Urls $urls)
34 {
35 parent::__construct($templateEngine);
36 $this->backupsFinder = $backupsFinder;
37 $this->backupPathResolver = $backupPathResolver;
38 $this->urls = $urls;
39 }
40
41
42
43
44 public function render()
45 {
46 if (!$this->canRenderAjax()) {
47 wp_send_json([
48 'error' => true,
49 'message' => 'You are not allowed to access this page!',
50 ]);
51 }
52
53 $backupDir = wp_normalize_path($this->backupsFinder->getBackupsDirectory());
54 $indexFile = isset($_POST['filePath']) ? Sanitize::sanitizePath($_POST['filePath']) : '';
55
56 if ($indexFile === '') {
57 wp_send_json([
58 'error' => true,
59 'message' => 'Backup file path not provided!',
60 ]);
61 }
62
63 $file = $this->backupPathResolver->resolveBackupPath($indexFile);
64 if ($file === '') {
65 wp_send_json([
66 'error' => true,
67 'message' => 'Invalid backup file path!',
68 ]);
69 }
70
71 $info = null;
72 try {
73 $info = (new BackupMetadata())->hydrateByFilePath($file);
74 } catch (\Exception $e) {
75 wp_send_json([
76 'error' => true,
77 'message' => $e->getMessage(),
78 ]);
79 }
80
81 $metadata = $info->getMultipartMetadata();
82
83 $parts = array_merge(
84 $this->addParts('Database', $metadata->getDatabaseParts(), $backupDir),
85 $this->addParts('Medias', $metadata->getUploadsParts(), $backupDir),
86 $this->addParts('Themes', $metadata->getThemesParts(), $backupDir),
87 $this->addParts('Plugins', $metadata->getPluginsParts(), $backupDir),
88 $this->addParts('Mu Plugins', $metadata->getMuPluginsParts(), $backupDir),
89 $this->addParts('Others', $metadata->getOthersParts(), $backupDir),
90 $this->addParts('Root Files', $metadata->getOtherWpRootParts(), $backupDir)
91 );
92
93 $result = $this->renderTemplate('backup/modal/backup-parts.php', [
94 'backupParts' => $parts,
95 ]);
96 wp_send_json($result);
97 }
98
99
100
101
102
103
104 private function getFullPath(string $backupDir, string $relativePath): string
105 {
106 return trailingslashit($backupDir) . basename(wp_normalize_path($relativePath));
107 }
108
109
110
111
112
113
114
115
116
117
118 private function getPart(string $type, int $key, string $fileName, string $fullPath, int $totalParts): array
119 {
120 $partName = $type;
121 $currentKey = $key + 1;
122 $partType = strtolower(str_replace(' ', '_', $type));
123 $partIndex = '';
124 if ($totalParts > 1) {
125 $partIndex .= " {$currentKey} / {$totalParts}";
126 }
127
128 return [
129 'partType' => $partType,
130 'partIndex' => $partIndex,
131 'description' => $this->getPartDescription($partType),
132 'icon' => $this->getIcon($partType),
133 'name' => $partName,
134 'fileSize' => size_format(filesize($fullPath), 2),
135 'downloadLink' => $this->urls->getBackupUrl() . $fileName,
136 ];
137 }
138
139
140
141
142
143
144
145
146 private function addParts(string $type, array $files, string $backupDir): array
147 {
148 $total = count($files);
149 $parts = [];
150
151 foreach ($files as $key => $fileName) {
152 $fullPath = $this->getFullPath($backupDir, $fileName);
153 $parts[] = $this->getPart($type, $key, $fileName, $fullPath, $total);
154 }
155
156 return $parts;
157 }
158
159
160
161
162
163 private function getIcon(string $partType): string
164 {
165 $icons = [
166 'database' => 'database',
167 'plugins' => 'admin-plugins',
168 'mu_plugins' => 'plugins-checked',
169 'themes' => 'layout',
170 'medias' => 'images-alt',
171 'others' => 'admin-generic',
172 'root_files' => 'root-folder',
173 ];
174 if (isset($icons[$partType])) {
175 return $icons[$partType];
176 }
177
178 return '';
179 }
180
181 private function getPartDescription(string $partType): string
182 {
183 $partsDesc = [
184 'database' => __('Complete WordPress database with all content and settings.', 'wp-staging'),
185 'plugins' => __('All installed WordPress plugins and their configurations.', 'wp-staging'),
186 'mu_plugins' => __('Must-use plugins that are always active.', 'wp-staging'),
187 'themes' => __('WordPress themes, customizations, and design assets.', 'wp-staging'),
188 'medias' => __('Media files such as images or documents in the media library.', 'wp-staging'),
189 'others' => __('Files in wp-content excl. plugins, themes, uploads and mu-plugins.', 'wp-staging'),
190 'root_files' => __('Root folders only: excludes wp-config.php and staging sites.', 'wp-staging'),
191 ];
192
193 if (isset($partsDesc[$partType])) {
194 return $partsDesc[$partType];
195 }
196
197 return '';
198 }
199 }
200