PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.87
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.87
51.1.87 51.1.86 51.1.84 51.1.85 51.1.83 51.1.82 51.1.81 51.1.79 51.1.78 51.1.77 51.1.76 51.1.74 51.1.75 51.1.65 51.1.64 51.1.63 trunk 51.1.14 51.1.2 51.1.35 51.1.36 51.1.37 51.1.38 51.1.39 51.1.44 All 41 releases
← All changes | includes/extensions/Maintenance_Mode/templates/view-schedule.php +262 -12 51.1.44 → 51.1.87 View file →
@@ -10,8 +10,39 @@
10 10 }
11 11
12 12 $schedule_start = $settings['schedule_start'] ? get_date_from_gmt($settings['schedule_start'], 'Y-m-d\\TH:i') : '';
13 13 $schedule_end = $settings['schedule_end'] ? get_date_from_gmt($settings['schedule_end'], 'Y-m-d\\TH:i') : '';
14 +
15 +$schedule_windows = $settings['schedule_windows'] ?? [];
16 +if (!is_array($schedule_windows)) {
17 + $schedule_windows = [];
18 +}
19 +
20 +if ($schedule_windows === [] && ($schedule_start !== '' || $schedule_end !== '')) {
21 + $schedule_windows[] = [
22 + 'start' => $settings['schedule_start'] ?? '',
23 + 'end' => $settings['schedule_end'] ?? '',
24 + 'timezone' => 'site',
25 + ];
26 +}
27 +
28 +$recurring_enabled = !empty($settings['recurring_enabled']);
29 +$recurring_rules = $settings['recurring_rules'] ?? [];
30 +if (!is_array($recurring_rules)) {
31 + $recurring_rules = [];
32 +}
33 +
34 +$site_timezone = function_exists('wp_timezone_string') ? wp_timezone_string() : 'UTC';
35 +$timezone_list = function_exists('timezone_identifiers_list') ? timezone_identifiers_list() : [];
36 +
37 +function kng_mm_dt_local($gmt)
38 +{
39 + if (!$gmt) {
40 + return '';
41 + }
42 +
43 + return get_date_from_gmt($gmt, 'Y-m-d\\TH:i');
44 +}
14 45 ?>
15 46
16 47 <form method="post" action="options.php">
17 48 <?php settings_fields('kng_maintenance_settings_group'); ?>
@@ -45,24 +76,243 @@
45 76
46 77 <div class="ka-card">
47 78 <div class="ka-card-header">
48 79 <span class="dashicons dashicons-lock pink"></span>
49 - <h2><?php esc_html_e('Recurring Schedules', 'king-addons'); ?></h2>
50 - <?php if (!$is_pro) : ?><span class="ka-pro-badge">PRO</span><?php endif; ?>
80 + <h2><?php esc_html_e('Multiple Schedule Windows', 'king-addons'); ?></h2>
51 81 </div>
52 82 <div class="ka-card-body">
53 - <ul>
54 - <li><?php esc_html_e('Multiple schedule windows', 'king-addons'); ?></li>
55 - <li><?php esc_html_e('Daily/weekly/monthly recurring', 'king-addons'); ?></li>
56 - <li><?php esc_html_e('Timezone overrides per rule', 'king-addons'); ?></li>
57 - </ul>
58 - <?php if (!$is_pro) : ?>
59 - <a href="https://kingaddons.com/pricing/" target="_blank" class="ka-btn ka-btn-pink">
60 - <?php esc_html_e('Upgrade to Pro', 'king-addons'); ?>
61 - </a>
62 - <?php endif; ?>
83 + <p class="kng-maintenance-note">
84 + <?php
85 + echo esc_html(sprintf(
86 + /* translators: %s: timezone string */
87 + __('Each window can override timezone (default: site timezone %s). Windows are evaluated in UTC internally.', 'king-addons'),
88 + $site_timezone
89 + ));
90 + ?>
91 + </p>
92 +
93 + <div id="kng-maintenance-windows" class="kng-maintenance-repeat">
94 + <?php foreach ($schedule_windows as $index => $window) :
95 + $tz = isset($window['timezone']) ? (string) $window['timezone'] : 'site';
96 + $startLocal = kng_mm_dt_local($window['start'] ?? '');
97 + $endLocal = kng_mm_dt_local($window['end'] ?? '');
98 + ?>
99 + <div class="kng-repeat-row" data-index="<?php echo esc_attr($index); ?>">
100 + <div class="kng-maintenance-schedule-grid">
101 + <div class="kng-field">
102 + <label><?php esc_html_e('Start', 'king-addons'); ?></label>
103 + <input type="datetime-local" name="kng_maintenance_settings[schedule_windows][<?php echo esc_attr($index); ?>][start]" value="<?php echo esc_attr($startLocal); ?>">
104 + </div>
105 + <div class="kng-field">
106 + <label><?php esc_html_e('End', 'king-addons'); ?></label>
107 + <input type="datetime-local" name="kng_maintenance_settings[schedule_windows][<?php echo esc_attr($index); ?>][end]" value="<?php echo esc_attr($endLocal); ?>">
108 + </div>
109 + <div class="kng-field">
110 + <label><?php esc_html_e('Timezone', 'king-addons'); ?></label>
111 + <select name="kng_maintenance_settings[schedule_windows][<?php echo esc_attr($index); ?>][timezone]">
112 + <option value="site" <?php selected($tz, 'site'); ?>><?php echo esc_html(sprintf(__('Site (%s)', 'king-addons'), $site_timezone)); ?></option>
113 + <?php foreach ($timezone_list as $tzItem) : ?>
114 + <option value="<?php echo esc_attr($tzItem); ?>" <?php selected($tz, $tzItem); ?>><?php echo esc_html($tzItem); ?></option>
115 + <?php endforeach; ?>
116 + </select>
117 + </div>
118 + </div>
119 + <div class="kng-repeat-actions">
120 + <button type="button" class="ka-btn ka-btn-secondary ka-btn-sm kng-remove-row"><?php esc_html_e('Remove', 'king-addons'); ?></button>
121 + </div>
122 + </div>
123 + <?php endforeach; ?>
124 + </div>
125 +
126 + <div class="kng-maintenance-actions">
127 + <button type="button" class="ka-btn ka-btn-secondary" id="kng-add-window"><?php esc_html_e('Add window', 'king-addons'); ?></button>
128 + </div>
63 129 </div>
64 130 </div>
131 +
132 + <div class="ka-card">
133 + <div class="ka-card-header">
134 + <span class="dashicons dashicons-update purple"></span>
135 + <h2><?php esc_html_e('Recurring Rules', 'king-addons'); ?></h2>
136 + </div>
137 + <div class="ka-card-body">
138 + <input type="hidden" name="kng_maintenance_settings[recurring_enabled]" value="0">
139 + <label class="ka-toggle">
140 + <input type="checkbox" name="kng_maintenance_settings[recurring_enabled]" value="1" <?php checked($recurring_enabled); ?> />
141 + <span class="ka-toggle-slider"></span>
142 + <span class="ka-toggle-label"><?php esc_html_e('Enable recurring rules', 'king-addons'); ?></span>
143 + </label>
144 +
145 + <div id="kng-maintenance-recurring" class="kng-maintenance-repeat" style="margin-top: 16px;">
146 + <?php foreach ($recurring_rules as $index => $rule) :
147 + $freq = isset($rule['frequency']) ? (string) $rule['frequency'] : 'daily';
148 + $tz = isset($rule['timezone']) ? (string) $rule['timezone'] : 'site';
149 + $startTime = isset($rule['start_time']) ? (string) $rule['start_time'] : '01:00';
150 + $endTime = isset($rule['end_time']) ? (string) $rule['end_time'] : '02:00';
151 + $dow = isset($rule['days_of_week']) && is_array($rule['days_of_week']) ? array_map('intval', $rule['days_of_week']) : [];
152 + $dom = isset($rule['days_of_month']) && is_array($rule['days_of_month']) ? implode(',', array_map('intval', $rule['days_of_month'])) : '';
153 + ?>
154 + <div class="kng-repeat-row" data-index="<?php echo esc_attr($index); ?>">
155 + <div class="kng-maintenance-content-grid kng-maintenance-content-grid-sm">
156 + <div class="kng-field">
157 + <label><?php esc_html_e('Frequency', 'king-addons'); ?></label>
158 + <select class="kng-recurring-frequency" name="kng_maintenance_settings[recurring_rules][<?php echo esc_attr($index); ?>][frequency]">
159 + <option value="daily" <?php selected($freq, 'daily'); ?>><?php esc_html_e('Daily', 'king-addons'); ?></option>
160 + <option value="weekly" <?php selected($freq, 'weekly'); ?>><?php esc_html_e('Weekly', 'king-addons'); ?></option>
161 + <option value="monthly" <?php selected($freq, 'monthly'); ?>><?php esc_html_e('Monthly', 'king-addons'); ?></option>
162 + </select>
163 + </div>
164 + <div class="kng-field">
165 + <label><?php esc_html_e('Timezone', 'king-addons'); ?></label>
166 + <select name="kng_maintenance_settings[recurring_rules][<?php echo esc_attr($index); ?>][timezone]">
167 + <option value="site" <?php selected($tz, 'site'); ?>><?php echo esc_html(sprintf(__('Site (%s)', 'king-addons'), $site_timezone)); ?></option>
168 + <?php foreach ($timezone_list as $tzItem) : ?>
169 + <option value="<?php echo esc_attr($tzItem); ?>" <?php selected($tz, $tzItem); ?>><?php echo esc_html($tzItem); ?></option>
170 + <?php endforeach; ?>
171 + </select>
172 + </div>
173 + <div class="kng-field">
174 + <label><?php esc_html_e('Start time', 'king-addons'); ?></label>
175 + <input type="time" name="kng_maintenance_settings[recurring_rules][<?php echo esc_attr($index); ?>][start_time]" value="<?php echo esc_attr($startTime); ?>">
176 + </div>
177 + <div class="kng-field">
178 + <label><?php esc_html_e('End time', 'king-addons'); ?></label>
179 + <input type="time" name="kng_maintenance_settings[recurring_rules][<?php echo esc_attr($index); ?>][end_time]" value="<?php echo esc_attr($endTime); ?>">
180 + </div>
181 + </div>
182 +
183 + <div class="kng-recurring-weekly" <?php echo $freq === 'weekly' ? '' : 'style="display:none;"'; ?>>
184 + <div class="kng-field">
185 + <label><?php esc_html_e('Days of week', 'king-addons'); ?></label>
186 + <div class="kng-weekdays">
187 + <?php
188 + $labels = [
189 + 1 => __('Mon', 'king-addons'),
190 + 2 => __('Tue', 'king-addons'),
191 + 3 => __('Wed', 'king-addons'),
192 + 4 => __('Thu', 'king-addons'),
193 + 5 => __('Fri', 'king-addons'),
194 + 6 => __('Sat', 'king-addons'),
195 + 7 => __('Sun', 'king-addons'),
196 + ];
197 + foreach ($labels as $dayNum => $label) :
198 + ?>
199 + <label style="margin-right:10px; display:inline-flex; align-items:center; gap:6px;">
200 + <input type="checkbox" name="kng_maintenance_settings[recurring_rules][<?php echo esc_attr($index); ?>][days_of_week][]" value="<?php echo esc_attr($dayNum); ?>" <?php checked(in_array($dayNum, $dow, true)); ?>>
201 + <span><?php echo esc_html($label); ?></span>
202 + </label>
203 + <?php endforeach; ?>
204 + </div>
205 + <p class="kng-maintenance-note"><?php esc_html_e('Weekly rules run only on the selected days.', 'king-addons'); ?></p>
206 + </div>
207 + </div>
208 +
209 + <div class="kng-recurring-monthly" <?php echo $freq === 'monthly' ? '' : 'style="display:none;"'; ?>>
210 + <div class="kng-field">
211 + <label><?php esc_html_e('Days of month', 'king-addons'); ?></label>
212 + <input type="text" placeholder="1,15,28" name="kng_maintenance_settings[recurring_rules][<?php echo esc_attr($index); ?>][days_of_month]" value="<?php echo esc_attr($dom); ?>">
213 + <p class="kng-maintenance-note"><?php esc_html_e('Comma-separated list (1..31).', 'king-addons'); ?></p>
214 + </div>
215 + </div>
216 +
217 + <div class="kng-repeat-actions">
218 + <button type="button" class="ka-btn ka-btn-secondary ka-btn-sm kng-remove-row"><?php esc_html_e('Remove', 'king-addons'); ?></button>
219 + </div>
220 + </div>
221 + <?php endforeach; ?>
222 + </div>
223 +
224 + <div class="kng-maintenance-actions">
225 + <button type="button" class="ka-btn ka-btn-secondary" id="kng-add-recurring"><?php esc_html_e('Add recurring rule', 'king-addons'); ?></button>
226 + </div>
227 + </div>
228 + </div>
229 +
230 + <template id="kng-maintenance-window-template">
231 + <div class="kng-repeat-row" data-index="__INDEX__">
232 + <div class="kng-maintenance-schedule-grid">
233 + <div class="kng-field">
234 + <label><?php esc_html_e('Start', 'king-addons'); ?></label>
235 + <input type="datetime-local" name="kng_maintenance_settings[schedule_windows][__INDEX__][start]" value="">
236 + </div>
237 + <div class="kng-field">
238 + <label><?php esc_html_e('End', 'king-addons'); ?></label>
239 + <input type="datetime-local" name="kng_maintenance_settings[schedule_windows][__INDEX__][end]" value="">
240 + </div>
241 + <div class="kng-field">
242 + <label><?php esc_html_e('Timezone', 'king-addons'); ?></label>
243 + <select name="kng_maintenance_settings[schedule_windows][__INDEX__][timezone]">
244 + <option value="site"><?php echo esc_html(sprintf(__('Site (%s)', 'king-addons'), $site_timezone)); ?></option>
245 + <?php foreach ($timezone_list as $tzItem) : ?>
246 + <option value="<?php echo esc_attr($tzItem); ?>"><?php echo esc_html($tzItem); ?></option>
247 + <?php endforeach; ?>
248 + </select>
249 + </div>
250 + </div>
251 + <div class="kng-repeat-actions">
252 + <button type="button" class="ka-btn ka-btn-secondary ka-btn-sm kng-remove-row"><?php esc_html_e('Remove', 'king-addons'); ?></button>
253 + </div>
254 + </div>
255 + </template>
256 +
257 + <template id="kng-maintenance-recurring-template">
258 + <div class="kng-repeat-row" data-index="__INDEX__">
259 + <div class="kng-maintenance-content-grid kng-maintenance-content-grid-sm">
260 + <div class="kng-field">
261 + <label><?php esc_html_e('Frequency', 'king-addons'); ?></label>
262 + <select class="kng-recurring-frequency" name="kng_maintenance_settings[recurring_rules][__INDEX__][frequency]">
263 + <option value="daily"><?php esc_html_e('Daily', 'king-addons'); ?></option>
264 + <option value="weekly"><?php esc_html_e('Weekly', 'king-addons'); ?></option>
265 + <option value="monthly"><?php esc_html_e('Monthly', 'king-addons'); ?></option>
266 + </select>
267 + </div>
268 + <div class="kng-field">
269 + <label><?php esc_html_e('Timezone', 'king-addons'); ?></label>
270 + <select name="kng_maintenance_settings[recurring_rules][__INDEX__][timezone]">
271 + <option value="site"><?php echo esc_html(sprintf(__('Site (%s)', 'king-addons'), $site_timezone)); ?></option>
272 + <?php foreach ($timezone_list as $tzItem) : ?>
273 + <option value="<?php echo esc_attr($tzItem); ?>"><?php echo esc_html($tzItem); ?></option>
274 + <?php endforeach; ?>
275 + </select>
276 + </div>
277 + <div class="kng-field">
278 + <label><?php esc_html_e('Start time', 'king-addons'); ?></label>
279 + <input type="time" name="kng_maintenance_settings[recurring_rules][__INDEX__][start_time]" value="01:00">
280 + </div>
281 + <div class="kng-field">
282 + <label><?php esc_html_e('End time', 'king-addons'); ?></label>
283 + <input type="time" name="kng_maintenance_settings[recurring_rules][__INDEX__][end_time]" value="02:00">
284 + </div>
285 + </div>
286 +
287 + <div class="kng-recurring-weekly" style="display:none;">
288 + <div class="kng-field">
289 + <label><?php esc_html_e('Days of week', 'king-addons'); ?></label>
290 + <div class="kng-weekdays">
291 + <?php foreach ([1 => __('Mon', 'king-addons'), 2 => __('Tue', 'king-addons'), 3 => __('Wed', 'king-addons'), 4 => __('Thu', 'king-addons'), 5 => __('Fri', 'king-addons'), 6 => __('Sat', 'king-addons'), 7 => __('Sun', 'king-addons')] as $dayNum => $label) : ?>
292 + <label style="margin-right:10px; display:inline-flex; align-items:center; gap:6px;">
293 + <input type="checkbox" name="kng_maintenance_settings[recurring_rules][__INDEX__][days_of_week][]" value="<?php echo esc_attr($dayNum); ?>">
294 + <span><?php echo esc_html($label); ?></span>
295 + </label>
296 + <?php endforeach; ?>
297 + </div>
298 + <p class="kng-maintenance-note"><?php esc_html_e('Weekly rules run only on the selected days.', 'king-addons'); ?></p>
299 + </div>
300 + </div>
301 +
302 + <div class="kng-recurring-monthly" style="display:none;">
303 + <div class="kng-field">
304 + <label><?php esc_html_e('Days of month', 'king-addons'); ?></label>
305 + <input type="text" placeholder="1,15,28" name="kng_maintenance_settings[recurring_rules][__INDEX__][days_of_month]" value="">
306 + <p class="kng-maintenance-note"><?php esc_html_e('Comma-separated list (1..31).', 'king-addons'); ?></p>
307 + </div>
308 + </div>
309 +
310 + <div class="kng-repeat-actions">
311 + <button type="button" class="ka-btn ka-btn-secondary ka-btn-sm kng-remove-row"><?php esc_html_e('Remove', 'king-addons'); ?></button>
312 + </div>
313 + </div>
314 + </template>
65 315
66 316 <div class="ka-card">
67 317 <div class="ka-submit">
68 318 <button type="submit" class="ka-btn ka-btn-primary">