PluginProbe
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder / 51.1.49
King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder v51.1.49
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 51.1.45 51.1.46 51.1.47 51.1.49 All 37 releases
king-addons / includes / admin / layouts / settings-page.php

settings-page.php in King Addons for Elementor – 80+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce, Mega Menu, Popup Builder 51.1.49, at includes/admin/layouts/settings-page.php

461 lines 25.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Settings admin page - V3 Premium style inspired design.
4 *
5 * @package King_Addons
6 */
7
8 if (!defined('ABSPATH')) {
9 exit;
10 }
11
12 // Theme mode is per-user
13 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
14 $allowed_theme_modes = ['dark', 'light', 'auto'];
15 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
16 $theme_mode = 'dark';
17 }
18
19 // Handle form submission
20 if (isset($_POST['king_addons_settings_submit_settings'])) {
21 if (
22 !isset($_POST['king_addons_settings_nonce_field']) ||
23 !wp_verify_nonce($_POST['king_addons_settings_nonce_field'], 'king_addons_settings_save_settings')
24 ) {
25 wp_die('Security check failed.');
26 }
27
28 update_option('king_addons_google_map_api_key', sanitize_text_field($_POST['king_addons_google_map_api_key']));
29 update_option('king_addons_mailchimp_api_key', sanitize_text_field($_POST['king_addons_mailchimp_api_key']));
30 update_option('king_addons_recaptcha_v3_site_key', sanitize_text_field($_POST['king_addons_recaptcha_v3_site_key']));
31 update_option('king_addons_recaptcha_v3_secret_key', sanitize_text_field($_POST['king_addons_recaptcha_v3_secret_key']));
32 update_option('king_addons_recaptcha_v3_score_threshold', floatval($_POST['king_addons_recaptcha_v3_score_threshold']));
33
34 // Lightbox colors
35 update_option('king_addons_lightbox_bg_color', sanitize_text_field($_POST['king_addons_lightbox_bg_color']));
36 update_option('king_addons_lightbox_toolbar_color', sanitize_text_field($_POST['king_addons_lightbox_toolbar_color']));
37 update_option('king_addons_lightbox_caption_color', sanitize_text_field($_POST['king_addons_lightbox_caption_color']));
38 update_option('king_addons_lightbox_gallery_color', sanitize_text_field($_POST['king_addons_lightbox_gallery_color']));
39 update_option('king_addons_lightbox_pb_color', sanitize_text_field($_POST['king_addons_lightbox_pb_color']));
40 update_option('king_addons_lightbox_ui_color', sanitize_text_field($_POST['king_addons_lightbox_ui_color']));
41 update_option('king_addons_lightbox_ui_hover_color', sanitize_text_field($_POST['king_addons_lightbox_ui_hover_color']));
42 update_option('king_addons_lightbox_text_color', sanitize_text_field($_POST['king_addons_lightbox_text_color']));
43
44 // Lightbox numbers
45 update_option('king_addons_lightbox_icon_size', intval($_POST['king_addons_lightbox_icon_size']));
46 update_option('king_addons_lightbox_text_size', intval($_POST['king_addons_lightbox_text_size']));
47 update_option('king_addons_lightbox_arrow_size', intval($_POST['king_addons_lightbox_arrow_size']));
48
49 // Import Performance
50 $improve_import = isset($_POST['king_addons_improve_import_performance']) ? '1' : '0';
51 update_option('king_addons_improve_import_performance', $improve_import);
52
53 // Template Catalog Button
54 if (function_exists('king_addons_freemius') && king_addons_freemius()->can_use_premium_code()) {
55 $disable_template_catalog = isset($_POST['king_addons_disable_template_catalog_button']) ? '1' : '0';
56 update_option('king_addons_disable_template_catalog_button', $disable_template_catalog);
57 }
58
59 add_settings_error('king_addons_messages', 'king_addons_message', esc_html__('Settings Saved', 'king-addons'), 'updated');
60 }
61
62 // Get existing values
63 $google_map_key = get_option('king_addons_google_map_api_key', '');
64 $mailchimp_key = get_option('king_addons_mailchimp_api_key', '');
65 $recaptcha_site_key = get_option('king_addons_recaptcha_v3_site_key', '');
66 $recaptcha_secret_key = get_option('king_addons_recaptcha_v3_secret_key', '');
67 $recaptcha_score_threshold = get_option('king_addons_recaptcha_v3_score_threshold', 0.5);
68 $improve_import_performance = get_option('king_addons_improve_import_performance', '1');
69 $disable_template_catalog_button = get_option('king_addons_disable_template_catalog_button', '0');
70
71 // Enqueue the shared CSS
72 $css_url = KING_ADDONS_URL . 'includes/admin/layouts/shared/admin-v3-styles.css';
73 $css_path = KING_ADDONS_PATH . 'includes/admin/layouts/shared/admin-v3-styles.css';
74 $css_version = file_exists($css_path) ? filemtime($css_path) : KING_ADDONS_VERSION;
75 ?>
76
77 <link rel="stylesheet" href="<?php echo esc_url($css_url); ?>?v=<?php echo esc_attr($css_version); ?>">
78
79 <script>
80 document.body.classList.add('ka-admin-v3');
81 (function() {
82 const mode = '<?php echo esc_js($theme_mode); ?>';
83 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
84 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
85 document.body.classList.toggle('ka-v3-dark', isDark);
86 document.documentElement.classList.toggle('ka-v3-dark', isDark);
87 })();
88 </script>
89
90 <div class="ka-admin-wrap">
91 <?php settings_errors('king_addons_messages'); ?>
92 <!-- Header -->
93 <div class="ka-admin-header">
94 <div class="ka-admin-header-left">
95 <div class="ka-admin-header-icon purple">
96 <span class="dashicons dashicons-admin-generic"></span>
97 </div>
98 <div>
99 <h1 class="ka-admin-title"><?php esc_html_e('Settings', 'king-addons'); ?></h1>
100 <p class="ka-admin-subtitle"><?php esc_html_e('Configure API keys and global options for King Addons.', 'king-addons'); ?></p>
101 </div>
102 </div>
103 <div class="ka-admin-header-actions">
104 <div class="ka-v3-segmented" id="ka-v3-theme-segment" role="radiogroup" aria-label="<?php echo esc_attr(esc_html__('Theme', 'king-addons')); ?>" data-active="<?php echo esc_attr($theme_mode); ?>">
105 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
106 <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>">
107 <span class="ka-v3-segmented-icon" aria-hidden="true">☀︎</span>
108 <?php esc_html_e('Light', 'king-addons'); ?>
109 </button>
110 <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>">
111 <span class="ka-v3-segmented-icon" aria-hidden="true"></span>
112 <?php esc_html_e('Dark', 'king-addons'); ?>
113 </button>
114 <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>">
115 <?php esc_html_e('Auto', 'king-addons'); ?>
116 </button>
117 </div>
118 <a href="https://www.youtube.com/@kingaddons" target="_blank" class="ka-btn ka-btn-secondary">
119 <span class="dashicons dashicons-book"></span>
120 <?php esc_html_e('Guides', 'king-addons'); ?>
121 </a>
122 </div>
123 </div>
124
125 <!-- Tabs Navigation -->
126 <div class="ka-tabs">
127 <button type="button" class="ka-tab active" data-tab="integrations"><?php esc_html_e('Integrations', 'king-addons'); ?></button>
128 <button type="button" class="ka-tab" data-tab="lightbox"><?php esc_html_e('Lightbox', 'king-addons'); ?></button>
129 <button type="button" class="ka-tab" data-tab="performance"><?php esc_html_e('Performance', 'king-addons'); ?></button>
130 </div>
131
132 <form method="post" action="">
133 <?php wp_nonce_field('king_addons_settings_save_settings', 'king_addons_settings_nonce_field'); ?>
134
135 <!-- Integrations Tab -->
136 <div class="ka-tab-content active" data-tab="integrations">
137 <div class="ka-card">
138 <div class="ka-card-header">
139 <span class="dashicons dashicons-admin-plugins"></span>
140 <h2><?php esc_html_e('API Keys', 'king-addons'); ?></h2>
141 </div>
142 <div class="ka-card-body">
143 <div class="ka-row">
144 <div class="ka-row-label"><?php esc_html_e('Google Map API Key', 'king-addons'); ?></div>
145 <div class="ka-row-field">
146 <input type="text" name="king_addons_google_map_api_key" value="<?php echo esc_attr($google_map_key); ?>" placeholder="AIza..." />
147 <p class="ka-row-desc">
148 <?php esc_html_e('Enter your Google Map API key from Google Cloud Platform.', 'king-addons'); ?>
149 <a href="https://www.youtube.com/watch?v=O5cUoVpVUjU" target="_blank"><?php esc_html_e('Learn how →', 'king-addons'); ?></a>
150 </p>
151 </div>
152 </div>
153 <div class="ka-row">
154 <div class="ka-row-label"><?php esc_html_e('MailChimp API Key', 'king-addons'); ?></div>
155 <div class="ka-row-field">
156 <input type="text" name="king_addons_mailchimp_api_key" value="<?php echo esc_attr($mailchimp_key); ?>" />
157 <p class="ka-row-desc">
158 <?php esc_html_e('Insert your MailChimp API key for mailing features.', 'king-addons'); ?>
159 <a href="https://mailchimp.com/help/about-api-keys/" target="_blank"><?php esc_html_e('Learn how →', 'king-addons'); ?></a>
160 </p>
161 </div>
162 </div>
163 </div>
164 </div>
165
166 <div class="ka-card">
167 <div class="ka-card-header">
168 <span class="dashicons dashicons-shield"></span>
169 <h2><?php esc_html_e('reCAPTCHA v3', 'king-addons'); ?></h2>
170 </div>
171 <div class="ka-card-body">
172 <div class="ka-row">
173 <div class="ka-row-label"><?php esc_html_e('Site Key', 'king-addons'); ?></div>
174 <div class="ka-row-field">
175 <input type="text" name="king_addons_recaptcha_v3_site_key" value="<?php echo esc_attr($recaptcha_site_key); ?>" />
176 <p class="ka-row-desc">
177 <?php esc_html_e('Enter your reCAPTCHA Site Key for Form Builder.', 'king-addons'); ?>
178 <a href="https://www.google.com/recaptcha/about/" target="_blank"><?php esc_html_e('Get keys →', 'king-addons'); ?></a>
179 </p>
180 </div>
181 </div>
182 <div class="ka-row">
183 <div class="ka-row-label"><?php esc_html_e('Secret Key', 'king-addons'); ?></div>
184 <div class="ka-row-field">
185 <input type="password" name="king_addons_recaptcha_v3_secret_key" value="<?php echo esc_attr($recaptcha_secret_key); ?>" />
186 </div>
187 </div>
188 <div class="ka-row">
189 <div class="ka-row-label"><?php esc_html_e('Score Threshold', 'king-addons'); ?></div>
190 <div class="ka-row-field">
191 <input type="number" step="0.1" min="0" max="1" name="king_addons_recaptcha_v3_score_threshold" value="<?php echo esc_attr($recaptcha_score_threshold); ?>" style="max-width:100px" />
192 <p class="ka-row-desc"><?php esc_html_e('Score threshold 0.0 to 1.0 (default 0.5). Higher values are more strict.', 'king-addons'); ?></p>
193 </div>
194 </div>
195 </div>
196 </div>
197 </div>
198
199 <!-- Lightbox Tab -->
200 <div class="ka-tab-content" data-tab="lightbox">
201 <div class="ka-card">
202 <div class="ka-card-header">
203 <span class="dashicons dashicons-format-gallery"></span>
204 <h2><?php esc_html_e('Lightbox Colors', 'king-addons'); ?></h2>
205 </div>
206 <div class="ka-card-body">
207 <div class="ka-grid-2">
208 <div class="ka-row">
209 <div class="ka-row-label"><?php esc_html_e('Text Color', 'king-addons'); ?></div>
210 <div class="ka-row-field">
211 <div class="ka-color-wrap">
212 <input type="text" name="king_addons_lightbox_text_color" data-alpha-enabled="true" data-default-color="#efefef" value="<?php echo esc_attr(get_option('king_addons_lightbox_text_color', '#efefef')); ?>" class="color-picker" />
213 </div>
214 </div>
215 </div>
216 <div class="ka-row">
217 <div class="ka-row-label"><?php esc_html_e('Background', 'king-addons'); ?></div>
218 <div class="ka-row-field">
219 <div class="ka-color-wrap">
220 <input type="text" name="king_addons_lightbox_bg_color" data-alpha-enabled="true" data-default-color="rgba(0,0,0,0.6)" value="<?php echo esc_attr(get_option('king_addons_lightbox_bg_color', 'rgba(0,0,0,0.6)')); ?>" class="color-picker" />
221 </div>
222 </div>
223 </div>
224 <div class="ka-row">
225 <div class="ka-row-label"><?php esc_html_e('Toolbar BG', 'king-addons'); ?></div>
226 <div class="ka-row-field">
227 <div class="ka-color-wrap">
228 <input type="text" name="king_addons_lightbox_toolbar_color" data-alpha-enabled="true" data-default-color="rgba(0,0,0,0.8)" value="<?php echo esc_attr(get_option('king_addons_lightbox_toolbar_color', 'rgba(0,0,0,0.8)')); ?>" class="color-picker" />
229 </div>
230 </div>
231 </div>
232 <div class="ka-row">
233 <div class="ka-row-label"><?php esc_html_e('Caption BG', 'king-addons'); ?></div>
234 <div class="ka-row-field">
235 <div class="ka-color-wrap">
236 <input type="text" name="king_addons_lightbox_caption_color" data-alpha-enabled="true" data-default-color="rgba(0,0,0,0.8)" value="<?php echo esc_attr(get_option('king_addons_lightbox_caption_color', 'rgba(0,0,0,0.8)')); ?>" class="color-picker" />
237 </div>
238 </div>
239 </div>
240 <div class="ka-row">
241 <div class="ka-row-label"><?php esc_html_e('Gallery BG', 'king-addons'); ?></div>
242 <div class="ka-row-field">
243 <div class="ka-color-wrap">
244 <input type="text" name="king_addons_lightbox_gallery_color" data-alpha-enabled="true" data-default-color="#444444" value="<?php echo esc_attr(get_option('king_addons_lightbox_gallery_color', '#444444')); ?>" class="color-picker" />
245 </div>
246 </div>
247 </div>
248 <div class="ka-row">
249 <div class="ka-row-label"><?php esc_html_e('Progress Bar', 'king-addons'); ?></div>
250 <div class="ka-row-field">
251 <div class="ka-color-wrap">
252 <input type="text" name="king_addons_lightbox_pb_color" data-alpha-enabled="true" data-default-color="#8a8a8a" value="<?php echo esc_attr(get_option('king_addons_lightbox_pb_color', '#8a8a8a')); ?>" class="color-picker" />
253 </div>
254 </div>
255 </div>
256 <div class="ka-row">
257 <div class="ka-row-label"><?php esc_html_e('UI Color', 'king-addons'); ?></div>
258 <div class="ka-row-field">
259 <div class="ka-color-wrap">
260 <input type="text" name="king_addons_lightbox_ui_color" data-alpha-enabled="true" data-default-color="#efefef" value="<?php echo esc_attr(get_option('king_addons_lightbox_ui_color', '#efefef')); ?>" class="color-picker" />
261 </div>
262 </div>
263 </div>
264 <div class="ka-row">
265 <div class="ka-row-label"><?php esc_html_e('UI Hover', 'king-addons'); ?></div>
266 <div class="ka-row-field">
267 <div class="ka-color-wrap">
268 <input type="text" name="king_addons_lightbox_ui_hover_color" data-alpha-enabled="true" data-default-color="#ffffff" value="<?php echo esc_attr(get_option('king_addons_lightbox_ui_hover_color', '#ffffff')); ?>" class="color-picker" />
269 </div>
270 </div>
271 </div>
272 </div>
273 </div>
274 </div>
275
276 <div class="ka-card">
277 <div class="ka-card-header">
278 <span class="dashicons dashicons-editor-expand"></span>
279 <h2><?php esc_html_e('Lightbox Sizes', 'king-addons'); ?></h2>
280 </div>
281 <div class="ka-card-body">
282 <div class="ka-row">
283 <div class="ka-row-label"><?php esc_html_e('Icon Size', 'king-addons'); ?></div>
284 <div class="ka-row-field">
285 <input type="number" name="king_addons_lightbox_icon_size" value="<?php echo esc_attr(get_option('king_addons_lightbox_icon_size', '20')); ?>" style="max-width:100px" />
286 <span style="color:#86868b;margin-left:8px">px</span>
287 </div>
288 </div>
289 <div class="ka-row">
290 <div class="ka-row-label"><?php esc_html_e('Arrow Size', 'king-addons'); ?></div>
291 <div class="ka-row-field">
292 <input type="number" name="king_addons_lightbox_arrow_size" value="<?php echo esc_attr(get_option('king_addons_lightbox_arrow_size', '35')); ?>" style="max-width:100px" />
293 <span style="color:#86868b;margin-left:8px">px</span>
294 </div>
295 </div>
296 <div class="ka-row">
297 <div class="ka-row-label"><?php esc_html_e('Text Size', 'king-addons'); ?></div>
298 <div class="ka-row-field">
299 <input type="number" name="king_addons_lightbox_text_size" value="<?php echo esc_attr(get_option('king_addons_lightbox_text_size', '14')); ?>" style="max-width:100px" />
300 <span style="color:#86868b;margin-left:8px">px</span>
301 </div>
302 </div>
303 </div>
304 </div>
305 </div>
306
307 <!-- Performance Tab -->
308 <div class="ka-tab-content" data-tab="performance">
309 <div class="ka-card">
310 <div class="ka-card-header">
311 <span class="dashicons dashicons-download"></span>
312 <h2><?php esc_html_e('Import Templates', 'king-addons'); ?></h2>
313 </div>
314 <div class="ka-card-body">
315 <div class="ka-row">
316 <div class="ka-row-label"><?php esc_html_e('Performance Mode', 'king-addons'); ?></div>
317 <div class="ka-row-field">
318 <label class="ka-toggle">
319 <input type="checkbox" name="king_addons_improve_import_performance" value="1" <?php checked($improve_import_performance, '1'); ?> />
320 <span class="ka-toggle-slider"></span>
321 <span class="ka-toggle-label"><?php esc_html_e('Improve import on low-performance servers', 'king-addons'); ?></span>
322 </label>
323 <p class="ka-row-desc"><?php esc_html_e('Applies optimizations like increased PHP limits during import. Enabled by default.', 'king-addons'); ?></p>
324 </div>
325 </div>
326 <?php if (function_exists('king_addons_freemius') && king_addons_freemius()->can_use_premium_code()) : ?>
327 <div class="ka-row">
328 <div class="ka-row-label"><?php esc_html_e('Template Button', 'king-addons'); ?><span class="ka-pro-badge">PRO</span></div>
329 <div class="ka-row-field">
330 <label class="ka-toggle">
331 <input type="checkbox" name="king_addons_disable_template_catalog_button" value="1" <?php checked($disable_template_catalog_button, '1'); ?> />
332 <span class="ka-toggle-slider"></span>
333 <span class="ka-toggle-label"><?php esc_html_e('Hide "Start with a Template" button in editor', 'king-addons'); ?></span>
334 </label>
335 </div>
336 </div>
337 <?php endif; ?>
338 </div>
339 </div>
340 </div>
341
342 <div class="ka-card">
343 <div class="ka-submit">
344 <button type="submit" name="king_addons_settings_submit_settings" class="ka-btn ka-btn-primary">
345 <?php esc_html_e('Save Settings', 'king-addons'); ?>
346 </button>
347 </div>
348 </div>
349 </form>
350 </div>
351
352 <?php
353 // Enqueue color picker
354 wp_enqueue_style('wp-color-picker');
355 wp_enqueue_script('wp-color-picker');
356 ?>
357 <script>
358 (function($) {
359 'use strict';
360
361 $(document).ready(function() {
362 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
363 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
364
365 // Theme segmented control (dashboard-style)
366 const $themeSegment = $('#ka-v3-theme-segment');
367 const $themeSegmentButtons = $themeSegment.find('.ka-v3-segmented-btn');
368 const themeMql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
369 let themeMode = ($themeSegment.attr('data-active') || 'dark').toString();
370 let themeMqlHandler = null;
371
372 function saveUISetting(key, value) {
373 $.post(ajaxUrl, {
374 action: 'king_addons_save_dashboard_ui',
375 nonce: nonce,
376 key: key,
377 value: value
378 });
379 }
380
381 function updateSegment(mode) {
382 $themeSegment.attr('data-active', mode);
383 $themeSegmentButtons.each(function() {
384 const theme = $(this).data('theme');
385 $(this).attr('aria-pressed', theme === mode ? 'true' : 'false');
386 });
387 }
388
389 function applyThemeClass(isDark) {
390 $('body').toggleClass('ka-v3-dark', isDark);
391 document.documentElement.classList.toggle('ka-v3-dark', isDark);
392 }
393
394 function setThemeMode(mode, save) {
395 themeMode = mode;
396 updateSegment(mode);
397
398 if (themeMqlHandler && themeMql) {
399 if (themeMql.removeEventListener) {
400 themeMql.removeEventListener('change', themeMqlHandler);
401 } else if (themeMql.removeListener) {
402 themeMql.removeListener(themeMqlHandler);
403 }
404 themeMqlHandler = null;
405 }
406
407 if (mode === 'auto') {
408 applyThemeClass(!!(themeMql && themeMql.matches));
409 themeMqlHandler = function(e) {
410 if (themeMode !== 'auto') {
411 return;
412 }
413 applyThemeClass(!!e.matches);
414 };
415 if (themeMql) {
416 if (themeMql.addEventListener) {
417 themeMql.addEventListener('change', themeMqlHandler);
418 } else if (themeMql.addListener) {
419 themeMql.addListener(themeMqlHandler);
420 }
421 }
422 } else {
423 applyThemeClass(mode === 'dark');
424 }
425
426 if (save) {
427 saveUISetting('theme_mode', mode);
428 }
429 }
430
431 $themeSegment.on('click', '.ka-v3-segmented-btn', function(e) {
432 e.preventDefault();
433 const mode = ($(this).data('theme') || 'dark').toString();
434 setThemeMode(mode, true);
435 });
436
437 // Ensure mode applies for Auto (listener + system state)
438 setThemeMode(themeMode, false);
439
440 // Tab navigation
441 $('.ka-tab').on('click', function() {
442 const target = $(this).data('tab');
443 $('.ka-tab').removeClass('active');
444 $(this).addClass('active');
445 $('.ka-tab-content').removeClass('active');
446 $(`.ka-tab-content[data-tab="${target}"]`).addClass('active');
447 });
448
449 // Initialize color pickers
450 if ($.fn.wpColorPicker) {
451 $('.color-picker').each(function() {
452 var $input = $(this);
453 $input.wpColorPicker({
454 defaultColor: $input.data('default-color') || ''
455 });
456 });
457 }
458 });
459 })(jQuery);
460 </script>
461