PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 4.1
MainWP Dashboard: Self-hosted WordPress Management for Agencies v4.1
6.2 6.1.8 6.1.7 6.1.6 6.1.5 6.1.4 6.1.3 6.1.2 6.1.1 6.1 6.0.12 6.0.11 4.6.0.1 5.0 5.0.1 5.0.2 5.0.3 5.0.3.1 5.0.3.2 5.1 5.1.1 5.2 5.2.1 5.2.2 5.3 All 153 releases
mainwp / class / class-mainwp-menu.php

class-mainwp-menu.php in MainWP Dashboard: Self-hosted WordPress Management for Agencies 4.1, at class/class-mainwp-menu.php

579 lines 15.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * MainWP Main Menu
4 *
5 * Build & Render MainWP Main Menu.
6 *
7 * @package MainWP/Dashboard
8 */
9
10 namespace MainWP\Dashboard;
11
12 /**
13 * Class MainWP_Menu
14 *
15 * @package MainWP\Dashboard
16 */
17 class MainWP_Menu {
18
19 /**
20 * Method get_class_name()
21 *
22 * Get Class Name.
23 *
24 * @return object
25 */
26 public static function get_class_name() {
27 return __CLASS__;
28 }
29
30 /**
31 * MainWP_Menu constructor.
32 *
33 * Run each time the class is called.
34 * Define MainWP Main Menu Items.
35 */
36 public function __construct() {
37
38 /**
39 * MainWP Disable Menus items array.
40 *
41 * @global object
42 */
43 global $_mainwp_disable_menus_items;
44
45 // Init disable menu items, default is false.
46 // Use the MainWP Hook 'mainwp_main_menu_disable_menu_items' to disable menu items.
47 if ( null === $_mainwp_disable_menus_items ) {
48 $_mainwp_disable_menus_items = array(
49 // Compatible with old hooks.
50 'level_1' => array(
51 'not_set_this_level' => true,
52 ),
53 'level_2' => array(
54 // 'mainwp_tab' - Do not hide this menu.
55 'UpdatesManage' => false,
56 'managesites' => false,
57 'PostBulkManage' => false,
58 'PageBulkManage' => false,
59 'ThemesManage' => false,
60 'PluginsManage' => false,
61 'UserBulkManage' => false,
62 'ManageBackups' => false,
63 'Settings' => false,
64 'Extensions' => false,
65 'ServerInformation' => false,
66 ),
67 // Compatible with old hooks.
68 'level_3' => array(),
69 );
70 }
71 }
72
73 /**
74 * Method init_mainwp_menus()
75 *
76 * Init MainWP menus.
77 */
78 public static function init_mainwp_menus() {
79 if ( MainWP_System_Utility::is_admin() ) {
80 if ( ! self::is_disable_menu_item( 2, 'UpdatesManage' ) ) {
81 MainWP_Updates::init_menu();
82 }
83 if ( ! self::is_disable_menu_item( 2, 'managesites' ) ) {
84 MainWP_Manage_Sites::init_menu();
85 }
86 if ( ! self::is_disable_menu_item( 2, 'PostBulkManage' ) ) {
87 MainWP_Post::init_menu();
88 }
89 if ( ! self::is_disable_menu_item( 2, 'PageBulkManage' ) ) {
90 MainWP_Page::init_menu();
91 }
92 if ( ! self::is_disable_menu_item( 2, 'ThemesManage' ) ) {
93 MainWP_Themes::init_menu();
94 }
95 if ( ! self::is_disable_menu_item( 2, 'PluginsManage' ) ) {
96 MainWP_Plugins::init_menu();
97 }
98 if ( ! self::is_disable_menu_item( 2, 'UserBulkManage' ) ) {
99 MainWP_User::init_menu();
100 }
101 if ( ! self::is_disable_menu_item( 2, 'ManageBackups' ) ) {
102 MainWP_Manage_Backups::init_menu();
103 }
104 if ( ! self::is_disable_menu_item( 3, 'UpdateAdminPasswords' ) ) {
105 MainWP_Bulk_Update_Admin_Passwords::init_menu();
106 }
107 if ( ! self::is_disable_menu_item( 3, 'ManageGroups' ) ) {
108 MainWP_Manage_Groups::init_menu();
109 }
110 if ( ! self::is_disable_menu_item( 3, 'MonitoringSites' ) ) {
111 MainWP_Monitoring::init_menu();
112 }
113 if ( ! self::is_disable_menu_item( 2, 'Settings' ) ) {
114 MainWP_Settings::init_menu();
115 }
116 MainWP_Extensions::init_menu();
117
118 /**
119 * Action: mainwp_admin_menu
120 *
121 * Hooks main navigation menu items.
122 *
123 * @since 4.0
124 */
125 do_action( 'mainwp_admin_menu' );
126
127 if ( ! self::is_disable_menu_item( 2, 'ServerInformation' ) ) {
128 MainWP_Server_Information::init_menu();
129 }
130 }
131 }
132
133 /**
134 * Method init_subpages_menu()
135 *
136 * Init subpages MainWP menus.
137 */
138 public static function init_subpages_menu() {
139
140 if ( ! self::is_disable_menu_item( 2, 'PostBulkManage' ) ) {
141 MainWP_Post::init_subpages_menu();
142 }
143 if ( ! self::is_disable_menu_item( 2, 'managesites' ) ) {
144 MainWP_Manage_Sites::init_subpages_menu();
145 }
146
147 if ( ! self::is_disable_menu_item( 2, 'Settings' ) ) {
148 MainWP_Settings::init_subpages_menu();
149 }
150
151 if ( ! self::is_disable_menu_item( 2, 'Extensions' ) ) {
152 MainWP_Extensions::init_subpages_menu();
153 }
154 if ( ! self::is_disable_menu_item( 2, 'PageBulkManage' ) ) {
155 MainWP_Page::init_subpages_menu();
156 }
157 if ( ! self::is_disable_menu_item( 2, 'ThemesManage' ) ) {
158 MainWP_Themes::init_subpages_menu();
159 }
160 if ( ! self::is_disable_menu_item( 2, 'PluginsManage' ) ) {
161 MainWP_Plugins::init_subpages_menu();
162 }
163 if ( ! self::is_disable_menu_item( 2, 'UserBulkManage' ) ) {
164 MainWP_User::init_subpages_menu();
165 }
166 if ( get_option( 'mainwp_enableLegacyBackupFeature' ) ) {
167 if ( ! self::is_disable_menu_item( 2, 'ManageBackups' ) ) {
168 MainWP_Manage_Backups::init_subpages_menu();
169 }
170 }
171 if ( ! self::is_disable_menu_item( 2, 'Settings' ) ) {
172 MainWP_Settings::init_subpages_menu();
173 }
174
175 /**
176 * Action: mainwp_admin_menu_sub
177 *
178 * Hooks main navigation sub-menu items.
179 *
180 * @since 4.0
181 */
182 do_action( 'mainwp_admin_menu_sub' );
183
184 if ( ! self::is_disable_menu_item( 2, 'ServerInformation' ) ) {
185 MainWP_Server_Information::init_subpages_menu();
186 }
187 }
188
189
190 /**
191 * Method init_subpages_left_menu
192 *
193 * Build left menu subpages array.
194 *
195 * @param array $subPages Array of SubPages.
196 * @param array $initSubpage Initial SubPage Array.
197 * @param string $parentKey Parent Menu Slug.
198 * @param mixed $slug SubPage Slug.
199 *
200 * @return array $initSubpage[] Final SubPages Array.
201 */
202 public static function init_subpages_left_menu( $subPages, &$initSubpage, $parentKey, $slug ) {
203 if ( ! is_array( $subPages ) ) {
204 return;
205 }
206 foreach ( $subPages as $subPage ) {
207 if ( ! isset( $subPage['menu_hidden'] ) || ( isset( $subPage['menu_hidden'] ) && true != $subPage['menu_hidden'] ) ) {
208 $_item = array(
209 'title' => $subPage['title'],
210 'parent_key' => $parentKey,
211 'href' => 'admin.php?page=' . $slug . $subPage['slug'],
212 'slug' => $slug . $subPage['slug'],
213 'right' => '',
214 );
215
216 // To support check right to open menu for sometime.
217 if ( isset( $subPage['item_slug'] ) ) {
218 $_item['item_slug'] = $subPage['item_slug'];
219 }
220
221 $initSubpage[] = $_item;
222 }
223 }
224 }
225
226 /**
227 * Method is_disable_menu_item
228 *
229 * Check if $_mainwp_disable_menus_items contains any menu items to hide.
230 *
231 * @param string $level The level the menu item is on.
232 * @param array $item The menu items meta data.
233 *
234 * @return bool True|False, default is False.
235 */
236 public static function is_disable_menu_item( $level, $item ) {
237
238 /**
239 * MainWP Disable Menus items array.
240 *
241 * @global object
242 */
243 global $_mainwp_disable_menus_items;
244
245 $_level = 'level_' . $level;
246 if ( is_array( $_mainwp_disable_menus_items ) && isset( $_mainwp_disable_menus_items[ $_level ] ) && isset( $_mainwp_disable_menus_items[ $_level ][ $item ] ) ) {
247 if ( $_mainwp_disable_menus_items[ $_level ][ $item ] ) {
248 return true;
249 } else {
250 return false;
251 }
252 }
253 $_mainwp_disable_menus_items[ $_level ][ $item ] = false;
254 return false;
255 }
256
257 /**
258 * Method add_left_menu
259 *
260 * Build Top Level Menu
261 *
262 * @param array $params Menu Item parameters.
263 * @param integer $level Menu Item Level 1 or 2.
264 *
265 * @return array $mainwp_leftmenu[] | $mainwp_sub_leftmenu[].
266 */
267 public static function add_left_menu( $params = array(), $level = 1 ) {
268
269 if ( empty( $params ) ) {
270 return;
271 }
272
273 if ( 1 != $level && 2 != $level ) {
274 $level = 1;
275 }
276
277 $title = $params['title'];
278
279 if ( 1 === $level ) {
280 $parent_key = 'mainwp_tab'; // forced value.
281 } else {
282 if ( isset( $params['parent_key'] ) ) {
283 $parent_key = $params['parent_key'];
284 } else {
285 $parent_key = 'mainwp_tab'; // forced value.
286 }
287 }
288
289 $slug = $params['slug'];
290 $href = $params['href'];
291 $right = isset( $params['right'] ) ? $params['right'] : '';
292 $id = isset( $params['id'] ) ? $params['id'] : '';
293
294 /**
295 * MainWP Left Menu, Sub Menu & Active menu slugs.
296 *
297 * @global object $mainwp_leftmenu
298 * @global object $mainwp_sub_leftmenu
299 * @global object $_mainwp_menu_active_slugs
300 */
301 global $mainwp_leftmenu, $mainwp_sub_leftmenu, $_mainwp_menu_active_slugs;
302
303 $title = esc_html( $title );
304
305 if ( 1 == $level ) {
306 $mainwp_leftmenu[ $parent_key ][] = array( $title, $slug, $href, $id );
307 if ( ! empty( $slug ) ) {
308 $_mainwp_menu_active_slugs[ $slug ] = $slug; // to get active menu.
309 }
310 } elseif ( 2 == $level ) {
311 $mainwp_sub_leftmenu[ $parent_key ][] = array( $title, $href, $right, $id );
312 if ( ! empty( $slug ) ) {
313 $_mainwp_menu_active_slugs[ $slug ] = $parent_key; // to get active menu.
314 }
315 }
316 }
317
318 /**
319 * Method render_left_menu
320 *
321 * Build Top Level Main Menu HTML & Render.
322 */
323 public static function render_left_menu() {
324
325 /**
326 * MainWP Left Menu, Sub Menu & Active menu slugs.
327 *
328 * @global object $mainwp_leftmenu
329 * @global object $mainwp_sub_leftmenu
330 * @global object $_mainwp_menu_active_slugs
331 */
332 global $mainwp_leftmenu, $mainwp_sub_leftmenu, $_mainwp_menu_active_slugs, $plugin_page;
333
334 /**
335 * Filter: mainwp_main_menu
336 *
337 * Filters main navigation menu items
338 *
339 * @since 4.0
340 */
341 $mainwp_leftmenu = apply_filters( 'mainwp_main_menu', $mainwp_leftmenu );
342
343 /**
344 * Filter: mainwp_main_menu_submenu
345 *
346 * Filters main navigation subt-menu items
347 *
348 * @since 4.0
349 */
350 $mainwp_sub_leftmenu = apply_filters( 'mainwp_main_menu_submenu', $mainwp_sub_leftmenu );
351
352 $mainwp_leftmenu = isset( $mainwp_leftmenu['mainwp_tab'] ) ? $mainwp_leftmenu['mainwp_tab'] : array();
353
354 ?>
355 <div class="mainwp-nav-wrap">
356 <div id="mainwp-logo">
357 <img src="
358 <?php
359 /**
360 * Filter: mainwp_menu_logo_src
361 *
362 * Filters the Logo src attribute.
363 *
364 * @since 4.1
365 */
366 echo apply_filters( 'mainwp_menu_logo_src', MAINWP_PLUGIN_URL . 'assets/images/logo.png' );
367 ?>
368 " alt="
369 <?php
370 /**
371 * Filter: mainwp_menu_logo_alt
372 *
373 * Filters the Logo alt attribute.
374 *
375 * @since 4.1
376 */
377 echo apply_filters( 'mainwp_menu_logo_alt', 'MainWP' );
378 ?>
379 " />
380 </div>
381 <div class="ui hidden divider"></div>
382 <div class="mainwp-nav-menu">
383 <?php
384 /**
385 * Action: before_mainwp_menu
386 *
387 * Fires before the main navigation element.
388 *
389 * @since 4.0
390 */
391 do_action( 'before_mainwp_menu' );
392 ?>
393 <div id="mainwp-main-menu" class="ui inverted vertical accordion menu stackable">
394 <?php
395 if ( is_array( $mainwp_leftmenu ) && ! empty( $mainwp_leftmenu ) ) {
396 foreach ( $mainwp_leftmenu as $item ) {
397 $title = wptexturize( $item[0] );
398 $item_key = $item[1];
399 $href = $item[2];
400 $item_id = isset( $item[3] ) ? $item[3] : '';
401
402 $has_sub = true;
403 if ( ! isset( $mainwp_sub_leftmenu[ $item_key ] ) || empty( $mainwp_sub_leftmenu[ $item_key ] ) ) {
404 $has_sub = false;
405 }
406 $active_item = '';
407 $set_actived = false;
408 // to fix active menu.
409 if ( ! $set_actived ) {
410 if ( isset( $_mainwp_menu_active_slugs[ $plugin_page ] ) ) {
411 if ( $item_key == $_mainwp_menu_active_slugs[ $plugin_page ] ) {
412 $active_item = 'active';
413 $set_actived = true;
414 }
415 }
416 }
417
418 $id_attr = ! empty( $item_id ) ? 'id="' . esc_html( $item_id ) . '"' : '';
419
420 if ( $has_sub ) {
421 echo '<div ' . $id_attr . " class=\"item $active_item\">";
422 echo "<a class=\"title with-sub $active_item\" href=\"$href\"><b>$title</b> <i class=\"dropdown icon\"></i></a>";
423 echo "<div class=\"content menu $active_item\">";
424 self::render_sub_item( $item_key );
425 echo '</div>';
426 echo '</div>';
427 } else {
428 echo '<div ' . $id_attr . ' class="item">';
429 echo "<a class='title $active_item' href=\"$href\"><b>$title</b></a>";
430 echo '</div>';
431 }
432 }
433 } else {
434 echo "\n\t<div class='item'>";
435 echo '</div>';
436 }
437
438 $go_back_wpadmin_url = admin_url( 'index.php' );
439
440 $link = array(
441 'url' => $go_back_wpadmin_url,
442 'text' => __( 'Go to WP Admin', 'mainwp' ),
443 'tip' => __( 'Click to go back to the site WP Admin area.', 'mainwp' ),
444 );
445
446 /**
447 * Filter: mainwp_go_back_wpadmin_link
448 *
449 * Filters URL for the Go to WP Admin button in Main navigation.
450 *
451 * @since 4.0
452 */
453 $go_back_link = apply_filters( 'mainwp_go_back_wpadmin_link', $link );
454
455 if ( is_array( $go_back_link ) ) {
456 if ( isset( $go_back_link['url'] ) ) {
457 $link['url'] = $go_back_link['url'];
458 }
459 if ( isset( $go_back_link['text'] ) ) {
460 $link['text'] = $go_back_link['text'];
461 }
462 if ( isset( $go_back_link['tip'] ) ) {
463 $link['tip'] = $go_back_link['tip'];
464 }
465 }
466 ?>
467 <div class="item item-wp-admin" style="background-color: rgba(255,255,255,.15);">
468 <a href="<?php echo esc_html( $link['url'] ); ?>" class="title" style="display:inline" data-position="top left" data-tooltip="<?php echo esc_html( $link['tip'] ); ?>"><b><i class="wordpress icon"></i> <?php echo esc_html( $link['text'] ); ?></b></a> <a class="ui small label" data-position="top right" data-tooltip="<?php esc_html_e( 'Logout', 'mainwp' ); ?>" href="<?php echo wp_logout_url(); ?>"><i class="sign-out icon" style="margin:0"></i></a> <?php //phpcs:ignore -- to avoid auto fix wordpress icon ?>
469 </div>
470 <div class="hamburger">
471 <span class="hamburger-bun"></span>
472 <span class="hamburger-patty"></span>
473 <span class="hamburger-bun"></span>
474 </div>
475 </div>
476 <?php
477 /**
478 * Action: after_mainwp_menu
479 *
480 * Fires after the main navigation element.
481 *
482 * @since 4.0
483 */
484 do_action( 'after_mainwp_menu' );
485 ?>
486 </div>
487 </div>
488 <script type="text/javascript">
489 jQuery( document ).ready( function () {
490 // click on menu with-sub icon.
491 jQuery( '.mainwp-nav-menu a.title.with-sub .icon' ).on( "click", function ( event ) {
492 var pr = jQuery( this ).closest( '.item' );
493 var title = jQuery( this ).closest( '.title' );
494 var active = jQuery( title ).hasClass( 'active' );
495
496 // remove current active.
497 mainwp_menu_collapse();
498
499 // if current menu item are not active then set it active.
500 if ( !active ) {
501 jQuery( title ).addClass( 'active' );
502 jQuery( pr ).find('.content.menu').addClass( 'active' );
503 pr.addClass('active');
504 }
505 return false;
506 } );
507
508 jQuery( '.mainwp-nav-menu a.title.with-sub' ).on( "click", function ( event ) {
509 var pr = jQuery( this ).closest( '.item' );
510 var active = jQuery( this ).hasClass( 'active' );
511
512 // remove current active.
513 mainwp_menu_collapse();
514
515 // set active before go to the page.
516 if ( !active ) {
517 jQuery( this ).addClass( 'active' );
518 jQuery( pr ).find('.content.menu').addClass( 'active' );
519 pr.addClass('active');
520 }
521 } );
522
523 mainwp_menu_collapse = function() {
524 // remove current active.
525 jQuery( '.mainwp-nav-menu a.title.active').removeClass('active');
526 jQuery( '.mainwp-nav-menu .menu .item').removeClass('active');
527 jQuery( '.mainwp-nav-menu .content.menu.active').removeClass('active');
528 };
529 } );
530 </script>
531 <?php
532 }
533
534 /**
535 * Method render_sub_item
536 *
537 * Grab all submenu items and attatch to Main Menu.
538 *
539 * @param mixed $parent_key The parent key.
540 */
541 public static function render_sub_item( $parent_key ) {
542 if ( empty( $parent_key ) ) {
543 return;
544 }
545
546 /**
547 * MainWP Left Menu.
548 *
549 * @global object $mainwp_sub_leftmenu
550 */
551 global $mainwp_sub_leftmenu;
552
553 $submenu_items = $mainwp_sub_leftmenu[ $parent_key ];
554
555 if ( ! is_array( $submenu_items ) || count( $submenu_items ) == 0 ) {
556 return;
557 }
558
559 foreach ( $submenu_items as $sub_key => $sub_item ) {
560 $title = $sub_item[0];
561 $href = $sub_item[1];
562 $right = $sub_item[2];
563 $right_group = 'dashboard';
564 if ( ! empty( $right ) ) {
565 if ( strpos( $right, 'extension_' ) === 0 ) {
566 $right_group = 'extension';
567 $right = str_replace( 'extension_', '', $right );
568 }
569 }
570 if ( empty( $right ) || ( ! empty( $right ) && mainwp_current_user_have_right( $right_group, $right ) ) ) {
571 ?>
572 <a class="item" href="<?php echo esc_url( $href ); ?>"><?php echo esc_html( $title ); ?></a>
573 <?php
574 }
575 }
576 }
577
578 }
579