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

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