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

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