PluginProbe ʕ •ᴥ•ʔ
WP STAGING – WordPress Backup, Restore, Migration & Clone / trunk
WP STAGING – WordPress Backup, Restore, Migration & Clone vtrunk
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 / views / settings / tabs / general.php
wp-staging / views / settings / tabs Last commit date
general.php 21 hours ago mail-settings.php 2 months ago remote-sync-settings.php 21 hours ago temporary-login.php 21 hours ago
general.php
746 lines
1 <?php
2
3 use WPStaging\Core\WPStaging;
4 use WPStaging\Framework\Facades\Escape;
5 use WPStaging\Framework\Language\Language;
6 use WPStaging\Framework\Facades\Hooks;
7 use WPStaging\Framework\Facades\UI\Toggle;
8 use WPStaging\Framework\Security\EncryptionNoticeService;
9 use WPStaging\Framework\Settings\Settings;
10 use WPStaging\Backup\BackupScheduler;
11 use WPStaging\Notifications\Notifications;
12 use WPStaging\Framework\Adapter\Directory;
13 use WPStaging\Framework\BackgroundProcessing\Queue;
14
15 $directory = WPStaging::make(Directory::class);
16 ?>
17
18 <!-- General Settings -->
19 <div class="wpstg-general-settings-wrapper">
20 <?php if (isset($_GET['settings-updated']) && $_GET['settings-updated'] === 'true') : ?>
21 <div class="wpstg-callout wpstg-callout-success wpstg-mb-6">
22 <svg class="wpstg-h-5 wpstg-w-5 wpstg-flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
23 <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z" clip-rule="evenodd"/>
24 </svg>
25 <span class="wpstg-text-sm wpstg-font-medium">
26 <?php esc_html_e('Settings updated.', 'wp-staging'); ?>
27 </span>
28 </div>
29 <?php endif; ?>
30 <div class="wpstg-provider-page-header">
31 <h1 class="wpstg-text-2xl wpstg-font-semibold wpstg-text-slate-900 dark:wpstg-text-slate-100"><?php esc_html_e('General Settings', 'wp-staging'); ?></h1>
32 <p class="wpstg-mt-1 wpstg-text-sm wpstg-text-slate-600 dark:wpstg-text-slate-400"><?php esc_html_e('Configure your staging and backup preferences', 'wp-staging'); ?></p>
33 </div>
34 <div class="wpstg-settings-container">
35 <div class="wpstg-quick-access">
36 <div class="wpstg-quick-card wpstg-card">
37 <div class="wpstg-quick-icon">
38 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M3 5V19A9 3 0 0 0 21 19V5"/><path d="M3 12A9 3 0 0 0 21 12"/></svg>
39 </div>
40 <div class="wpstg-quick-content">
41 <h3><?php esc_html_e('Database Management', 'wp-staging'); ?></h3>
42 <p><?php esc_html_e('Optimize copy and search operations', 'wp-staging'); ?></p>
43 </div>
44 </div>
45
46 <div class="wpstg-quick-card wpstg-card">
47 <div class="wpstg-quick-icon">
48 <svg class="wpstg-icon-green" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
49 <path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path>
50 </svg>
51 </div>
52 <div class="wpstg-quick-content wpstg-icon-blue">
53 <h3><?php esc_html_e('Security & Access', 'wp-staging'); ?></h3>
54 <p><?php esc_html_e('Control user permissions and access', 'wp-staging'); ?></p>
55 </div>
56 </div>
57
58 <div class="wpstg-quick-card wpstg-card">
59 <div class="wpstg-quick-icon">
60 <svg class="wpstg-icon-blue" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
61 <circle cx="12" cy="12" r="3"></circle>
62 <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
63 </svg>
64 </div>
65 <div class="wpstg-quick-content">
66 <h3><?php esc_html_e('Advanced Options', 'wp-staging'); ?></h3>
67 <p><?php esc_html_e('Fine-tune performance settings', 'wp-staging'); ?></p>
68 </div>
69 </div>
70 </div>
71 <form class="wpstg-settings-form" method="post" action="options.php">
72 <?php
73 settings_fields("wpstg_settings");
74
75 foreach ($tabs as $id => $name) :
76 if ($id === 'mail-settings' || $id === 'remote-storages' || $id === 'temporary-login' || $id === 'remote-sync-settings') {
77 continue;
78 }
79
80 /** @var \WPStaging\Core\Forms\Form */
81 $form = \WPStaging\Core\WPStaging::getInstance()->get("forms")->get($id);
82
83 if ($form === null) {
84 continue;
85 }
86 ?>
87 <div class="wpstg-settings-grid" id="<?php echo esc_attr($id) ?>__wpstg_header">
88 <div class="wpstg-settings-column">
89 <div class="wpstg-settings-card wpstg-card wpstg-settings-card-first">
90 <div class="wpstg-settings-card-header">
91 <h3 class="wpstg-settings-card-title"><?php echo esc_html__("Staging: Database & performance", "wp-staging");?></h3>
92 <p class="wpstg-settings-card-description">
93 <?php echo esc_html__("Configure database operations and performance optimization settings", "wp-staging");?>
94 </p>
95 </div>
96 <div class="wpstg-settings-card-body">
97 <div class="wpstg-settings-field wpstg-settings-has-toggle">
98 <div>
99 <div class="wpstg-settings-field-header">
100 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[queryLimit]"); ?></span>
101 <span class="wpstg-settings-field-badge wpstg-recommended"><?php echo esc_html__('Recommended', 'wp-staging');?></span>
102 </div>
103 <div class="wpstg-settings-field-description">
104 <?php
105 esc_html_e(
106 "Number of DB rows, that are queried within one request.
107 The higher the value the faster the database copy process.
108 To find out the highest possible values try a high value like 10.000 or more. If you get timeout issues, lower it
109 until you get no more errors during copying process.",
110 "wp-staging"
111 ); ?>
112 </div>
113 <div class="wpstg-settings-default-value">
114 <div>Default:</div>
115 <div>10000</div>
116 </div>
117 </div>
118 <div class="wpstg-settings-field-input">
119 <?php $form->renderInput("wpstg_settings[queryLimit]"); ?>
120 </div>
121 </div>
122 <div class="wpstg-settings-field wpstg-settings-has-toggle">
123 <div>
124 <div class="wpstg-settings-field-header">
125 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[querySRLimit]"); ?></span>
126 </div>
127 <div class="wpstg-settings-field-description">
128 <?php esc_html_e("Number of DB rows processed within one request for search and replace operations. Memory intensive process - lower values for large databases.", "wp-staging"); ?>
129 </div>
130 <div class="wpstg-settings-default-value">
131 <div>Default:</div>
132 <div>5000</div>
133 </div>
134 </div>
135 <div class="wpstg-settings-field-input">
136 <?php $form->renderInput("wpstg_settings[querySRLimit]"); ?>
137 </div>
138 </div>
139 <div class="wpstg-settings-field wpstg-settings-has-toggle">
140 <div>
141 <div class="wpstg-settings-field-header">
142 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[fileLimit]"); ?></span>
143 </div>
144 <div class="wpstg-settings-field-description">
145 <?php esc_html_e("Number of files copied within one request. Higher values speed up file copying but may cause timeouts with large file sets.", "wp-staging"); ?>
146 </div>
147 <div class="wpstg-settings-default-value">
148 <div>Default:</div>
149 <div>50</div>
150 </div>
151 </div>
152 <div class="wpstg-settings-field-input wpstg-select">
153 <?php $form->renderInput("wpstg_settings[fileLimit]"); ?>
154 </div>
155 </div>
156 <div class="wpstg-settings-field wpstg-settings-has-toggle">
157 <div>
158 <div class="wpstg-settings-field-header">
159 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[maxFileSize]"); ?></span>
160 </div>
161 <div class="wpstg-settings-field-description">
162 <?php esc_html_e("Maximum size of files that can be copied. Files larger than this will be skipped to prevent memory issues during staging.", "wp-staging"); ?>
163 </div>
164 <div class="wpstg-settings-default-value">
165 <div>Default:</div>
166 <div>8 MB</div>
167 </div>
168 </div>
169 <div class="wpstg-settings-field-input">
170 <?php $form->renderInput("wpstg_settings[maxFileSize]"); ?>
171 </div>
172 </div>
173 <div class="wpstg-settings-field wpstg-settings-has-toggle">
174 <div>
175 <div class="wpstg-settings-field-header">
176 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[batchSize]"); ?></span>
177 </div>
178 <div class="wpstg-settings-field-description">
179 <?php
180 esc_html_e(
181 "Buffer size for the file copy process in megabytes.
182 The higher the value the faster large files are copied.
183 To find out the highest possible values try a high one and lower it until
184 you get no more errors during file copy process. Usually this value correlates directly
185 with the memory consumption of PHP so make sure that
186 it does not exceed any php.ini max_memory limits.",
187 "wp-staging"
188 ); ?>
189 </div>
190 <div class="wpstg-settings-default-value">
191 <div>Default:</div>
192 <div>2 MB</div>
193 </div>
194 </div>
195 <div class="wpstg-settings-field-input">
196 <?php $form->renderInput("wpstg_settings[batchSize]"); ?>
197 </div>
198 </div>
199 <div class="wpstg-settings-field wpstg-settings-has-toggle">
200 <div>
201 <div class="wpstg-settings-field-header">
202 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[cpuLoad]"); ?></span>
203 </div>
204 <div class="wpstg-settings-field-description">
205 <?php esc_html_e("Using HIGH results in faster processing but higher CPU load. Using lower values reduces server load but slows staging site creation.", "wp-staging"); ?>
206 </div>
207 <div class="wpstg-settings-default-value">
208 <div>Default:</div>
209 <div>Low</div>
210 </div>
211 </div>
212 <div class="wpstg-settings-field-input wpstg-select">
213 <?php $form->renderInput("wpstg_settings[cpuLoad]"); ?>
214 </div>
215 </div>
216 </div>
217 </div>
218 <!-- Backups Settings -->
219 <div id="wpstg-backups" class="wpstg-settings-card wpstg-card wpstg-settings-card-first">
220 <div class="wpstg-settings-card-header">
221 <h3 class="wpstg-settings-card-title"><?php esc_html_e("Backups", "wp-staging");?></h3>
222 <p class="wpstg-settings-card-description"><?php esc_html_e("Configure how backups are created and stored.", "wp-staging");?></p>
223 </div>
224 <div class="wpstg-settings-card-body">
225 <?php if (!defined('WPSTGPRO_VERSION')) : ?>
226 <div class="wpstg-settings-field wpstg-settings-has-toggle">
227 <div>
228 <div class="wpstg-settings-field-header">
229 <span class="wpstg-settings-field-label"><?php esc_html_e('Compress Backups', 'wp-staging') ?></span>
230 <a href="<?php echo esc_url(Language::getUpgradeUrl('compress_backups')); ?>" target="_blank" rel="noopener" class="wpstg-button danger wpstg-banner-button"><?php esc_html_e('Upgrade Now', 'wp-staging');?></a>
231 </div>
232 <div class="wpstg-settings-field-description">
233 <?php echo esc_html__('This reduces backup size by up to 60%, making it especially useful for large databases.', 'wp-staging'); ?>
234 </div>
235 </div>
236 <div class="wpstg-settings-field-input">
237 <?php
238 Toggle::render('wpstg-compress-backups', 'wpstg_settings[enableCompression]', 'false', false, ['classes' => 'wpstg-settings-field', 'isDisabled' => true]);
239 ?>
240 </div>
241 </div>
242 <?php else : ?>
243 <div class="wpstg-settings-field wpstg-settings-has-toggle">
244 <div>
245 <div class="wpstg-settings-field-header">
246 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[enableCompression]"); ?></span>
247 <span class="wpstg-settings-field-badge wpstg-recommended"><?php echo esc_html__('Recommended', 'wp-staging');?></span>
248 </div>
249 <div class="wpstg-settings-field-description">
250 <?php echo esc_html__('This reduces backup size by up to 60%, making it especially useful for large databases.', 'wp-staging'); ?>
251 </div>
252 </div>
253 <div class="wpstg-settings-field-input">
254 <?php $form->renderInput("wpstg_settings[enableCompression]"); ?>
255 </div>
256 </div>
257 <?php endif; ?>
258 </div>
259 </div>
260 <!-- /Backups Settings -->
261
262 <!-- Notifications Settings -->
263 <div id="wpstg-notifications" class="wpstg-settings-card wpstg-card">
264 <div class="wpstg-settings-card-header">
265 <h3 class="wpstg-settings-card-title"><?php esc_html_e("Notifications", "wp-staging");?></h3>
266 <p class="wpstg-settings-card-description"><?php esc_html_e("Configure email and Slack alerts for backup and remote sync events.", "wp-staging");?></p>
267 </div>
268 <div class="wpstg-settings-card-body">
269 <div class="wpstg-settings-field wpstg-settings-has-toggle wpstg-notification-toggles">
270 <div class="wpstg-notification-toggles-header">
271 <span class="wpstg-settings-field-label"><?php esc_html_e('Email Notifications', 'wp-staging'); ?></span>
272 </div>
273 <div class="wpstg-notification-toggles-input">
274 <div class="wpstg-notification-toggle-row">
275 <div class="wpstg-notification-toggle-label">
276 <?php esc_html_e('Errors', 'wp-staging'); ?>
277 </div>
278 <div class="wpstg-notification-toggle-switch">
279 <?php
280 $isErrorCheckboxChecked = get_option(BackupScheduler::OPTION_BACKUP_SCHEDULE_ERROR_REPORT) === 'true';
281 Toggle::render('wpstg-send-schedules-error-report', 'wpstg_settings[schedulesErrorReport]', 'true', $isErrorCheckboxChecked, ['classes' => 'wpstg-settings-field']);
282 ?>
283 </div>
284 </div>
285 <div class="wpstg-notification-toggle-row">
286 <div class="wpstg-notification-toggle-label">
287 <?php esc_html_e('Warnings', 'wp-staging'); ?>
288 </div>
289 <div class="wpstg-notification-toggle-switch">
290 <?php
291 $isWarningCheckboxChecked = get_option(BackupScheduler::OPTION_BACKUP_SCHEDULE_WARNING_REPORT) === 'true';
292 Toggle::render('wpstg-send-schedules-warning-report', 'wpstg_settings[schedulesWarningReport]', 'true', $isWarningCheckboxChecked, ['classes' => 'wpstg-settings-field']);
293 ?>
294 </div>
295 </div>
296 <div class="wpstg-notification-toggle-row">
297 <div class="wpstg-notification-toggle-label">
298 <?php esc_html_e('General Backup Status', 'wp-staging'); ?>
299 </div>
300 <div class="wpstg-notification-toggle-switch">
301 <?php
302 $isGeneralCheckboxChecked = get_option(BackupScheduler::OPTION_BACKUP_SCHEDULE_GENERAL_REPORT) === 'true';
303 Toggle::render('wpstg-send-schedules-general-report', 'wpstg_settings[schedulesGeneralReport]', 'true', $isGeneralCheckboxChecked, ['classes' => 'wpstg-settings-field']);
304 ?>
305 </div>
306 </div>
307 </div>
308 </div>
309 <div class="wpstg-email-controls-container wpstg-two-column-settings <?php echo $isErrorCheckboxChecked || $isWarningCheckboxChecked || $isGeneralCheckboxChecked ? '' : 'hidden';?>" id="wpstg-send-schedules-email-notification-input">
310 <div class="wpstg-settings-field wpstg-settings-has-toggle">
311 <div>
312 <div class="wpstg-settings-field-header">
313 <span class="wpstg-settings-field-label"><?php esc_html_e('Email Address', 'wp-staging'); ?></span>
314 </div>
315 <div class="wpstg-settings-field-description">
316 <?php esc_html_e('Send emails to this address', 'wp-staging'); ?>
317 </div>
318 </div>
319 <div class="wpstg-settings-field-input">
320 <input type="text" id="wpstg-send-schedules-report-email" name="wpstg_settings[schedulesReportEmail]" value="<?php echo esc_attr(get_option(Notifications::OPTION_BACKUP_SCHEDULE_REPORT_EMAIL)) ?>"/>
321 </div>
322 <div>
323 <div class="wpstg-settings-field-header">
324 <span class="wpstg-settings-field-label"><?php esc_html_e('Email as HTML', 'wp-staging') ?></span>
325 </div>
326 <div class="wpstg-settings-field-description">
327 <?php esc_html_e('Send emails as HTML', 'wp-staging') ?>
328 </div>
329 </div>
330 <div class="wpstg-settings-field-input">
331 <?php
332 $isCheckboxChecked = get_option(\WPStaging\Notifications\Notifications::OPTION_SEND_EMAIL_AS_HTML) === 'true';
333 Toggle::render('wpstg-send-email-as-html', 'wpstg_settings[emailAsHTML]', 'true', $isCheckboxChecked);
334 ?>
335 </div>
336 </div>
337 </div>
338 <?php
339 $attrDisabled = defined('WPSTGPRO_VERSION') ? '' : ' disabled';
340 ?>
341 <div class="wpstg-settings-field wpstg-settings-has-toggle">
342 <div>
343 <div class="wpstg-settings-field-header">
344 <span class="wpstg-settings-field-label"><?php esc_html_e('Slack Notifications', 'wp-staging'); ?></span>
345 <?php if (!defined('WPSTGPRO_VERSION')) : ?>
346 <a href="<?php echo esc_url(Language::getUpgradeUrl('slack_notifications')); ?>" target="_blank" rel="noopener" class="wpstg-button danger wpstg-banner-button"><?php esc_html_e('Upgrade Now', 'wp-staging');?></a>
347 <?php endif; ?>
348 </div>
349 <div class="wpstg-settings-field-description">
350 <?php esc_html_e('If a scheduled backup fails, send a report to the Slack channel.', 'wp-staging'); ?>
351 </div>
352 </div>
353 <div class="wpstg-settings-field-input">
354 <?php
355 $isCheckboxChecked = get_option(BackupScheduler::OPTION_BACKUP_SCHEDULE_SLACK_ERROR_REPORT) === 'true';
356 Toggle::render('wpstg-send-schedules-slack-error-report', 'wpstg_settings[schedulesSlackErrorReport]', 'true', $isCheckboxChecked, ['classes' => 'wpstg-settings-field', 'isDisabled' => !empty($attrDisabled)]);
357 ?>
358 </div>
359 </div>
360 <div class="wpstg-settings-field <?php echo $isCheckboxChecked && defined('WPSTGPRO_VERSION') ? '' : 'hidden';?>" id="wpstg-send-schedules-slack-error-report-input">
361 <div>
362 <div class="wpstg-settings-field-header">
363 <label for="wpstg-send-schedules-report-slack-webhook" class="wpstg-settings-field-label"><?php esc_html_e('Slack Webhook URL', 'wp-staging'); ?></label>
364 </div>
365 <div class="wpstg-settings-field-description">
366 <?php
367 $link = '<a href="https://api.slack.com/messaging/webhooks" target="_blank" rel="noopener">' .
368 esc_html__('Slack webhooks documentation', 'wp-staging') .
369 '</a>';
370 echo wp_kses_post(sprintf(
371 /* translators: %s is a link to Slack webhook documentation */
372 Escape::escapeHtml(__('Send Slack notifications by using a Webhook URL. Read the %s to learn how to create one.', 'wp-staging')),
373 $link
374 ));
375 ?>
376 </div>
377 </div>
378 <div class="wpstg-settings-field-input">
379 <input type="text" id="wpstg-send-schedules-report-slack-webhook" name="wpstg_settings[schedulesReportSlackWebhook]" class="wpstg-settings-field" value="<?php echo esc_attr(get_option(BackupScheduler::OPTION_BACKUP_SCHEDULE_REPORT_SLACK_WEBHOOK)) ?>"<?php echo esc_attr($attrDisabled);?>/>
380 </div>
381 </div>
382 </div>
383 </div>
384 <!-- /Notifications Settings -->
385 </div>
386 <div class="wpstg-settings-column">
387 <!-- Access Control Settings -->
388 <div class="wpstg-settings-card wpstg-card wpstg-settings-card-fixed">
389 <div class="wpstg-settings-card-header">
390 <h3 class="wpstg-settings-card-title"><?php esc_html_e("Access Control", "wp-staging");?></h3>
391 <p class="wpstg-settings-card-description"><?php esc_html_e("Manage user permissions and access control for staging operations", "wp-staging");?></p>
392 </div>
393 <div class="wpstg-settings-card-body">
394 <?php if (defined("WPSTGPRO_VERSION")) : ?>
395 <?php Hooks::callInternalHook(Settings::ACTION_WPSTG_PRO_SETTINGS, [$form]); ?>
396 <?php else :?>
397 <div class="wpstg-settings-field wpstg-settings-has-toggle">
398 <div>
399 <div class="wpstg-settings-field-header">
400 <span class="wpstg-settings-field-label">
401 <?php echo esc_html__("Keep Permalinks", "wp-staging"); ?>
402 </span>
403 <a href="<?php echo esc_url(Language::getUpgradeUrl('keep_permalinks')); ?>" target="_blank" rel="noopener" class="wpstg-button danger wpstg-banner-button"><?php esc_html_e('Upgrade Now', 'wp-staging');?></a>
404 </div>
405 <div class="wpstg-settings-field-description">
406 <?php
407 echo wp_kses_post(sprintf(
408 __(
409 'Use on the staging site the same permalink structure and do not set permalinks to plain structure. <br/>Read more: <a href="%1$s" target="_blank">Permalink Settings</a> ',
410 'wp-staging'
411 ),
412 'https://wp-staging.com/docs/activate-permalinks-staging-site/'
413 )); ?>
414 </div>
415 </div>
416 <div class="wpstg-settings-field-input">
417 <?php Toggle::render('wpstg-keep-permalinks', 'wpstg-keep-permalinks', 'false', false, ['classes' => 'wpstg-settings-field', 'isDisabled' => true]); ?>
418 </div>
419 </div>
420
421 <div class="wpstg-settings-field">
422 <div>
423 <div class="wpstg-settings-field-header">
424 <span class="wpstg-settings-field-label">
425 <?php echo esc_html__("Access Permissions", "wp-staging"); ?>
426 </span>
427 <a href="<?php echo esc_url(Language::getUpgradeUrl('access_permissions')); ?>" target="_blank" rel="noopener" class="wpstg-button danger wpstg-banner-button"><?php esc_html_e('Upgrade Now', 'wp-staging');?></a>
428 </div>
429 <div class="wpstg-settings-field-description">
430 <?php
431 echo Escape::escapeHtml(__(
432 'Select the user role you want to give access to the staging site. You can select multiple roles by holding CTRL or ⌘ Cmd key while clicking. <strong>Change this option on the staging site if you want to change the authentication behavior there.</strong>',
433 'wp-staging'
434 )); ?>
435 </div>
436 </div>
437 <div class="wpstg-settings-field-input wpstg-select wpstg-multi-select">
438 <?php
439 $roles = wp_roles()->get_names();
440 echo '<select multiple disabled>';
441 echo '<option value="all">Allow access from all visitors</option>';
442
443 foreach ($roles as $key => $name) {
444 echo '<option value="' . esc_attr($key) . '">' . esc_html($name) . '</option>';
445 }
446
447 echo '</select>';
448 ?>
449 </div>
450 </div>
451 <div class="wpstg-settings-field">
452 <div>
453 <div class="wpstg-settings-field-header">
454 <label class="wpstg-settings-field-label">
455 <?php echo esc_html__("Users With Staging Access", "wp-staging"); ?>
456 </label>
457 <a href="<?php echo esc_url(Language::getUpgradeUrl('staging_access_users')); ?>" target="_blank" rel="noopener" class="wpstg-button danger wpstg-banner-button"><?php esc_html_e('Upgrade Now', 'wp-staging');?></a>
458 </div>
459 <div class="wpstg-settings-field-description">
460 <?php
461 echo Escape::escapeHtml(__(
462 'Specify users who will have access to the staging site regardless of their role. You can enter multiple user names separated by a comma. <strong>Change this option on the staging site if you want to change the authentication behavior there.</strong>',
463 'wp-staging'
464 )); ?>
465 </div>
466 </div>
467 <div class="wpstg-settings-field-input">
468 <input type="text" value="" name="wpstg-users-with-staging-access" disabled>
469 </div>
470 </div>
471 <div class="wpstg-settings-field wpstg-settings-has-toggle">
472 <div>
473 <div class="wpstg-settings-field-header">
474 <label class="wpstg-settings-field-label">
475 <?php echo esc_html__("Admin Bar Background Color", "wp-staging"); ?>
476 </label>
477 <a href="<?php echo esc_url(Language::getUpgradeUrl('admin_bar_color')); ?>" target="_blank" rel="noopener" class="wpstg-button danger wpstg-banner-button"><?php esc_html_e('Upgrade Now', 'wp-staging');?></a>
478 </div>
479 <div class="wpstg-settings-field-description">
480 </div>
481 </div>
482 <div class="wpstg-settings-field-input">
483 <input type="color" value="#ff8d00" disabled>
484 </div>
485 </div>
486 <div class="wpstg-settings-field wpstg-settings-has-toggle">
487 <div>
488 <div class="wpstg-settings-field-header">
489 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[disableAdminLogin]"); ?></span>
490 </div>
491 <div class="wpstg-settings-field-description">
492 <?php esc_html_e("Disable the additional login form on the staging site. Search engine indexing is always blocked via the 'noindex' tag, regardless of this setting.", "wp-staging"); ?>
493 </div>
494 </div>
495 <div class="wpstg-settings-field-input">
496 <?php $form->renderInput("wpstg_settings[disableAdminLogin]"); ?>
497 </div>
498 </div>
499 <?php endif; ?>
500 <?php if (defined('WPSTGPRO_VERSION') && $this->siteInfo->isStagingSite()) : ?>
501 <div class="wpstg-settings-field wpstg-settings-has-toggle">
502 <div>
503 <div class="wpstg-settings-field-header">
504 <span class="wpstg-settings-field-label">
505 <?php esc_html_e('Allow Cloning (Staging Site Only)', 'wp-staging') ?>
506 </span>
507 </div>
508 <div class="wpstg-settings-field-description">
509 <?php esc_html_e('Check this box to make this staging site cloneable.', 'wp-staging') ?>
510 <?php echo sprintf(__("If you would like to know more about cloning staging sites check out <a href='%s' target='_new'>this article</a>.", 'wp-staging'), 'https://wp-staging.com/docs/cloning-a-staging-site-testing-push-method/'); ?>
511 </div>
512 </div>
513 <div class="wpstg-settings-field-input">
514 <?php Toggle::render('wpstg-is-staging-cloneable', 'wpstg_settings[isStagingSiteCloneable]', 'true', $this->siteInfo->isCloneable(), ['classes' => 'wpstg-settings-field']); ?>
515 </div>
516 </div>
517 <?php endif; ?>
518 </div>
519 </div>
520 <!-- Access Control Settings -->
521 <!-- Debug & System Settings -->
522 <div class="wpstg-settings-card wpstg-card">
523 <div class="wpstg-settings-card-header">
524 <h3 class="wpstg-settings-card-title"><?php esc_html_e("System & Debugging", "wp-staging");?></h3>
525 <p class="wpstg-settings-card-description"><?php esc_html_e("Advanced system settings and debugging options", "wp-staging");?></p>
526 </div>
527 <div class="wpstg-settings-card-body">
528 <div class="wpstg-settings-field wpstg-settings-has-toggle">
529 <div>
530 <div class="wpstg-settings-field-header">
531 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[debugMode]"); ?></span>
532 <span class="wpstg-settings-field-badge wpstg-caution"><?php echo esc_html__('Caution', 'wp-staging');?></span>
533 </div>
534 <div class="wpstg-settings-field-description">
535 <?php
536 esc_html_e(
537 "Enable a debug mode that creates log entries in wp-content/uploads/wp-staging/logs/logfile.log.",
538 "wp-staging"
539 );
540 ?>
541 <strong>
542 <?php esc_attr_e('It\'s not recommended to activate this until we ask you to do so!', 'wp-staging') ?>
543 </strong>
544 </div>
545 </div>
546 <div class="wpstg-settings-field-input">
547 <?php $form->renderInput("wpstg_settings[debugMode]"); ?>
548 </div>
549 </div>
550
551 <div class="wpstg-settings-field wpstg-settings-has-toggle">
552 <div>
553 <div class="wpstg-settings-field-header">
554 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[optimizer]"); ?></span>
555 <span class="wpstg-settings-field-badge wpstg-recommended"><?php esc_html_e("Recommended", "wp-staging");?></span>
556 </div>
557 <div class="wpstg-settings-field-description">
558 <?php
559 esc_html_e(
560 "The Optimizer is a mu-plugin that disables all other plugins during staging and backup operations.
561 This lowers memory consumption and speeds up processing. It should always be enabled!",
562 "wp-staging"
563 ); ?>
564 </div>
565 </div>
566 <div class="wpstg-settings-field-input">
567 <?php $form->renderInput("wpstg_settings[optimizer]"); ?>
568 </div>
569 </div>
570 <div class="wpstg-settings-field wpstg-settings-has-toggle">
571 <div>
572 <div class="wpstg-settings-field-header">
573 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[unInstallOnDelete]"); ?></span>
574 <span class="wpstg-settings-field-badge wpstg-caution"><?php echo esc_html__('Caution', 'wp-staging');?></span>
575 </div>
576 <div class="wpstg-settings-field-description">
577 <?php
578 esc_html_e(
579 "Remove all WP STAGING settings and data on uninstall. Staging site data, backups, and related database tables will not be deleted unless empty.",
580 "wp-staging"
581 );
582 ?>
583 <br><br>
584 <strong><?php echo esc_html__("Note:", "wp-staging"); ?></strong>
585 <br>
586 <?php
587 echo sprintf(
588 esc_html__("The backups folder %s will only be deleted if it does not contain any backup files.", "wp-staging"),
589 "<strong>" . esc_html($directory->getBackupDirectory()) . "</strong>"
590 );
591 ?>
592 <br>
593 <?php esc_html_e("Staging site data is never deleted while staging sites exist.", "wp-staging");?>
594 </div>
595 </div>
596 <div class="wpstg-settings-field-input">
597 <?php $form->renderInput("wpstg_settings[unInstallOnDelete]"); ?>
598 </div>
599 </div>
600 </div>
601 </div>
602 <!-- Debug & System Settings -->
603 <!-- Network Settings -->
604 <?php $httpAuthCredentials = get_option(Queue::OPTION_HTTP_AUTH_CREDENTIALS, []); ?>
605 <?php $hasHttpAuthCredentials = !empty($httpAuthCredentials['username']); ?>
606 <div class="wpstg-settings-card wpstg-card">
607 <div class="wpstg-settings-card-header">
608 <h3 class="wpstg-settings-card-title !wpstg-me-2"><?php esc_html_e("WP Admin HTTP Basic Auth", "wp-staging"); ?></h3>
609 <p class="wpstg-settings-card-description"><?php esc_html_e("Only fill this in if your /wp-admin is protected with HTTP Basic Authentication (browser login prompt). Background tasks (scans, updates, scheduled jobs) can't access wp-admin without these credentials and may fail. If you don't use HTTP Basic Auth for wp-admin, leave both fields blank.", "wp-staging"); ?></p>
610 </div>
611 <div class="wpstg-settings-card-body">
612 <div class="wpstg-settings-field wpstg-settings-has-toggle">
613 <div>
614 <div class="wpstg-settings-field-header">
615 <label class="wpstg-settings-field-label"><?php esc_html_e('My wp-admin is protected with HTTP Basic Auth', 'wp-staging'); ?></label>
616 </div>
617 </div>
618 <div class="wpstg-settings-field-input">
619 <?php Toggle::render('wpstg-http-basic-auth-active', '', '', $hasHttpAuthCredentials, ['classes' => 'wpstg-settings-field']); ?>
620 </div>
621 </div>
622 <div id="wpstg-http-basic-auth-fields" <?php echo $hasHttpAuthCredentials ? '' : 'class="hidden"'; ?>>
623 <div class="wpstg-mb-4">
624 <?php
625 /** @var EncryptionNoticeService */
626 $encryptionNoticeService = WPStaging::make(EncryptionNoticeService::class);
627 $encryptionNoticeService->renderEncryptedNotice(Queue::OPTION_HTTP_AUTH_CREDENTIALS, 'password', 'HTTP Basic Auth');
628 ?>
629 </div>
630 <div class="wpstg-settings-field wpstg-settings-has-toggle">
631 <div>
632 <div class="wpstg-settings-field-header">
633 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[httpAuthUsername]"); ?></span>
634 <span class="wpstg-settings-field-badge wpstg-badge-gray wpstg-icon-person"><?php echo esc_html__('Username', 'wp-staging'); ?></span>
635 </div>
636 <div class="wpstg-settings-field-description">
637 <?php esc_html_e('The HTTP Basic Auth username required to access /wp-admin.', 'wp-staging'); ?>
638 </div>
639 </div>
640 <div class="wpstg-settings-field-input">
641 <div class="wpstg-settings-field-input-with-icon wpstg-icon-person">
642 <?php $form->renderInput("wpstg_settings[httpAuthUsername]"); ?>
643 </div>
644 </div>
645 </div>
646 <div class="wpstg-settings-field wpstg-settings-has-toggle">
647 <div>
648 <div class="wpstg-settings-field-header">
649 <span class="wpstg-settings-field-label"><?php $form->renderLabel("wpstg_settings[httpAuthPassword]"); ?></span>
650 <span class="wpstg-settings-field-badge wpstg-badge-gray wpstg-icon-lock"><?php echo esc_html__('Password', 'wp-staging'); ?></span>
651 </div>
652 <div class="wpstg-settings-field-description">
653 <?php esc_html_e('The HTTP Basic Auth password for the username above.', 'wp-staging'); ?>
654 </div>
655 </div>
656 <div class="wpstg-settings-field-input">
657 <div class="wpstg-password-toggle-wrapper wpstg-settings-field-input-with-icon wpstg-icon-lock">
658 <?php $form->renderInput("wpstg_settings[httpAuthPassword]"); ?>
659 <?php require WPSTG_VIEWS_DIR . '_main/partials/password-toggle-button.php'; ?>
660 </div>
661 </div>
662 </div>
663 <div class="wpstg-callout wpstg-callout-warning wpstg-mt-4">
664 <svg class="wpstg-h-5 wpstg-w-5 wpstg-flex-shrink-0" fill="currentColor" viewBox="0 0 20 20">
665 <path fill-rule="evenodd" d="M8.485 2.495c.673-1.167 2.357-1.167 3.03 0l6.28 10.875c.673 1.167-.168 2.625-1.516 2.625H3.72c-1.347 0-2.189-1.458-1.515-2.625L8.485 2.495zM10 6a.75.75 0 01.75.75v3.5a.75.75 0 01-1.5 0v-3.5A.75.75 0 0110 6zm0 9a1 1 0 100-2 1 1 0 000 2z" clip-rule="evenodd"/>
666 </svg>
667 <span class="wpstg-text-sm wpstg-font-medium">
668 <?php esc_html_e('Without these credentials, background processing may not run on sites with protected wp-admin.', 'wp-staging'); ?>
669 </span>
670 </div>
671 <div class="wpstg-mt-4">
672 <button type="button" class="wpstg-btn wpstg-btn-sm wpstg-btn-secondary" id="wpstg-test-http-auth">
673 <svg class="wpstg-btn-icon-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
674 <path d="M22 11.08V12a10 10 0 1 1-5.93-9.14"></path>
675 <polyline points="22 4 12 14.01 9 11.01"></polyline>
676 </svg>
677 <?php esc_html_e('Test Connection', 'wp-staging'); ?>
678 </button>
679 <div id="wpstg-http-auth-test-result" class="wpstg-mt-3 hidden"></div>
680 </div>
681 </div>
682 </div>
683 </div>
684 <!-- Network Settings -->
685 </div>
686 </div>
687 <?php if (defined('WPSTGPRO_VERSION')) : ?>
688 <div class="wpstg-settings-card wpstg-card wpstg-full-width">
689 <div class="wpstg-settings-card-header">
690 <h3 class="wpstg-settings-card-title"><?php esc_html_e("Usage Information", "wp-staging");?></h3>
691 <p class="wpstg-settings-card-description"><?php esc_html_e("Help improve this plugin by sharing anonymous usage data.", "wp-staging");?></p>
692 </div>
693 <div class="wpstg-settings-card-body">
694 <div class="wpstg-settings-field wpstg-settings-has-toggle">
695 <div>
696 <div class="wpstg-settings-field-header">
697 <label class="wpstg-settings-field-label"><?php esc_html_e("Send Usage Information", "wp-staging");?></label>
698 </div>
699 <div class="wpstg-settings-field-description">
700 <?php esc_html_e("Send usage information to wp-staging.com to help improve the plugin. No personal data is collected.", "wp-staging");
701 echo '<br/><i>' . wp_kses_post(sprintf(__('See the data we collect <a href="%s" target="_blank">here</a>', 'wp-staging'), 'https://wp-staging.com/what-data-do-we-collect/')) . '</i>';
702 ?>
703 </div>
704 </div>
705 <div class="wpstg-settings-field-input">
706 <?php
707 $analytics = \WPStaging\Core\WPStaging::make(\WPStaging\Framework\Analytics\AnalyticsConsent::class);
708 $analyticsAllowed = $analytics->hasUserConsent();
709 $isChecked = $analyticsAllowed === '1' || $analyticsAllowed === true;
710 ?>
711 <span id="wpstg-analytics-consent-allowed-link" data-href="<?php echo esc_url($analytics->getConsentLink(true)) ?>"></span>
712 <span id="wpstg-analytics-consent-decline-link" data-href="<?php echo esc_url($analytics->getConsentLink(false)) ?>"></span>
713 <?php
714 Toggle::render('wpstg-analytics-consent', 'analytics_consent', 'true', $isChecked, ['classes' => 'wpstg-settings-field']);
715 ?>
716 </div>
717 </div>
718 </div>
719 </div>
720 <?php endif; ?>
721 <?php
722 endforeach;
723 ?>
724 <div class="wpstg-settings-actions wpstg-card">
725 <button type="button" class="wpstg-btn wpstg-btn-md wpstg-btn-secondary" id="wpstg-reset-settings-to-defaults">
726 <svg class="wpstg-btn-icon-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
727 <path d="M3 6h18l-2 13H5L3 6z"></path>
728 <path d="M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2"></path>
729 </svg>
730 <?php echo esc_html__('Reset to Defaults', 'wp-staging');?>
731 </button>
732 <button type="submit" class="wpstg-btn wpstg-btn-md wpstg-btn-primary">
733 <svg class="wpstg-btn-icon-sm" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
734 <path d="M19 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11l5 5v11a2 2 0 0 1-2 2z"></path>
735 <polyline points="17,21 17,13 7,13 7,21"></polyline>
736 <polyline points="7,3 7,8 15,8"></polyline>
737 </svg>
738 <?php echo esc_html__('Save Changes', 'wp-staging');?>
739 </button>
740 </div>
741 <?php
742 unset($tabs);
743 ?>
744 </form>
745 </div>
746 </div>