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/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() {