PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.0.4
Adminify – White Label, Admin Menu Editor, Login Customizer v3.0.4
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.0.4, at Inc/Modules/MenuEditor/MenuEditor.php

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