PluginProbe
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder / 51.1.44
King Addons for Elementor – 100+ Elementor Widgets, 4 000+ Elementor Templates, WooCommerce Builder, Mega Menu, Popup Builder v51.1.44
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 51.1.45 All 40 releases
king-addons / includes / admin / layouts / wishlist-page.php

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

475 lines 26.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Wishlist admin settings page - V3 Apple-inspired design.
4 *
5 * @package King_Addons
6 */
7
8 use King_Addons\Wishlist\Wishlist_Settings;
9
10 if (!defined('ABSPATH')) {
11 exit;
12 }
13
14 // Theme mode is per-user
15 $theme_mode = get_user_meta(get_current_user_id(), 'king_addons_theme_mode', true);
16 $allowed_theme_modes = ['dark', 'light', 'auto'];
17 if (!in_array($theme_mode, $allowed_theme_modes, true)) {
18 $theme_mode = 'dark';
19 }
20
21 $settings = Wishlist_Settings::get_settings();
22 $pages = get_pages(['sort_column' => 'post_title', 'sort_order' => 'ASC']);
23 $columns = Wishlist_Settings::get_column_options();
24 $is_pro = function_exists('king_addons_freemius') && king_addons_freemius()->can_use_premium_code__premium_only();
25
26 // Enqueue the shared CSS
27 $css_url = KING_ADDONS_URL . 'includes/admin/layouts/shared/admin-v3-styles.css';
28 $css_path = KING_ADDONS_PATH . 'includes/admin/layouts/shared/admin-v3-styles.css';
29 $css_version = file_exists($css_path) ? filemtime($css_path) : KING_ADDONS_VERSION;
30 ?>
31
32 <link rel="stylesheet" href="<?php echo esc_url($css_url); ?>?v=<?php echo esc_attr($css_version); ?>">
33
34 <script>
35 document.body.classList.add('ka-admin-v3');
36 (function() {
37 const mode = '<?php echo esc_js($theme_mode); ?>';
38 const mql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
39 const isDark = mode === 'auto' ? !!(mql && mql.matches) : mode === 'dark';
40 document.body.classList.toggle('ka-v3-dark', isDark);
41 document.documentElement.classList.toggle('ka-v3-dark', isDark);
42 })();
43 </script>
44
45 <div class="ka-admin-wrap">
46 <!-- Header -->
47 <div class="ka-admin-header">
48 <div class="ka-admin-header-left">
49 <div class="ka-admin-header-icon pink">
50 <span class="dashicons dashicons-heart"></span>
51 </div>
52 <div>
53 <h1 class="ka-admin-title"><?php esc_html_e('Wishlist', 'king-addons'); ?></h1>
54 <p class="ka-admin-subtitle"><?php esc_html_e('Configure WooCommerce wishlist functionality.', 'king-addons'); ?></p>
55 </div>
56 </div>
57 <div class="ka-admin-header-actions">
58 <span class="ka-status <?php echo !empty($settings['enabled']) ? 'ka-status-enabled' : 'ka-status-disabled'; ?>">
59 <span class="ka-status-dot"></span>
60 <?php echo !empty($settings['enabled']) ? esc_html__('Enabled', 'king-addons') : esc_html__('Disabled', 'king-addons'); ?>
61 </span>
62 <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); ?>">
63 <span class="ka-v3-segmented-indicator" aria-hidden="true"></span>
64 <button type="button" class="ka-v3-segmented-btn" data-theme="light" aria-pressed="<?php echo $theme_mode === 'light' ? 'true' : 'false'; ?>">
65 <span class="ka-v3-segmented-icon" aria-hidden="true">☀︎</span>
66 <?php esc_html_e('Light', 'king-addons'); ?>
67 </button>
68 <button type="button" class="ka-v3-segmented-btn" data-theme="dark" aria-pressed="<?php echo $theme_mode === 'dark' ? 'true' : 'false'; ?>">
69 <span class="ka-v3-segmented-icon" aria-hidden="true">☾</span>
70 <?php esc_html_e('Dark', 'king-addons'); ?>
71 </button>
72 <button type="button" class="ka-v3-segmented-btn" data-theme="auto" aria-pressed="<?php echo $theme_mode === 'auto' ? 'true' : 'false'; ?>">
73 <?php esc_html_e('Auto', 'king-addons'); ?>
74 </button>
75 </div>
76 <a href="<?php echo esc_url(admin_url('admin.php?page=king-addons-wishlist-analytics')); ?>" class="ka-btn ka-btn-pink">
77 <span class="dashicons dashicons-chart-bar"></span>
78 <?php esc_html_e('Analytics', 'king-addons'); ?>
79 </a>
80 </div>
81 </div>
82
83 <!-- Tabs Navigation -->
84 <div class="ka-tabs">
85 <button type="button" class="ka-tab active" data-tab="general"><?php esc_html_e('General', 'king-addons'); ?></button>
86 <button type="button" class="ka-tab" data-tab="buttons"><?php esc_html_e('Buttons & Icons', 'king-addons'); ?></button>
87 <button type="button" class="ka-tab" data-tab="page"><?php esc_html_e('Wishlist Page', 'king-addons'); ?></button>
88 <button type="button" class="ka-tab" data-tab="performance"><?php esc_html_e('Performance', 'king-addons'); ?></button>
89 <button type="button" class="ka-tab" data-tab="pro"><?php esc_html_e('Pro Features', 'king-addons'); ?><?php if (!$is_pro) : ?><span class="ka-pro-badge">PRO</span><?php endif; ?></button>
90 </div>
91
92 <form method="post" action="options.php" id="king-addons-wishlist-form">
93 <?php settings_fields('king_addons_wishlist'); ?>
94
95 <!-- General Tab -->
96 <div class="ka-tab-content active" data-tab="general">
97 <div class="ka-card">
98 <div class="ka-card-header">
99 <span class="dashicons dashicons-admin-settings pink"></span>
100 <h2><?php esc_html_e('General Settings', 'king-addons'); ?></h2>
101 </div>
102 <div class="ka-card-body">
103 <div class="ka-row">
104 <div class="ka-row-label"><?php esc_html_e('Enable Wishlist', 'king-addons'); ?></div>
105 <div class="ka-row-field">
106 <label class="ka-toggle">
107 <input type="checkbox" name="king_addons_wishlist_settings[enabled]" value="1" <?php checked(!empty($settings['enabled'])); ?> />
108 <span class="ka-toggle-slider"></span>
109 <span class="ka-toggle-label"><?php esc_html_e('Turn on wishlist functionality', 'king-addons'); ?></span>
110 </label>
111 </div>
112 </div>
113 <div class="ka-row">
114 <div class="ka-row-label"><?php esc_html_e('Wishlist Page', 'king-addons'); ?></div>
115 <div class="ka-row-field">
116 <select name="king_addons_wishlist_settings[wishlist_page_id]">
117 <option value="0"><?php esc_html_e('— Select page —', 'king-addons'); ?></option>
118 <?php foreach ($pages as $page) : ?>
119 <option value="<?php echo esc_attr($page->ID); ?>" <?php selected(intval($settings['wishlist_page_id']), $page->ID); ?>>
120 <?php echo esc_html($page->post_title); ?>
121 </option>
122 <?php endforeach; ?>
123 </select>
124 <p class="ka-row-desc"><?php esc_html_e('Choose the page that displays the wishlist or use the shortcode [ka_wishlist_page].', 'king-addons'); ?></p>
125 </div>
126 </div>
127 <div class="ka-row">
128 <div class="ka-row-label"><?php esc_html_e('Allow Guests', 'king-addons'); ?></div>
129 <div class="ka-row-field">
130 <label class="ka-toggle">
131 <input type="checkbox" name="king_addons_wishlist_settings[allow_guests]" value="1" <?php checked(!empty($settings['allow_guests'])); ?> />
132 <span class="ka-toggle-slider"></span>
133 <span class="ka-toggle-label"><?php esc_html_e('Guests can use wishlist with session', 'king-addons'); ?></span>
134 </label>
135 </div>
136 </div>
137 <div class="ka-row">
138 <div class="ka-row-label"><?php esc_html_e('Guest Notice', 'king-addons'); ?></div>
139 <div class="ka-row-field">
140 <textarea name="king_addons_wishlist_settings[guest_block_text]" rows="2" style="max-width:100%"><?php echo esc_textarea($settings['guest_block_text']); ?></textarea>
141 <p class="ka-row-desc"><?php esc_html_e('Message shown to guests when wishlist is disabled for them.', 'king-addons'); ?></p>
142 </div>
143 </div>
144 </div>
145 </div>
146 </div>
147
148 <!-- Buttons Tab -->
149 <div class="ka-tab-content" data-tab="buttons">
150 <div class="ka-card">
151 <div class="ka-card-header">
152 <span class="dashicons dashicons-button pink"></span>
153 <h2><?php esc_html_e('Button Settings', 'king-addons'); ?></h2>
154 </div>
155 <div class="ka-card-body">
156 <div class="ka-row">
157 <div class="ka-row-label"><?php esc_html_e('Default Text', 'king-addons'); ?></div>
158 <div class="ka-row-field">
159 <input type="text" name="king_addons_wishlist_settings[button_add_text]" value="<?php echo esc_attr($settings['button_add_text']); ?>" />
160 </div>
161 </div>
162 <div class="ka-row">
163 <div class="ka-row-label"><?php esc_html_e('Added Text', 'king-addons'); ?></div>
164 <div class="ka-row-field">
165 <input type="text" name="king_addons_wishlist_settings[button_added_text]" value="<?php echo esc_attr($settings['button_added_text']); ?>" />
166 </div>
167 </div>
168 <div class="ka-row">
169 <div class="ka-row-label"><?php esc_html_e('Display Mode', 'king-addons'); ?></div>
170 <div class="ka-row-field">
171 <div class="ka-radio-group">
172 <label class="ka-radio-item">
173 <input type="radio" name="king_addons_wishlist_settings[button_display_mode]" value="icon_text" <?php checked($settings['button_display_mode'], 'icon_text'); ?> />
174 <?php esc_html_e('Icon with text', 'king-addons'); ?>
175 </label>
176 <label class="ka-radio-item">
177 <input type="radio" name="king_addons_wishlist_settings[button_display_mode]" value="icon" <?php checked($settings['button_display_mode'], 'icon'); ?> />
178 <?php esc_html_e('Icon only', 'king-addons'); ?>
179 </label>
180 </div>
181 </div>
182 </div>
183 <div class="ka-row">
184 <div class="ka-row-label"><?php esc_html_e('Icon Class', 'king-addons'); ?></div>
185 <div class="ka-row-field">
186 <input type="text" name="king_addons_wishlist_settings[icon_choice]" value="<?php echo esc_attr($settings['icon_choice']); ?>" />
187 <p class="ka-row-desc"><?php esc_html_e('Elementor or FontAwesome class, e.g. eicon-heart', 'king-addons'); ?></p>
188 </div>
189 </div>
190 <div class="ka-row">
191 <div class="ka-row-label"><?php esc_html_e('Position', 'king-addons'); ?></div>
192 <div class="ka-row-field">
193 <select name="king_addons_wishlist_settings[button_position]">
194 <option value="before_add_to_cart" <?php selected($settings['button_position'], 'before_add_to_cart'); ?>><?php esc_html_e('Before Add to Cart', 'king-addons'); ?></option>
195 <option value="after_add_to_cart" <?php selected($settings['button_position'], 'after_add_to_cart'); ?>><?php esc_html_e('After Add to Cart', 'king-addons'); ?></option>
196 </select>
197 </div>
198 </div>
199 <div class="ka-row">
200 <div class="ka-row-label"><?php esc_html_e('Show in Archives', 'king-addons'); ?></div>
201 <div class="ka-row-field">
202 <label class="ka-toggle">
203 <input type="checkbox" name="king_addons_wishlist_settings[show_in_archives]" value="1" <?php checked(!empty($settings['show_in_archives'])); ?> />
204 <span class="ka-toggle-slider"></span>
205 <span class="ka-toggle-label"><?php esc_html_e('Display in product loops', 'king-addons'); ?></span>
206 </label>
207 </div>
208 </div>
209 </div>
210 </div>
211 </div>
212
213 <!-- Page Tab -->
214 <div class="ka-tab-content" data-tab="page">
215 <div class="ka-card">
216 <div class="ka-card-header">
217 <span class="dashicons dashicons-editor-table pink"></span>
218 <h2><?php esc_html_e('Table Columns', 'king-addons'); ?></h2>
219 </div>
220 <div class="ka-card-body">
221 <div class="ka-row">
222 <div class="ka-row-label"><?php esc_html_e('Columns', 'king-addons'); ?></div>
223 <div class="ka-row-field">
224 <p class="ka-row-desc" style="margin-top:0;margin-bottom:12px"><?php esc_html_e('Drag to reorder. Check/uncheck to show/hide.', 'king-addons'); ?></p>
225 <ul id="ka-wishlist-columns" class="ka-sortable-list">
226 <?php foreach ($settings['wishlist_columns'] as $saved_key) : if (isset($columns[$saved_key])) : ?>
227 <li class="ka-sortable-item" data-column="<?php echo esc_attr($saved_key); ?>">
228 <span class="dashicons dashicons-menu ka-sortable-handle"></span>
229 <label>
230 <input type="checkbox" name="king_addons_wishlist_settings[wishlist_columns][]" value="<?php echo esc_attr($saved_key); ?>" checked />
231 <?php echo esc_html($columns[$saved_key]); ?>
232 </label>
233 </li>
234 <?php endif; endforeach; ?>
235 <?php foreach ($columns as $column_key => $label) : if (!in_array($column_key, $settings['wishlist_columns'], true)) : ?>
236 <li class="ka-sortable-item" data-column="<?php echo esc_attr($column_key); ?>">
237 <span class="dashicons dashicons-menu ka-sortable-handle"></span>
238 <label>
239 <input type="checkbox" name="king_addons_wishlist_settings[wishlist_columns][]" value="<?php echo esc_attr($column_key); ?>" />
240 <?php echo esc_html($label); ?>
241 </label>
242 </li>
243 <?php endif; endforeach; ?>
244 </ul>
245 </div>
246 </div>
247 </div>
248 </div>
249 </div>
250
251 <!-- Performance Tab -->
252 <div class="ka-tab-content" data-tab="performance">
253 <div class="ka-card">
254 <div class="ka-card-header">
255 <span class="dashicons dashicons-performance pink"></span>
256 <h2><?php esc_html_e('Performance', 'king-addons'); ?></h2>
257 </div>
258 <div class="ka-card-body">
259 <div class="ka-row">
260 <div class="ka-row-label"><?php esc_html_e('Frontend Cache', 'king-addons'); ?></div>
261 <div class="ka-row-field">
262 <label class="ka-toggle">
263 <input type="checkbox" name="king_addons_wishlist_settings[cache_enabled]" value="1" <?php checked(!empty($settings['cache_enabled'])); ?> />
264 <span class="ka-toggle-slider"></span>
265 <span class="ka-toggle-label"><?php esc_html_e('Cache wishlist fragments', 'king-addons'); ?></span>
266 </label>
267 <p class="ka-row-desc"><?php esc_html_e('Basic HTML cache. Disable if counts appear stale.', 'king-addons'); ?></p>
268 </div>
269 </div>
270 <div class="ka-row">
271 <div class="ka-row-label"><?php esc_html_e('Cache Lifetime', 'king-addons'); ?></div>
272 <div class="ka-row-field">
273 <input type="number" min="0" step="30" name="king_addons_wishlist_settings[cache_ttl]" value="<?php echo esc_attr(intval($settings['cache_ttl'])); ?>" style="max-width:120px" />
274 <span style="color:#86868b;margin-left:8px"><?php esc_html_e('seconds', 'king-addons'); ?></span>
275 </div>
276 </div>
277 </div>
278 </div>
279 </div>
280
281 <!-- Pro Tab -->
282 <div class="ka-tab-content" data-tab="pro">
283 <?php if (!$is_pro) : ?>
284 <div class="ka-upgrade-card">
285 <h3><?php esc_html_e('Upgrade to Pro', 'king-addons'); ?></h3>
286 <p><?php esc_html_e('Unlock powerful wishlist features for your WooCommerce store.', 'king-addons'); ?></p>
287 <ul>
288 <li><?php esc_html_e('Multiple wishlists with visibility control', 'king-addons'); ?></li>
289 <li><?php esc_html_e('Shareable links and social buttons', 'king-addons'); ?></li>
290 <li><?php esc_html_e('Email triggers for price drops and restocks', 'king-addons'); ?></li>
291 <li><?php esc_html_e('Wishlist analytics and CSV export', 'king-addons'); ?></li>
292 <li><?php esc_html_e('Product notes and advanced design controls', 'king-addons'); ?></li>
293 </ul>
294 <a href="https://kingaddons.com/pricing/?utm_source=kng-wishlist-admin&utm_medium=plugin&utm_campaign=kng" target="_blank" class="ka-btn ka-btn-pink">
295 <?php esc_html_e('View Pro Plans', 'king-addons'); ?>
296 </a>
297 </div>
298 <?php else :
299 $email_settings = class_exists('King_Addons\Wishlist\Wishlist_Email_Notifications')
300 ? \King_Addons\Wishlist\Wishlist_Email_Notifications::get_settings()
301 : [];
302 ?>
303 <div class="ka-card">
304 <div class="ka-card-header">
305 <span class="dashicons dashicons-email-alt pink"></span>
306 <h2><?php esc_html_e('Email Notifications', 'king-addons'); ?></h2>
307 </div>
308 <div class="ka-card-body">
309 <div class="ka-row">
310 <div class="ka-row-label"><?php esc_html_e('Price Drops', 'king-addons'); ?></div>
311 <div class="ka-row-field">
312 <label class="ka-toggle">
313 <input type="checkbox" name="king_addons_wishlist_email_settings[enable_price_drop]" value="1" <?php checked(!empty($email_settings['enable_price_drop'])); ?> />
314 <span class="ka-toggle-slider"></span>
315 <span class="ka-toggle-label"><?php esc_html_e('Notify on price reduction', 'king-addons'); ?></span>
316 </label>
317 </div>
318 </div>
319 <div class="ka-row">
320 <div class="ka-row-label"><?php esc_html_e('Back in Stock', 'king-addons'); ?></div>
321 <div class="ka-row-field">
322 <label class="ka-toggle">
323 <input type="checkbox" name="king_addons_wishlist_email_settings[enable_back_in_stock]" value="1" <?php checked(!empty($email_settings['enable_back_in_stock'])); ?> />
324 <span class="ka-toggle-slider"></span>
325 <span class="ka-toggle-label"><?php esc_html_e('Notify when product returns', 'king-addons'); ?></span>
326 </label>
327 </div>
328 </div>
329 <div class="ka-row">
330 <div class="ka-row-label"><?php esc_html_e('Weekly Digest', 'king-addons'); ?></div>
331 <div class="ka-row-field">
332 <label class="ka-toggle">
333 <input type="checkbox" name="king_addons_wishlist_email_settings[enable_digest]" value="1" <?php checked(!empty($email_settings['enable_digest'])); ?> />
334 <span class="ka-toggle-slider"></span>
335 <span class="ka-toggle-label"><?php esc_html_e('Send weekly wishlist summary', 'king-addons'); ?></span>
336 </label>
337 </div>
338 </div>
339 <div class="ka-row">
340 <div class="ka-row-label"><?php esc_html_e('Price Threshold', 'king-addons'); ?></div>
341 <div class="ka-row-field">
342 <input type="number" min="1" max="50" name="king_addons_wishlist_email_settings[price_threshold]" value="<?php echo esc_attr($email_settings['price_threshold'] ?? 5); ?>" style="max-width:80px" />
343 <span style="color:#86868b;margin-left:8px">%</span>
344 <p class="ka-row-desc"><?php esc_html_e('Minimum % drop to trigger notification', 'king-addons'); ?></p>
345 </div>
346 </div>
347 <div class="ka-row">
348 <div class="ka-row-label"><?php esc_html_e('Daily Limit', 'king-addons'); ?></div>
349 <div class="ka-row-field">
350 <input type="number" min="1" max="10" name="king_addons_wishlist_email_settings[daily_email_limit]" value="<?php echo esc_attr($email_settings['daily_email_limit'] ?? 3); ?>" style="max-width:80px" />
351 <span style="color:#86868b;margin-left:8px"><?php esc_html_e('emails/user/day', 'king-addons'); ?></span>
352 </div>
353 </div>
354 </div>
355 </div>
356 <?php endif; ?>
357 </div>
358
359 <div class="ka-card">
360 <div class="ka-submit">
361 <button type="submit" class="ka-btn ka-btn-pink">
362 <?php esc_html_e('Save Settings', 'king-addons'); ?>
363 </button>
364 </div>
365 </div>
366 </form>
367 </div>
368
369 <script>
370 (function($) {
371 'use strict';
372
373 $(document).ready(function() {
374 const ajaxUrl = '<?php echo esc_url(admin_url('admin-ajax.php')); ?>';
375 const nonce = '<?php echo esc_js(wp_create_nonce('king_addons_dashboard_ui')); ?>';
376
377 // Theme segmented control (dashboard-style)
378 const $themeSegment = $('#ka-v3-theme-segment');
379 const $themeSegmentButtons = $themeSegment.find('.ka-v3-segmented-btn');
380 const themeMql = window.matchMedia ? window.matchMedia('(prefers-color-scheme: dark)') : null;
381 let themeMode = ($themeSegment.attr('data-active') || 'dark').toString();
382 let themeMqlHandler = null;
383
384 function saveUISetting(key, value) {
385 $.post(ajaxUrl, {
386 action: 'king_addons_save_dashboard_ui',
387 nonce: nonce,
388 key: key,
389 value: value
390 });
391 }
392
393 function updateSegment(mode) {
394 $themeSegment.attr('data-active', mode);
395 $themeSegmentButtons.each(function() {
396 const theme = $(this).data('theme');
397 $(this).attr('aria-pressed', theme === mode ? 'true' : 'false');
398 });
399 }
400
401 function applyThemeClass(isDark) {
402 $('body').toggleClass('ka-v3-dark', isDark);
403 document.documentElement.classList.toggle('ka-v3-dark', isDark);
404 }
405
406 function setThemeMode(mode, save) {
407 themeMode = mode;
408 updateSegment(mode);
409
410 if (themeMqlHandler && themeMql) {
411 if (themeMql.removeEventListener) {
412 themeMql.removeEventListener('change', themeMqlHandler);
413 } else if (themeMql.removeListener) {
414 themeMql.removeListener(themeMqlHandler);
415 }
416 themeMqlHandler = null;
417 }
418
419 if (mode === 'auto') {
420 applyThemeClass(!!(themeMql && themeMql.matches));
421 themeMqlHandler = function(e) {
422 if (themeMode !== 'auto') {
423 return;
424 }
425 applyThemeClass(!!e.matches);
426 };
427 if (themeMql) {
428 if (themeMql.addEventListener) {
429 themeMql.addEventListener('change', themeMqlHandler);
430 } else if (themeMql.addListener) {
431 themeMql.addListener(themeMqlHandler);
432 }
433 }
434 } else {
435 applyThemeClass(mode === 'dark');
436 }
437
438 if (save) {
439 saveUISetting('theme_mode', mode);
440 }
441 }
442
443 $themeSegment.on('click', '.ka-v3-segmented-btn', function(e) {
444 e.preventDefault();
445 const mode = ($(this).data('theme') || 'dark').toString();
446 setThemeMode(mode, true);
447 });
448
449 // Ensure mode applies for Auto (listener + system state)
450 setThemeMode(themeMode, false);
451
452 // Tab navigation
453 $('.ka-tab').on('click', function() {
454 const target = $(this).data('tab');
455 $('.ka-tab').removeClass('active');
456 $(this).addClass('active');
457 $('.ka-tab-content').removeClass('active');
458 $(`.ka-tab-content[data-tab="${target}"]`).addClass('active');
459 });
460
461 // Sortable columns
462 if ($.fn.sortable) {
463 $('#ka-wishlist-columns').sortable({
464 handle: '.ka-sortable-handle',
465 placeholder: 'ui-sortable-placeholder',
466 axis: 'y',
467 cursor: 'move',
468 tolerance: 'pointer'
469 });
470 }
471 });
472 })(jQuery);
473 </script>
474 <?php wp_enqueue_script('jquery-ui-sortable'); ?>
475