← All changes
|
includes/extensions/Age_Gate/templates/admin-page.php
+204
-10
51.1.44
→
51.1.87
View file →
| @@ -1,7 +1,7 @@ | ||
| 1 | 1 | <?php |
| 2 | 2 | /** |
| 3 | - * Admin page for Age Gate - V3 Apple-inspired Design. | |
| 3 | + * Admin page for Age Gate - V3 Premium style inspired Design. | |
| 4 | 4 | * |
| 5 | 5 | * @package King_Addons |
| 6 | 6 | */ |
| 7 | 7 | |
| @@ -30,13 +30,135 @@ | ||
| 30 | 30 | 'post_type' => 'elementor_library', |
| 31 | 31 | 'posts_per_page' => 50, |
| 32 | 32 | ]); |
| 33 | 33 | |
| 34 | +// Normalize options to prevent undefined index notices on fresh installs/older saved settings. | |
| 35 | +$options = (isset($options) && is_array($options)) ? $options : []; | |
| 36 | +$is_premium = isset($is_premium) ? (bool) $is_premium : false; | |
| 37 | + | |
| 38 | +$options['general'] = wp_parse_args($options['general'] ?? [], [ | |
| 39 | + 'enabled' => 0, | |
| 40 | + 'audience' => 'guests', | |
| 41 | + 'mode' => 'confirm', | |
| 42 | + 'min_age' => 18, | |
| 43 | + 'cookie_days' => 30, | |
| 44 | +]); | |
| 45 | + | |
| 46 | +$options['display'] = wp_parse_args($options['display'] ?? [], [ | |
| 47 | + 'scope' => 'site', | |
| 48 | + 'exclude_ids' => [], | |
| 49 | + 'mode' => 'global', | |
| 50 | + 'cpt_scope' => [], | |
| 51 | + 'archives' => 0, | |
| 52 | + 'woo' => [ | |
| 53 | + 'enabled' => 0, | |
| 54 | + 'apply_to' => 'product', | |
| 55 | + 'categories' => [], | |
| 56 | + ], | |
| 57 | +]); | |
| 58 | +$options['display']['exclude_ids'] = array_map('intval', (array) $options['display']['exclude_ids']); | |
| 59 | +$options['display']['cpt_scope'] = array_values(array_map('strval', (array) $options['display']['cpt_scope'])); | |
| 60 | +$options['display']['woo'] = wp_parse_args($options['display']['woo'] ?? [], [ | |
| 61 | + 'enabled' => 0, | |
| 62 | + 'apply_to' => 'product', | |
| 63 | + 'categories' => [], | |
| 64 | +]); | |
| 65 | +$options['display']['woo']['categories'] = array_map('intval', (array) $options['display']['woo']['categories']); | |
| 66 | + | |
| 67 | +$product_cats = []; | |
| 68 | +if (taxonomy_exists('product_cat')) { | |
| 69 | + $woo_terms = get_terms([ | |
| 70 | + 'taxonomy' => 'product_cat', | |
| 71 | + 'hide_empty' => false, | |
| 72 | + ]); | |
| 73 | + if (!is_wp_error($woo_terms)) { | |
| 74 | + foreach ($woo_terms as $woo_term) { | |
| 75 | + $product_cats[(int) $woo_term->term_id] = $woo_term->name; | |
| 76 | + } | |
| 77 | + } | |
| 78 | +} | |
| 79 | + | |
| 80 | +$options['design'] = wp_parse_args($options['design'] ?? [], [ | |
| 81 | + 'template' => 'center-card', | |
| 82 | + 'overlay_color' => '#000000', | |
| 83 | + 'overlay_opacity' => 0.6, | |
| 84 | + 'card_background' => '#ffffff', | |
| 85 | + 'card_width' => 420, | |
| 86 | + 'title' => __('Age Verification', 'king-addons'), | |
| 87 | + 'subtitle' => __('You must be 18+ to enter.', 'king-addons'), | |
| 88 | + 'text_color' => '#111111', | |
| 89 | + 'button_yes' => __('Yes', 'king-addons'), | |
| 90 | + 'button_no' => __('No', 'king-addons'), | |
| 91 | + 'title_size' => 24, | |
| 92 | + 'body_size' => 16, | |
| 93 | + 'title_weight' => 700, | |
| 94 | + 'body_weight' => 400, | |
| 95 | + 'button_yes_color' => '#ffffff', | |
| 96 | + 'button_yes_bg' => '#6d28d9', | |
| 97 | + 'button_no_color' => '#111111', | |
| 98 | + 'button_no_bg' => '#e5e7eb', | |
| 99 | + 'button_yes_hover_bg' => '#5b21b6', | |
| 100 | + 'button_yes_hover_color' => '#ffffff', | |
| 101 | + 'button_no_hover_bg' => '#d1d5db', | |
| 102 | + 'button_no_hover_color' => '#111111', | |
| 103 | + 'animation' => 'fade', | |
| 104 | + 'elementor_template' => 0, | |
| 105 | + 'logo' => '', | |
| 106 | + 'background_image' => '', | |
| 107 | +]); | |
| 108 | +$options['design']['elementor_template'] = (int) $options['design']['elementor_template']; | |
| 109 | + | |
| 110 | +$options['behaviour'] = wp_parse_args($options['behaviour'] ?? [], [ | |
| 111 | + 'deny_action' => 'redirect_url', | |
| 112 | + 'deny_redirect_page' => 0, | |
| 113 | + 'deny_redirect_url' => 'https://google.com', | |
| 114 | + 'block_message' => __('Access denied.', 'king-addons'), | |
| 115 | + 'reset_on_rule_change' => 0, | |
| 116 | + 'repeat_mode' => 'days', | |
| 117 | + 'consent_checkbox' => 0, | |
| 118 | +]); | |
| 119 | +$options['behaviour']['deny_action'] = ($options['behaviour']['deny_action'] === 'redirect') ? 'redirect_page' : $options['behaviour']['deny_action']; | |
| 120 | +$options['behaviour']['deny_redirect_page'] = (int) $options['behaviour']['deny_redirect_page']; | |
| 121 | +$options['behaviour']['deny_redirect_url'] = is_string($options['behaviour']['deny_redirect_url']) ? trim($options['behaviour']['deny_redirect_url']) : 'https://google.com'; | |
| 122 | + | |
| 123 | +$options['dob'] = wp_parse_args($options['dob'] ?? [], [ | |
| 124 | + 'format' => 'dmy', | |
| 125 | + 'max_age' => 120, | |
| 126 | + 'error_invalid' => __('Please enter a valid date.', 'king-addons'), | |
| 127 | + 'error_denied' => __('You do not meet the minimum age requirement.', 'king-addons'), | |
| 128 | +]); | |
| 129 | +$options['dob']['max_age'] = (int) $options['dob']['max_age']; | |
| 130 | + | |
| 131 | +$options['geo'] = wp_parse_args($options['geo'] ?? [], [ | |
| 132 | + 'enabled' => 0, | |
| 133 | + 'default_age' => 18, | |
| 134 | + 'map' => [], | |
| 135 | +]); | |
| 136 | +$options['geo']['default_age'] = (int) $options['geo']['default_age']; | |
| 137 | +if (is_string($options['geo']['map'])) { | |
| 138 | + $map = []; | |
| 139 | + foreach (preg_split('/\r\n|\r|\n/', $options['geo']['map']) as $line) { | |
| 140 | + $line = trim($line); | |
| 141 | + if ($line === '' || strpos($line, '=') === false) { | |
| 142 | + continue; | |
| 143 | + } | |
| 144 | + [$code, $age] = array_map('trim', explode('=', $line, 2)); | |
| 145 | + if ($code === '') { | |
| 146 | + continue; | |
| 147 | + } | |
| 148 | + $map[strtoupper($code)] = (int) $age; | |
| 149 | + } | |
| 150 | + $options['geo']['map'] = $map; | |
| 151 | +} | |
| 152 | +if (!is_array($options['geo']['map'])) { | |
| 153 | + $options['geo']['map'] = []; | |
| 154 | +} | |
| 155 | + | |
| 34 | 156 | // Theme mode is per-user |
| 35 | 157 | $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true); |
| 36 | 158 | $allowed_theme_modes = ['dark', 'light', 'auto']; |
| 37 | 159 | if (!in_array($theme_mode, $allowed_theme_modes, true)) { |
| 38 | - $theme_mode = 'dark'; | |
| 160 | + $theme_mode = 'auto'; | |
| 39 | 161 | } |
| 40 | 162 | ?> |
| 41 | 163 | <script> |
| 42 | 164 | (function() { |
| @@ -61,18 +183,27 @@ | ||
| 61 | 183 | <p class="ka-admin-subtitle"><?php esc_html_e('Age verification overlay for restricted content', 'king-addons'); ?></p> |
| 62 | 184 | </div> |
| 63 | 185 | </div> |
| 64 | 186 | <div class="ka-admin-header-actions"> |
| 65 | - <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="Theme" data-active="<?php echo esc_attr($theme_mode); ?>"> | |
| 66 | - <span class="ka-v3-segmented-indicator" aria-hidden="true"></span> | |
| 67 | - <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>"><?php esc_html_e('Light', 'king-addons'); ?></button> | |
| 68 | - <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>"><?php esc_html_e('Dark', 'king-addons'); ?></button> | |
| 69 | - <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>"><?php esc_html_e('Auto', 'king-addons'); ?></button> | |
| 70 | - </div> | |
| 71 | 187 | <span class="ka-status <?php echo !empty($options['general']['enabled']) ? 'ka-status-enabled' : 'ka-status-disabled'; ?>"> |
| 72 | 188 | <span class="ka-status-dot"></span> |
| 73 | 189 | <?php echo !empty($options['general']['enabled']) ? esc_html__('Enabled', 'king-addons') : esc_html__('Disabled', 'king-addons'); ?> |
| 74 | 190 | </span> |
| 191 | + <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="Theme" data-active="<?php echo esc_attr($theme_mode); ?>"> | |
| 192 | + <span class="ka-v3-segmented-indicator" aria-hidden="true"></span> | |
| 193 | + <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>"> | |
| 194 | + <span class="ka-v3-segmented-icon" aria-hidden="true">☀︎</span> | |
| 195 | + <?php esc_html_e('Light', 'king-addons'); ?> | |
| 196 | + </button> | |
| 197 | + <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>"> | |
| 198 | + <span class="ka-v3-segmented-icon" aria-hidden="true">☾</span> | |
| 199 | + <?php esc_html_e('Dark', 'king-addons'); ?> | |
| 200 | + </button> | |
| 201 | + <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>"> | |
| 202 | + <span class="ka-v3-segmented-icon" aria-hidden="true">◐</span> | |
| 203 | + <?php esc_html_e('Auto', 'king-addons'); ?> | |
| 204 | + </button> | |
| 205 | + </div> | |
| 75 | 206 | </div> |
| 76 | 207 | </div> |
| 77 | 208 | |
| 78 | 209 | <?php settings_errors('king_addons_age_gate'); ?> |
| @@ -223,8 +354,33 @@ | ||
| 223 | 354 | <span class="ka-toggle-label"><?php esc_html_e('Show on archives', 'king-addons'); ?></span> |
| 224 | 355 | </label> |
| 225 | 356 | </div> |
| 226 | 357 | </div> |
| 358 | + <div class="ka-row"> | |
| 359 | + <div class="ka-row-label"><?php esc_html_e('WooCommerce', 'king-addons'); ?></div> | |
| 360 | + <div class="ka-row-field"> | |
| 361 | + <label class="ka-toggle"> | |
| 362 | + <input type="checkbox" name="king_addons_age_gate_options[display][woo][enabled]" value="1" <?php checked(!empty($options['display']['woo']['enabled'])); ?>> | |
| 363 | + <span class="ka-toggle-slider"></span> | |
| 364 | + <span class="ka-toggle-label"><?php esc_html_e('Show on WooCommerce', 'king-addons'); ?></span> | |
| 365 | + </label> | |
| 366 | + <select name="king_addons_age_gate_options[display][woo][apply_to]" style="margin-top: 10px; max-width: 100%;"> | |
| 367 | + <option value="product" <?php selected($options['display']['woo']['apply_to'], 'product'); ?>><?php esc_html_e('Single products', 'king-addons'); ?></option> | |
| 368 | + <option value="category" <?php selected($options['display']['woo']['apply_to'], 'category'); ?>><?php esc_html_e('Product categories', 'king-addons'); ?></option> | |
| 369 | + <option value="shop" <?php selected($options['display']['woo']['apply_to'], 'shop'); ?>><?php esc_html_e('Shop page', 'king-addons'); ?></option> | |
| 370 | + </select> | |
| 371 | + <?php if ($product_cats): ?> | |
| 372 | + <select name="king_addons_age_gate_options[display][woo][categories][]" multiple size="4" style="margin-top: 10px; max-width: 100%; min-height: 100px;"> | |
| 373 | + <?php foreach ($product_cats as $cat_id => $cat_name): ?> | |
| 374 | + <option value="<?php echo esc_attr((string) $cat_id); ?>" <?php selected(in_array((int) $cat_id, $options['display']['woo']['categories'], true)); ?>> | |
| 375 | + <?php echo esc_html($cat_name); ?> | |
| 376 | + </option> | |
| 377 | + <?php endforeach; ?> | |
| 378 | + </select> | |
| 379 | + <p class="ka-row-desc"><?php esc_html_e('Leave categories empty to match every product or every product category. The shop page ignores this list.', 'king-addons'); ?></p> | |
| 380 | + <?php endif; ?> | |
| 381 | + </div> | |
| 382 | + </div> | |
| 227 | 383 | <?php endif; ?> |
| 228 | 384 | </div> |
| 229 | 385 | </div> |
| 230 | 386 | </div> |
| @@ -242,8 +398,12 @@ | ||
| 242 | 398 | <div class="ka-row-field"> |
| 243 | 399 | <select name="king_addons_age_gate_options[design][template]"> |
| 244 | 400 | <option value="center-card" <?php selected($options['design']['template'], 'center-card'); ?>><?php esc_html_e('Centered card', 'king-addons'); ?></option> |
| 245 | 401 | <option value="bottom-card" <?php selected($options['design']['template'], 'bottom-card'); ?>><?php esc_html_e('Bottom card', 'king-addons'); ?></option> |
| 402 | + <option value="top-card" <?php selected($options['design']['template'], 'top-card'); ?>><?php esc_html_e('Top card', 'king-addons'); ?></option> | |
| 403 | + <option value="side-left" <?php selected($options['design']['template'], 'side-left'); ?>><?php esc_html_e('Side panel (left)', 'king-addons'); ?></option> | |
| 404 | + <option value="side-right" <?php selected($options['design']['template'], 'side-right'); ?>><?php esc_html_e('Side panel (right)', 'king-addons'); ?></option> | |
| 405 | + <option value="fullscreen" <?php selected($options['design']['template'], 'fullscreen'); ?>><?php esc_html_e('Fullscreen modal', 'king-addons'); ?></option> | |
| 246 | 406 | </select> |
| 247 | 407 | </div> |
| 248 | 408 | </div> |
| 249 | 409 | <div class="ka-row"> |
| @@ -421,14 +581,15 @@ | ||
| 421 | 581 | <div class="ka-row"> |
| 422 | 582 | <div class="ka-row-label"><?php esc_html_e('On Denial', 'king-addons'); ?></div> |
| 423 | 583 | <div class="ka-row-field"> |
| 424 | 584 | <select name="king_addons_age_gate_options[behaviour][deny_action]"> |
| 425 | - <option value="redirect" <?php selected($options['behaviour']['deny_action'], 'redirect'); ?>><?php esc_html_e('Redirect to page', 'king-addons'); ?></option> | |
| 585 | + <option value="redirect_page" <?php selected($options['behaviour']['deny_action'], 'redirect_page'); ?>><?php esc_html_e('Redirect to page', 'king-addons'); ?></option> | |
| 586 | + <option value="redirect_url" <?php selected($options['behaviour']['deny_action'], 'redirect_url'); ?>><?php esc_html_e('Redirect to URL', 'king-addons'); ?></option> | |
| 426 | 587 | <option value="block" <?php selected($options['behaviour']['deny_action'], 'block'); ?>><?php esc_html_e('Show blocked message', 'king-addons'); ?></option> |
| 427 | 588 | </select> |
| 428 | 589 | </div> |
| 429 | 590 | </div> |
| 430 | - <div class="ka-row"> | |
| 591 | + <div class="ka-row" id="ka-age-gate-deny-page-row"> | |
| 431 | 592 | <div class="ka-row-label"><?php esc_html_e('Redirect Page', 'king-addons'); ?></div> |
| 432 | 593 | <div class="ka-row-field"> |
| 433 | 594 | <select name="king_addons_age_gate_options[behaviour][deny_redirect_page]"> |
| 434 | 595 | <option value="0"><?php esc_html_e('— Select page —', 'king-addons'); ?></option> |
| @@ -437,10 +598,18 @@ | ||
| 437 | 598 | <?php echo esc_html($title); ?> |
| 438 | 599 | </option> |
| 439 | 600 | <?php endforeach; ?> |
| 440 | 601 | </select> |
| 602 | + <p class="ka-row-desc"><?php esc_html_e('If a page is selected, it will be used for redirect.', 'king-addons'); ?></p> | |
| 441 | 603 | </div> |
| 442 | 604 | </div> |
| 605 | + <div class="ka-row" id="ka-age-gate-deny-url-row"> | |
| 606 | + <div class="ka-row-label"><?php esc_html_e('Redirect URL', 'king-addons'); ?></div> | |
| 607 | + <div class="ka-row-field"> | |
| 608 | + <input type="url" name="king_addons_age_gate_options[behaviour][deny_redirect_url]" value="<?php echo esc_attr($options['behaviour']['deny_redirect_url']); ?>" placeholder="https://google.com"> | |
| 609 | + <p class="ka-row-desc"><?php esc_html_e('Used only when no redirect page is selected.', 'king-addons'); ?></p> | |
| 610 | + </div> | |
| 611 | + </div> | |
| 443 | 612 | <div class="ka-row"> |
| 444 | 613 | <div class="ka-row-label"><?php esc_html_e('Block Message', 'king-addons'); ?></div> |
| 445 | 614 | <div class="ka-row-field"> |
| 446 | 615 | <input type="text" name="king_addons_age_gate_options[behaviour][block_message]" value="<?php echo esc_attr($options['behaviour']['block_message']); ?>"> |
| @@ -586,8 +755,33 @@ | ||
| 586 | 755 | this.classList.add('active'); |
| 587 | 756 | document.querySelector(`.ka-tab-content[data-tab="${target}"]`).classList.add('active'); |
| 588 | 757 | }); |
| 589 | 758 | }); |
| 759 | + | |
| 760 | + // Behaviour: toggle redirect destination fields. | |
| 761 | + (function() { | |
| 762 | + const select = document.querySelector('select[name="king_addons_age_gate_options[behaviour][deny_action]"]'); | |
| 763 | + const pageRow = document.getElementById('ka-age-gate-deny-page-row'); | |
| 764 | + const urlRow = document.getElementById('ka-age-gate-deny-url-row'); | |
| 765 | + | |
| 766 | + function sync() { | |
| 767 | + if (!select) { | |
| 768 | + return; | |
| 769 | + } | |
| 770 | + const value = (select.value || '').toString(); | |
| 771 | + if (pageRow) { | |
| 772 | + pageRow.style.display = value === 'redirect_page' ? '' : 'none'; | |
| 773 | + } | |
| 774 | + if (urlRow) { | |
| 775 | + urlRow.style.display = value === 'redirect_url' ? '' : 'none'; | |
| 776 | + } | |
| 777 | + } | |
| 778 | + | |
| 779 | + if (select) { | |
| 780 | + select.addEventListener('change', sync); | |
| 781 | + sync(); | |
| 782 | + } | |
| 783 | + })(); | |
| 590 | 784 | })(jQuery); |
| 591 | 785 | |
| 592 | 786 | // Theme segmented control (dashboard-style) |
| 593 | 787 | (function() { |