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

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