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

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