PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.2.4.1
Adminify – White Label, Admin Menu Editor, Login Customizer v3.2.4.1
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 / Classes / MenuStyles / VerticalMainMenu.php

VerticalMainMenu.php in Adminify – White Label, Admin Menu Editor, Login Customizer 3.2.4.1, at Inc/Classes/MenuStyles/VerticalMainMenu.php

678 lines 18.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\Classes\MenuStyles;
4
5 use WPAdminify\Inc\Utils;
6 use WPAdminify\Inc\Admin\AdminSettings;
7 use WPAdminify\Inc\Classes\MenuStyles\MenuStyleBase;
8 use WPAdminify\Inc\Modules\MenuEditor\MenuEditorOptions;
9
10 // no direct access allowed
11 if (!defined('ABSPATH')) {
12 exit;
13 }
14
15 class VerticalMainMenu extends MenuStyleBase
16 {
17
18 public $options;
19 public $menu_settings;
20 public $sub_menu_setting;
21 public $original_submenu;
22
23 public function __construct()
24 {
25 parent::__construct();
26 $this->menu_settings = (new MenuEditorOptions())->get();
27 $this->options = (array) AdminSettings::get_instance()->get();
28
29 add_filter('admin_body_class', array($this, 'admin_menu_body_class'));
30
31 if (empty($this->options['admin_ui'])) {
32 return;
33 }
34
35 add_filter('parent_file', array($this, 'render_adminify_admin_menu'), 9999);
36
37 add_action('adminmenu', array($this, 'render_output_adminify_admin_menu'));
38 }
39
40 // Body Class
41 public function admin_menu_body_class($classes)
42 {
43 $this->options = (array) AdminSettings::get_instance()->get('menu_layout_settings');
44 $menu_layout = !empty($this->options['layout_type']) ? sanitize_text_field($this->options['layout_type']) : 'vertical';
45 $menu_mode = !empty($this->options['menu_mode']) ? sanitize_text_field($this->options['menu_mode']) : 'classic';
46
47 $bodyclass = '';
48 if ($menu_layout == 'vertical' && $menu_mode === 'icon_menu') {
49 $classes .= ' folded ';
50 }
51 $classes .= ' adminify_admin_menu ';
52 return $classes . $bodyclass;
53 }
54
55 /**
56 * Render Admin Menu
57 *
58 * @package WP Adminify
59 * @return void
60 */
61 public function render_adminify_admin_menu($parent_file)
62 {
63 global $menu, $pagenow, $wp_adminify_menu;
64 $current_user = wp_get_current_user();
65 $this->original_menu = $menu;
66 $this->options = (array) AdminSettings::get_instance()->get();
67
68 // Disable Default Menu
69 $menu = array();
70 ob_start();
71 ?>
72 <div class="wp_adminify_sidebar_admin-menu menu-default-light">
73 <ul class="wp_adminify_admin-menu">
74 <?php
75 // User Info Section
76 if (!empty($this->options['menu_layout_settings']['user_info'])) {
77 ?>
78 <li class="wp_adminify_admin-menu-top">
79 <div class="wp_adminify_user has-text-centered p-2 pt-4 pb-5 mb-2">
80 <div class="wp_adminify_user-avatar image is-80x80">
81 <?php if (isset($this->options['menu_layout_settings']['user_info_avatar']) && $this->options['menu_layout_settings']['user_info_avatar'] === 'rounded') { ?>
82 <?php echo get_avatar($current_user->user_email, 80, '', '', array('class' => 'is-rounded')); ?>
83 <?php
84 } else {
85 echo get_avatar($current_user->user_email, 80, '', '', array('class' => 'is-square'));
86 }
87 ?>
88 </div>
89
90 <?php if (isset($this->options['menu_layout_settings']['user_info_content']) && $this->options['menu_layout_settings']['user_info_content'] === 'text') { ?>
91
92 <div class="wp_adminify_user-details">
93 <h4 class="wp_adminify_user-name is-capitalized">
94 <a class="has-text-weight-bold" href="<?php echo esc_url(admin_url('profile.php')); ?>">
95 <?php echo esc_html($current_user->display_name); ?>
96 </a>
97 </h4>
98 <span class="wp_adminify_user-url">
99 <a href="<?php echo esc_url(admin_url('profile.php')); ?>">
100 <?php echo wp_kses_post(is_email($current_user->user_email)); ?>
101 </a>
102 </span>
103
104 <a class="logout mt-2" href="<?php echo esc_url(wp_logout_url()); ?>">
105 <?php echo esc_html__('Log Out', 'adminify'); ?>
106 </a>
107 </div>
108
109 <?php } elseif (isset($this->options['menu_layout_settings']['user_info_content']) && $this->options['menu_layout_settings']['user_info_content'] === 'icon') { ?>
110 <div class="wp_adminify_user-actions">
111 <a href="<?php echo esc_url(admin_url('profile.php')); ?>">
112 <i class="icon-user icons"></i>
113 </a>
114 <a href="<?php echo esc_url(wp_logout_url()); ?>">
115 <i class="icon-logout icons"></i>
116 </a>
117 </div>
118 <?php } ?>
119 </div>
120 </li>
121 <?php } ?>
122
123
124
125 <?php
126
127 $this->render_top_level_menu_items($this->original_menu);
128
129 ?>
130
131
132 </ul>
133
134 </div>
135
136
137 <?php
138 $wp_adminify_menu = ob_get_clean();
139
140 return $parent_file;
141 }
142
143 /**
144 * User Roles Slug from Names
145 *
146 * @param [type] $user_roles
147 *
148 * @return void
149 */
150 public function jltwp_adminify_menu_roles($user_roles = [])
151 {
152 $disabled_for_roles = [];
153 if ($user_roles) {
154 foreach ($user_roles as $usr_key) {
155 $disabled_for_roles = strtolower(str_replace(' ', '_', $usr_key));
156 }
157 }
158 return $disabled_for_roles;
159 }
160
161 /**
162 * Render Top Level Menu Items
163 */
164
165 public function render_top_level_menu_items($the_menu)
166 {
167 global $submenu;
168 $this->original_submenu = $submenu;
169 $menu_options = $this->menu_settings;
170
171 foreach ($the_menu as $menu_item) {
172 $menu_name = $menu_item[0];
173 $menu_link = $menu_item[2];
174 $divider = false;
175
176
177 $disabled_for = array();
178
179 if (is_array($menu_options)) {
180 if (isset($menu_options[$menu_item[2]])) {
181 $optiongroup = $menu_options[$menu_item[2]];
182
183 if (!empty($optiongroup['hidden_for'])) {
184
185 $disabled_for = $this->jltwp_adminify_menu_roles($optiongroup['hidden_for']);
186
187 if (Utils::restricted_for($disabled_for)) {
188 continue;
189 }
190 }
191 }
192 }
193
194 $custom_menu = isset($menu_item[5]) ? $menu_item[5] : '';
195 if (strpos($custom_menu, 'adminify-custom-menu-') !== false) {
196 if (isset($menu_options[$menu_item[5]]['hidden_for'])) {
197 $hidden_for = $menu_options[$menu_item[5]]['hidden_for'];
198 if (!empty($hidden_for)) {
199
200 $disabled_for = $this->jltwp_adminify_menu_roles($hidden_for);
201 if (Utils::restricted_for($disabled_for)) {
202 continue;
203 }
204 }
205 }
206 }
207
208 if (strpos($menu_link, 'separator') !== false) {
209 $divider = true;
210 // $this->render_divider($menu_item);
211 continue;
212 }
213
214 if (!$menu_name) {
215 continue;
216 }
217
218 if (isset($submenu[$menu_link])) {
219 $sub_menu_items = $submenu[$menu_link];
220 } else {
221 $sub_menu_items = false;
222 }
223
224 $link = $this->get_menu_link($menu_item);
225
226 if ('edit.php?post_type=elementor_library' === $link) {
227 $link .= '&tabs_group=library';
228 }
229
230 $classes = $this->get_menu_clases($menu_item, $submenu);
231 ?>
232
233 <li class="<?php echo esc_attr($classes); ?>" id="<?php echo esc_attr($menu_item[5]); ?>">
234 <a class="menu-icon-generic <?php echo esc_attr($classes); ?>" href="<?php echo esc_url($link); ?>">
235
236 <?php $this->get_icon($menu_item); ?>
237
238 <span class="wp-menu-name" id="adminify-main-topmenu-<?php echo esc_attr(preg_replace('/[^A-Za-z0-9 ]/', '', $menu_item[5])); ?>"><?php echo wp_kses_post($menu_name); ?></span>
239
240 </a>
241
242 <?php
243 if (is_array($sub_menu_items)) {
244 $this->render_sub_level_menu_items($sub_menu_items, $menu_item, $menu_options);
245 }
246 ?>
247
248 </li>
249
250 <?php
251
252 if (isset($menu_item['separator']) && $menu_item['separator'] == 1) {
253 $this->render_divider($menu_item);
254 }
255 }
256 }
257
258
259 /**
260 * Gets correct classes for top level menu item
261 *
262 * @since 1.4
263 */
264
265 public function get_menu_clases($menu_item, $sub_menu)
266 {
267 $menu_link = $menu_item[2];
268 $classes = $menu_item[4];
269
270 if (isset($sub_menu[$menu_link])) {
271 $classes = $classes . ' wp-has-submenu wp-adminify-parent ';
272 $classes = $classes . ' ' . $this->check_if_active($menu_item, $sub_menu[$menu_link]);
273 } else {
274 $classes = $classes . ' ' . $this->check_if_single_active($menu_item);
275 }
276
277 return $classes;
278 }
279
280
281 /**
282 * Checks if we are on an active link or sub link
283 *
284 * @since 1.4
285 */
286
287 public function check_if_active($menu_item, $sub_menu)
288 {
289 if (!is_array($sub_menu)) {
290 return '';
291 }
292
293 global $pagenow;
294
295 if (isset($_SERVER['QUERY_STRING'])) {
296 $currentquery = sanitize_text_field(wp_unslash($_SERVER['QUERY_STRING']));
297 }
298
299 if ($currentquery) {
300 $currentquery = '?' . $currentquery;
301 }
302 $wholestring = $pagenow . $currentquery;
303 $visibility = 'hidden';
304 $open = 'wp-not-current-submenu';
305 $files = $this->files;
306
307 foreach ($sub_menu as $sub) {
308 if ($sub[2] === 'edit-tags.php?taxonomy=elementor_library_category&amp;post_type=elementor_library') {
309 $link = 'edit-tags.php?taxonomy=elementor_library_category&post_type=elementor_library';
310 } elseif ($sub[2] === 'edit.php?post_type=elementor_library') {
311 $link = 'edit.php?post_type=elementor_library';
312 } elseif (($sub[2] === 'e-landing-page') || ($sub[2] === 'popup_templates')) {
313 $link = 'edit.php?post_type=elementor_library&page=' . esc_attr($sub[2]);
314 } elseif ($sub[2] === 'updraftplus') {
315 $link = 'options-general.php?page=' . esc_attr($sub[2]);
316 } elseif (strpos($sub[2], '.php') !== false) {
317 $link = $sub[2];
318
319 $querypieces = explode('?', $link);
320 $temp = $querypieces[0];
321
322 if (!in_array($temp, $files)) {
323 $link = 'admin.php?page=' . esc_attr($sub[2]);
324 }
325 } else {
326 $link = 'admin.php?page=' . esc_attr($sub[2]);
327 }
328 $linkclass = '';
329 if (($wholestring == $link) || ((strpos($wholestring, 'edit.php?post_type=elementor_library') !== false) && (strpos($link, 'edit.php?post_type=elementor_library') !== false))) {
330 $linkclass = 'wp-has-current-submenu wp-menu-open';
331 $open = 'wp-adminify-active wp-adminify-open wp-menu-open wp-has-current-submenu';
332 $visibility = '';
333 break;
334 }
335 }
336
337 return $open;
338 }
339
340
341
342 /**
343 * Render Divider
344 *
345 * @package WP Adminify
346 * @return void
347 */
348 public function render_divider($divider)
349 {
350 if (isset($divider['name'])) {
351 ?>
352
353 <li class="wp-adminify-nav-header"><?php echo esc_html($divider['name']); ?></li>
354 <li class="wp-adminify-nav-divider divider-placeholder"></li>
355
356 <?php
357
358 } else {
359 ?>
360
361 <li class="wp-adminify-nav-divider"></li>
362
363 <?php
364 }
365 }
366
367
368 /**
369 * Render Sub Menu Items
370 *
371 * @return void
372 */
373 public function render_sub_level_menu_items($sub_menu, $parent_menu, $menu_options)
374 {
375 $sub_menu_setting = isset($menu_options[$parent_menu[2]]['submenu']) ? $menu_options[$parent_menu[2]]['submenu'] : array();
376
377 ?>
378 <ul class="wp-adminify-nav-sub wp-submenu wp-submenu-wrap">
379 <?php
380 foreach ($sub_menu as $sub_item) {
381 $restrict_submenu = false;
382 $sub_menu_name = $sub_item[0];
383 $sub_menu_link = $sub_item[2];
384 $link = $this->get_menu_link($sub_item);
385 $class = $this->check_if_single_active($sub_item);
386
387 $parent_menu_id = preg_replace('/[^A-Za-z0-9 ]/', '', $sub_menu_link);
388
389 $disabled_for = array();
390
391 // Custom Submenu
392 $custom_submenu = isset($sub_item['key']) ? $sub_item['key'] : '';
393
394 if (strpos($parent_menu[5], 'adminify-custom-menu-') !== false) {
395 if (strpos($custom_submenu, 'adminify-custom-submenu-') !== false) {
396 $submenu_options = $menu_options[$parent_menu[5]]['submenu'][$custom_submenu];
397
398 $hidden_for = isset($submenu_options['hidden_for']) ? $submenu_options['hidden_for'] : array();
399
400 if (!empty($hidden_for)) {
401 $disabled_for[] = $this->jltwp_adminify_menu_roles($hidden_for);
402 }
403 }
404 } else {
405 $disabled_for[] = !empty($sub_menu_setting[$sub_item[2]]['hidden_for']) ? $this->jltwp_adminify_menu_roles($sub_menu_setting[$sub_item[2]]['hidden_for']) : array();
406 }
407
408
409 // hide pricing menu when user is using pro version
410 if (($sub_menu_link === 'wp-adminify-settings-pricing') && jltwp_adminify()->can_use_premium_code__premium_only()) {
411 // Do not display the menu item
412 } else {
413 $sub_menu_name = $sub_item[0];
414 $sub_menu_link = $sub_item[2];
415 $link = $this->get_menu_link($sub_item);
416
417 if (!empty($disabled_for)) {
418 $restrict_submenu = Utils::restricted_for($disabled_for);
419
420 if ($restrict_submenu) {
421 continue;
422 }
423 }
424 ?>
425 <li class="<?php echo esc_attr($class); ?>">
426 <a class="<?php echo esc_attr($class); ?>" href="<?php echo esc_url($link); ?>" id="adminify-main-submenu-<?php echo esc_attr($parent_menu_id); ?>">
427 <?php echo wp_kses_post($sub_menu_name); ?>
428 </a>
429 </li>
430 <?php
431 }
432 }
433 ?>
434 </ul>
435 <?php
436 }
437
438
439 /**
440 * Checks if we are on an active link or sub link
441 *
442 * @since 1.4
443 */
444
445 public function check_if_single_active($sub_menu_item)
446 {
447 global $pagenow;
448
449 $currentquery = sanitize_text_field(wp_unslash($_SERVER['QUERY_STRING']));
450
451 if ($currentquery) {
452 $currentquery = '?' . $currentquery;
453 }
454 $wholestring = $pagenow . $currentquery;
455 $visibility = 'hidden';
456 $open = 'wp-not-current-submenu';
457 $files = $this->files;
458
459 if ($sub_menu_item[2] === 'edit-tags.php?taxonomy=elementor_library_category&amp;post_type=elementor_library') {
460 $link = 'edit-tags.php?taxonomy=elementor_library_category&post_type=elementor_library';
461 } elseif ($sub_menu_item[2] === 'popup_templates') {
462 $link = 'edit.php?post_type=elementor_library&page=' . esc_attr($sub_menu_item[2]);
463 } elseif ($sub_menu_item[2] === 'updraftplus') {
464 $link = 'options-general.php?page=' . esc_attr($sub_menu_item[2]);
465 } elseif (strpos($sub_menu_item[2], '.php') !== false) {
466 $link = $sub_menu_item[2];
467
468 $querypieces = explode('?', $link);
469 $temp = $querypieces[0];
470
471 if (!in_array($temp, $files)) {
472 $link = 'admin.php?page=' . esc_attr($sub_menu_item[2]);
473 }
474 } else {
475 $link = 'admin.php?page=' . esc_attr($sub_menu_item[2]);
476 }
477
478 $linkclass = '';
479 if ($wholestring == $link) {
480 $linkclass = 'wp-adminify-active current';
481 }
482
483 return $linkclass;
484 }
485
486
487
488 /**
489 * Scans admin directory for menu links
490 *
491 * @since 1.4
492 */
493 public function get_admin_files()
494 {
495 $absolutepath = ABSPATH . '/wp-admin' . '/';
496 $files = array_diff(scandir($absolutepath), array('.', '..'));
497
498 if (is_multisite()) {
499 $pathtonetwork = ABSPATH . '/wp-admin' . '/network/';
500 $networkfiles = array_diff(scandir($pathtonetwork), array('.', '..'));
501 $files = array_merge($files, $networkfiles);
502 }
503
504 return $files;
505 }
506
507 /**
508 * Gets correct link for menu item
509 *
510 * @since 1.4
511 */
512
513 public function get_menu_link($menu_item)
514 {
515 $menu_link = $menu_item[2];
516 $files = $this->get_admin_files();
517 $this->files = $files;
518
519 if ($menu_link == 'woocommerce') {
520 $menu_link = 'wc-admin';
521 }
522
523 if (($menu_link === 'e-landing-page') || ($menu_link === 'popup_templates')) {
524 $link = 'edit.php?post_type=elementor_library&page=' . esc_attr($menu_link);
525 } elseif ($menu_link === 'updraftplus') {
526 $link = 'options-general.php?page=' . esc_attr($menu_link);
527 } elseif (strpos($menu_link, 'admin.php') !== false) {
528 $link = $menu_link;
529 } elseif (strpos($menu_link, '.php') !== false) {
530 $link = $menu_link;
531 if (strpos($menu_link, '/') !== false) {
532 $pieces = explode('/', $menu_link);
533 if (strpos($pieces[0], '.php') !== true || !file_exists(get_admin_url() . esc_attr($menu_link))) {
534 $link = 'admin.php?page=' . esc_attr($menu_link);
535 }
536 }
537
538 $querypieces = explode('?', $link);
539 $temp = $querypieces[0];
540
541 if (!in_array($temp, $files)) {
542 $link = 'admin.php?page=' . esc_attr($menu_link);
543 }
544 } else {
545 $link = 'admin.php?page=' . esc_attr($menu_link);
546 }
547
548 if (strpos($menu_link, '/wp-content/') !== false) {
549 $link = 'admin.php?page=' . esc_attr($menu_link);
550 }
551
552 // CHECK IF INTERNAL URL
553 if (strpos($menu_link, get_site_url()) !== false) {
554 $link = $menu_link;
555 }
556
557 // CHECK IF EXTERNAL LINK
558 if (strpos($menu_link, 'https://') !== false || strpos($menu_link, 'http://') !== false) {
559 $link = $menu_link;
560 }
561
562 return $link;
563 }
564
565
566
567 /**
568 * Gets top level menu item icon
569 *
570 * @since 1.4
571 */
572
573 public function get_icon($menu_item)
574 {
575
576 // LIST OF AVAILABLE MENU ICONS
577 $icons = array(
578 'dashicons-dashboard' => 'dashicons dashicons-dashboard',
579 'dashicons-admin-post' => 'dashicons dashicons-admin-post',
580 'dashicons-database' => 'dashicons dashicons-database',
581 'dashicons-admin-media' => 'dashicons dashicons-admin-media',
582 'dashicons-admin-page' => 'dashicons dashicons-admin-page',
583 'dashicons-admin-comments' => 'dashicons dashicons-admin-comments',
584 'dashicons-admin-appearance' => 'dashicons dashicons-admin-appearance',
585 'dashicons-admin-plugins' => 'dashicons dashicons-admin-plugins',
586 'dashicons-admin-users' => 'dashicons dashicons-admin-users',
587 'dashicons-admin-tools' => 'dashicons dashicons-admin-tools',
588 'dashicons-chart-bar' => 'dashicons dashicons-chart-bar',
589 'dashicons-admin-settings' => 'dashicons dashicons-admin-settings',
590 );
591
592 // SET MENU ICON
593 $theicon = '';
594 // $wpicon = $menu_item;
595 $wpicon = (isset($menu_item)) ? $menu_item[6] : '';
596
597 if (isset($menu_item['icon']) && !empty($menu_item['icon'])) {
598 if (preg_match('/http(s?)\:\/\//i', $menu_item['icon'])) {
599 $icon = explode(',', $menu_item['icon']);
600
601 ?>
602 <span class="wp-adminify-icon-button" style="background-image: url(<?php echo esc_url($icon[1]); ?>);"></span>
603 <?php
604 return;
605 } else {
606 ?>
607 <span class="wp-adminify-icon-button <?php echo esc_attr($menu_item['icon']); ?>"></span>
608 <?php
609 return;
610 }
611 }
612
613 if (isset($icons[$wpicon])) {
614
615 // ICON IS SET BY WP ADMINIFY
616 ?>
617 <span class="wp-adminify-icon-button <?php echo esc_attr($icons[$wpicon]); ?>"></span>
618 <?php
619 return;
620 }
621
622 if (!$theicon) {
623 if (strpos($wpicon, 'http') !== false || strpos($wpicon, 'data:') !== false) {
624 // ICON IS IMAGE && BASE64
625 $class = '';
626 // ICON IS BASE64
627 if (strpos($wpicon, 'data:') !== false) {
628 $deocded_bas64 = base64_decode(explode(',', $wpicon)[1]);
629 }
630 // ICON IS IMAGE
631 if (strpos($wpicon, 'http') !== false) {
632 $class = 'svg-image-icon';
633 $wpicon = (strpos($wpicon, ',') !== false) ? explode(',', $wpicon)[1] : $wpicon;
634 }
635 ?>
636 <span class="wp-adminify-icon wp-adminify-icon-image wp-adminify-icon-button <?php echo esc_attr($class); ?>" <?php
637 if (strpos($wpicon, 'data:') === false) {
638 ?> style="background-image: url(<?php echo esc_url($wpicon); ?>);" <?php } ?>>
639 <?php
640 if (strpos($wpicon, 'data:') !== false) {
641 echo Utils::wp_kses_custom($deocded_bas64);
642 }
643 ?>
644 </span>
645 <?php
646 } else {
647
648 // ICON IS ::BEFORE ELEMENT
649 if (empty($wpicon)) {
650 $wpicon = empty($wpicon) ? WP_ADMINIFY_ASSETS_IMAGE . 'logos/menu-icon.svg' : '';
651 ?>
652 <span class="wp-adminify-icon wp-adminify-icon-image wp-adminify-icon-button svg-image-icon" style="background-image: url(<?php echo esc_url($wpicon); ?>);"></span>
653 <?php
654 } else {
655 $wpicon = (strpos($wpicon, 'dashicons-') !== false) ? 'dashicons-before ' . $wpicon : $wpicon;
656 ?>
657 <div class="wp-menu-image <?php echo esc_attr($wpicon); ?> wp-adminify-icon wp-adminify-icon-image wp-adminify-icon-button"></div>
658 <?php
659 }
660 }
661 }
662 }
663
664
665 /**
666 * Render Output Admin Menu
667 *
668 * @return void
669 */
670 public function render_output_adminify_admin_menu()
671 {
672 global $menu, $submenu, $wp_adminify_menu;
673 echo Utils::wp_kses_custom($wp_adminify_menu);
674 $menu = $this->original_menu;
675 $submenu = $this->original_submenu;
676 }
677 }
678