PluginProbe
Adminify – White Label, Admin Menu Editor, Login Customizer / 3.2.1
Adminify – White Label, Admin Menu Editor, Login Customizer v3.2.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.1, at Inc/Classes/MenuStyles/VerticalMainMenu.php

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