← 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"> |