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

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

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