PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.2.4.5
Adminify – White Label, Admin Menu Editor, Login Customizer v3.2.4.5
4.3.1 4.3.0 4.2.26 4.2.25 4.2.24 4.2.23 4.2.22 4.2.21 4.2.20 4.2.19 4.2.18 4.2.17 4.2.16 4.2.15 4.2.14 4.2.13 4.2.12 4.2.11 4.2.10 4.2.9 4.2.8 4.2.7 4.2.6 4.2.5 4.1.17 All 164 releases
adminify / Inc / Modules / MenuEditor / MenuEditor.php

MenuEditor.php in Adminify – White Label, Admin Menu Editor, Login Customizer 3.2.4.5, at Inc/Modules/MenuEditor/MenuEditor.php

1,591 lines 66.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace WPAdminify\Inc\Modules\MenuEditor;
4
5 use WPAdminify\Inc\Utils;
6 use WPAdminify\Inc\Admin\AdminSettings;
7 use WPAdminify\Inc\Modules\MenuEditor\MenuEditorAssets;
8 // no direct access allowed
9 if ( !defined( 'ABSPATH' ) ) {
10 exit;
11 }
12 /**
13 * WP Adminify
14 *
15 * @package WP Adminify: Menu Editor
16 *
17 * @author WP Adminify <support@wpadminify.com>
18 */
19 if ( !class_exists( 'MenuEditor' ) ) {
20 class MenuEditor extends MenuEditorModel {
21 public $url;
22
23 public $menu;
24
25 public $users;
26
27 public $roles;
28
29 public $submenu;
30
31 public $options = [];
32
33 public $menu_settings = [];
34
35 public function __construct() {
36 $this->url = WP_ADMINIFY_URL . 'Inc/Modules/MenuEditor';
37 $this->menu_settings = ( new MenuEditorOptions() )->get();
38 $this->options = (array) AdminSettings::get_instance()->get();
39 add_filter( 'upload_mimes', [$this, 'custom_icon_mime_types'] );
40 add_action( 'admin_menu', [$this, 'jltwp_adminify_menu_editor_submenu'], 51 );
41 add_filter( 'admin_body_class', [$this, 'jltwp_adminify_menu_editor_body_class'] );
42 add_filter( 'parent_file', [$this, 'set_menu'], 800 );
43 add_filter( 'parent_file', [$this, 'apply_menu'], 900 );
44 add_action( 'wp_ajax_adminify_save_menu_settings', [$this, 'adminify_save_menu_settings'] );
45 add_action( 'wp_ajax_adminify_reset_menu_settings', [$this, 'adminify_reset_menu_settings'] );
46 add_action( 'wp_ajax_adminify_export_menu_settings', [$this, 'adminify_export_menu_settings'] );
47 add_action( 'wp_ajax_adminify_import_menu_settings', [$this, 'adminify_import_menu_settings'] );
48 add_action( 'wp_ajax_adminify_file_upload', [$this, 'adminify_file_upload_callback'] );
49 add_action( 'wp_ajax_adminify_load_custom_icons', [$this, 'adminify_load_custom_icons_callback'] );
50 new MenuEditorAssets();
51 }
52
53 public function custom_icon_mime_types( $mimes ) {
54 $mimes['svg'] = 'image/svg+xml';
55 return $mimes;
56 }
57
58 public function filter_attachment( $value ) {
59 // return $value->post_title == 'adminify-custom-icon';
60 return strpos( $value->guid, 'adminify-custom-icon' ) !== false;
61 }
62
63 public function adminify_load_custom_icons_callback() {
64 $result['images'] = null;
65 $query = get_posts( [
66 'post_type' => 'attachment',
67 'numberposts' => -1,
68 ] );
69 $filtered = array_filter( $query, [$this, 'filter_attachment'] );
70 foreach ( $filtered as $key => $value ) {
71 $result['images'][$value->ID] = $value->guid;
72 }
73 echo wp_json_encode( $result );
74 die;
75 }
76
77 public function adminify_file_upload_callback() {
78 $result['status'] = false;
79 check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' );
80 $upload_dir = wp_upload_dir();
81 $targeted_dir = $upload_dir['basedir'] . '/adminify-custom-icons';
82 if ( !is_dir( $targeted_dir ) ) {
83 wp_mkdir_p( $targeted_dir );
84 }
85 add_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] );
86 $files = wp_kses_post_deep( wp_unslash( $_FILES['my_file_upload'] ) );
87 foreach ( $files['name'] as $key => $value ) {
88 if ( $files['name'][$key] ) {
89 $file = [
90 'name' => $files['name'][$key],
91 'type' => $files['type'][$key],
92 'tmp_name' => $files['tmp_name'][$key],
93 'error' => $files['error'][$key],
94 'size' => $files['size'][$key],
95 ];
96 $_FILES = [
97 'upload_file' => $file,
98 ];
99 $attachment_id = media_handle_upload( 'upload_file', 0 );
100 if ( is_wp_error( $attachment_id ) ) {
101 // There was an error uploading the image.
102 $result['status'] = false;
103 $result['message'] = __( 'Error uploading file.', 'adminify' );
104 } else {
105 // The image was uploaded successfully!
106 $result['status'] = true;
107 $result['message'] = __( 'File Uploaded successfully.', 'adminify' );
108 $result['images'][$attachment_id] = wp_get_attachment_url( $attachment_id );
109 }
110 }
111 }
112 remove_filter( 'upload_dir', [$this, 'adminify_icon_custom_upload_dir'] );
113 echo wp_json_encode( $result );
114 wp_die();
115 }
116
117 public function adminify_icon_custom_upload_dir( $dir_data ) {
118 // $dir_data already you might want to use
119 $custom_dir = 'adminify-custom-icons';
120 return [
121 'path' => $dir_data['basedir'] . '/' . $custom_dir,
122 'url' => $dir_data['baseurl'] . '/' . $custom_dir,
123 'subdir' => '/' . $custom_dir,
124 'basedir' => $dir_data['basedir'],
125 'baseurl' => $dir_data['baseurl'],
126 'error' => $dir_data['error'],
127 ];
128 }
129
130 // Menu Editor Body Class
131 public function jltwp_adminify_menu_editor_body_class( $classes ) {
132 $classes .= ' adminify_menu_editor ';
133 return $classes;
134 }
135
136 /**
137 * Sanitises and strips tags of input from ajax
138 *
139 * @since 1.0.0
140 * @variables $values = item to clean (array or string)
141 */
142 public function clean_ajax_input( $values ) {
143 if ( is_array( $values ) ) {
144 foreach ( $values as $index => $in ) {
145 if ( is_array( $in ) ) {
146 $values[$index] = $this->clean_ajax_input( $in );
147 } else {
148 $values[$index] = strip_tags( $in );
149 }
150 }
151 } else {
152 $values = strip_tags( $values );
153 }
154 return $values;
155 }
156
157 /**
158 * Returns ajax error
159 *
160 * @since 1.4
161 * @variables $message = error message to send back to user (string)
162 */
163 public function ajax_error_message( $message ) {
164 $returndata = [];
165 $returndata['error'] = true;
166 $returndata['error_message'] = $message;
167 return json_encode( $returndata );
168 }
169
170 public function adminify_save_menu_settings() {
171 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
172 $options = wp_kses_post_deep( wp_unslash( $_POST['options'] ) );
173 $options = $this->clean_ajax_input( $options );
174 if ( $options == '' || !is_array( $options ) ) {
175 $message = __( 'No options supplied to save', 'adminify' );
176 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
177 die;
178 }
179 if ( is_array( $options ) ) {
180 update_option( $this->prefix, $options );
181 $returndata = [];
182 $returndata['success'] = true;
183 $returndata['message'] = __( 'Settings saved', 'adminify' );
184 echo json_encode( $returndata );
185 die;
186 } else {
187 $message = __( 'Something went wrong', 'adminify' );
188 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
189 die;
190 }
191 }
192 die;
193 }
194
195 /**
196 * Menu Editor Settings Reset
197 *
198 * @return void
199 */
200 public function adminify_reset_menu_settings() {
201 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
202 update_option( $this->prefix, [] );
203 $menu_editor_options = get_option( $this->prefix );
204 if ( !$menu_editor_options ) {
205 $returndata = [];
206 $returndata['success'] = true;
207 $returndata['message'] = __( 'Settings reset', 'adminify' );
208 echo json_encode( $returndata );
209 die;
210 } else {
211 $message = __( 'Something went wrong', 'adminify' );
212 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
213 die;
214 }
215 }
216 die;
217 }
218
219 /**
220 * Export Menu Editor Settings
221 *
222 * @return void
223 */
224 public function adminify_export_menu_settings() {
225 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
226 $menu_editor_options = get_option( $this->prefix );
227 echo json_encode( $menu_editor_options );
228 }
229 die;
230 }
231
232 /**
233 * Import Menu Editor Settings
234 *
235 * @since 1.0.0
236 */
237 public function adminify_import_menu_settings() {
238 if ( defined( 'DOING_AJAX' ) && DOING_AJAX && check_ajax_referer( 'adminify-menu-editor-security-nonce', 'security' ) > 0 ) {
239 $new_options = wp_kses_post_deep( $_POST['settings'] );
240 if ( $new_options == '' || !is_array( $new_options ) ) {
241 $message = __( 'No options supplied to save', 'adminify' );
242 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
243 die;
244 }
245 if ( is_array( $new_options ) ) {
246 update_option( $this->prefix, $new_options );
247 $returndata = [];
248 $returndata['success'] = true;
249 $returndata['message'] = __( 'Menu Imported', 'adminify' );
250 echo json_encode( $returndata );
251 die;
252 } else {
253 $message = __( 'Something went wrong', 'adminify' );
254 echo Utils::wp_kses_custom( $this->ajax_error_message( $message ) );
255 die;
256 }
257 }
258 die;
259 }
260
261 /**
262 * Get menu items
263 *
264 * @param [type] $parent_file
265 *
266 * @return void
267 */
268 public function set_menu( $parent_file ) {
269 global $menu, $submenu;
270 $this->menu = $this->sort_menu_settings( $menu );
271 $this->submenu = $this->sort_sub_menu_settings( $this->menu, $submenu );
272 return $parent_file;
273 }
274
275 /**
276 * Sorts Menu's for Option settings
277 */
278 public function sort_menu_settings( $thismenu ) {
279 $menu_settings = $this->menu_settings;
280 $tempmenu = [];
281 foreach ( $thismenu as $key => $current_menu_item ) {
282 $next_menu_item = next( $thismenu );
283 $optiongroup = [];
284 $order = $key;
285 $separator = 0;
286 $icon = null;
287 $hidden_for = [];
288 if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
289 $separator = 1;
290 }
291 if ( is_array( $menu_settings ) ) {
292 if ( isset( $menu_settings[$current_menu_item[2]] ) ) {
293 $optiongroup = $menu_settings[$current_menu_item[2]];
294 if ( isset( $optiongroup['order'] ) ) {
295 $order = $optiongroup['order'];
296 }
297 if ( isset( $optiongroup['separator'] ) ) {
298 $separator = $optiongroup['separator'];
299 }
300 if ( !empty( $optiongroup['icon'] ) ) {
301 $icon = $optiongroup['icon'];
302 }
303 if ( !empty( $optiongroup['hidden_for'] ) ) {
304 $hidden_for = $optiongroup['hidden_for'];
305 }
306 }
307 }
308 $current_menu_item['order'] = $order;
309 $current_menu_item['separator'] = $separator;
310 if ( empty( $this->options['admin_ui'] ) ) {
311 if ( $icon !== null ) {
312 if ( strpos( $icon, 'dashicons ' ) !== false ) {
313 $menu_icon = str_replace( 'dashicons ', '', $icon );
314 $current_menu_item[6] = $menu_icon;
315 } else {
316 if ( strpos( $icon, ',' ) !== false ) {
317 $menu_icon = explode( ',', $icon )[1];
318 } else {
319 $menu_icon = 'dashicons-adminify- ' . $icon;
320 }
321 $current_menu_item[6] = $menu_icon;
322 }
323 }
324 if ( $separator == 1 ) {
325 $current_menu_item[4] = $current_menu_item[4] . ' adminify-menu-separator';
326 }
327 }
328 array_push( $tempmenu, $current_menu_item );
329 if ( isset( $menu_settings[$current_menu_item[2]] ) ) {
330 unset($menu_settings[$current_menu_item[2]]);
331 }
332 }
333 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
334 foreach ( $menu_settings as $key => $menu_s ) {
335 $new_array = [
336 $menu_s['name'],
337 'read',
338 ( !empty( $menu_s['link'] ) ? $menu_s['link'] : '' ),
339 '',
340 'menu-top menu-icon-custom',
341 $key,
342 ( !empty( $menu_s['icon'] ) ? $menu_s['icon'] : '' ),
343 'order' => $menu_s['order'],
344 'separator' => ( !empty( $menu_s['separator'] ) ? $menu_s['separator'] : 0 ),
345 'hidden_for' => ( !empty( $menu_s['hidden_for'] ) ? $menu_s['hidden_for'] : [] )
346 ];
347 if ( empty( $this->options['admin_ui'] ) ) {
348 if ( strpos( $menu_s['icon'], 'dashicons ' ) !== false ) {
349 $menu_icon = str_replace( 'dashicons ', '', $menu_s['icon'] );
350 } else {
351 if ( empty( $menu_s['icon'] ) || strpos( $menu_s['icon'], ',' ) !== false ) {
352 if ( empty( $menu_s['icon'] ) ) {
353 $menu_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
354 } else {
355 $menu_icon = explode( ',', $menu_s['icon'] )[1];
356 }
357 } else {
358 $menu_icon = 'dashicons-adminify- ' . $menu_s['icon'];
359 }
360 }
361 if ( $menu_s['separator'] == 1 ) {
362 $new_array[4] = $new_array[4] . ' adminify-menu-separator';
363 }
364 $new_array[6] = $menu_icon;
365 }
366 array_push( $tempmenu, $new_array );
367 }
368 }
369 return $this->sort_array( $tempmenu );
370 }
371
372 /**
373 * usort function for menu arrays
374 */
375 public function sort_array_helper( $a, $b ) {
376 $result = 0;
377 if ( !isset( $a['order'] ) ) {
378 return $result;
379 }
380 if ( $a['order'] > $b['order'] ) {
381 $result = 1;
382 } elseif ( $a['order'] < $b['order'] ) {
383 $result = -1;
384 }
385 return $result;
386 }
387
388 /**
389 * Sorts arrays by key 'order'
390 */
391 public function sort_array( $tosort ) {
392 usort( $tosort, [$this, 'sort_array_helper'] );
393 return $tosort;
394 }
395
396 /**
397 * Sorts Sub Menu for settings
398 *
399 * @since 1.4
400 */
401 public function sort_sub_menu_settings( $themenu, $thesubmenu ) {
402 $menu_settings = $this->menu_settings;
403 $tempsubmenu = [];
404 foreach ( $themenu as $current_menu_item ) {
405 $optiongroup = [];
406 $submenu_items = [];
407 if ( isset( $thesubmenu[$current_menu_item[2]] ) ) {
408 $submenuitems = $thesubmenu[$current_menu_item[2]];
409 foreach ( $submenuitems as $key => $subitem ) {
410 $subitem['order'] = $key;
411 if ( is_array( $menu_settings ) && isset( $menu_settings[$current_menu_item[2]] ) && isset( $menu_settings[$current_menu_item[2]]['submenu'] ) ) {
412 $submenugroup = $menu_settings[$current_menu_item[2]]['submenu'];
413 if ( isset( $submenugroup[$subitem[2]] ) ) {
414 $itemoptions = $submenugroup[$subitem[2]];
415 if ( isset( $itemoptions['order'] ) ) {
416 $subitem['order'] = $itemoptions['order'];
417 }
418 }
419 }
420 array_push( $submenu_items, $subitem );
421 }
422 $submenu_items = $this->sort_array( $submenu_items );
423 $tempsubmenu[$current_menu_item[2]] = $submenu_items;
424 }
425 }
426 if ( is_array( $menu_settings ) ) {
427 $tmp_menu = [];
428 foreach ( $menu_settings as $key => $menu_s ) {
429 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
430 $tmp_sub_menu = [];
431 $i = 0;
432 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
433 if ( strpos( $k, 'adminify-custom-submenu' ) === false ) {
434 continue;
435 }
436 $order = ( $sub_menu['order'] ? $sub_menu['order'] : $i );
437 $new_array = [
438 ( $sub_menu['name'] ? $sub_menu['name'] : '' ),
439 'read',
440 ( $sub_menu['link'] ? $sub_menu['link'] : '' ),
441 'order' => $order,
442 'key' => $k,
443 'hidden_for' => ( isset( $sub_menu['hidden_for'] ) ? $sub_menu['hidden_for'] : [] )
444 ];
445 // processing submenu array
446 $tmp_sub_menu[$order] = $new_array;
447 $i++;
448 }
449 if ( !empty( $tmp_sub_menu ) ) {
450 // adding submenu into temp variable
451 $tmp_menu[$key] = $tmp_sub_menu;
452 }
453 }
454 }
455 if ( !empty( $tmp_menu ) ) {
456 $tempsubmenu = array_merge_recursive( $tempsubmenu, $tmp_menu );
457 }
458 foreach ( $tempsubmenu as $m_k => $m_menu ) {
459 $tempsubmenu[$m_k] = $this->sort_array( $tempsubmenu[$m_k] );
460 }
461 }
462 return $tempsubmenu;
463 }
464
465 /**
466 * Applies menu settings
467 */
468 public function apply_menu( $parent_file ) {
469 // Not applicable for Network Admin
470 if ( is_multisite() && is_network_admin() ) {
471 return;
472 }
473 global $menu, $submenu;
474 $tempmenu = [];
475 $tempsub = [];
476 $submenu = $this->sort_sub_menu_settings( $menu, $submenu );
477 if ( $this->menu && is_array( $this->menu ) ) {
478 foreach ( $this->menu as $key => $menu_item ) {
479 if ( empty( $menu_item[0] ) ) {
480 continue;
481 }
482 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
483 // Build Separator
484 $newitem = $this->apply_separator_settings( $menu_item, $key );
485 if ( $newitem ) {
486 array_push( $tempmenu, $newitem );
487 }
488 } else {
489 // Build Top Level
490 $newitem = $this->apply_top_level_settings( $menu_item, $key );
491 if ( $newitem ) {
492 array_push( $tempmenu, $newitem );
493 $parent_key = $newitem[2];
494 if ( strpos( $newitem[5], 'adminify-custom-menu-' ) !== false ) {
495 $parent_key = $newitem[5];
496 }
497 if ( isset( $this->submenu[$parent_key] ) ) {
498 $subitem = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
499 if ( $subitem ) {
500 $tempsub[$newitem[2]] = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
501 }
502 }
503 }
504 }
505 }
506 }
507 $submenu = $tempsub;
508 $menu = $this->sort_array( $tempmenu );
509 return $parent_file;
510 }
511
512 /**
513 * Applies sub level menu item settings
514 *
515 * @return $tempsub | false
516 *
517 * @since 1.4
518 */
519 public function apply_sub_level_settings( $subitems, $parentname ) {
520 if ( !is_array( $this->menu_settings ) ) {
521 return $subitems;
522 }
523 if ( !isset( $this->menu_settings[$parentname]['submenu'] ) ) {
524 return $subitems;
525 }
526 $submenu_settings = $this->menu_settings[$parentname]['submenu'];
527 $tempsub = [];
528 foreach ( $subitems as $current_menu_item ) {
529 if ( empty( $current_menu_item[0] ) || $current_menu_item[2] === 'wp-adminify-settings-pricing' && jltwp_adminify()->can_use_premium_code__premium_only() ) {
530 continue;
531 }
532 $name = '';
533 $link = '';
534 $disabled_for = [];
535 $optiongroup = [];
536 // NO SETTINGS
537 if ( isset( $submenu_settings[$current_menu_item[2]] ) ) {
538 $optiongroup = $submenu_settings[$current_menu_item[2]];
539 if ( isset( $optiongroup['name'] ) ) {
540 $name = $optiongroup['name'];
541 if ( $name != '' ) {
542 $current_menu_item[0] = $name;
543 }
544 }
545 if ( isset( $optiongroup['link'] ) ) {
546 $link = $optiongroup['link'];
547 if ( $link != '' ) {
548 $current_menu_item[2] = $link;
549 $current_menu_item['link'] = $link;
550 }
551 }
552 if ( isset( $optiongroup['hidden_for'] ) ) {
553 $disabled_for = $optiongroup['hidden_for'];
554 if ( $this->is_hidden( $disabled_for ) ) {
555 $current_menu_item['hidden'] = true;
556 continue;
557 }
558 }
559 }
560 $custom_menu = ( isset( $current_menu_item['key'] ) ? $current_menu_item['key'] : '' );
561 if ( strpos( $custom_menu, 'adminify-custom-submenu-' ) !== false ) {
562 if ( isset( $submenu_settings[$current_menu_item['key']]['hidden_for'] ) ) {
563 $disabled_for = $submenu_settings[$current_menu_item['key']]['hidden_for'];
564 }
565 if ( $this->is_hidden( $disabled_for ) ) {
566 $current_menu_item['hidden'] = true;
567 continue;
568 }
569 }
570 array_push( $tempsub, $current_menu_item );
571 }
572 if ( count( $tempsub ) < 1 ) {
573 return false;
574 } else {
575 return $tempsub;
576 }
577 }
578
579 /**
580 * Applies top level menu item settings
581 *
582 * @since 1.4
583 */
584 public function apply_top_level_settings( $current_menu_item, $key ) {
585 $name = '';
586 $link = '';
587 $icon = '';
588 $disabled_for = [];
589 $optiongroup = [];
590 $order = $key;
591 if ( is_array( $this->menu_settings ) ) {
592 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
593 $optiongroup = $this->menu_settings[$current_menu_item[2]];
594 if ( isset( $optiongroup['name'] ) ) {
595 $name = $optiongroup['name'];
596 if ( $name != '' ) {
597 $current_menu_item[0] = $name;
598 }
599 }
600 if ( isset( $optiongroup['link'] ) ) {
601 $link = $optiongroup['link'];
602 if ( $link != '' ) {
603 $current_menu_item[2] = $link;
604 $current_menu_item['link'] = $link;
605 }
606 }
607 if ( isset( $optiongroup['icon'] ) ) {
608 $icon = $optiongroup['icon'];
609 if ( $icon != '' ) {
610 $current_menu_item['icon'] = $icon;
611 }
612 }
613 if ( isset( $optiongroup['order'] ) ) {
614 $order = $optiongroup['order'];
615 }
616 if ( isset( $optiongroup['hidden_for'] ) ) {
617 $disabled_for = $optiongroup['hidden_for'];
618 if ( $this->is_hidden( $disabled_for ) ) {
619 $current_menu_item['hidden'] = true;
620 }
621 }
622 }
623 $custom_menu = ( isset( $current_menu_item[5] ) ? $current_menu_item[5] : '' );
624 if ( strpos( $custom_menu, 'adminify-custom-menu-' ) !== false ) {
625 if ( isset( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) ) {
626 $disabled_for = $this->menu_settings[$current_menu_item[5]]['hidden_for'];
627 }
628 if ( $this->is_hidden( $disabled_for ) ) {
629 $current_menu_item['hidden'] = true;
630 }
631 }
632 }
633 $current_menu_item['order'] = $order;
634 if ( isset( $current_menu_item['hidden'] ) ) {
635 if ( $current_menu_item['hidden'] == true ) {
636 return false;
637 } else {
638 return $current_menu_item;
639 }
640 } else {
641 return $current_menu_item;
642 }
643 }
644
645 /**
646 * Hidden for method
647 *
648 * @param [type] $disabled_for
649 *
650 * @return boolean
651 */
652 public function is_hidden( $disabled_for ) {
653 if ( !is_array( $disabled_for ) ) {
654 return false;
655 }
656 $current_user = wp_get_current_user();
657 $current_name = $current_user->display_name;
658 $current_roles = $current_user->roles;
659 $all_roles = wp_roles()->get_names();
660 if ( in_array( $current_name, $disabled_for ) ) {
661 return true;
662 }
663 // MULTISITE SUPER ADMIN
664 if ( is_super_admin() && is_multisite() ) {
665 if ( in_array( 'Super Admin', $disabled_for ) ) {
666 return true;
667 } else {
668 return false;
669 }
670 }
671 // NORMAL SUPER ADMIN
672 if ( $current_user->ID === 1 ) {
673 if ( in_array( 'Super Admin', $disabled_for ) ) {
674 return true;
675 } else {
676 return false;
677 }
678 }
679 foreach ( $current_roles as $role ) {
680 $role_name = $all_roles[$role];
681 if ( in_array( $role_name, $disabled_for ) ) {
682 return true;
683 }
684 }
685 }
686
687 /**
688 * Applies separator menu item settings
689 *
690 * @since 1.0.0
691 */
692 public function apply_separator_settings( $current_menu_item, $key ) {
693 $name = '';
694 $disabled_for = [];
695 $optiongroup = [];
696 $order = $key;
697 if ( is_array( $this->menu_settings ) ) {
698 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
699 $optiongroup = $this->menu_settings[$current_menu_item[2]];
700 if ( isset( $optiongroup['name'] ) ) {
701 $name = $optiongroup['name'];
702 if ( $name != '' ) {
703 $current_menu_item['name'] = $name;
704 }
705 }
706 if ( isset( $optiongroup['order'] ) ) {
707 $order = $optiongroup['order'];
708 }
709 if ( isset( $optiongroup['hidden_for'] ) ) {
710 $disabled_for = $optiongroup['hidden_for'];
711 if ( $this->is_hidden( $disabled_for ) ) {
712 $current_menu_item['hidden'] = true;
713 }
714 }
715 }
716 }
717 $current_menu_item['order'] = $order;
718 if ( isset( $current_menu_item['hidden'] ) ) {
719 if ( $current_menu_item['hidden'] == true ) {
720 return false;
721 } else {
722 return $current_menu_item;
723 }
724 } else {
725 return $current_menu_item;
726 }
727 }
728
729 /**
730 * Menu Editor Menu
731 */
732 public function jltwp_adminify_menu_editor_submenu() {
733 add_submenu_page(
734 'wp-adminify-settings',
735 esc_html__( 'Menu Editor by WP Adminify', 'adminify' ),
736 esc_html__( 'Menu Editor', 'adminify' ),
737 apply_filters( 'jltwp_adminify_capability', 'manage_options' ),
738 'adminify-menu-editor',
739 // Page slug, will be displayed in URL
740 [$this, 'jltwp_adminify_menu_editor_contents']
741 );
742 }
743
744 public function get_saved_sub_menu() {
745 $menu_settings = $this->menu_settings;
746 $menu = $this->menu;
747 $submenu = $this->submenu;
748 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
749 foreach ( $menu as $menu_item ) {
750 if ( isset( $menu_settings[$menu_item[2]] ) ) {
751 unset($menu_settings[$menu_item[2]]);
752 }
753 }
754 $tmp_menu = [];
755 foreach ( $menu_settings as $key => $menu_s ) {
756 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
757 $tmp_sub_menu = [];
758 $i = 0;
759 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
760 $new_array = [
761 $sub_menu['name'],
762 'read',
763 $sub_menu['link'],
764 'order' => $i
765 ];
766 $tmp_sub_menu[$i] = $new_array;
767 $i++;
768 }
769 if ( !empty( $tmp_sub_menu ) ) {
770 $tmp_menu[$key] = $tmp_sub_menu;
771 }
772 }
773 }
774 if ( !empty( $tmp_menu ) ) {
775 $submenu = $submenu + $tmp_menu;
776 }
777 }
778 return $submenu;
779 }
780
781 /**
782 * Render Menu Editor
783 */
784 public function render_menu_editor() {
785 global $wp_roles;
786 $users = get_users();
787 $this->users = $users;
788 $this->roles = $wp_roles->roles;
789 if ( $this->menu && is_array( $this->menu ) ) {
790 foreach ( $this->menu as $menu_item ) {
791 $next_menu_item = next( $this->menu );
792 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
793 // Render Separator
794 // $this->render_menu_separator($menu_item);
795 } else {
796 // Render Top Level menu
797 $this->render_top_level_menu_item(
798 $this->menu,
799 $menu_item,
800 $this->submenu,
801 $next_menu_item
802 );
803 }
804 }
805 $this->render_add_new_menu_item();
806 ?>
807 <script>
808 jQuery(function($) {
809
810 $('.adminify-menu-settings').tokenize2({
811 placeholder: '<?php
812 esc_html_e( 'Select roles or users', 'adminify' );
813 ?>'
814 });
815
816 $('.adminify-menu-settings').on('tokenize:select', function() {
817 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
818 });
819
820 });
821 </script>
822 <?php
823 }
824 }
825
826 public function get_icon( $value, $default ) {
827 if ( empty( $value ) ) {
828 return $default;
829 }
830 return $value;
831 }
832
833 /**
834 * Generate User Rules Select box
835 */
836 public function generate_user_rules_select_field( $menu_id, $disabled_for, $menu_type = 'menu' ) {
837 ob_start();
838 ?>
839 <select class="adminify-menu-settings <?php
840 echo $menu_type;
841 ?>_setting" name="hidden_for" id="<?php
842 echo esc_attr( $menu_id );
843 ?>-user-role-types" multiple>
844 <?php
845 $sel = '';
846 // if (in_array('Super Admin', $disabled_for)) {
847 // $sel = 'selected';
848 // }
849 ?>
850
851 <!-- <option value="Super Admin" <?php
852 // echo esc_attr($sel);
853 ?>><?php
854 // esc_html_e('Super Admin', 'adminify');
855 ?></option> -->
856
857 <?php
858 foreach ( $this->roles as $role ) {
859 $rolename = $role['name'];
860 if ( 'administrator' == strtolower( $rolename ) ) {
861 continue;
862 }
863 $sel = '';
864 if ( in_array( $rolename, $disabled_for ) ) {
865 $sel = 'selected';
866 }
867 ?>
868 <option value="<?php
869 echo esc_attr( $rolename );
870 ?>" <?php
871 echo esc_attr( $sel );
872 ?>><?php
873 echo esc_html( $rolename );
874 ?></option>
875 <?php
876 }
877 foreach ( $this->users as $user ) {
878 $username = $user->display_name;
879 $sel = '';
880 if ( in_array( $username, $disabled_for ) ) {
881 $sel = 'selected';
882 }
883 ?>
884 <option value="<?php
885 echo esc_attr( $username );
886 ?>" <?php
887 echo esc_attr( $sel );
888 ?>><?php
889 echo esc_html( $username );
890 ?></option>
891 <?php
892 }
893 ?>
894 </select>
895 <?php
896 return ob_get_clean();
897 }
898
899 /**
900 * Render Top Level menu Item
901 *
902 * @return void
903 */
904 public function render_top_level_menu_item(
905 $master_menu,
906 $current_menu_item,
907 $master_sub_menu,
908 $next_menu_item
909 ) {
910 $disabled_for = '';
911 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[5] );
912 $name = '';
913 $link = '';
914 $icon = '';
915 $separator = '';
916 $disabled_for = [];
917 $optiongroup = [];
918 $menu_options = $this->menu_settings;
919 if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
920 $separator = 1;
921 }
922 if ( is_array( $menu_options ) ) {
923 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
924 $optiongroup = $menu_options[$current_menu_item[2]];
925 if ( isset( $optiongroup['name'] ) ) {
926 $name = $optiongroup['name'];
927 }
928 if ( isset( $optiongroup['link'] ) ) {
929 $link = $optiongroup['link'];
930 }
931 if ( isset( $optiongroup['icon'] ) ) {
932 $icon = $optiongroup['icon'];
933 }
934 if ( isset( $optiongroup['hidden_for'] ) ) {
935 $disabled_for = $optiongroup['hidden_for'];
936 }
937 if ( isset( $optiongroup['separator'] ) ) {
938 $separator = $optiongroup['separator'];
939 }
940 }
941 }
942 $name_attr = $current_menu_item[2];
943 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
944 $name_attr = $current_menu_item[5];
945 $name = $current_menu_item[0];
946 $link = $current_menu_item[2];
947 if ( isset( $menu_options[$current_menu_item[5]]['hidden_for'] ) ) {
948 $disabled_for = $menu_options[$current_menu_item[5]]['hidden_for'];
949 }
950 if ( isset( $menu_options[$current_menu_item[5]] ) ) {
951 $optiongroup = $menu_options[$current_menu_item[5]];
952 }
953 if ( isset( $menu_options[$current_menu_item[5]]['icon'] ) ) {
954 $icon = $menu_options[$current_menu_item[5]]['icon'];
955 }
956 if ( isset( $current_menu_item['separator'] ) ) {
957 $separator = $current_menu_item['separator'];
958 }
959 }
960 if ( !is_array( $disabled_for ) ) {
961 $disabled_for = [];
962 }
963 // LIST OF AVAILABLE MENU ICONS
964 $icons = [
965 'dashicons-admin-multisite' => 'dashicons dashicons-admin-multisite',
966 'dashicons-dashboard' => 'dashicons dashicons-dashboard',
967 'dashicons-admin-post' => 'dashicons dashicons-admin-post',
968 'dashicons-database' => 'dashicons dashicons-database',
969 'dashicons-admin-media' => 'dashicons dashicons-admin-media',
970 'dashicons-admin-page' => 'dashicons dashicons-admin-page',
971 'dashicons-admin-comments' => 'dashicons dashicons-admin-comments',
972 'dashicons-admin-appearance' => 'dashicons dashicons-admin-appearance',
973 'dashicons-admin-plugins' => 'dashicons dashicons-admin-plugins',
974 'dashicons-admin-users' => 'dashicons dashicons-admin-users',
975 'dashicons-admin-tools' => 'dashicons dashicons-admin-tools',
976 'dashicons-chart-bar' => 'dashicons dashicons-chart-bar',
977 'dashicons-admin-settings' => 'dashicons dashicons-admin-settings',
978 ];
979 $default_icons = ( isset( $current_menu_item ) ? $current_menu_item[6] : 'dashicons dashicons-external' );
980 ?>
981 <div class="accordion adminify_menu_item" name="<?php
982 echo esc_attr( $name_attr );
983 ?>" id="wp-adminify-top-menu-<?php
984 echo esc_attr( $menu_id );
985 ?>">
986 <input type="number" class="top_level_order" value="" style="display:none;">
987 <a class="menu-editor-title accordion-button p-4" href="#">
988 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
989 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
990 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
991 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
992 <path d="M5 14C6.10457 14 7 13.1046 7 12C7 10.8954 6.10457 10 5 10C3.89543 10 3 10.8954 3 12C3 13.1046 3.89543 14 5 14Z" fill="#4E4B66" fill-opacity="0.72" />
993 <path d="M5 7C6.10457 7 7 6.10457 7 5C7 3.89543 6.10457 3 5 3C3.89543 3 3 3.89543 3 5C3 6.10457 3.89543 7 5 7Z" fill="#4E4B66" fill-opacity="0.72" />
994 <path d="M5 21C6.10457 21 7 20.1046 7 19C7 17.8954 6.10457 17 5 17C3.89543 17 3 17.8954 3 19C3 20.1046 3.89543 21 5 21Z" fill="#4E4B66" fill-opacity="0.72" />
995 <path d="M19 14C20.1046 14 21 13.1046 21 12C21 10.8954 20.1046 10 19 10C17.8954 10 17 10.8954 17 12C17 13.1046 17.8954 14 19 14Z" fill="#4E4B66" fill-opacity="0.72" />
996 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
997 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
998 </svg>
999 <?php
1000 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1001 ?>
1002 </a>
1003
1004 <div class="accordion-body adminify_top_level_settings">
1005 <div class="tabs tabbable m-0">
1006 <ul class="m-0 b-0 nav nav-tabs">
1007 <li class="nav-item active">
1008 <a class="nav-link is-clickable active" href="#tab-<?php
1009 echo esc_attr( $menu_id );
1010 ?>-1">
1011 <?php
1012 esc_html_e( 'Settings', 'adminify' );
1013 ?>
1014 </a>
1015 </li>
1016 <li class="nav-item" role="presentation">
1017 <a class="nav-link is-clickable" href="#tab-<?php
1018 echo esc_attr( $menu_id );
1019 ?>-2">
1020 <?php
1021 esc_html_e( 'Submenu', 'adminify' );
1022 ?>
1023 </a>
1024 </li>
1025 </ul>
1026 </div>
1027
1028 <div class="tab-content tab-panel panel p-4">
1029 <div id="tab-<?php
1030 echo esc_attr( $menu_id );
1031 ?>-1" class="tab-pane">
1032 <div class="menu-editor-form">
1033 <div class="columns">
1034 <div class="column">
1035 <label for="<?php
1036 echo esc_attr( $current_menu_item[2] );
1037 ?>">
1038 <?php
1039 esc_html_e( 'Rename as', 'adminify' );
1040 ?>
1041 </label>
1042 <input class="menu_setting" type="text" name="name" data-top-menu-id="<?php
1043 echo esc_attr( $menu_id );
1044 ?>" placeholder="<?php
1045 echo esc_attr( $current_menu_item[0] );
1046 ?>" value='<?php
1047 echo esc_attr( $name );
1048 ?>' />
1049 </div>
1050 <div class="column">
1051 <label for="<?php
1052 echo esc_attr( $current_menu_item[2] );
1053 ?>">
1054 <?php
1055 esc_html_e( 'Hidden For Rules', 'adminify' );
1056 ?>
1057 </label>
1058
1059 <div class="select is-small">
1060
1061 <?php
1062 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1063 ?>
1064
1065 </div>
1066 </div>
1067 </div>
1068 <div class="columns">
1069 <div class="column">
1070 <label for="">
1071 <?php
1072 esc_html_e( 'Change Link', 'adminify' );
1073 ?>
1074 </label>
1075 <input class="menu_setting" name="link" type="url" placeholder="<?php
1076 esc_html_e( 'New link', 'adminify' );
1077 ?>" value="<?php
1078 echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1079 ?>">
1080 </div>
1081 <div class="column">
1082 <label for="">
1083 <?php
1084 esc_html_e( 'Set Custom Icon', 'adminify' );
1085 ?>
1086 </label>
1087 <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable is-pulled-left">
1088 <ul class="icon-picker">
1089 <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1090 <li class="select-icon <?php
1091 echo ( !empty( $icon ) && preg_match( '/http(s?)\\:\\/\\//i', $icon ) || empty( $icon ) && empty( $icons[$default_icons] ) ? 'custom-icon' : '' );
1092 ?>" title="Icon Library">
1093 <?php
1094 if ( !empty( $icon ) ) {
1095 if ( preg_match( '/http(s?)\\:\\/\\//i', $icon ) ) {
1096 $image = explode( ',', $icon );
1097 echo '<i class=""><img src=' . esc_url( $image[1] ) . ' ></i>';
1098 } else {
1099 ?>
1100 <i class="<?php
1101 echo esc_attr( $this->get_icon( esc_attr( $icon ), '' ) );
1102 ?>"></i>
1103 <?php
1104 }
1105 } else {
1106 $adminify_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1107 if ( empty( $icons[$default_icons] ) ) {
1108 echo '<i class=""><img src=' . esc_url( $adminify_icon ) . ' ></i>';
1109 } else {
1110 ?>
1111 <i class="<?php
1112 echo wp_kses_post( $this->get_icon( esc_attr( $icon ), $icons[$default_icons] ) );
1113 ?>"></i>
1114 <?php
1115 }
1116 }
1117 ?>
1118
1119 </li>
1120 <input type="hidden" class="menu_setting" name="icon" value="<?php
1121 echo esc_attr( $icon );
1122 ?>">
1123 </ul>
1124 </div>
1125 </div>
1126 </div>
1127 <div class='columns'>
1128 <div class='column <?php
1129 echo ( !jltwp_adminify()->can_use_premium_code__premium_only() ? 'upgrade-pro' : '' );
1130 ?>'>
1131 <?php
1132 ?>
1133 <?php
1134 echo Utils::adminify_upgrade_pro( 'Add Separator' );
1135 ?>
1136 </div>
1137 </div>
1138 </div>
1139 <?php
1140 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1141 ?>
1142 <div class="remove-add-new-menu"><span data-id="<?php
1143 echo esc_attr( $current_menu_item[5] );
1144 ?>"><i class="icon-close"></i> Delete</span></div>
1145 <?php
1146 }
1147 ?>
1148 </div>
1149 <div id="tab-<?php
1150 echo esc_attr( $menu_id );
1151 ?>-2" class="tab-pane tab-pane--submenu">
1152 <?php
1153 // Sub Menu Items Check
1154 $link = $current_menu_item[2];
1155 if ( isset( $master_sub_menu[$name_attr] ) && is_array( $master_sub_menu[$name_attr] ) ) {
1156 foreach ( $master_sub_menu[$name_attr] as $sub_menu_item ) {
1157 $this->build_sub_menu_item( $sub_menu_item, $optiongroup, $name_attr );
1158 }
1159 } else {
1160 ?>
1161 <span><?php
1162 esc_html_e( 'No sub menu items', 'adminify' );
1163 ?></span>
1164 <?php
1165 }
1166 $this->render_add_new_menu_item( true );
1167 // true for submenu item
1168 ?>
1169
1170 </div>
1171 </div>
1172
1173 </div>
1174 </div>
1175
1176 <?php
1177 }
1178
1179 public function render_menu_separator( $current_menu_item ) {
1180 $disabled_for = [];
1181 $name = '';
1182 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[2] );
1183 $menu_options = $this->menu_settings;
1184 if ( is_array( $menu_options ) ) {
1185 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
1186 $optiongroup = $menu_options[$current_menu_item[2]];
1187 if ( isset( $optiongroup['name'] ) ) {
1188 $name = $optiongroup['name'];
1189 }
1190 if ( isset( $optiongroup['hidden_for'] ) ) {
1191 $disabled_for = $optiongroup['hidden_for'];
1192 }
1193 }
1194 }
1195 if ( !is_array( $disabled_for ) ) {
1196 $disabled_for = [];
1197 }
1198 ?>
1199 <div class="accordion adminify_menu_item" name="<?php
1200 echo esc_attr( $current_menu_item[2] );
1201 ?>" id="<?php
1202 echo esc_attr( $menu_id );
1203 ?>">
1204 <input type="number" class="top_level_order" value="" style="display:none;">
1205 <a class="menu-editor-title accordion-button p-4" href="#">
1206 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1207 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
1208 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
1209 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
1210 <path d="M5 14C6.10457 14 7 13.1046 7 12C7 10.8954 6.10457 10 5 10C3.89543 10 3 10.8954 3 12C3 13.1046 3.89543 14 5 14Z" fill="#4E4B66" fill-opacity="0.72" />
1211 <path d="M5 7C6.10457 7 7 6.10457 7 5C7 3.89543 6.10457 3 5 3C3.89543 3 3 3.89543 3 5C3 6.10457 3.89543 7 5 7Z" fill="#4E4B66" fill-opacity="0.72" />
1212 <path d="M5 21C6.10457 21 7 20.1046 7 19C7 17.8954 6.10457 17 5 17C3.89543 17 3 17.8954 3 19C3 20.1046 3.89543 21 5 21Z" fill="#4E4B66" fill-opacity="0.72" />
1213 <path d="M19 14C20.1046 14 21 13.1046 21 12C21 10.8954 20.1046 10 19 10C17.8954 10 17 10.8954 17 12C17 13.1046 17.8954 14 19 14Z" fill="#4E4B66" fill-opacity="0.72" />
1214 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
1215 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
1216 </svg>
1217 <?php
1218 esc_html_e( 'Separator', 'adminify' );
1219 ?>
1220 </a>
1221
1222 <div class="accordion-body adminify_top_level_settings">
1223 <div class="tab-content tab-panel panel p-4">
1224 <div class="menu-editor-form">
1225 <div class="columns">
1226 <div class="column">
1227 <label for=""><?php
1228 esc_html_e( 'Rename as', 'adminify' );
1229 ?></label>
1230 <input class="menu_setting" type="text" name="name" placeholder="<?php
1231 esc_html_e( 'New Name', 'adminify' );
1232 ?>" value="<?php
1233 echo esc_attr( $name );
1234 ?>">
1235 </div>
1236 <div class="column">
1237 <label for=""><?php
1238 esc_html_e( 'Hidden For Rules', 'adminify' );
1239 ?></label>
1240
1241 <div class="select is-small">
1242 <?php
1243 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1244 ?>
1245
1246 <script>
1247 jQuery('#<?php
1248 echo esc_attr( $menu_id );
1249 ?> #<?php
1250 echo esc_attr( $menu_id );
1251 ?>-user-role-types').tokenize2({
1252 placeholder: '<?php
1253 esc_html_e( 'Select roles or users', 'adminify' );
1254 ?>'
1255 });
1256 jQuery(document).ready(function($) {
1257 $('#<?php
1258 echo esc_attr( $menu_id );
1259 ?> #<?php
1260 echo esc_attr( $menu_id );
1261 ?>-user-role-types').on('tokenize:select', function(container) {
1262 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1263 });
1264 })
1265 </script>
1266 </div>
1267 </div>
1268 </div>
1269 </div>
1270
1271 </div>
1272 </div>
1273 </div>
1274
1275 <?php
1276 }
1277
1278 public function build_sub_menu_item( $current_menu_item, $optiongroup, $name_attr ) {
1279 $name = '';
1280 $link = '';
1281 $icon = '';
1282 $disabled_for = [];
1283 $suboptiongroup = [];
1284 $menu_options = $this->menu_settings;
1285 if ( isset( $optiongroup['submenu'] ) ) {
1286 if ( isset( $optiongroup['submenu'][$current_menu_item[2]] ) ) {
1287 $suboptiongroup = $optiongroup['submenu'][$current_menu_item[2]];
1288 if ( isset( $suboptiongroup['name'] ) ) {
1289 $name = $suboptiongroup['name'];
1290 }
1291 if ( isset( $suboptiongroup['link'] ) ) {
1292 $link = $suboptiongroup['link'];
1293 }
1294 if ( isset( $suboptiongroup['icon'] ) ) {
1295 $icon = $suboptiongroup['icon'];
1296 }
1297 if ( isset( $suboptiongroup['hidden_for'] ) ) {
1298 $disabled_for = $suboptiongroup['hidden_for'];
1299 }
1300 }
1301 }
1302 $sub_menu_name_attr = $current_menu_item[2];
1303 if ( isset( $current_menu_item['key'] ) ) {
1304 $sub_menu_name_attr = $current_menu_item['key'];
1305 }
1306 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1307 $name = $current_menu_item[0];
1308 $link = $current_menu_item[2];
1309 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'] ) ) {
1310 $disabled_for = $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'];
1311 }
1312 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['icon'] ) ) {
1313 $icon = $optiongroup['submenu'][$sub_menu_name_attr]['icon'];
1314 }
1315 }
1316 if ( !is_array( $disabled_for ) ) {
1317 $disabled_for = [];
1318 }
1319 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $sub_menu_name_attr );
1320 ?>
1321 <div class="accordion adminify_sub_menu_item" name="<?php
1322 echo esc_attr( $sub_menu_name_attr );
1323 ?>" id="wp-adminify-sub-menu-<?php
1324 echo esc_attr( $menu_id );
1325 ?>">
1326 <input type="number" class="top_level_order" value="" style="display:none;">
1327 <a class="menu-editor-title accordion-button p-4" href="#">
1328 <svg class="drag-icon is-pulled-left mr-2" width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
1329 <path d="M12 14C13.1046 14 14 13.1046 14 12C14 10.8954 13.1046 10 12 10C10.8954 10 10 10.8954 10 12C10 13.1046 10.8954 14 12 14Z" fill="#4E4B66" fill-opacity="0.72" />
1330 <path d="M12 7C13.1046 7 14 6.10457 14 5C14 3.89543 13.1046 3 12 3C10.8954 3 10 3.89543 10 5C10 6.10457 10.8954 7 12 7Z" fill="#4E4B66" fill-opacity="0.72" />
1331 <path d="M12 21C13.1046 21 14 20.1046 14 19C14 17.8954 13.1046 17 12 17C10.8954 17 10 17.8954 10 19C10 20.1046 10.8954 21 12 21Z" fill="#4E4B66" fill-opacity="0.72" />
1332 <path d="M5 14C6.10457 14 7 13.1046 7 12C7 10.8954 6.10457 10 5 10C3.89543 10 3 10.8954 3 12C3 13.1046 3.89543 14 5 14Z" fill="#4E4B66" fill-opacity="0.72" />
1333 <path d="M5 7C6.10457 7 7 6.10457 7 5C7 3.89543 6.10457 3 5 3C3.89543 3 3 3.89543 3 5C3 6.10457 3.89543 7 5 7Z" fill="#4E4B66" fill-opacity="0.72" />
1334 <path d="M5 21C6.10457 21 7 20.1046 7 19C7 17.8954 6.10457 17 5 17C3.89543 17 3 17.8954 3 19C3 20.1046 3.89543 21 5 21Z" fill="#4E4B66" fill-opacity="0.72" />
1335 <path d="M19 14C20.1046 14 21 13.1046 21 12C21 10.8954 20.1046 10 19 10C17.8954 10 17 10.8954 17 12C17 13.1046 17.8954 14 19 14Z" fill="#4E4B66" fill-opacity="0.72" />
1336 <path d="M19 7C20.1046 7 21 6.10457 21 5C21 3.89543 20.1046 3 19 3C17.8954 3 17 3.89543 17 5C17 6.10457 17.8954 7 19 7Z" fill="#4E4B66" fill-opacity="0.72" />
1337 <path d="M19 21C20.1046 21 21 20.1046 21 19C21 17.8954 20.1046 17 19 17C17.8954 17 17 17.8954 17 19C17 20.1046 17.8954 21 19 21Z" fill="#4E4B66" fill-opacity="0.72" />
1338 </svg>
1339 <?php
1340 if ( !empty( $current_menu_item[0] ) ) {
1341 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1342 }
1343 ?>
1344 </a>
1345
1346 <div class="accordion-body">
1347 <div class="tab-content tab-panel panel p-4">
1348 <div class="tab-pane">
1349 <div class="menu-editor-form">
1350 <div class="columns">
1351 <div class="column">
1352 <label for=""><?php
1353 esc_html_e( 'Rename as', 'adminify' );
1354 ?></label>
1355 <input class="sub_menu_setting" type="text" data-sub-menu-id="<?php
1356 echo esc_attr( $menu_id );
1357 ?>" name="name" placeholder="<?php
1358 esc_html_e( 'New Menu name...', 'adminify' );
1359 ?>" value="<?php
1360 echo esc_attr( $name );
1361 ?>">
1362 </div>
1363 <div class="column">
1364 <label for=""><?php
1365 esc_html_e( 'Hidden For Rules', 'adminify' );
1366 ?></label>
1367
1368 <div class="select is-small">
1369
1370 <?php
1371 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for, 'sub_menu' );
1372 ?>
1373
1374 <script>
1375 jQuery('#wp-adminify-sub-menu-<?php
1376 echo esc_attr( $menu_id );
1377 ?> #<?php
1378 echo esc_attr( $menu_id );
1379 ?>-user-role-types').tokenize2({
1380 placeholder: '<?php
1381 esc_html_e( 'Select roles or users', 'adminify' );
1382 ?>'
1383 });
1384 jQuery(document).ready(function($) {
1385 $('#wp-adminify-sub-menu-<?php
1386 echo esc_attr( $menu_id );
1387 ?> #<?php
1388 echo esc_attr( $menu_id );
1389 ?>-user-role-types').on('tokenize:select', function(container) {
1390 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1391 });
1392 })
1393 </script>
1394
1395 </div>
1396 </div>
1397 </div>
1398 <div class="columns">
1399 <div class="column">
1400 <label for=""><?php
1401 esc_html_e( 'Change Link', 'adminify' );
1402 ?></label>
1403 <input class="sub_menu_setting" name="link" type="url" placeholder="New link" value="<?php
1404 echo esc_attr( ( $sub_menu_name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1405 ?>">
1406 </div>
1407 <div class="column">
1408 <label for=""><?php
1409 esc_html_e( 'Set Custom Icon', 'adminify' );
1410 ?> <i>(<?php
1411 esc_html_e( 'Not available for Submenu.', 'adminify' );
1412 ?>)</i></label>
1413
1414 <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable-no is-pulled-left">
1415 <ul class="icon-picker">
1416 <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1417 <?php
1418 $custom_class = '';
1419 $icon = '<i class="' . $this->get_icon( esc_attr( $icon ), 'dashicons dashicons-external' ) . '"></i>';
1420 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1421 $custom_class = 'custom-icon';
1422 $icon = '<img src="' . esc_url( WP_ADMINIFY_ASSETS_IMAGE ) . 'logos/menu-icon.svg" />';
1423 }
1424 ?>
1425 <li class="select-icon <?php
1426 echo esc_attr( $custom_class );
1427 ?>" title="Icon Library">
1428 <?php
1429 echo wp_kses_post( $icon );
1430 ?>
1431 </li>
1432 <input type="hidden" class="sub_menu_setting" name="icon" value="<?php
1433 echo esc_attr( $icon );
1434 ?>">
1435 </ul>
1436 </div>
1437
1438 </div>
1439 </div>
1440 </div>
1441 <?php
1442 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1443 ?>
1444 <div class="remove-add-new-menu"><span data-id="<?php
1445 echo esc_attr( $sub_menu_name_attr );
1446 ?>"><i class="icon-close"></i> Delete</span></div>
1447 <?php
1448 }
1449 ?>
1450 </div>
1451 </div>
1452 </div>
1453 </div>
1454
1455 <?php
1456 }
1457
1458 /**
1459 * Add New Menu Item.
1460 */
1461 public function render_add_new_menu_item( $submenu = false ) {
1462 ?>
1463 <div class="accordion add-new-menu-editor-item <?php
1464 echo esc_attr( ( $submenu ? 'submenu' : '' ) );
1465 ?> <?php
1466 echo ( !jltwp_adminify()->can_use_premium_code__premium_only() ? 'upgrade-pro' : '' );
1467 ?>">
1468 <div class="inner-text">
1469 <i class="dashicons dashicons-plus-alt"></i>
1470 <span class="title"><?php
1471 esc_html_e( 'Add Item', 'adminify' );
1472 ?></span>
1473 </div>
1474 <?php
1475 echo Utils::adminify_upgrade_pro( ' ' );
1476 ?>
1477 </div>
1478 <?php
1479 }
1480
1481 /**
1482 * Menu Editor Header
1483 *
1484 * @return void
1485 */
1486 public function render_menu_editor_header() {
1487 ?>
1488
1489 <div class="adminify-menu-editor-help-urls wp-heading-inline is-pulled-left is-flex is-align-items-center">
1490 <?php
1491 echo Utils::adminfiy_help_urls(
1492 __( 'Menu Editor', 'adminify' ),
1493 'https://wpadminify.com/kb/wordpress-dashboard-menu-editor/',
1494 'https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8',
1495 'https://www.facebook.com/groups/jeweltheme',
1496 'https://wpadminify.com/support/'
1497 );
1498 ?>
1499 </div>
1500
1501
1502 <div class="wp-adminify--page--title--actions mt-1 is-pulled-right">
1503
1504 <button class="page-title-action mr-3 adminify_menu_save_settings">
1505 <?php
1506 esc_html_e( 'Save', 'adminify' );
1507 ?>
1508 </button>
1509
1510 <div class="dropdown is-right is-hoverable is-pulled-right">
1511 <div class="dropdown-trigger">
1512 <button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
1513 <svg class="icon" width="16" height="12" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg">
1514 <path d="M5 12C3.63144 12.0007 2.43589 11.0751 2.09375 9.75H0.5V8.25H2.0945C2.48423 6.74059 3.96509 5.78119 5.50196 6.04243C7.03883 6.30366 8.11953 7.69847 7.98865 9.25188C7.85776 10.8053 6.55892 11.9996 5 12ZM5 7.5C4.18055 7.50083 3.51342 8.15914 3.50167 8.97851C3.48993 9.79788 4.13792 10.475 4.95702 10.4993C5.77611 10.5237 6.46312 9.88613 6.5 9.0675V9.3675V9C6.5 8.17158 5.82843 7.5 5 7.5ZM15.5 9.75H8.75V8.25H15.5V9.75ZM8.75 6C7.38172 6.00035 6.18657 5.07483 5.8445 3.75H0.5V2.25H5.8445C6.23423 0.740588 7.71509 -0.218809 9.25196 0.0424253C10.7888 0.30366 11.8695 1.69847 11.7386 3.25188C11.6078 4.80529 10.3089 5.99961 8.75 6ZM8.75 1.5C7.93055 1.50083 7.26342 2.15914 7.25167 2.97851C7.23993 3.79788 7.88792 4.47503 8.70702 4.49934C9.52611 4.52365 10.2131 3.88613 10.25 3.0675V3.3675V3C10.25 2.17158 9.57843 1.5 8.75 1.5ZM15.5 3.75H12.5V2.25H15.5V3.75Z" fill="#0347FF" />
1515 </svg>
1516 </button>
1517 </div>
1518 <div class="dropdown-menu" id="dropdown-menu" role="menu">
1519 <div class="dropdown-content">
1520 <a href="#" class="dropdown-item adminify_export_menu_settings">
1521 <?php
1522 esc_html_e( 'Export menu', 'adminify' );
1523 ?>
1524 </a>
1525 <input accept=".json" type="file" single="" id="adminify_import_menu" class="hidden">
1526 <a href="#" class="dropdown-item adminify_import_menu_settings">
1527 <?php
1528 esc_html_e( 'Import menu', 'adminify' );
1529 ?>
1530 </a>
1531 <a href="#" class="dropdown-item adminify_reset_menu_settings">
1532 <?php
1533 esc_html_e( 'Reset menu', 'adminify' );
1534 ?>
1535 </a>
1536 </div>
1537 </div>
1538 </div>
1539 </div>
1540
1541 <div class="is-inline-block">
1542 <p><?php
1543 esc_html_e( 'Edit each menu item\'s name, link, icon and visibility. Drag and drop to rearange the menu. Changes will take effect after page refresh.', 'adminify' );
1544 ?></p>
1545 <p>
1546 <svg class="is-pulled-left mr-1 mt-1" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
1547 <path d="M7.33398 7.32002C7.33398 7.14321 7.40422 6.97364 7.52925 6.84861C7.65427 6.72359 7.82384 6.65335 8.00065 6.65335C8.17746 6.65335 8.34703 6.72359 8.47206 6.84861C8.59708 6.97364 8.66732 7.14321 8.66732 7.32002V11.32C8.66732 11.4968 8.59708 11.6664 8.47206 11.7914C8.34703 11.9164 8.17746 11.9867 8.00065 11.9867C7.82384 11.9867 7.65427 11.9164 7.52925 11.7914C7.40422 11.6664 7.33398 11.4968 7.33398 11.32V7.32002Z" fill="#4E4B66" />
1548 <path d="M8.00065 4.034C7.82384 4.034 7.65427 4.10423 7.52925 4.22926C7.40422 4.35428 7.33398 4.52385 7.33398 4.70066C7.33398 4.87747 7.40422 5.04704 7.52925 5.17207C7.65427 5.29709 7.82384 5.36733 8.00065 5.36733C8.17746 5.36733 8.34703 5.29709 8.47206 5.17207C8.59708 5.04704 8.66732 4.87747 8.66732 4.70066C8.66732 4.52385 8.59708 4.35428 8.47206 4.22926C8.34703 4.10423 8.17746 4.034 8.00065 4.034Z" fill="#4E4B66" />
1549 <path fill-rule="evenodd" clip-rule="evenodd" d="M8.00065 1.33334C4.31865 1.33334 1.33398 4.31801 1.33398 8.00001C1.33398 11.682 4.31865 14.6667 8.00065 14.6667C11.6827 14.6667 14.6673 11.682 14.6673 8.00001C14.6673 4.31801 11.6827 1.33334 8.00065 1.33334ZM2.66732 8.00001C2.66732 9.4145 3.22922 10.7711 4.22942 11.7712C5.22961 12.7714 6.58616 13.3333 8.00065 13.3333C9.41514 13.3333 10.7717 12.7714 11.7719 11.7712C12.7721 10.7711 13.334 9.4145 13.334 8.00001C13.334 6.58552 12.7721 5.22897 11.7719 4.22877C10.7717 3.22858 9.41514 2.66668 8.00065 2.66668C6.58616 2.66668 5.22961 3.22858 4.22942 4.22877C3.22922 5.22897 2.66732 6.58552 2.66732 8.00001V8.00001Z" fill="#4E4B66" />
1550 </svg>
1551
1552 <?php
1553 esc_html_e( 'If you have WP Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1554 ?>
1555
1556 </p>
1557 </div>
1558
1559
1560 <?php
1561 }
1562
1563 public function jltwp_adminify_menu_editor_contents() {
1564 ?>
1565
1566 <div class="wrap">
1567 <div class="wp-adminify--menu--editor--container mt-4">
1568
1569 <div id="adminify-data-saved-message"></div>
1570
1571 <?php
1572 $this->render_menu_editor_header();
1573 ?>
1574
1575
1576 <div class="wp-adminify--menu--editor--settings mt-5 pt-3">
1577 <div class="wp-adminify-menu-editor-loader"></div>
1578 <?php
1579 $this->render_menu_editor();
1580 ?>
1581 </div>
1582
1583 </div>
1584 </div>
1585 <a href="#" id="adminify_download_settings" style="display: none;" ?></a>
1586 <?php
1587 }
1588
1589 }
1590
1591 }