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

1,626 lines 68.8 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 }
678 }
679 }
680 $custom_menu = ( isset( $current_menu_item[5] ) ? $current_menu_item[5] : '' );
681 if ( strpos( $custom_menu, 'adminify-custom-menu-' ) !== false ) {
682 if ( isset( $this->menu_settings[$current_menu_item[5]]['hidden_for'] ) ) {
683 $disabled_for = $this->menu_settings[$current_menu_item[5]]['hidden_for'];
684 }
685 if ( $this->is_hidden( $disabled_for ) ) {
686 $current_menu_item['hidden'] = true;
687 }
688 }
689 }
690 $current_menu_item['order'] = $order;
691 if ( isset( $current_menu_item['hidden'] ) ) {
692 if ( $current_menu_item['hidden'] == true ) {
693 return false;
694 } else {
695 return $current_menu_item;
696 }
697 } else {
698 return $current_menu_item;
699 }
700 }
701
702 /**
703 * Hidden for method
704 *
705 * @param [type] $disabled_for
706 *
707 * @return boolean
708 */
709 public function is_hidden( $disabled_for ) {
710 if ( !is_array( $disabled_for ) ) {
711 return false;
712 }
713 $current_user = wp_get_current_user();
714 $current_name = $current_user->display_name;
715 $current_roles = $current_user->roles;
716 $all_roles = wp_roles()->get_names();
717 if ( in_array( $current_name, $disabled_for ) ) {
718 return true;
719 }
720 // MULTISITE SUPER ADMIN
721 if ( is_super_admin() && is_multisite() ) {
722 if ( in_array( 'Super Admin', $disabled_for ) ) {
723 return true;
724 } else {
725 return false;
726 }
727 }
728 // NORMAL SUPER ADMIN
729 if ( $current_user->ID === 1 ) {
730 if ( in_array( 'Super Admin', $disabled_for ) ) {
731 return true;
732 } else {
733 return false;
734 }
735 }
736 foreach ( $current_roles as $role ) {
737 $role_name = $all_roles[$role];
738 if ( in_array( $role_name, $disabled_for ) ) {
739 return true;
740 }
741 }
742 }
743
744 /**
745 * Applies separator menu item settings
746 *
747 * @since 1.0.0
748 */
749 public function apply_separator_settings( $current_menu_item, $key ) {
750 $name = '';
751 $disabled_for = [];
752 $optiongroup = [];
753 $order = $key;
754 if ( is_array( $this->menu_settings ) ) {
755 if ( isset( $this->menu_settings[$current_menu_item[2]] ) ) {
756 $optiongroup = $this->menu_settings[$current_menu_item[2]];
757 if ( isset( $optiongroup['name'] ) ) {
758 $name = $optiongroup['name'];
759 if ( $name != '' ) {
760 $current_menu_item['name'] = $name;
761 }
762 }
763 if ( isset( $optiongroup['order'] ) ) {
764 $order = $optiongroup['order'];
765 }
766 if ( isset( $optiongroup['hidden_for'] ) ) {
767 $disabled_for = $optiongroup['hidden_for'];
768 if ( $this->is_hidden( $disabled_for ) ) {
769 $current_menu_item['hidden'] = true;
770 }
771 }
772 }
773 }
774 $current_menu_item['order'] = $order;
775 if ( isset( $current_menu_item['hidden'] ) ) {
776 if ( $current_menu_item['hidden'] == true ) {
777 return false;
778 } else {
779 return $current_menu_item;
780 }
781 } else {
782 return $current_menu_item;
783 }
784 }
785
786 public function get_saved_sub_menu() {
787 $menu_settings = $this->menu_settings;
788 $menu = $this->menu;
789 $submenu = $this->submenu;
790 if ( is_array( $menu_settings ) && !array_key_exists( 0, $menu_settings ) ) {
791 foreach ( $menu as $menu_item ) {
792 if ( isset( $menu_settings[$menu_item[2]] ) ) {
793 unset($menu_settings[$menu_item[2]]);
794 }
795 }
796 $tmp_menu = [];
797 foreach ( $menu_settings as $key => $menu_s ) {
798 if ( isset( $menu_s['submenu'] ) && is_array( $menu_s['submenu'] ) ) {
799 $tmp_sub_menu = [];
800 $i = 0;
801 foreach ( $menu_s['submenu'] as $k => $sub_menu ) {
802 $new_array = [
803 $sub_menu['name'],
804 'read',
805 $sub_menu['link'],
806 'order' => $i
807 ];
808 $tmp_sub_menu[$i] = $new_array;
809 $i++;
810 }
811 if ( !empty( $tmp_sub_menu ) ) {
812 $tmp_menu[$key] = $tmp_sub_menu;
813 }
814 }
815 }
816 if ( !empty( $tmp_menu ) ) {
817 $submenu = $submenu + $tmp_menu;
818 }
819 }
820 return $submenu;
821 }
822
823 /**
824 * Render Menu Editor
825 */
826 public function render_menu_editor() {
827 global $wp_roles;
828 $users = get_users();
829 $this->users = $users;
830 $this->roles = $wp_roles->roles;
831 if ( $this->menu && is_array( $this->menu ) ) {
832 foreach ( $this->menu as $menu_item ) {
833 $next_menu_item = next( $this->menu );
834 if ( strpos( $menu_item[2], 'separator' ) !== false && !$menu_item[0] ) {
835 // Render Separator
836 // $this->render_menu_separator($menu_item);
837 } else {
838 // Render Top Level menu
839 $this->render_top_level_menu_item(
840 $this->menu,
841 $menu_item,
842 $this->submenu,
843 $next_menu_item
844 );
845 }
846 }
847 $this->render_add_new_menu_item();
848 ?>
849 <script>
850 jQuery(function($) {
851
852 $('.adminify-menu-settings').tokenize2({
853 placeholder: '<?php
854 esc_html_e( 'Select roles or users', 'adminify' );
855 ?>'
856 });
857
858 $('.adminify-menu-settings').on('tokenize:select', function() {
859 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
860 });
861
862 });
863 </script>
864 <?php
865 }
866 }
867
868 public function get_icon( $value, $default ) {
869 if ( empty( $value ) ) {
870 return $default;
871 }
872 return $value;
873 }
874
875 /**
876 * Generate User Rules Select box
877 */
878 public function generate_user_rules_select_field( $menu_id, $disabled_for, $menu_type = 'menu' ) {
879 ob_start();
880 ?>
881 <select class="adminify-menu-settings <?php
882 echo $menu_type;
883 ?>_setting" name="hidden_for" id="<?php
884 echo esc_attr( $menu_id );
885 ?>-user-role-types" multiple>
886 <?php
887 $sel = '';
888 // if (in_array('Super Admin', $disabled_for)) {
889 // $sel = 'selected';
890 // }
891 ?>
892
893 <!-- <option value="Super Admin" <?php
894 // echo esc_attr($sel);
895 ?>><?php
896 // esc_html_e('Super Admin', 'adminify');
897 ?></option> -->
898
899 <?php
900 foreach ( $this->roles as $role ) {
901 $rolename = $role['name'];
902 if ( 'administrator' == strtolower( $rolename ) ) {
903 continue;
904 }
905 $sel = '';
906 if ( in_array( $rolename, $disabled_for ) ) {
907 $sel = 'selected';
908 }
909 ?>
910 <option value="<?php
911 echo esc_attr( $rolename );
912 ?>" <?php
913 echo esc_attr( $sel );
914 ?>><?php
915 echo esc_html( $rolename );
916 ?></option>
917 <?php
918 }
919 foreach ( $this->users as $user ) {
920 $username = $user->display_name;
921 $sel = '';
922 if ( in_array( $username, $disabled_for ) ) {
923 $sel = 'selected';
924 }
925 ?>
926 <option value="<?php
927 echo esc_attr( $username );
928 ?>" <?php
929 echo esc_attr( $sel );
930 ?>><?php
931 echo esc_html( $username );
932 ?></option>
933 <?php
934 }
935 ?>
936 </select>
937 <?php
938 return ob_get_clean();
939 }
940
941 /**
942 * Render Top Level menu Item
943 *
944 * @return void
945 */
946 public function render_top_level_menu_item(
947 $master_menu,
948 $current_menu_item,
949 $master_sub_menu,
950 $next_menu_item
951 ) {
952 if ( empty( $current_menu_item[2] ) ) {
953 return;
954 }
955 $disabled_for = '';
956 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[5] );
957 $name = '';
958 $link = '';
959 $icon = '';
960 $separator = '';
961 $disabled_for = [];
962 $optiongroup = [];
963 $menu_options = $this->menu_settings;
964 if ( !empty( $next_menu_item ) && strpos( $next_menu_item[2], 'separator' ) !== false ) {
965 $separator = 1;
966 }
967 if ( is_array( $menu_options ) ) {
968 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
969 $optiongroup = $menu_options[$current_menu_item[2]];
970 if ( isset( $optiongroup['name'] ) ) {
971 $name = $optiongroup['name'];
972 }
973 if ( isset( $optiongroup['link'] ) ) {
974 $link = $optiongroup['link'];
975 }
976 if ( isset( $optiongroup['icon'] ) ) {
977 $icon = $optiongroup['icon'];
978 }
979 if ( isset( $optiongroup['hidden_for'] ) ) {
980 $disabled_for = $optiongroup['hidden_for'];
981 }
982 if ( isset( $optiongroup['separator'] ) ) {
983 $separator = $optiongroup['separator'];
984 }
985 }
986 }
987 $name_attr = $current_menu_item[2];
988 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
989 $name_attr = $current_menu_item[5];
990 $name = $current_menu_item[0];
991 $link = $current_menu_item[2];
992 if ( isset( $menu_options[$current_menu_item[5]]['hidden_for'] ) ) {
993 $disabled_for = $menu_options[$current_menu_item[5]]['hidden_for'];
994 }
995 if ( isset( $menu_options[$current_menu_item[5]] ) ) {
996 $optiongroup = $menu_options[$current_menu_item[5]];
997 }
998 if ( isset( $menu_options[$current_menu_item[5]]['icon'] ) ) {
999 $icon = $menu_options[$current_menu_item[5]]['icon'];
1000 }
1001 if ( isset( $current_menu_item['separator'] ) ) {
1002 $separator = $current_menu_item['separator'];
1003 }
1004 }
1005 if ( !is_array( $disabled_for ) ) {
1006 $disabled_for = [];
1007 }
1008 // LIST OF AVAILABLE MENU ICONS
1009 $icons = [
1010 'dashicons-admin-multisite' => 'dashicons dashicons-admin-multisite',
1011 'dashicons-dashboard' => 'dashicons dashicons-dashboard',
1012 'dashicons-admin-post' => 'dashicons dashicons-admin-post',
1013 'dashicons-database' => 'dashicons dashicons-database',
1014 'dashicons-admin-media' => 'dashicons dashicons-admin-media',
1015 'dashicons-admin-page' => 'dashicons dashicons-admin-page',
1016 'dashicons-admin-comments' => 'dashicons dashicons-admin-comments',
1017 'dashicons-admin-appearance' => 'dashicons dashicons-admin-appearance',
1018 'dashicons-admin-plugins' => 'dashicons dashicons-admin-plugins',
1019 'dashicons-admin-users' => 'dashicons dashicons-admin-users',
1020 'dashicons-admin-tools' => 'dashicons dashicons-admin-tools',
1021 'dashicons-chart-bar' => 'dashicons dashicons-chart-bar',
1022 'dashicons-admin-settings' => 'dashicons dashicons-admin-settings',
1023 ];
1024 $default_icons = ( isset( $current_menu_item ) ? $current_menu_item[6] : 'dashicons dashicons-external' );
1025 ?>
1026 <div class="accordion adminify_menu_item" name="<?php
1027 echo esc_attr( $name_attr );
1028 ?>" id="wp-adminify-top-menu-<?php
1029 echo esc_attr( $menu_id );
1030 ?>">
1031 <input type="number" class="top_level_order" value="" style="display:none;">
1032 <a class="menu-editor-title accordion-button adminify-flex adminify-flex-center adminify-gap-2" href="#">
1033 <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">
1034 <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" />
1035 <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" />
1036 <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" />
1037 <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" />
1038 <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" />
1039 <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" />
1040 <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" />
1041 <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" />
1042 <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" />
1043 </svg>
1044 <?php
1045 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1046 ?>
1047 </a>
1048
1049 <div class="accordion-body adminify_top_level_settings">
1050 <div class="tabs tabbable">
1051 <ul class="adminify-flex adminify-flex-center adminify-m-0 nav nav-tabs">
1052 <li class="nav-item active">
1053 <a class="nav-link is-clickable active" href="#tab-<?php
1054 echo esc_attr( $menu_id );
1055 ?>-1">
1056 <?php
1057 esc_html_e( 'Settings', 'adminify' );
1058 ?>
1059 </a>
1060 </li>
1061 <li class="nav-item" role="presentation">
1062 <a class="nav-link is-clickable" href="#tab-<?php
1063 echo esc_attr( $menu_id );
1064 ?>-2">
1065 <?php
1066 esc_html_e( 'Submenu', 'adminify' );
1067 ?>
1068 </a>
1069 </li>
1070 </ul>
1071 </div>
1072
1073 <div class="tab-content tab-panel panel adminify-p-4">
1074 <div id="tab-<?php
1075 echo esc_attr( $menu_id );
1076 ?>-1" class="tab-pane">
1077 <div class="menu-editor-form">
1078 <div class="columns">
1079 <div class="column">
1080 <label for="<?php
1081 echo esc_attr( $current_menu_item[2] );
1082 ?>">
1083 <?php
1084 esc_html_e( 'Rename as', 'adminify' );
1085 ?>
1086 </label>
1087 <input class="menu_setting" type="text" name="name" data-top-menu-id="<?php
1088 echo esc_attr( $menu_id );
1089 ?>" placeholder="<?php
1090 echo esc_attr( $current_menu_item[0] );
1091 ?>" value='<?php
1092 echo esc_attr( $name );
1093 ?>' />
1094 </div>
1095 <div class="column">
1096 <label for="<?php
1097 echo esc_attr( $current_menu_item[2] );
1098 ?>">
1099 <?php
1100 esc_html_e( 'Hidden For Rules', 'adminify' );
1101 ?>
1102 </label>
1103
1104 <div class="select is-small">
1105
1106 <?php
1107 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1108 ?>
1109
1110 </div>
1111 </div>
1112 </div>
1113 <div class="columns">
1114 <div class="column">
1115 <label for="">
1116 <?php
1117 esc_html_e( 'Change Link', 'adminify' );
1118 ?>
1119 </label>
1120 <input class="menu_setting" name="link" type="url" placeholder="<?php
1121 esc_html_e( 'New link', 'adminify' );
1122 ?>" value="<?php
1123 echo esc_attr( ( $name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1124 ?>">
1125 </div>
1126 <div class="column">
1127 <label for="">
1128 <?php
1129 esc_html_e( 'Set Custom Icon', 'adminify' );
1130 ?>
1131 </label>
1132 <div class="icon-picker-wrap wp-adminify-menu-icon-picker adminify-icon-picker-input icon-select-button is-clickable is-pulled-left">
1133 <ul class="icon-picker">
1134 <li class="icon-none" title="None"><i class="dashicons dashicons-dismiss"></i></li>
1135 <li class="select-icon <?php
1136 echo ( !empty( $icon ) && preg_match( '/http(s?)\\:\\/\\//i', $icon ) || empty( $icon ) && empty( $icons[$default_icons] ) ? 'custom-icon' : '' );
1137 ?>" title="Icon Library">
1138 <?php
1139 if ( !empty( $icon ) ) {
1140 if ( preg_match( '/http(s?)\\:\\/\\//i', $icon ) ) {
1141 $image = explode( ',', $icon );
1142 echo '<i class=""><img src=' . esc_url( $image[1] ) . ' ></i>';
1143 } else {
1144 ?>
1145 <i class="<?php
1146 echo esc_attr( $this->get_icon( esc_attr( $icon ), '' ) );
1147 ?>"></i>
1148 <?php
1149 }
1150 } else {
1151 $adminify_icon = WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg';
1152 if ( empty( $icons[$default_icons] ) ) {
1153 echo '<i class=""><img src=' . esc_url( $adminify_icon ) . ' ></i>';
1154 } else {
1155 ?>
1156 <i class="<?php
1157 echo wp_kses_post( $this->get_icon( esc_attr( $icon ), $icons[$default_icons] ) );
1158 ?>"></i>
1159 <?php
1160 }
1161 }
1162 ?>
1163
1164 </li>
1165 <input type="hidden" class="menu_setting" name="icon" value="<?php
1166 echo esc_attr( $icon );
1167 ?>">
1168 </ul>
1169 </div>
1170 </div>
1171 </div>
1172 <div class='columns'>
1173 <?php
1174 $upgrade_pro = '';
1175 $upgrade_pro = 'upgrade-pro';
1176 ?>
1177
1178 <div class='column <?php
1179 echo esc_attr( $upgrade_pro );
1180 ?>'>
1181 <label for="seperator-<?php
1182 echo esc_attr( $name_attr );
1183 ?>">
1184 <?php
1185 $separator_content = Utils::adminify_upgrade_pro( 'Add Separator' );
1186 $separator_content = apply_filters( 'adminify/menu_editor/add_separator', $name_attr, $separator );
1187 // Apply the filter
1188 echo $separator_content;
1189 ?>
1190 </label>
1191 </div>
1192 </div>
1193 </div>
1194 <?php
1195 if ( strpos( $current_menu_item[5], 'adminify-custom-menu-' ) !== false ) {
1196 ?>
1197 <div class="remove-add-new-menu"><span data-id="<?php
1198 echo esc_attr( $current_menu_item[5] );
1199 ?>"><i class="icon-close"></i> Delete</span></div>
1200 <?php
1201 }
1202 ?>
1203 </div>
1204 <div id="tab-<?php
1205 echo esc_attr( $menu_id );
1206 ?>-2" class="tab-pane tab-pane--submenu">
1207 <?php
1208 // Sub Menu Items Check
1209 $link = $current_menu_item[2];
1210 if ( isset( $master_sub_menu[$name_attr] ) && is_array( $master_sub_menu[$name_attr] ) ) {
1211 foreach ( $master_sub_menu[$name_attr] as $sub_menu_item ) {
1212 $this->build_sub_menu_item( $sub_menu_item, $optiongroup, $name_attr );
1213 }
1214 } else {
1215 ?>
1216 <span><?php
1217 esc_html_e( 'No sub menu items', 'adminify' );
1218 ?></span>
1219 <?php
1220 }
1221 $this->render_add_new_menu_item( true );
1222 // true for submenu item
1223 ?>
1224
1225 </div>
1226 </div>
1227
1228 </div>
1229 </div>
1230
1231 <?php
1232 }
1233
1234 public function render_menu_separator( $current_menu_item ) {
1235 $disabled_for = [];
1236 $name = '';
1237 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $current_menu_item[2] );
1238 $menu_options = $this->menu_settings;
1239 if ( is_array( $menu_options ) ) {
1240 if ( isset( $menu_options[$current_menu_item[2]] ) ) {
1241 $optiongroup = $menu_options[$current_menu_item[2]];
1242 if ( isset( $optiongroup['name'] ) ) {
1243 $name = $optiongroup['name'];
1244 }
1245 if ( isset( $optiongroup['hidden_for'] ) ) {
1246 $disabled_for = $optiongroup['hidden_for'];
1247 }
1248 }
1249 }
1250 if ( !is_array( $disabled_for ) ) {
1251 $disabled_for = [];
1252 }
1253 ?>
1254 <div class="accordion adminify_menu_item" name="<?php
1255 echo esc_attr( $current_menu_item[2] );
1256 ?>" id="<?php
1257 echo esc_attr( $menu_id );
1258 ?>">
1259 <input type="number" class="top_level_order" value="" style="display:none;">
1260 <a class="menu-editor-title accordion-button p-4" href="#">
1261 <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">
1262 <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" />
1263 <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" />
1264 <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" />
1265 <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" />
1266 <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" />
1267 <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" />
1268 <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" />
1269 <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" />
1270 <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" />
1271 </svg>
1272 <?php
1273 esc_html_e( 'Separator', 'adminify' );
1274 ?>
1275 </a>
1276
1277 <div class="accordion-body adminify_top_level_settings">
1278 <div class="tab-content tab-panel panel p-4">
1279 <div class="menu-editor-form">
1280 <div class="columns">
1281 <div class="column">
1282 <label for=""><?php
1283 esc_html_e( 'Rename as', 'adminify' );
1284 ?></label>
1285 <input class="menu_setting" type="text" name="name" placeholder="<?php
1286 esc_html_e( 'New Name', 'adminify' );
1287 ?>" value="<?php
1288 echo esc_attr( $name );
1289 ?>">
1290 </div>
1291 <div class="column">
1292 <label for=""><?php
1293 esc_html_e( 'Hidden For Rules', 'adminify' );
1294 ?></label>
1295
1296 <div class="select is-small">
1297 <?php
1298 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for );
1299 ?>
1300
1301 <script>
1302 jQuery('#<?php
1303 echo esc_attr( $menu_id );
1304 ?> #<?php
1305 echo esc_attr( $menu_id );
1306 ?>-user-role-types').tokenize2({
1307 placeholder: '<?php
1308 esc_html_e( 'Select roles or users', 'adminify' );
1309 ?>'
1310 });
1311 jQuery(document).ready(function($) {
1312 $('#<?php
1313 echo esc_attr( $menu_id );
1314 ?> #<?php
1315 echo esc_attr( $menu_id );
1316 ?>-user-role-types').on('tokenize:select', function(container) {
1317 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1318 });
1319 })
1320 </script>
1321 </div>
1322 </div>
1323 </div>
1324 </div>
1325
1326 </div>
1327 </div>
1328 </div>
1329
1330 <?php
1331 }
1332
1333 public function build_sub_menu_item( $current_menu_item, $optiongroup, $name_attr ) {
1334 $name = '';
1335 $link = '';
1336 $icon = '';
1337 $disabled_for = [];
1338 $suboptiongroup = [];
1339 $menu_options = $this->menu_settings;
1340 if ( isset( $optiongroup['submenu'] ) ) {
1341 if ( isset( $optiongroup['submenu'][$current_menu_item[2]] ) ) {
1342 $suboptiongroup = $optiongroup['submenu'][$current_menu_item[2]];
1343 if ( isset( $suboptiongroup['name'] ) ) {
1344 $name = $suboptiongroup['name'];
1345 }
1346 if ( isset( $suboptiongroup['link'] ) ) {
1347 $link = $suboptiongroup['link'];
1348 }
1349 if ( isset( $suboptiongroup['icon'] ) ) {
1350 $icon = $suboptiongroup['icon'];
1351 }
1352 if ( isset( $suboptiongroup['hidden_for'] ) ) {
1353 $disabled_for = $suboptiongroup['hidden_for'];
1354 }
1355 }
1356 }
1357 $sub_menu_name_attr = $current_menu_item[2];
1358 if ( isset( $current_menu_item['key'] ) ) {
1359 $sub_menu_name_attr = $current_menu_item['key'];
1360 }
1361 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1362 $name = $current_menu_item[0];
1363 $link = $current_menu_item[2];
1364 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'] ) ) {
1365 $disabled_for = $optiongroup['submenu'][$sub_menu_name_attr]['hidden_for'];
1366 }
1367 if ( isset( $optiongroup['submenu'][$sub_menu_name_attr]['icon'] ) ) {
1368 $icon = $optiongroup['submenu'][$sub_menu_name_attr]['icon'];
1369 }
1370 }
1371 if ( !is_array( $disabled_for ) ) {
1372 $disabled_for = [];
1373 }
1374 $menu_id = preg_replace( '/[^A-Za-z0-9 ]/', '', $sub_menu_name_attr );
1375 ?>
1376 <div class="accordion adminify_sub_menu_item" name="<?php
1377 echo esc_attr( $sub_menu_name_attr );
1378 ?>" id="wp-adminify-sub-menu-<?php
1379 echo esc_attr( $menu_id );
1380 ?>">
1381 <input type="number" class="top_level_order" value="" style="display:none;">
1382 <a class="menu-editor-title accordion-button adminify-flex adminify-flex-center adminify-gap-2" href="#">
1383 <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">
1384 <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" />
1385 <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" />
1386 <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" />
1387 <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" />
1388 <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" />
1389 <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" />
1390 <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" />
1391 <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" />
1392 <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" />
1393 </svg>
1394 <?php
1395 if ( !empty( $current_menu_item[0] ) ) {
1396 echo wp_kses_post( preg_replace( '/\\<span.*?>.*?\\<\\/span><\\/span>/s', '', $current_menu_item[0] ) );
1397 }
1398 ?>
1399 </a>
1400
1401 <div class="accordion-body">
1402 <div class="tab-content tab-panel panel p-4">
1403 <div class="tab-pane">
1404 <div class="menu-editor-form">
1405 <div class="columns">
1406 <div class="column">
1407 <label for=""><?php
1408 esc_html_e( 'Rename as', 'adminify' );
1409 ?></label>
1410 <input class="sub_menu_setting" type="text" data-sub-menu-id="<?php
1411 echo esc_attr( $menu_id );
1412 ?>" name="name" placeholder="<?php
1413 esc_html_e( 'New Menu name...', 'adminify' );
1414 ?>" value="<?php
1415 echo esc_attr( $name );
1416 ?>">
1417 </div>
1418 <div class="column">
1419 <label for=""><?php
1420 esc_html_e( 'Hidden For Rules', 'adminify' );
1421 ?></label>
1422
1423 <div class="select is-small">
1424
1425 <?php
1426 echo $this->generate_user_rules_select_field( $menu_id, $disabled_for, 'sub_menu' );
1427 ?>
1428
1429 <script>
1430 jQuery('#wp-adminify-sub-menu-<?php
1431 echo esc_attr( $menu_id );
1432 ?> #<?php
1433 echo esc_attr( $menu_id );
1434 ?>-user-role-types').tokenize2({
1435 placeholder: '<?php
1436 esc_html_e( 'Select roles or users', 'adminify' );
1437 ?>'
1438 });
1439 jQuery(document).ready(function($) {
1440 $('#wp-adminify-sub-menu-<?php
1441 echo esc_attr( $menu_id );
1442 ?> #<?php
1443 echo esc_attr( $menu_id );
1444 ?>-user-role-types').on('tokenize:select', function(container) {
1445 $(this).tokenize2().trigger('tokenize:search', [$(this).tokenize2().input.val()]);
1446 });
1447 })
1448 </script>
1449
1450 </div>
1451 </div>
1452 </div>
1453 <div class="columns">
1454 <div class="column">
1455 <label for=""><?php
1456 esc_html_e( 'Change Link', 'adminify' );
1457 ?></label>
1458 <input class="sub_menu_setting" name="link" type="url" placeholder="New link" value="<?php
1459 echo esc_attr( ( $sub_menu_name_attr != ltrim( $link, '#' ) ? $link : '' ) );
1460 ?>">
1461 </div>
1462 <div class="column">
1463 <label for="" style="margin-top:25px">
1464 <?php
1465 esc_html_e( 'Custom Icon is not allowed for Submenu', 'adminify' );
1466 ?>
1467 </label>
1468 </div>
1469 </div>
1470 </div>
1471 <?php
1472 if ( strpos( $sub_menu_name_attr, 'adminify-custom-submenu-' ) !== false ) {
1473 ?>
1474 <div class="remove-add-new-menu"><span data-id="<?php
1475 echo esc_attr( $sub_menu_name_attr );
1476 ?>"><i class="icon-close"></i> Delete</span></div>
1477 <?php
1478 }
1479 ?>
1480 </div>
1481 </div>
1482 </div>
1483 </div>
1484
1485 <?php
1486 }
1487
1488 /**
1489 * Add New Menu Item.
1490 */
1491 public function render_add_new_menu_item( $submenu = false ) {
1492 $add_item = apply_filters( 'adminify/menu_editor', [
1493 'upgrade_pro' => Utils::adminify_upgrade_pro( ' ' ),
1494 'upgrade_class' => 'upgrade-pro',
1495 ] );
1496 ?>
1497 <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
1498 echo esc_attr( ( $submenu ? 'submenu' : '' ) );
1499 ?> <?php
1500 echo Utils::wp_kses_custom( $add_item['upgrade_class'] );
1501 ?>">
1502 <div class="inner-text">
1503 <i class="dashicons dashicons-plus-alt"></i>
1504 <span class="title"><?php
1505 esc_html_e( 'Add Item', 'adminify' );
1506 ?></span>
1507 </div>
1508 <?php
1509 echo Utils::wp_kses_custom( $add_item['upgrade_pro'] );
1510 ?>
1511 </div>
1512 <?php
1513 }
1514
1515 /**
1516 * Menu Editor Header
1517 *
1518 * @return void
1519 */
1520 public static function render_menu_editor_header() {
1521 ?>
1522
1523 <div class="adminify-flex adminify-flex-center adminify-justify-between">
1524 <div class="adminify-menu-editor-help-urls adminify-flex adminify-flex-center adminify-gap-2">
1525 <?php
1526 echo Utils::adminfiy_help_urls(
1527 __( 'Menu Editor', 'adminify' ),
1528 'https://wpadminify.com/kb/wordpress-dashboard-menu-editor/',
1529 'https://www.youtube.com/playlist?list=PLqpMw0NsHXV-EKj9Xm1DMGa6FGniHHly8',
1530 'https://www.facebook.com/groups/jeweltheme',
1531 \WPAdminify\Inc\Admin\AdminSettings::support_url()
1532 );
1533 ?>
1534 </div>
1535
1536
1537 <div class="wp-adminify--page--title--actions adminify-flex adminify-flex-center adminify-gap-2">
1538
1539 <button class="adminify-btn adminify-btn-outline-primary adminify_menu_save_settings">
1540 <?php
1541 esc_html_e( 'Save', 'adminify' );
1542 ?>
1543 </button>
1544
1545 <div class="adminify-dropdown">
1546 <div class="adminify-dropdown-trigger">
1547 <button class="adminify-btn adminify-btn-outline-primary" aria-haspopup="true" aria-controls="dropdown-menu">
1548 <svg class="icon" width="16" height="12" viewBox="0 0 16 12" fill="none" xmlns="http://www.w3.org/2000/svg">
1549 <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" />
1550 </svg>
1551 </button>
1552 </div>
1553 <div class="adminify-dropdown-menu" id="dropdown-menu" role="menu">
1554 <div class="adminify-dropdown-content adminify-flex adminify-flex-col adminify-gap-2">
1555 <a href="#" class="adminify-dropdown-item adminify_export_menu_settings">
1556 <?php
1557 esc_html_e( 'Export menu', 'adminify' );
1558 ?>
1559 </a>
1560 <input accept=".json" type="file" single="" id="adminify_import_menu" class="hidden">
1561 <a href="#" class="adminify-dropdown-item adminify_import_menu_settings">
1562 <?php
1563 esc_html_e( 'Import menu', 'adminify' );
1564 ?>
1565 </a>
1566 <a href="#" class="adminify-dropdown-item adminify_reset_menu_settings">
1567 <?php
1568 esc_html_e( 'Reset menu', 'adminify' );
1569 ?>
1570 </a>
1571 </div>
1572 </div>
1573 </div>
1574 </div>
1575 </div>
1576
1577 <div class="adminify-text-wrap">
1578 <p><?php
1579 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' );
1580 ?></p>
1581 <p class="adminify-flex adminify-flex-center adminify-gap-1">
1582 <svg class="" width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
1583 <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" />
1584 <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" />
1585 <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" />
1586 </svg>
1587
1588 <?php
1589 esc_html_e( 'If you have WP Adminify Menu Module disabled, icons and label dividers won\'t change.', 'adminify' );
1590 ?>
1591
1592 </p>
1593 </div>
1594
1595
1596 <?php
1597 }
1598
1599 public function jltwp_adminify_menu_editor_contents() {
1600 ?>
1601
1602 <div class="wrap">
1603 <div class="wp-adminify--menu--editor--container">
1604
1605 <!-- <div id="adminify-data-saved-message"></div> -->
1606
1607 <?php
1608 //self::render_menu_editor_header();
1609 ?>
1610
1611 <div class="wp-adminify--menu--editor--settings adminify-flex adminify-flex-col adminify-gap-4">
1612 <div class="wp-adminify-menu-editor-loader"></div>
1613 <?php
1614 $this->render_menu_editor();
1615 ?>
1616 </div>
1617
1618 </div>
1619 </div>
1620 <a href="#" id="adminify_download_settings" style="display: none;" ?></a>
1621 <?php
1622 }
1623
1624 }
1625
1626 }