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

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

1,819 lines 71.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 $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 = sanitize_text_field( 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 = $this->clean_ajax_input( sanitize_text_field( wp_unslash( $_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 $menu_s['link'] ?? '',
378 '',
379 'menu-top menu-icon-custom',
380 $key,
381 $menu_s['icon'] ?? '',
382 'order' => $menu_s['order'],
383 'separator' => $menu_s['separator'] ?? 0,
384 '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'] ?? $i;
497 $new_array = [
498 $sub_menu['name'] ?? '',
499 'read',
500 $sub_menu['link'] ?? '',
501 'order' => $order,
502 'key' => $k,
503 '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 global $menu, $submenu ;
533 $tempmenu = [];
534 $tempsub = [];
535 $submenu = $this->sort_sub_menu_settings( $menu, $submenu );
536 if ( $this->menu && is_array( $this->menu ) ) {
537 foreach ( $this->menu as $key => $menu_item ) {
538 if ( empty($menu_item[0]) ) {
539 continue;
540 }
541
542 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
543 // Build Separator
544 $newitem = $this->apply_separator_settings( $menu_item, $key );
545 if ( $newitem ) {
546 array_push( $tempmenu, $newitem );
547 }
548 } else {
549 // Build Top Level
550 $newitem = $this->apply_top_level_settings( $menu_item, $key );
551
552 if ( $newitem ) {
553 array_push( $tempmenu, $newitem );
554 $parent_key = $newitem[2];
555 if ( strpos( $newitem[5], 'adminify-custom-menu-' ) !== false ) {
556 $parent_key = $newitem[5];
557 }
558
559 if ( isset( $this->submenu[$parent_key] ) ) {
560 $subitem = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
561 if ( $subitem ) {
562 $tempsub[$newitem[2]] = $this->apply_sub_level_settings( $this->submenu[$parent_key], $parent_key );
563 }
564 }
565
566 }
567
568 }
569
570 }
571 }
572 $submenu = $tempsub;
573 $menu = $this->sort_array( $tempmenu );
574 return $parent_file;
575 }
576
577 /**
578 * Applies top level menu item settings
579 *
580 * @since 1.4
581 */
582 public function apply_sub_level_settings( $subitems, $parentname )
583 {
584 if ( !is_array( $this->menu_settings ) ) {
585 return $subitems;
586 }
587 if ( !isset( $this->menu_settings[$parentname]['submenu'] ) ) {
588 return $subitems;
589 }
590 $submenu_settings = $this->menu_settings[$parentname]['submenu'];
591 $tempsub = [];
592 foreach ( $subitems as $current_menu_item ) {
593 if ( empty($current_menu_item[0]) || $current_menu_item[2] === 'wp-adminify-settings-pricing' && jltwp_adminify()->can_use_premium_code__premium_only() ) {
594 continue;
595 }
596 $name = '';
597 $link = '';
598 $disabled_for = [];
599 $optiongroup = [];
600 // NO SETTINGS
601
602 if ( isset( $submenu_settings[$current_menu_item[2]] ) ) {
603 $optiongroup = $submenu_settings[$current_menu_item[2]];
604
605 if ( isset( $optiongroup['name'] ) ) {
606 $name = $optiongroup['name'];
607 if ( $name != '' ) {
608 $current_menu_item[0] = $name;
609 }
610 }
611
612
613 if ( isset( $optiongroup['link'] ) ) {
614 $link = $optiongroup['link'];
615
616 if ( $link != '' ) {
617 $current_menu_item[2] = $link;
618 $current_menu_item['link'] = $link;
619 }
620
621 }
622
623
624 if ( isset( $optiongroup['hidden_for'] ) ) {
625 $disabled_for = $optiongroup['hidden_for'];
626
627 if ( $this->is_hidden( $disabled_for ) ) {
628 $current_menu_item['hidden'] = true;
629 continue;
630 }
631
632 }
633
634 }
635
636 $custom_menu = ( isset( $current_menu_item['key'] ) ? $current_menu_item['key'] : '' );
637
638 if ( strpos( $custom_menu, 'adminify-custom-submenu-' ) !== false ) {
639 if ( isset( $submenu_settings[$current_menu_item['key']]['hidden_for'] ) ) {
640 $disabled_for = $submenu_settings[$current_menu_item['key']]['hidden_for'];
641 }
642
643 if ( $this->is_hidden( $disabled_for ) ) {
644 $current_menu_item['hidden'] = true;
645 continue;
646 }
647
648 }
649
650 array_push( $tempsub, $current_menu_item );
651 }
652
653 if ( count( $tempsub ) < 1 ) {
654 return false;
655 } else {
656 return $tempsub;
657 }
658
659 }
660
661 /**
662 * Applies top level menu item settings
663 *
664 * @since 1.4
665 */
666 public function apply_top_level_settings( $current_menu_item, $key )
667 {
668 $name = '';
669 $link = '';
670 $icon = '';
671 $disabled_for = [];
672 $optiongroup = [];
673 $order = $key;
674
675 if ( is_array( $this->menu_settings ) ) {
676
677 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
678 $optiongroup = $this->menu_settings[$current_menu_item[2]];
679
680 if ( isset( $optiongroup['name'] ) ) {
681 $name = $optiongroup['name'];
682 if ( $name != '' ) {
683 $current_menu_item[0] = $name;
684 }
685 }
686
687
688 if ( isset( $optiongroup['link'] ) ) {
689 $link = $optiongroup['link'];
690
691 if ( $link != '' ) {
692 $current_menu_item[2] = $link;
693 $current_menu_item['link'] = $link;
694 }
695
696 }
697
698
699 if ( isset( $optiongroup['icon'] ) ) {
700 $icon = $optiongroup['icon'];
701 if ( $icon != '' ) {
702 $current_menu_item['icon'] = $icon;
703 }
704 }
705
706 if ( isset( $optiongroup['order'] ) ) {
707 $order = $optiongroup['order'];
708 }
709
710 if ( isset( $optiongroup['hidden_for'] ) ) {
711 $disabled_for = $optiongroup['hidden_for'];
712 if ( $this->is_hidden( $disabled_for ) ) {
713 $current_menu_item['hidden'] = true;
714 }
715 }
716
717 }
718
719 $custom_menu = ( isset( $current_menu_item[5] ) ? $current_menu_item[5] : '' );
720
721 if ( strpos( $custom_menu, 'adminify-custom-menu-' ) !== false ) {
722 if ( isset( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) ) {
723 $disabled_for = $this->menu_settings[$current_menu_item[5]]['hidden_for'];
724 }
725 if ( $this->is_hidden( $disabled_for ) ) {
726 $current_menu_item['hidden'] = true;
727 }
728 }
729
730 }
731
732 $current_menu_item['order'] = $order;
733
734 if ( isset( $current_menu_item['hidden'] ) ) {
735
736 if ( $current_menu_item['hidden'] == true ) {
737 return false;
738 } else {
739 return $current_menu_item;
740 }
741
742 } else {
743 return $current_menu_item;
744 }
745
746 }
747
748 /**
749 * Hidden for method
750 *
751 * @param [type] $disabled_for
752 *
753 * @return boolean
754 */
755 public function is_hidden( $disabled_for )
756 {
757 if ( !is_array( $disabled_for ) ) {
758 return false;
759 }
760 $current_user = wp_get_current_user();
761 $current_name = $current_user->display_name;
762 $current_roles = $current_user->roles;
763 $all_roles = wp_roles()->get_names();
764 if ( in_array( $current_name, $disabled_for ) ) {
765 return true;
766 }
767 // MULTISITE SUPER ADMIN
768 if ( is_super_admin() && is_multisite() ) {
769
770 if ( in_array( 'Super Admin', $disabled_for ) ) {
771 return true;
772 } else {
773 return false;
774 }
775
776 }
777 // NORMAL SUPER ADMIN
778 if ( $current_user->ID === 1 ) {
779
780 if ( in_array( 'Super Admin', $disabled_for ) ) {
781 return true;
782 } else {
783 return false;
784 }
785
786 }
787 foreach ( $current_roles as $role ) {
788 $role_name = $all_roles[$role];
789 if ( in_array( $role_name, $disabled_for ) ) {
790 return true;
791 }
792 }
793 }
794
795 /**
796 * Applies separator menu item settings
797 *
798 * @since 1.0.0
799 */
800 public function apply_separator_settings( $current_menu_item, $key )
801 {
802 $name = '';
803 $disabled_for = [];
804 $optiongroup = [];
805 $order = $key;
806 if ( is_array( $this->menu_settings ) ) {
807
808 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
809 $optiongroup = $this->menu_settings[$current_menu_item[2]];
810
811 if ( isset( $optiongroup['name'] ) ) {
812 $name = $optiongroup['name'];
813 if ( $name != '' ) {
814 $current_menu_item['name'] = $name;
815 }
816 }
817
818 if ( isset( $optiongroup['order'] ) ) {
819 $order = $optiongroup['order'];
820 }
821
822 if ( isset( $optiongroup['hidden_for'] ) ) {
823 $disabled_for = $optiongroup['hidden_for'];
824 if ( $this->is_hidden( $disabled_for ) ) {
825 $current_menu_item['hidden'] = true;
826 }
827 }
828
829 }
830
831 }
832 $current_menu_item['order'] = $order;
833
834 if ( isset( $current_menu_item['hidden'] ) ) {
835
836 if ( $current_menu_item['hidden'] == true ) {
837 return false;
838 } else {
839 return $current_menu_item;
840 }
841
842 } else {
843 return $current_menu_item;
844 }
845
846 }
847
848 /**
849 * Menu Editor Menu
850 */
851 public function jltwp_adminify_menu_editor_submenu()
852 {
853 add_submenu_page(
854 'wp-adminify-settings',
855 esc_html__( 'Menu Editor by WP Adminify', 'adminify' ),
856 esc_html__( 'Menu Editor', 'adminify' ),
857 apply_filters( 'jltwp_adminify_capability', 'manage_options' ),
858 'adminify-menu-editor',
859 // Page slug, will be displayed in URL
860 [ $this, 'jltwp_adminify_menu_editor_contents' ]
861 );
862 }
863
864 public function get_saved_sub_menu()
865 {
866 $menu_settings = $this->menu_settings;
867 $menu = $this->menu;
868 $submenu = $this->submenu;
869
870 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
871 foreach ( $menu as $menu_item ) {
872 if ( isset( $menu_settings[$menu_item[2]] ) ) {
873 unset( $menu_settings[$menu_item[2]] );
874 }
875 }
876 $tmp_menu = [];
877 foreach ( $menu_settings as $key => $menu_s ) {
878
879 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
880 $tmp_sub_menu = [];
881 $i = 0;
882 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
883 $new_array = [
884 $sub_menu['name'],
885 'read',
886 $sub_menu['link'],
887 'order' => $i
888 ];
889 $tmp_sub_menu[$i] = $new_array;
890 $i++;
891 }
892 if ( !empty($tmp_sub_menu) ) {
893 $tmp_menu[$key] = $tmp_sub_menu;
894 }
895 }
896
897 }
898 if ( !empty($tmp_menu) ) {
899 $submenu = $submenu + $tmp_menu;
900 }
901 }
902
903 return $submenu;
904 }
905
906 /**
907 * Render Menu Editor
908 */
909 public function render_menu_editor()
910 {
911 global $wp_roles ;
912 $users = get_users();
913 $this->users = $users;
914 $this->roles = $wp_roles->roles;
915
916 if ( $this->menu && is_array( $this->menu ) ) {
917 foreach ( $this->menu as $menu_item ) {
918 $next_menu_item = next( $this->menu );
919
920 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
921 // Render Separator
922 // $this->render_menu_separator($menu_item);
923 } else {
924 // Render Top Level menu
925 $this->render_top_level_menu_item(
926 $this->menu,
927 $menu_item,
928 $this->submenu,
929 $next_menu_item
930 );
931 }
932
933 }
934 $this->render_add_new_menu_item();
935 ?>
936 <script>
937 jQuery(function($) {
938
939 $('.adminify-menu-settings').tokenize2({
940 placeholder: '<?php
941 esc_html_e( 'Select roles or users', 'adminify' );
942 ?>'
943 });
944
945 $('.adminify-menu-settings').on('tokenize:select', function() {
946 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
947 });
948
949 });
950 </script>
951 <?php
952 }
953
954 }
955
956 public function get_icon( $value, $default )
957 {
958 if ( empty($value) ) {
959 return $default;
960 }
961 return $value;
962 }
963
964 /**
965 * Render Top Level menu Item
966 *
967 * @return void
968 */
969 public function render_top_level_menu_item(
970 $master_menu,
971 $current_menu_item,
972 $master_sub_menu,
973 $next_menu_item
974 )
975 {
976 $disabled_for = '';
977 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[5] );
978 $name = '';
979 $link = '';
980 $icon = '';
981 $separator = '';
982 $disabled_for = [];
983 $optiongroup = [];
984 $menu_options = $this->menu_settings;
985 if ( !empty($next_menu_item) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
986 $separator = 1;
987 }
988 if ( is_array( $menu_options ) ) {
989
990 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
991 $optiongroup = $menu_options[$current_menu_item[2]];
992 if ( isset( $optiongroup['name'] ) ) {
993 $name = $optiongroup['name'];
994 }
995 if ( isset( $optiongroup['link'] ) ) {
996 $link = $optiongroup['link'];
997 }
998 if ( isset( $optiongroup['icon'] ) ) {
999 $icon = $optiongroup['icon'];
1000 }
1001 if ( isset( $optiongroup['hidden_for'] ) ) {
1002 $disabled_for = $optiongroup['hidden_for'];
1003 }
1004 if ( isset( $optiongroup['separator'] ) ) {
1005 $separator = $optiongroup['separator'];
1006 }
1007 }
1008
1009 }
1010 $name_attr = $current_menu_item[2];
1011
1012 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1013 $name_attr = $current_menu_item[5];
1014 $name = $current_menu_item[0];
1015 $link = $current_menu_item[2];
1016 if ( isset( $menu_options[$current_menu_item[5]]['hidden_for'] ) ) {
1017 $disabled_for = $menu_options[$current_menu_item[5]]['hidden_for'];
1018 }
1019 if ( isset( $menu_options[$current_menu_item[5]] ) ) {
1020 $optiongroup = $menu_options[$current_menu_item[5]];
1021 }
1022 if ( isset( $menu_options[$current_menu_item[5]]['icon'] ) ) {
1023 $icon = $menu_options[$current_menu_item[5]]['icon'];
1024 }
1025 if ( isset( $current_menu_item['separator'] ) ) {
1026 $separator = $current_menu_item['separator'];
1027 }
1028 }
1029
1030 if ( !is_array( $disabled_for ) ) {
1031 $disabled_for = [];
1032 }
1033 // LIST OF AVAILABLE MENU ICONS
1034 $icons = [
1035 'dashicons-admin-multisite' => 'dashicons dashicons-admin-multisite',
1036 'dashicons-dashboard' => 'dashicons dashicons-dashboard',
1037 'dashicons-admin-post' => 'dashicons dashicons-admin-post',
1038 'dashicons-database' => 'dashicons dashicons-database',
1039 'dashicons-admin-media' => 'dashicons dashicons-admin-media',
1040 'dashicons-admin-page' => 'dashicons dashicons-admin-page',
1041 'dashicons-admin-comments' => 'dashicons dashicons-admin-comments',
1042 'dashicons-admin-appearance' => 'dashicons dashicons-admin-appearance',
1043 'dashicons-admin-plugins' => 'dashicons dashicons-admin-plugins',
1044 'dashicons-admin-users' => 'dashicons dashicons-admin-users',
1045 'dashicons-admin-tools' => 'dashicons dashicons-admin-tools',
1046 'dashicons-chart-bar' => 'dashicons dashicons-chart-bar',
1047 'dashicons-admin-settings' => 'dashicons dashicons-admin-settings',
1048 ];
1049 $default_icons = ( isset( $current_menu_item ) ? $current_menu_item[6] : 'dashicons dashicons-external' );
1050 ?>
1051 <div class="accordion adminify_menu_item" name="<?php
1052 echo esc_attr( $name_attr ) ;
1053 ?>" id="wp-adminify-top-menu-<?php
1054 echo esc_attr( $menu_id ) ;
1055 ?>">
1056 <input type="number" class="top_level_order" value="" style="display:none;">
1057 <a class="menu-editor-title accordion-button p-4" href="#">
1058 <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">
1059 <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" />
1060 <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" />
1061 <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" />
1062 <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" />
1063 <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" />
1064 <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" />
1065 <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" />
1066 <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" />
1067 <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" />
1068 </svg>
1069 <?php
1070 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) ) ;
1071 ?>
1072 </a>
1073
1074 <div class="accordion-body adminify_top_level_settings">
1075 <div class="tabs tabbable m-0">
1076 <ul class="m-0 b-0 nav nav-tabs">
1077 <li class="nav-item active">
1078 <a class="nav-link is-clickable active" href="#tab-<?php
1079 echo esc_attr( $menu_id ) ;
1080 ?>-1">
1081 <?php
1082 esc_html_e( 'Settings', 'adminify' );
1083 ?>
1084 </a>
1085 </li>
1086 <li class="nav-item" role="presentation">
1087 <a class="nav-link is-clickable" href="#tab-<?php
1088 echo esc_attr( $menu_id ) ;
1089 ?>-2">
1090 <?php
1091 esc_html_e( 'Submenu', 'adminify' );
1092 ?>
1093 </a>
1094 </li>
1095 </ul>
1096 </div>
1097
1098 <div class="tab-content tab-panel panel p-4">
1099 <div id="tab-<?php
1100 echo esc_attr( $menu_id ) ;
1101 ?>-1" class="tab-pane">
1102 <div class="menu-editor-form">
1103 <div class="columns">
1104 <div class="column">
1105 <label for="<?php
1106 echo esc_attr( $current_menu_item[2] ) ;
1107 ?>">
1108 <?php
1109 esc_html_e( 'Rename as', 'adminify' );
1110 ?>
1111 </label>
1112 <input class="menu_setting" type="text" name="name" data-top-menu-id="<?php
1113 echo esc_attr( $menu_id ) ;
1114 ?>" placeholder="<?php
1115 echo esc_attr( $current_menu_item[0] ) ;
1116 ?>" value='<?php
1117 echo esc_attr( $name ) ;
1118 ?>' />
1119 </div>
1120 <div class="column">
1121 <label for="<?php
1122 echo esc_attr( $current_menu_item[2] ) ;
1123 ?>">
1124 <?php
1125 esc_html_e( 'Hidden For Rules', 'adminify' );
1126 ?>
1127 </label>
1128
1129 <div class="select is-small">
1130 <select class="adminify-menu-settings menu_setting" name="hidden_for" id="<?php
1131 echo esc_attr( $menu_id ) ;
1132 ?>-user-role-types" multiple>
1133 <?php
1134 $sel = '';
1135 if ( in_array( 'Super Admin', $disabled_for ) ) {
1136 $sel = 'selected';
1137 }
1138 ?>
1139 <option value="Super Admin" <?php
1140 echo esc_attr( $sel ) ;
1141 ?>><?php
1142 esc_html_e( 'Super Admin', 'adminify' );
1143 ?></option>
1144 <?php
1145 foreach ( $this->roles as $role ) {
1146 $rolename = $role['name'];
1147 $sel = '';
1148 if ( in_array( $rolename, $disabled_for ) ) {
1149 $sel = 'selected';
1150 }
1151 ?>
1152 <option value="<?php
1153 echo esc_attr( $rolename ) ;
1154 ?>" <?php
1155 echo esc_attr( $sel ) ;
1156 ?>><?php
1157 echo esc_html( $rolename ) ;
1158 ?></option>
1159 <?php
1160 }
1161 foreach ( $this->users as $user ) {
1162 $username = $user->display_name;
1163 $sel = '';
1164 if ( in_array( $username, $disabled_for ) ) {
1165 $sel = 'selected';
1166 }
1167 ?>
1168 <option value="<?php
1169 echo esc_attr( $username ) ;
1170 ?>" <?php
1171 echo esc_attr( $sel ) ;
1172 ?>><?php
1173 echo esc_attr( $username ) ;
1174 ?></option>
1175 <?php
1176 }
1177 ?>
1178 </select>
1179
1180 </div>
1181 </div>
1182 </div>
1183 <div class="columns">
1184 <div class="column">
1185 <label for="">
1186 <?php
1187 esc_html_e( 'Change Link', 'adminify' );
1188 ?>
1189 </label>
1190 <input class="menu_setting" name="link" type="url" placeholder="<?php
1191 esc_html_e( 'New link', 'adminify' );
1192 ?>" value="<?php
1193 echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) ) ;
1194 ?>">
1195 </div>
1196 <div class="column">
1197 <label for="">
1198 <?php
1199 esc_html_e( 'Set Custom Icon', 'adminify' );
1200 ?>
1201 </label>
1202 <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable is-pulled-left">
1203 <ul class="icon-picker">
1204 <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1205 <li class="select-icon <?php
1206 echo ( !empty($icon) && preg_match( '/http(s?)\\:\\/\\//i', $icon ) || empty($icon) && empty($icons[$default_icons]) ? 'custom-icon' : '' ) ;
1207 ?>" title="Icon Library">
1208 <?php
1209
1210 if ( !empty($icon) ) {
1211
1212 if ( preg_match( '/http(s?)\\:\\/\\//i', $icon ) ) {
1213 $image = explode( ',', $icon );
1214 echo '<i class=""><img src=' . esc_url( $image[1] ) . ' ></i>' ;
1215 } else {
1216 ?>
1217 <i class="<?php
1218 echo esc_attr( $this->get_icon( esc_attr( $icon ), '' ) ) ;
1219 ?>"></i>
1220 <?php
1221 }
1222
1223 } else {
1224 $adminify_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1225
1226 if ( empty($icons[$default_icons]) ) {
1227 echo '<i class=""><img src=' . esc_url( $adminify_icon ) . ' ></i>' ;
1228 } else {
1229 ?>
1230 <i class="<?php
1231 echo wp_kses_post( $this->get_icon( esc_attr( $icon ), $icons[$default_icons] ) ) ;
1232 ?>"></i>
1233 <?php
1234 }
1235
1236 }
1237
1238 ?>
1239
1240 </li>
1241 <input type="hidden" class="menu_setting" name="icon" value="<?php
1242 echo esc_attr( $icon ) ;
1243 ?>">
1244 </ul>
1245 </div>
1246 </div>
1247 </div>
1248 <div class='columns'>
1249 <div class='column <?php
1250 echo ( !jltwp_adminify()->can_use_premium_code__premium_only() ? 'upgrade-pro' : '' ) ;
1251 ?>'>
1252 <?php
1253 ?>
1254 <?php
1255 echo Utils::adminify_upgrade_pro( 'Add Separator' ) ;
1256 ?>
1257 </div>
1258 </div>
1259 </div>
1260 <?php
1261
1262 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1263 ?>
1264 <div class="remove-add-new-menu"><span data-id="<?php
1265 echo esc_attr( $current_menu_item[5] ) ;
1266 ?>"><i class="icon-close"></i> Delete</span></div>
1267 <?php
1268 }
1269
1270 ?>
1271 </div>
1272 <div id="tab-<?php
1273 echo esc_attr( $menu_id ) ;
1274 ?>-2" class="tab-pane tab-pane--submenu">
1275 <?php
1276 // Sub Menu Items Check
1277 $link = $current_menu_item[2];
1278
1279 if ( isset( $master_sub_menu[$name_attr] ) && is_array( $master_sub_menu[$name_attr] ) ) {
1280 foreach ( $master_sub_menu[$name_attr] as $sub_menu_item ) {
1281 $this->build_sub_menu_item( $sub_menu_item, $optiongroup, $name_attr );
1282 }
1283 } else {
1284 ?>
1285 <span><?php
1286 esc_html_e( 'No sub menu items', 'adminify' );
1287 ?></span>
1288 <?php
1289 }
1290
1291 $this->render_add_new_menu_item( true );
1292 // true for submenu item
1293 ?>
1294
1295 </div>
1296 </div>
1297
1298 </div>
1299 </div>
1300
1301 <?php
1302 }
1303
1304 public function render_menu_separator( $current_menu_item )
1305 {
1306 $disabled_for = [];
1307 $name = '';
1308 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[2] );
1309 $menu_options = $this->menu_settings;
1310 if ( is_array( $menu_options ) ) {
1311
1312 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
1313 $optiongroup = $menu_options[$current_menu_item[2]];
1314 if ( isset( $optiongroup['name'] ) ) {
1315 $name = $optiongroup['name'];
1316 }
1317 if ( isset( $optiongroup['hidden_for'] ) ) {
1318 $disabled_for = $optiongroup['hidden_for'];
1319 }
1320 }
1321
1322 }
1323 if ( !is_array( $disabled_for ) ) {
1324 $disabled_for = [];
1325 }
1326 ?>
1327 <div class="accordion adminify_menu_item" name="<?php
1328 echo esc_attr( $current_menu_item[2] ) ;
1329 ?>" id="<?php
1330 echo esc_attr( $menu_id ) ;
1331 ?>">
1332 <input type="number" class="top_level_order" value="" style="display:none;">
1333 <a class="menu-editor-title accordion-button p-4" href="#">
1334 <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">
1335 <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" />
1336 <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" />
1337 <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" />
1338 <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" />
1339 <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" />
1340 <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" />
1341 <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" />
1342 <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" />
1343 <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" />
1344 </svg>
1345 <?php
1346 esc_html_e( 'Separator', 'adminify' );
1347 ?>
1348 </a>
1349
1350 <div class="accordion-body adminify_top_level_settings">
1351 <div class="tab-content tab-panel panel p-4">
1352 <div class="menu-editor-form">
1353 <div class="columns">
1354 <div class="column">
1355 <label for=""><?php
1356 esc_html_e( 'Rename as', 'adminify' );
1357 ?></label>
1358 <input class="menu_setting" type="text" name="name" placeholder="<?php
1359 esc_html_e( 'New Name', 'adminify' );
1360 ?>" value="<?php
1361 echo esc_attr( $name ) ;
1362 ?>">
1363 </div>
1364 <div class="column">
1365 <label for=""><?php
1366 esc_html_e( 'Hidden For Rules', 'adminify' );
1367 ?></label>
1368
1369 <div class="select is-small">
1370 <select class="adminify-menu-settings menu_setting" name="hidden_for" id="<?php
1371 echo esc_attr( $menu_id ) ;
1372 ?>-user-role-types" multiple>
1373 <?php
1374 $sel = '';
1375 if ( in_array( 'Super Admin', $disabled_for ) ) {
1376 $sel = 'selected';
1377 }
1378 ?>
1379 <option value="Super Admin" <?php
1380 echo esc_attr( $sel ) ;
1381 ?>><?php
1382 esc_html_e( 'Super Admin', 'adminify' );
1383 ?></option>
1384 <?php
1385 foreach ( $this->roles as $role ) {
1386 $rolename = $role['name'];
1387 $sel = '';
1388 if ( in_array( $rolename, $disabled_for ) ) {
1389 $sel = 'selected';
1390 }
1391 ?>
1392 <option value="<?php
1393 echo esc_attr( $rolename ) ;
1394 ?>" <?php
1395 echo esc_attr( $sel ) ;
1396 ?>><?php
1397 echo esc_html( $rolename ) ;
1398 ?></option>
1399 <?php
1400 }
1401 foreach ( $this->users as $user ) {
1402 $username = $user->display_name;
1403 $sel = '';
1404 if ( in_array( $username, $disabled_for ) ) {
1405 $sel = 'selected';
1406 }
1407 ?>
1408 <option value="<?php
1409 echo esc_attr( $username ) ;
1410 ?>" <?php
1411 echo esc_attr( $sel ) ;
1412 ?>><?php
1413 echo esc_html( $username ) ;
1414 ?></option>
1415 <?php
1416 }
1417 ?>
1418 </select>
1419
1420 <script>
1421 jQuery('#<?php
1422 echo esc_attr( $menu_id ) ;
1423 ?> #<?php
1424 echo esc_attr( $menu_id ) ;
1425 ?>-user-role-types').tokenize2({
1426 placeholder: '<?php
1427 esc_html_e( 'Select roles or users', 'adminify' );
1428 ?>'
1429 });
1430 jQuery(document).ready(function($) {
1431 $('#<?php
1432 echo esc_attr( $menu_id ) ;
1433 ?> #<?php
1434 echo esc_attr( $menu_id ) ;
1435 ?>-user-role-types').on('tokenize:select', function(container) {
1436 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1437 });
1438 })
1439 </script>
1440 </div>
1441 </div>
1442 </div>
1443 </div>
1444
1445 </div>
1446 </div>
1447 </div>
1448
1449 <?php
1450 }
1451
1452 public function build_sub_menu_item( $current_menu_item, $optiongroup, $name_attr )
1453 {
1454 $name = '';
1455 $link = '';
1456 $icon = '';
1457 $disabled_for = [];
1458 $suboptiongroup = [];
1459 $menu_options = $this->menu_settings;
1460 if ( isset( $optiongroup['submenu'] ) ) {
1461
1462 if ( isset( $optiongroup['submenu'][$current_menu_item[2]] ) ) {
1463 $suboptiongroup = $optiongroup['submenu'][$current_menu_item[2]];
1464 if ( isset( $suboptiongroup['name'] ) ) {
1465 $name = $suboptiongroup['name'];
1466 }
1467 if ( isset( $suboptiongroup['link'] ) ) {
1468 $link = $suboptiongroup['link'];
1469 }
1470 if ( isset( $suboptiongroup['icon'] ) ) {
1471 $icon = $suboptiongroup['icon'];
1472 }
1473 if ( isset( $suboptiongroup['hidden_for'] ) ) {
1474 $disabled_for = $suboptiongroup['hidden_for'];
1475 }
1476 }
1477
1478 }
1479 $sub_menu_name_attr = $current_menu_item[2];
1480 if ( isset( $current_menu_item['key'] ) ) {
1481 $sub_menu_name_attr = $current_menu_item['key'];
1482 }
1483
1484 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1485 $name = $current_menu_item[0];
1486 $link = $current_menu_item[2];
1487 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'] ) ) {
1488 $disabled_for = $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'];
1489 }
1490 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['icon'] ) ) {
1491 $icon = $optiongroup['submenu'][$sub_menu_name_attr]['icon'];
1492 }
1493 }
1494
1495 if ( !is_array( $disabled_for ) ) {
1496 $disabled_for = [];
1497 }
1498 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $sub_menu_name_attr );
1499 ?>
1500 <div class="accordion adminify_sub_menu_item" name="<?php
1501 echo esc_attr( $sub_menu_name_attr ) ;
1502 ?>" id="wp-adminify-sub-menu-<?php
1503 echo esc_attr( $menu_id ) ;
1504 ?>">
1505 <input type="number" class="top_level_order" value="" style="display:none;">
1506 <a class="menu-editor-title accordion-button p-4" href="#">
1507 <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">
1508 <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" />
1509 <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" />
1510 <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" />
1511 <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" />
1512 <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" />
1513 <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" />
1514 <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" />
1515 <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" />
1516 <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" />
1517 </svg>
1518 <?php
1519 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) ) ;
1520 ?>
1521 </a>
1522
1523 <div class="accordion-body">
1524 <div class="tab-content tab-panel panel p-4">
1525 <div class="tab-pane">
1526 <div class="menu-editor-form">
1527 <div class="columns">
1528 <div class="column">
1529 <label for=""><?php
1530 esc_html_e( 'Rename as', 'adminify' );
1531 ?></label>
1532 <input class="sub_menu_setting" type="text" data-sub-menu-id="<?php
1533 echo esc_attr( $menu_id ) ;
1534 ?>" name="name" placeholder="<?php
1535 esc_html_e( 'New Menu name...', 'adminify' );
1536 ?>" value="<?php
1537 echo esc_attr( $name ) ;
1538 ?>">
1539 </div>
1540 <div class="column">
1541 <label for=""><?php
1542 esc_html_e( 'Hidden For Rules', 'adminify' );
1543 ?></label>
1544
1545 <div class="select is-small">
1546 <select class="adminify-menu-settings sub_menu_setting" name="hidden_for" id="<?php
1547 echo esc_attr( $menu_id ) ;
1548 ?>-user-role-types" multiple>
1549 <?php
1550 $sel = '';
1551 if ( in_array( 'Super Admin', $disabled_for ) ) {
1552 $sel = 'selected';
1553 }
1554 ?>
1555 <option value="Super Admin" <?php
1556 echo esc_attr( $sel ) ;
1557 ?>><?php
1558 esc_html_e( 'Super Admin', 'adminify' );
1559 ?></option>
1560 <?php
1561 foreach ( $this->roles as $role ) {
1562 $rolename = $role['name'];
1563 $sel = '';
1564 if ( in_array( $rolename, $disabled_for ) ) {
1565 $sel = 'selected';
1566 }
1567 ?>
1568 <option value="<?php
1569 echo esc_attr( $rolename ) ;
1570 ?>" <?php
1571 echo esc_attr( $sel ) ;
1572 ?>><?php
1573 echo esc_html( $rolename ) ;
1574 ?></option>
1575 <?php
1576 }
1577 foreach ( $this->users as $user ) {
1578 $username = $user->display_name;
1579 $sel = '';
1580 if ( in_array( $username, $disabled_for ) ) {
1581 $sel = 'selected';
1582 }
1583 ?>
1584 <option value="<?php
1585 echo esc_attr( $username ) ;
1586 ?>" <?php
1587 echo esc_attr( $sel ) ;
1588 ?>><?php
1589 echo esc_html( $username ) ;
1590 ?></option>
1591 <?php
1592 }
1593 ?>
1594 </select>
1595
1596 <script>
1597 jQuery('#wp-adminify-sub-menu-<?php
1598 echo esc_attr( $menu_id ) ;
1599 ?> #<?php
1600 echo esc_attr( $menu_id ) ;
1601 ?>-user-role-types').tokenize2({
1602 placeholder: '<?php
1603 esc_html_e( 'Select roles or users', 'adminify' );
1604 ?>'
1605 });
1606 jQuery(document).ready(function($) {
1607 $('#wp-adminify-sub-menu-<?php
1608 echo esc_attr( $menu_id ) ;
1609 ?> #<?php
1610 echo esc_attr( $menu_id ) ;
1611 ?>-user-role-types').on('tokenize:select', function(container) {
1612 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1613 });
1614 })
1615 </script>
1616
1617 </div>
1618 </div>
1619 </div>
1620 <div class="columns">
1621 <div class="column">
1622 <label for=""><?php
1623 esc_html_e( 'Change Link', 'adminify' );
1624 ?></label>
1625 <input class="sub_menu_setting" name="link" type="url" placeholder="New link" value="<?php
1626 echo esc_attr( ( $sub_menu_name_attr != ltrim( $link, '#' ) ? $link : '' ) ) ;
1627 ?>">
1628 </div>
1629 <div class="column">
1630 <label for=""><?php
1631 esc_html_e( 'Set Custom Icon', 'adminify' );
1632 ?> <i>(<?php
1633 esc_html_e( 'Not available for Submenu.', 'adminify' );
1634 ?>)</i></label>
1635
1636 <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable-no is-pulled-left">
1637 <ul class="icon-picker">
1638 <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1639 <?php
1640 $custom_class = '';
1641 $icon = '<i class="' . $this->get_icon( esc_attr( $icon ), 'dashicons dashicons-external' ) . '"></i>';
1642
1643 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1644 $custom_class = 'custom-icon';
1645 $icon = '<img src="' . esc_url( WP_ADMINIFY_ASSETS_IMAGE ) . 'logos/menu-icon.svg" />';
1646 }
1647
1648 ?>
1649 <li class="select-icon <?php
1650 echo esc_attr( $custom_class ) ;
1651 ?>" title="Icon Library">
1652 <?php
1653 echo wp_kses_post( $icon ) ;
1654 ?>
1655 </li>
1656 <input type="hidden" class="sub_menu_setting" name="icon" value="<?php
1657 echo esc_attr( $icon ) ;
1658 ?>">
1659 </ul>
1660 </div>
1661
1662 </div>
1663 </div>
1664 </div>
1665 <?php
1666
1667 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1668 ?>
1669 <div class="remove-add-new-menu"><span data-id="<?php
1670 echo esc_attr( $sub_menu_name_attr ) ;
1671 ?>"><i class="icon-close"></i> Delete</span></div>
1672 <?php
1673 }
1674
1675 ?>
1676 </div>
1677 </div>
1678 </div>
1679 </div>
1680
1681 <?php
1682 }
1683
1684 /**
1685 * Add New Menu Item.
1686 */
1687 public function render_add_new_menu_item( $submenu = false )
1688 {
1689 ?>
1690 <div class="accordion add-new-menu-editor-item <?php
1691 echo esc_attr( ( $submenu ? 'submenu' : '' ) ) ;
1692 ?> <?php
1693 echo ( !jltwp_adminify()->can_use_premium_code__premium_only() ? 'upgrade-pro' : '' ) ;
1694 ?>">
1695 <div class="inner-text">
1696 <i class="dashicons dashicons-plus-alt"></i>
1697 <span class="title"><?php
1698 esc_html_e( 'Add Item', 'adminify' );
1699 ?></span>
1700 </div>
1701 <?php
1702 echo Utils::adminify_upgrade_pro( ' ' ) ;
1703 ?>
1704 </div>
1705 <?php
1706 }
1707
1708 /**
1709 * Menu Editor Header
1710 *
1711 * @return void
1712 */
1713 public function render_menu_editor_header()
1714 {
1715 ?>
1716
1717 <div class="adminify-menu-editor-help-urls wp-heading-inline is-pulled-left is-flex is-align-items-center">
1718 <?php
1719 echo Utils::adminfiy_help_urls(
1720 __( 'Menu Editor', 'adminify' ),
1721 'https://wpadminify.com/kb/wordpress-dashboard-menu-editor/',
1722 'https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8',
1723 'https://www.facebook.com/groups/jeweltheme',
1724 'https://wpadminify.com/support/'
1725 ) ;
1726 ?>
1727 </div>
1728
1729
1730 <div class="wp-adminify--page--title--actions mt-1 is-pulled-right">
1731
1732 <button class="page-title-action mr-3 adminify_menu_save_settings">
1733 <?php
1734 esc_html_e( 'Save', 'adminify' );
1735 ?>
1736 </button>
1737
1738 <div class="dropdown is-right is-hoverable is-pulled-right">
1739 <div class="dropdown-trigger">
1740 <button class="button" aria-haspopup="true" aria-controls="dropdown-menu">
1741 <svg class="icon" width="16" height="12" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg">
1742 <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" />
1743 </svg>
1744 </button>
1745 </div>
1746 <div class="dropdown-menu" id="dropdown-menu" role="menu">
1747 <div class="dropdown-content">
1748 <a href="#" class="dropdown-item adminify_export_menu_settings">
1749 <?php
1750 esc_html_e( 'Export menu', 'adminify' );
1751 ?>
1752 </a>
1753 <input accept=".json" type="file" single="" id="adminify_import_menu" class="hidden">
1754 <a href="#" class="dropdown-item adminify_import_menu_settings">
1755 <?php
1756 esc_html_e( 'Import menu', 'adminify' );
1757 ?>
1758 </a>
1759 <a href="#" class="dropdown-item adminify_reset_menu_settings">
1760 <?php
1761 esc_html_e( 'Reset menu', 'adminify' );
1762 ?>
1763 </a>
1764 </div>
1765 </div>
1766 </div>
1767 </div>
1768
1769 <div class="is-inline-block">
1770 <p><?php
1771 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' );
1772 ?></p>
1773 <p>
1774 <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">
1775 <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" />
1776 <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" />
1777 <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" />
1778 </svg>
1779
1780 <?php
1781 esc_html_e( 'If you have WP Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1782 ?>
1783
1784 </p>
1785 </div>
1786
1787
1788 <?php
1789 }
1790
1791 public function jltwp_adminify_menu_editor_contents()
1792 {
1793 ?>
1794
1795 <div class="wrap">
1796 <div class="wp-adminify--menu--editor--container mt-4">
1797
1798 <div id="adminify-data-saved-message"></div>
1799
1800 <?php
1801 $this->render_menu_editor_header();
1802 ?>
1803
1804
1805 <div class="wp-adminify--menu--editor--settings mt-5 pt-3">
1806 <div class="wp-adminify-menu-editor-loader"></div>
1807 <?php
1808 $this->render_menu_editor();
1809 ?>
1810 </div>
1811
1812 </div>
1813 </div>
1814 <a href="#" id="adminify_download_settings" style="display: none;" ?></a>
1815 <?php
1816 }
1817
1818 }
1819 }