PluginProbe
MainWP Dashboard: Self-hosted WordPress Management for Agencies / 5.0
MainWP Dashboard: Self-hosted WordPress Management for Agencies v5.0
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 5.0, at class/class-mainwp-menu.php

1,436 lines 49.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 'ManageClients' => false,
58 'ManageGroups' => false,
59 'PostBulkManage' => false,
60 'PageBulkManage' => false,
61 'ThemesManage' => false,
62 'PluginsManage' => false,
63 'UserBulkManage' => false,
64 'ManageBackups' => false,
65 'Settings' => false,
66 'Extensions' => false,
67 'ServerInformation' => false,
68 ),
69 // Compatible with old hooks.
70 'level_3' => array(),
71 );
72 }
73 }
74
75 /**
76 * Method init_mainwp_menus()
77 *
78 * Init MainWP menus.
79 *
80 * @uses \MainWP\Dashboard\MainWP_System_Utility::is_admin()
81 * @uses \MainWP\Dashboard\MainWP_Updates::init_menu()
82 * @uses \MainWP\Dashboard\MainWP_Manage_Sites::init_menu()
83 * @uses \MainWP\Dashboard\MainWP_Post::init_menu()
84 * @uses \MainWP\Dashboard\MainWP_Page::init_menu()
85 * @uses \MainWP\Dashboard\MainWP_Themes::init_menu()
86 * @uses \MainWP\Dashboard\MainWP_Plugins::init_menu()
87 * @uses \MainWP\Dashboard\MainWP_User::init_menu()
88 * @uses \MainWP\Dashboard\MainWP_Manage_Backups::init_menu()
89 * @uses \MainWP\Dashboard\MainWP_Manage_Groups::init_menu()
90 * @uses \MainWP\Dashboard\MainWP_Monitoring::init_menu()
91 * @uses \MainWP\Dashboard\MainWP_Settings::init_menu()
92 * @uses \MainWP\Dashboard\MainWP_Extensions::init_menu()
93 * @uses \MainWP\Dashboard\MainWP_Bulk_Update_Admin_Passwords::init_menu()
94 */
95 public static function init_mainwp_menus() { // phpcs:ignore -- complex method. Current complexity is the only way to achieve desired results, pull request solutions appreciated.
96 if ( MainWP_System_Utility::is_admin() ) {
97
98 $menus_items = array();
99
100 // Manage Sites.
101 $menus_items[] = array(
102 'slug' => 'managesites',
103 'menu_level' => 2,
104 'menu_rights' => array(
105 'dashboard' => array(
106 'add_sites',
107 'edit_sites',
108 'delete_sites',
109 'access_individual_dashboard',
110 'access_wpadmin_on_child_sites',
111 'manage_security_issues',
112 'test_connection',
113 'manage_groups',
114 ),
115 ),
116 'init_menu_callback' => array( MainWP_Manage_Sites::class, 'init_menu' ),
117 'leftbar_order' => 1,
118 );
119
120 // Manage Clients.
121 $menus_items[] = array(
122 'slug' => 'ManageClients',
123 'menu_level' => 2,
124 'menu_rights' => array(
125 'dashboard' => array(
126 'manage_clients',
127 ),
128 ),
129 'init_menu_callback' => array( MainWP_Client::class, 'init_menu' ),
130 'leftbar_order' => 2,
131 );
132
133 // Manage Tags.
134 $menus_items[] = array(
135 'slug' => 'ManageGroups',
136 'menu_level' => 2,
137 'menu_rights' => array(
138 'dashboard' => array(
139 'manage_groups',
140 ),
141 ),
142 'init_menu_callback' => array( MainWP_Manage_Groups::class, 'init_menu' ),
143 );
144
145 // Manage Updates.
146 $menus_items[] = array(
147 'slug' => 'UpdatesManage',
148 'menu_level' => 2,
149 'menu_rights' => array(
150 'dashboard' => array(
151 'update_wordpress',
152 'update_plugins',
153 'update_themes',
154 'update_translations',
155 'ignore_unignore_updates',
156 'trust_untrust_updates',
157 ),
158 ),
159 'init_menu_callback' => array( MainWP_Updates::class, 'init_menu' ),
160 );
161
162 // Manage Plugins.
163 $menus_items[] = array(
164 'slug' => 'PluginsManage',
165 'menu_level' => 2,
166 'menu_rights' => array(
167 'dashboard' => array(
168 'install_plugins',
169 'delete_plugins',
170 'activate_deactivate_plugins',
171 ),
172 ),
173 'init_menu_callback' => array( MainWP_Plugins::class, 'init_menu' ),
174 );
175
176 // Manage Themes.
177 $menus_items[] = array(
178 'slug' => 'ThemesManage',
179 'menu_level' => 2,
180 'menu_rights' => array(
181 'dashboard' => array(
182 'install_themes',
183 'delete_themes',
184 'activate_deactivate_themes',
185 ),
186 ),
187 'init_menu_callback' => array( MainWP_Themes::class, 'init_menu' ),
188 );
189
190 // Manage Users.
191 $menus_items[] = array(
192 'slug' => 'UserBulkManage',
193 'menu_level' => 2,
194 'menu_rights' => array(
195 'dashboard' => array(
196 'manage_users',
197 ),
198 ),
199 'init_menu_callback' => array( MainWP_User::class, 'init_menu' ),
200 );
201
202 // Manage Posts.
203 $menus_items[] = array(
204 'slug' => 'PostBulkManage',
205 'menu_level' => 2,
206 'menu_rights' => array(
207 'dashboard' => array(
208 'manage_posts',
209 ),
210 ),
211 'init_menu_callback' => array( MainWP_Post::class, 'init_menu' ),
212 );
213
214 // Manage Pages.
215 $menus_items[] = array(
216 'slug' => 'PageBulkManage',
217 'menu_level' => 2,
218 'menu_rights' => array(
219 'dashboard' => array(
220 'manage_pages',
221 ),
222 ),
223 'init_menu_callback' => array( MainWP_Page::class, 'init_menu' ),
224 );
225
226 // Manage Backups.
227 $menus_items[] = array(
228 'slug' => 'ManageBackups',
229 'menu_level' => 2,
230 'menu_rights' => true,
231 'init_menu_callback' => array( MainWP_Manage_Backups::class, 'init_menu' ),
232 );
233
234 // Manage Settings.
235 $menus_items[] = array(
236 'slug' => 'Settings',
237 'menu_level' => 2,
238 'menu_rights' => array(
239 'dashboard' => array(
240 'manage_dashboard_settings',
241 ),
242 ),
243 'init_menu_callback' => array( MainWP_Settings::class, 'init_menu' ),
244 'leftbar_order' => 5,
245 );
246
247 // Manage RESTAPI.
248 $menus_items[] = array(
249 'slug' => 'RESTAPI',
250 'menu_level' => 2,
251 'menu_rights' => array(
252 'dashboard' => array(
253 'manage_dashboard_restapi',
254 ),
255 ),
256 'init_menu_callback' => array( MainWP_Rest_Api_Page::class, 'init_menu' ),
257 'leftbar_order' => 4,
258 );
259
260 // Manage Extensions.
261 $menus_items[] = array(
262 'slug' => 'Extensions',
263 'menu_level' => 2,
264 'menu_rights' => array(
265 'dashboard' => array(
266 'manage_extensions',
267 ),
268 ),
269 'init_menu_callback' => array( MainWP_Extensions::class, 'init_menu' ),
270 'leftbar_order' => 3,
271 );
272
273 // Manage Admin Passwords.
274 $menus_items[] = array(
275 'slug' => 'UpdateAdminPasswords',
276 'menu_level' => 2,
277 'menu_rights' => array(
278 'dashboard' => array(
279 'manage_users',
280 ),
281 ),
282 'init_menu_callback' => array( MainWP_Bulk_Update_Admin_Passwords::class, 'init_menu' ),
283 );
284
285 // Monitoring Sites.
286 $menus_items[] = array(
287 'slug' => 'MonitoringSites',
288 'menu_level' => 3,
289 'menu_rights' => true,
290 'init_menu_callback' => array( MainWP_Monitoring::class, 'init_menu' ),
291 );
292
293 self::init_mainwp_menu_items( $menus_items, 'first' ); // do NOT change 'first', it related other hooks.
294
295 /**
296 * Action: mainwp_admin_menu
297 *
298 * Hooks main navigation menu items.
299 *
300 * @since 4.0
301 */
302 do_action( 'mainwp_admin_menu' ); // to compatible.
303
304 $menus_items_low = array();
305
306 // Manage Admin Passwords.
307 $menus_items_low[] = array(
308 'slug' => 'ServerInformation',
309 'menu_level' => 2,
310 'menu_rights' => array(
311 'dashboard' => array(
312 'see_server_information',
313 ),
314 ),
315 'init_menu_callback' => array( MainWP_Server_Information::class, 'init_menu' ),
316 'leftbar_order' => 6,
317 );
318
319 self::init_mainwp_menu_items( $menus_items_low, 'second' );
320
321 }
322 }
323
324 /**
325 * Method init_mainwp_menu_items()
326 *
327 * Init MainWP menus.
328 *
329 * @param array $menus_items menus items.
330 * @param string $part menus part.
331 */
332 public static function init_mainwp_menu_items( $menus_items, $part ) { //phpcs:ignore -- complex method.
333 if ( ! is_array( $menus_items ) ) {
334 return;
335 }
336
337 $menus_items = apply_filters( 'mainwp_init_primary_menu_items', $menus_items, $part );
338
339 MainWP_Utility::array_sort_existed_keys( $menus_items, 'leftbar_order' );
340
341 foreach ( $menus_items as $item ) {
342 if ( ! is_array( $item ) ) {
343 continue;
344 }
345 if ( ! empty( $item['slug'] ) && ! empty( $item['menu_level'] ) && ! empty( $item['init_menu_callback'] ) ) {
346 if ( ! self::is_disable_menu_item( intval( $item['menu_level'] ), $item['slug'] ) ) {
347 if ( is_callable( $item['init_menu_callback'] ) ) {
348 $accessable = false;
349 if ( isset( $item['menu_rights'] ) ) {
350 $item_rights = $item['menu_rights'];
351 if ( is_array( $item_rights ) && ! empty( $item_rights ) ) {
352 foreach ( $item_rights as $group_right => $rights ) {
353 if ( is_array( $rights ) ) {
354 foreach ( $rights as $func_right ) {
355 if ( mainwp_current_user_have_right( $group_right, $func_right ) ) {
356 $accessable = true;
357 break;
358 }
359 }
360 }
361 if ( $accessable ) {
362 break;
363 }
364 }
365 } elseif ( true === $item['menu_rights'] ) {
366 $accessable = true;
367 }
368 }
369
370 if ( $accessable ) {
371 call_user_func( $item['init_menu_callback'] );
372 }
373 }
374 }
375 }
376 }
377 }
378
379 /**
380 * Method init_sub_pages()
381 *
382 * Init subpages MainWP menus.
383 *
384 * @uses \MainWP\Dashboard\MainWP_Extensions::init_subpages_menu()
385 * @uses \MainWP\Dashboard\MainWP_Manage_Backups::init_subpages_menu()
386 * @uses \MainWP\Dashboard\MainWP_Manage_Sites::init_subpages_menu()
387 * @uses \MainWP\Dashboard\MainWP_Page::init_subpages_menu()
388 * @uses \MainWP\Dashboard\MainWP_Post::init_subpages_menu()
389 * @uses \MainWP\Dashboard\MainWP_Settings::init_subpages_menu()
390 * @uses \MainWP\Dashboard\MainWP_Themes::init_subpages_menu()
391 * @uses \MainWP\Dashboard\MainWP_Themes::init_subpages_menu()
392 * @uses \MainWP\Dashboard\MainWP_Plugins::init_subpages_menu()
393 * @uses \MainWP\Dashboard\MainWP_User::init_subpages_menu()
394 * @uses \MainWP\Dashboard\MainWP_Settings::init_subpages_menu()
395 */
396 public static function init_sub_pages() {
397
398 if ( ! self::is_disable_menu_item( 2, 'PostBulkManage' ) ) {
399 MainWP_Post::init_subpages_menu();
400 }
401 if ( ! self::is_disable_menu_item( 2, 'managesites' ) ) {
402 MainWP_Manage_Sites::init_subpages_menu();
403 }
404
405 if ( ! self::is_disable_menu_item( 2, 'RESTAPI' ) ) {
406 MainWP_Rest_Api_Page::init_subpages_menu();
407 }
408
409 if ( ! self::is_disable_menu_item( 2, 'Settings' ) ) {
410 MainWP_Settings::init_subpages_menu();
411 }
412
413 if ( ! self::is_disable_menu_item( 2, 'Extensions' ) ) {
414 MainWP_Extensions::init_subpages_menu();
415 }
416 if ( ! self::is_disable_menu_item( 2, 'PageBulkManage' ) ) {
417 MainWP_Page::init_subpages_menu();
418 }
419 if ( ! self::is_disable_menu_item( 2, 'ThemesManage' ) ) {
420 MainWP_Themes::init_subpages_menu();
421 }
422 if ( ! self::is_disable_menu_item( 2, 'PluginsManage' ) ) {
423 MainWP_Plugins::init_subpages_menu();
424 }
425 if ( ! self::is_disable_menu_item( 2, 'UserBulkManage' ) ) {
426 MainWP_User::init_subpages_menu();
427 }
428 if ( ! self::is_disable_menu_item( 2, 'ManageClients' ) ) {
429 MainWP_Client::init_subpages_menu();
430 }
431 if ( get_option( 'mainwp_enableLegacyBackupFeature' ) ) {
432 if ( ! self::is_disable_menu_item( 2, 'ManageBackups' ) ) {
433 MainWP_Manage_Backups::init_subpages_menu();
434 }
435 }
436 if ( ! self::is_disable_menu_item( 2, 'Settings' ) ) {
437 MainWP_Settings::init_subpages_menu();
438 }
439
440 /**
441 * Action: mainwp_admin_menu_sub
442 *
443 * Hooks main navigation sub-menu items.
444 *
445 * @since 4.0
446 */
447 do_action( 'mainwp_admin_menu_sub' );
448
449 if ( ! self::is_disable_menu_item( 2, 'ServerInformation' ) ) {
450 MainWP_Server_Information::init_subpages_menu();
451 }
452 }
453
454 /**
455 * Method set_menu_active_slugs
456 *
457 * @param string $item Menu item.
458 * @param string $active Menu active slug.
459 */
460 public static function set_menu_active_slugs( $item, $active ) {
461 global $_mainwp_menu_active_slugs;
462 if ( ! is_array( $_mainwp_menu_active_slugs ) ) {
463 $_mainwp_menu_active_slugs = array();
464 }
465 $_mainwp_menu_active_slugs[ $item ] = $active;
466 }
467
468
469 /**
470 * Method init_subpages_left_menu
471 *
472 * Build left menu subpages array.
473 *
474 * @param array $subPages Array of SubPages.
475 * @param array $initSubpage Initial SubPage Array.
476 * @param string $parentKey Parent Menu Slug.
477 * @param mixed $slug SubPage Slug.
478 */
479 public static function init_subpages_left_menu( $subPages, &$initSubpage, $parentKey, $slug ) {
480
481 if ( ! is_array( $subPages ) ) {
482 $subPages = array();
483 }
484
485 global $_mainwp_menu_active_slugs;
486
487 $subPages = apply_filters( 'mainwp_subpages_left_menu', $subPages, $initSubpage, $parentKey, $slug );
488
489 foreach ( $subPages as $subPage ) {
490 if ( ! isset( $subPage['menu_hidden'] ) || ( isset( $subPage['menu_hidden'] ) && empty( $subPage['menu_hidden'] ) ) ) {
491 $_item = array(
492 'title' => $subPage['title'],
493 'parent_key' => $parentKey,
494 'href' => 'admin.php?page=' . $slug . $subPage['slug'],
495 'slug' => $slug . $subPage['slug'],
496 'right' => '',
497 );
498
499 // To support check right to open menu for sometime.
500 if ( isset( $subPage['item_slug'] ) ) {
501 $_item['item_slug'] = $subPage['item_slug'];
502 }
503
504 if ( isset( $subPage['href'] ) && ! empty( $subPage['href'] ) ) { // override href.
505 $_item['href'] = $subPage['href'];
506 }
507
508 $initSubpage[] = $_item;
509 } elseif ( isset( $subPage['slug'] ) ) {
510 $_mainwp_menu_active_slugs[ $slug . $subPage['slug'] ] = $parentKey; // to fix.
511 }
512 }
513 }
514
515 /**
516 * Method is_disable_menu_item
517 *
518 * Check if $_mainwp_disable_menus_items contains any menu items to hide.
519 *
520 * @param string $level The level the menu item is on.
521 * @param array $item The menu items meta data.
522 *
523 * @return bool True|False, default is False.
524 */
525 public static function is_disable_menu_item( $level, $item ) {
526
527 /**
528 * MainWP Disable Menus items array.
529 *
530 * @global object
531 */
532 global $_mainwp_disable_menus_items;
533 $disabled = false;
534 $_level = 'level_' . $level;
535 if ( is_array( $_mainwp_disable_menus_items ) && isset( $_mainwp_disable_menus_items[ $_level ] ) && isset( $_mainwp_disable_menus_items[ $_level ][ $item ] ) ) {
536 $disabled = $_mainwp_disable_menus_items[ $_level ][ $item ];
537 }
538 $disabled = apply_filters( 'mainwp_is_disable_menu_item', $disabled, $level, $item );
539 $_mainwp_disable_menus_items[ $_level ][ $item ] = $disabled;
540 return $disabled;
541 }
542
543 /**
544 * Method add_left_menu
545 *
546 * Build Top Level Menu
547 *
548 * @param array $params Menu Item parameters.
549 * @param integer $level Menu Item Level 1 or 2.
550 *
551 * @return array $mainwp_leftmenu[] | $mainwp_sub_leftmenu[].
552 */
553 public static function add_left_menu( $params = array(), $level = 1 ) { //phpcs:ignore -- complex method.
554
555 if ( empty( $params ) ) {
556 return;
557 }
558
559 $level = (int) $level;
560
561 if ( 1 !== $level && 2 !== $level && 0 !== $level ) {
562 $level = 1;
563 }
564
565 $title = $params['title'];
566
567 $slug = isset( $params['slug'] ) ? $params['slug'] : '';
568 $href = $params['href'];
569 $right = isset( $params['right'] ) ? $params['right'] : '';
570 $id = isset( $params['id'] ) ? $params['id'] : '';
571
572 $icon = isset( $params['icon'] ) ? $params['icon'] : '';
573 $leftsub_order = isset( $params['leftsub_order'] ) ? $params['leftsub_order'] : '';
574 $leftsub_order_level2 = isset( $params['leftsub_order_level2'] ) ? $params['leftsub_order_level2'] : '';
575 $ext_state = isset( $params['ext_status'] ) && ( 'activated' === $params['ext_status'] || 'inactive' === $params['ext_status'] ) ? $params['ext_status'] : '';
576 $parent_key = isset( $params['parent_key'] ) ? $params['parent_key'] : '';
577
578 /**
579 * MainWP Left Menu, Sub Menu & Active menu slugs.
580 *
581 * @global object $mainwp_leftmenu
582 * @global object $mainwp_sub_leftmenu
583 * @global object $_mainwp_menu_active_slugs
584 */
585 global $mainwp_leftmenu, $mainwp_sub_leftmenu, $_mainwp_menu_active_slugs;
586
587 if ( ! is_array( $mainwp_leftmenu ) ) {
588 $mainwp_leftmenu = array();
589 }
590
591 if ( ! isset( $mainwp_leftmenu['mainwp_tab'] ) ) {
592 $mainwp_leftmenu['mainwp_tab'] = array(); // to compatible with old hooks.
593 }
594
595 if ( ! is_array( $_mainwp_menu_active_slugs ) ) {
596 $_mainwp_menu_active_slugs = array();
597 }
598
599 $active_path = false;
600
601 if ( isset( $params['active_path'] ) && is_array( $params['active_path'] ) && ! empty( $params['active_path'] ) ) {
602 $active_path = $params['active_path'];
603 reset( $active_path );
604 $item = key( $active_path );
605 $active = current( $active_path );
606 $_mainwp_menu_active_slugs['leftbar'][ $item ] = $active;
607 $_mainwp_menu_active_slugs['parent_slug'][ $item ] = $parent_key;
608 }
609
610 if ( 0 === $level ) {
611 $parent_key = 'mainwp_tab'; // forced value.
612 $mainwp_leftmenu['leftbar'][] = array( $title, $slug, $href, $id, $icon );
613 } elseif ( 1 === $level ) {
614
615 if ( empty( $parent_key ) ) {
616 $parent_key = 'mainwp_tab'; // forced value.
617 }
618
619 if ( 'mainwp_tab' === $parent_key ) {
620 $mainwp_leftmenu[ $parent_key ][] = array( $title, $slug, $href, $id );
621 } else {
622 $mainwp_sub_leftmenu['leftbar'][ $parent_key ][] = array( $title, $slug, $href, $id, $leftsub_order, $ext_state, $active_path );
623
624 if ( ! empty( $slug ) ) {
625 $_mainwp_menu_active_slugs['leftbar'][ $slug ] = $parent_key; // to get active menu.
626 }
627 }
628 } else {
629 if ( empty( $parent_key ) ) {
630 $parent_key = 'mainwp_tab'; // forced value.
631 }
632 $mainwp_sub_leftmenu[ $parent_key ][] = array( $title, $href, $right, $id, $slug, $leftsub_order_level2, $ext_state, $active_path );
633 }
634
635 if ( ! empty( $slug ) ) {
636 $no_submenu = ! empty( $params['nosubmenu'] ) ? true : false;
637 if ( $no_submenu ) {
638 $_mainwp_menu_active_slugs[ $slug ] = $slug; // to get active menu.
639 } else {
640 $_mainwp_menu_active_slugs[ $slug ] = $parent_key; // to get active menu.
641 }
642 }
643 }
644
645 /**
646 * Method render_left_menu
647 *
648 * Build Top Level Main Menu HTML & Render.
649 */
650 public static function render_left_menu() { // phpcs:ignore -- Current complexity is the only way to achieve desired results, pull request solutions appreciated.
651
652 /**
653 * MainWP Left Menu, Sub Menu & Active menu slugs.
654 *
655 * @global object $mainwp_leftmenu
656 * @global object $mainwp_sub_leftmenu
657 * @global object $_mainwp_menu_active_slugs
658 */
659 global $mainwp_leftmenu, $mainwp_sub_leftmenu, $_mainwp_menu_active_slugs, $plugin_page;
660
661 /**
662 * Filter: mainwp_main_menu
663 *
664 * Filters main navigation menu items
665 *
666 * @since 4.0
667 */
668 $mainwp_leftmenu = apply_filters( 'mainwp_main_menu', $mainwp_leftmenu );
669 $main_leftmenu = isset( $mainwp_leftmenu['mainwp_tab'] ) ? $mainwp_leftmenu['mainwp_tab'] : array();
670 $bar_leftmenu = isset( $mainwp_leftmenu['leftbar'] ) ? $mainwp_leftmenu['leftbar'] : array();
671
672 /**
673 * Filter: mainwp_main_menu_submenu
674 *
675 * Filters main navigation subt-menu items
676 *
677 * @since 4.0
678 */
679
680 $mainwp_sub_leftmenu = apply_filters( 'mainwp_main_menu_submenu', $mainwp_sub_leftmenu );
681 $sub_bar_leftmenu = isset( $mainwp_sub_leftmenu['leftbar'] ) ? $mainwp_sub_leftmenu['leftbar'] : array();
682
683 $version = get_option( 'mainwp_plugin_version' );
684
685 ?>
686 <?php
687 /**
688 * Action: before_mainwp_menu
689 *
690 * Fires before the main navigation element.
691 *
692 * @since 4.0
693 */
694 do_action( 'before_mainwp_menu' );
695 ?>
696 <div id="mainwp-main-navigation-container">
697 <div id="mainwp-first-level-navigation">
698 <div id="mainwp-first-level-navigation-logo">
699 <a href="
700 <?php
701 /**
702 * Filter: mainwp_menu_logo_href
703 *
704 * Filters the Logo link.
705 *
706 * @since 4.1.4
707 */
708 echo esc_url( apply_filters( 'mainwp_menu_logo_href', admin_url( 'admin.php?page=mainwp_tab' ) ) );
709 ?>
710 ">
711 <img src="
712 <?php
713 /**
714 * Filter: mainwp_menu_logo_src
715 *
716 * Filters the Logo src attribute.
717 *
718 * @since 4.1
719 */
720 echo esc_url( apply_filters( 'mainwp_menu_logo_src', MAINWP_PLUGIN_URL . 'assets/images/mainwp-icon.svg' ) );
721 ?>
722 " alt="
723 <?php
724 /**
725 * Filter: mainwp_menu_logo_alt
726 *
727 * Filters the Logo alt attribute.
728 *
729 * @since 4.1
730 */
731 echo esc_html( apply_filters( 'mainwp_menu_logo_alt', 'MainWP' ) );
732 ?>
733 " id="mainwp-navigation-icon" />
734 </a>
735 </div>
736 <div id="mainwp-first-level-navigation-version-label">
737 <span id="mainwp-version-label" class="ui mini green fluid centered label"><?php echo esc_html( $version ); ?></span>
738 </div>
739 <div id="mainwp-first-level-navigation-menu" class="ui vertical labeled inverted icon tiny menu">
740 <?php
741
742 $bar_item_actived_key = '';
743 if ( is_array( $_mainwp_menu_active_slugs ) && isset( $_mainwp_menu_active_slugs[ $plugin_page ] ) ) {
744 $menu_item_actived_key = $_mainwp_menu_active_slugs[ $plugin_page ];
745 if ( isset( $_mainwp_menu_active_slugs['leftbar'] ) && is_array( $_mainwp_menu_active_slugs['leftbar'] ) && isset( $_mainwp_menu_active_slugs['leftbar'][ $menu_item_actived_key ] ) ) {
746 $bar_item_actived_key = $_mainwp_menu_active_slugs['leftbar'][ $menu_item_actived_key ];
747 }
748 }
749
750 $bar_item_active = null;
751
752 if ( is_array( $bar_leftmenu ) && ! empty( $bar_leftmenu ) ) {
753 foreach ( $bar_leftmenu as $item ) {
754 $title = wptexturize( $item[0] );
755 $item_key = $item[1];
756 $href = $item[2];
757 $item_id = isset( $item[3] ) ? $item[3] : '';
758 $item_icon = isset( $item[4] ) ? $item[4] : '';
759
760 $has_sub = true;
761 if ( ! isset( $mainwp_sub_leftmenu[ $item_key ] ) || empty( $mainwp_sub_leftmenu[ $item_key ] ) ) {
762 $has_sub = false;
763 }
764 $active_item = '';
765
766 if ( empty( $bar_item_actived_key ) ) {
767 if ( isset( $_mainwp_menu_active_slugs['leftbar'][ $plugin_page ] ) ) {
768 if ( $item_key === $_mainwp_menu_active_slugs['leftbar'][ $plugin_page ] ) {
769 $bar_item_actived_key = $item_key;
770 }
771 } elseif ( isset( $_mainwp_menu_active_slugs[ $plugin_page ] ) ) {
772 if ( $item_key === $_mainwp_menu_active_slugs[ $plugin_page ] ) {
773 $bar_item_actived_key = $item_key;
774 }
775 }
776 }
777
778 if ( ! empty( $bar_item_actived_key ) && $item_key === $bar_item_actived_key ) {
779 $active_item = 'active';
780 $bar_item_active = $item;
781 }
782
783 $id_attr = ! empty( $item_id ) ? 'id="' . esc_html( $item_id ) . '"' : '';
784
785 // phpcs:disable WordPress.Security.EscapeOutput
786 if ( $has_sub ) {
787 echo '<a ' . $id_attr . ' title="' . esc_html( $title ) . "\" class=\"item $active_item\" href=\"$href\">";
788 echo ! empty( $item_icon ) ? $item_icon : '<i class="th large icon"></i>';
789 echo '<span class="ui small text">' . esc_html( $title ) . '</span>';
790 echo '</a>';
791 } else {
792 echo '<a ' . $id_attr . ' title="' . esc_html( $title ) . "\" class=\"item $active_item\" href=\"$href\">";
793 echo ! empty( $item_icon ) ? $item_icon : '<i class="th large icon"></i>';
794 echo '<span class="ui small text">' . esc_html( $title ) . '</span>';
795 echo '</a>';
796 }
797 // phpcs:enable
798 }
799 }
800 ?>
801 </div>
802 <?php
803 $go_back_wpadmin_url = admin_url( 'index.php' );
804
805 $link = array(
806 'url' => $go_back_wpadmin_url,
807 'text' => esc_html__( 'WP Admin', 'mainwp' ),
808 'tip' => esc_html__( 'Click to go back to the site WP Admin area.', 'mainwp' ),
809 );
810 /**
811 * Filter: mainwp_go_back_wpadmin_link
812 *
813 * Filters URL for the Go to WP Admin button in Main navigation.
814 *
815 * @since 4.0
816 */
817 $go_back_link = apply_filters( 'mainwp_go_back_wpadmin_link', $link );
818
819 if ( false !== $go_back_link ) {
820 if ( is_array( $go_back_link ) ) {
821 if ( isset( $go_back_link['url'] ) ) {
822 $link['url'] = $go_back_link['url'];
823 }
824 if ( isset( $go_back_link['text'] ) ) {
825 $link['text'] = $go_back_link['text'];
826 }
827 if ( isset( $go_back_link['tip'] ) ) {
828 $link['tip'] = $go_back_link['tip'];
829 }
830 }
831 }
832 ?>
833 <div id="mainwp-first-level-wpitems-menu" class="ui vertical labeled inverted icon mini menu">
834 <a class="item" href="#" id="mainwp-collapse-second-level-navigation">
835 <i class="double angle left icon"></i>
836 </a>
837 </div>
838 </div>
839 <div id="mainwp-second-level-navigation">
840 <div id="mainwp-main-menu" class="ui inverted vertical accordion menu">
841 <?php
842 $bar_active_item_key = '';
843
844 $set_actived = false;
845
846 if ( ! empty( $bar_item_active ) ) {
847 $item = $bar_item_active;
848 $title = wptexturize( $item[0] );
849 $item_key = $item[1];
850 $href = $item[2];
851 $item_id = isset( $item[3] ) ? $item[3] : '';
852
853 $bar_active_item_key = $item_key;
854
855 $has_sub = true;
856 if ( ! isset( $mainwp_sub_leftmenu[ $item_key ] ) || empty( $mainwp_sub_leftmenu[ $item_key ] ) ) {
857 $has_sub = false;
858 }
859 $active_item = '';
860
861 if ( ! $set_actived ) {
862 if ( isset( $_mainwp_menu_active_slugs['parent_slug'][ $plugin_page ] ) ) {
863 if ( $item_key === $_mainwp_menu_active_slugs['parent_slug'][ $plugin_page ] ) {
864 $active_item = 'active';
865 $set_actived = true;
866 $bar_item_active = $item;
867 }
868 }
869 }
870
871 // to fix active menu.
872 if ( ! $set_actived ) {
873 if ( isset( $_mainwp_menu_active_slugs[ $plugin_page ] ) ) {
874 if ( $item_key === $_mainwp_menu_active_slugs[ $plugin_page ] ) {
875 $active_item = 'active';
876 $set_actived = true;
877 $bar_item_active = $item;
878 }
879 }
880 }
881
882 $id_attr = ! empty( $item_id ) ? 'id="' . esc_html( $item_id ) . '"' : '';
883
884 // phpcs:disable WordPress.Security.EscapeOutput
885 if ( $has_sub ) {
886 echo '<div ' . $id_attr . " class=\"item $active_item\">";
887 echo "<a class=\"title with-sub $active_item\" href=\"$href\">$title <i class=\"dropdown icon\"></i></a>";
888 echo "<div class=\"content menu $active_item\">";
889 self::render_sub_item( $item_key );
890 echo '</div>';
891 echo '</div>';
892 } else {
893 echo '<div ' . $id_attr . ' class="item">';
894 echo "<a class='title $active_item' href=\"$href\">$title</a>";
895 echo '</div>';
896 }
897 // phpcs:enable
898
899 if ( is_array( $sub_bar_leftmenu ) && ! empty( $bar_active_item_key ) && isset( $sub_bar_leftmenu[ $bar_active_item_key ] ) && is_array( $sub_bar_leftmenu[ $bar_active_item_key ] ) ) {
900 $sub_bar_leftmenu_active_items = $sub_bar_leftmenu[ $bar_active_item_key ];
901 MainWP_Utility::array_sort_existed_keys( $sub_bar_leftmenu_active_items, 4 ); //phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- 4 => 'leftsub_order'.
902 $set_actived = false;
903 foreach ( $sub_bar_leftmenu_active_items as $item ) {
904
905 if ( empty( $item ) || ! is_array( $item ) ) {
906 continue;
907 }
908
909 $title = wptexturize( $item[0] );
910 $item_key = $item[1];
911
912 $has_sub = true;
913 if ( ! isset( $mainwp_sub_leftmenu[ $item_key ] ) || empty( $mainwp_sub_leftmenu[ $item_key ] ) ) {
914 $has_sub = false;
915 }
916
917 $href = $item[2];
918 $item_id = isset( $item[3] ) ? $item[3] : '';
919 $ext_state = isset( $item[5] ) ? $item[5] : '';
920 $active_path = isset( $item[6] ) ? $item[6] : '';
921
922 $item_classes = 'inactive' === $ext_state ? 'extension-inactive' : '';
923
924 $active_item = '';
925
926 if ( ! $set_actived ) {
927 if ( isset( $_mainwp_menu_active_slugs['parent_slug'][ $plugin_page ] ) ) {
928 if ( $item_key === $_mainwp_menu_active_slugs['parent_slug'][ $plugin_page ] ) {
929 $active_item = 'active';
930 $set_actived = true;
931 }
932 }
933 }
934
935 // to fix active menu.
936 if ( ! $set_actived ) {
937 if ( isset( $_mainwp_menu_active_slugs[ $plugin_page ] ) ) {
938 if ( $item_key === $_mainwp_menu_active_slugs[ $plugin_page ] ) {
939 $active_item = 'active';
940 $set_actived = true;
941 }
942 }
943 }
944
945 $id_attr = ! empty( $item_id ) ? 'id="' . esc_html( $item_id ) . '"' : '';
946
947 $hide_item = '';
948 if ( 'admin.php?page=ManageApiBackups' === $href ) {
949 $hide_item = ' style="display:none"';
950 }
951
952 // phpcs:disable WordPress.Security.EscapeOutput
953 if ( $has_sub ) {
954 echo '<div ' . $id_attr . " class=\"item $active_item $item_classes\">";
955 echo "<a class=\"title with-sub $active_item\" href=\"$href\">$title <i class=\"dropdown icon\"></i></a>";
956 echo "<div class=\"content menu $active_item\">";
957 self::render_sub_item( $item_key );
958 echo '</div>';
959 echo '</div>';
960 } else {
961 echo '<div ' . $id_attr . $hide_item . " class=\"item $active_item $item_classes\">";
962 echo "<a class='title $active_item' href=\"$href\">$title</a>";
963 echo '</div>';
964 }
965 // phpcs:enable
966 }
967 }
968 }
969 ?>
970 </div>
971 </div>
972 </div>
973
974 <?php
975 /**
976 * Action: after_mainwp_menu
977 *
978 * Fires after the main navigation element.
979 *
980 * @since 4.0
981 */
982 do_action( 'after_mainwp_menu' );
983 ?>
984 <script type="text/javascript">
985 jQuery( document ).ready( function () {
986
987 mainwp_left_bar_showhide_init = function(){
988 if(jQuery('body').hasClass('mainwp-hidden-second-level-navigation')){
989 return; // hide always.
990 }
991 if(jQuery('body').hasClass('toplevel_page_mainwp_tab')){
992 return; // hide always.
993 }
994 var lbar = jQuery( '#mainwp-collapse-second-level-navigation' );
995 var show = ( 0 != mainwp_ui_state_load( 'showmenu' ) ) ? true : false;
996 mainwp_left_bar_showhide( lbar, show);
997 }
998 mainwp_left_bar_showhide = function( lbar, show ){
999 if ( show ) {
1000 jQuery( '#mainwp-second-level-navigation' ).show();
1001 jQuery( '.mainwp-content-wrap' ).css( "margin-left", "272px" );
1002 jQuery( '#mainwp-main-navigation-container' ).css( "width", "272px" );
1003 jQuery( lbar ).find( '.icon' ).removeClass( 'right' );
1004 jQuery( lbar ).find( '.icon' ).addClass( 'left' );
1005 jQuery( lbar ).css( "left", "272px" );
1006 jQuery( lbar ).removeClass( 'collapsed' );
1007 mainwp_ui_state_save( 'showmenu', 1 );
1008 } else {
1009 jQuery( '#mainwp-second-level-navigation' ).hide();
1010 jQuery( '.mainwp-content-wrap' ).css( "margin-left", "72px" );
1011 jQuery( '#mainwp-main-navigation-container' ).css( "width", "72px" );
1012 jQuery( lbar ).find( '.icon' ).removeClass( 'left' );
1013 jQuery( lbar ).find( '.icon' ).addClass( 'right' );
1014 jQuery( lbar ).css( "left", "72px" );
1015 jQuery( lbar ).addClass( 'collapsed' );
1016 jQuery( '#mainwp-top-header' ).css( "width", "100%" );
1017 mainwp_ui_state_save( 'showmenu', 0 );
1018 }
1019 }
1020
1021 jQuery( '#mainwp-collapse-second-level-navigation' ).on( 'click', function() {
1022 var show = jQuery( this ).hasClass( 'collapsed' ) ? true : false;
1023 mainwp_left_bar_showhide( this, show);
1024 return false;
1025 } );
1026 mainwp_left_bar_showhide_init();
1027
1028 // click on menu with-sub icon.
1029 jQuery( '#mainwp-main-navigation-container #mainwp-main-menu a.title.with-sub .icon' ).on( "click", function ( event ) {
1030 var pr = jQuery( this ).closest( '.item' );
1031 var title = jQuery( this ).closest( '.title' );
1032 var active = jQuery( title ).hasClass( 'active' );
1033
1034 // remove current active.
1035 mainwp_menu_collapse();
1036
1037 // if current menu item are not active then set it active.
1038 if ( !active ) {
1039 jQuery( title ).addClass( 'active' );
1040 jQuery( pr ).find('.content.menu').addClass( 'active' );
1041 pr.addClass('active');
1042 }
1043 return false;
1044 } );
1045
1046 jQuery( '#mainwp-main-navigation-container #mainwp-main-menu a.title.with-sub' ).on( "click", function ( event ) {
1047 var pr = jQuery( this ).closest( '.item' );
1048 var active = jQuery( this ).hasClass( 'active' );
1049
1050 // remove current active.
1051 mainwp_menu_collapse();
1052
1053 // set active before go to the page.
1054 if ( !active ) {
1055 jQuery( this ).addClass( 'active' );
1056 jQuery( pr ).find('.content.menu').addClass( 'active' );
1057 pr.addClass('active');
1058 }
1059 } );
1060
1061 mainwp_menu_collapse = function() {
1062 // remove current active.
1063 jQuery( '#mainwp-main-navigation-container #mainwp-main-menu a.title.active').removeClass('active');
1064 jQuery( '#mainwp-main-navigation-container #mainwp-main-menu .item').removeClass('active');
1065 jQuery( '#mainwp-main-navigation-container #mainwp-main-menu .content.menu.active').removeClass('active');
1066 };
1067
1068 jQuery('.mainwp-main-mobile-navigation-container #mainwp-main-menu').accordion();
1069
1070 } );
1071 </script>
1072 <?php
1073 }
1074
1075 /**
1076 * Method render_mobile_menu
1077 *
1078 * Renders the mobile menu.
1079 */
1080 public static function render_mobile_menu() { // phpcs:ignore -- Current complexity is the only way to achieve desired results, pull request solutions appreciated.
1081 $mainwp_show_language_updates = get_option( 'mainwp_show_language_updates', 1 );
1082 ?>
1083 <div class="mainwp-main-mobile-navigation-container">
1084 <div id="mainwp-logo">
1085 <a href="
1086 <?php
1087 /**
1088 * Filter: mainwp_menu_logo_href
1089 *
1090 * Filters the Logo link.
1091 *
1092 * @since 4.1.4
1093 */
1094 echo esc_url( apply_filters( 'mainwp_menu_logo_href', admin_url( 'admin.php?page=mainwp_tab' ) ) );
1095 ?>
1096 ">
1097 <img src="
1098 <?php
1099 /**
1100 * Filter: mainwp_menu_logo_src
1101 *
1102 * Filters the Logo src attribute.
1103 *
1104 * @since 4.1
1105 */
1106 echo esc_url( apply_filters( 'mainwp_menu_logo_src', MAINWP_PLUGIN_URL . 'assets/images/logo.png' ) );
1107 ?>
1108 " alt="
1109 <?php
1110 /**
1111 * Filter: mainwp_menu_logo_alt
1112 *
1113 * Filters the Logo alt attribute.
1114 *
1115 * @since 4.1
1116 */
1117 echo apply_filters( 'mainwp_menu_logo_alt', 'MainWP' ); // phpcs:ignore WordPress.Security.EscapeOutput
1118 ?>
1119 " id="mainwp-navigation-icon"/>
1120 </a>
1121 </div>
1122 <div class="mainwp-nav-menu">
1123 <?php
1124 /**
1125 * Action: before_mainwp_menu
1126 *
1127 * Fires before the main navigation element.
1128 *
1129 * @since 4.0
1130 */
1131 do_action( 'before_mainwp_menu' );
1132 ?>
1133
1134 <div id="mainwp-main-menu" class="test-menu ui inverted vertical accordion menu">
1135 <div class="item"></div>
1136 <div class="item"><a href="admin.php?page=mainwp_tab"><?php esc_html_e( 'Overview', 'mainwp' ); ?></a></div>
1137 <div class="item">
1138 <div class="title"><a href="admin.php?page=managesites" class=" with-sub"><?php esc_html_e( 'Sites', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1139 <div class="content menu" id="mainwp-sites-mobile-menu-item">
1140 <div class="accordion item">
1141 <div class="title"><a href="admin.php?page=managesites"><?php esc_html_e( 'Sites', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1142 <div class="content menu">
1143 <a class="item" href="admin.php?page=managesites"><?php esc_html_e( 'Manage Sites', 'mainwp' ); ?></a>
1144 <a class="item" href="admin.php?page=managesites&do=new"><?php esc_html_e( 'Add New Site', 'mainwp' ); ?></a>
1145 <a class="item" href="admin.php?page=managesites&do=bulknew"><?php esc_html_e( 'Import Sites', 'mainwp' ); ?></a>
1146 <a class="item" href="admin.php?page=MonitoringSites"><?php esc_html_e( 'Monitoring', 'mainwp' ); ?></a>
1147 </div>
1148 </div>
1149 <div class="item accordion">
1150 <div class="title"><a class="" href="admin.php?page=ManageGroups"><?php esc_html_e( 'Tags', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1151 <div class="content menu">
1152 <a class="item" href="admin.php?page=ManageGroups"><?php esc_html_e( 'Manage Tags', 'mainwp' ); ?></a>
1153 </div>
1154 </div>
1155 <div class="item accordion">
1156 <div class="title"><a href="admin.php?page=UpdatesManage"><?php esc_html_e( 'Updates', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1157 <div class="content menu">
1158 <a class="item" href="admin.php?page=UpdatesManage&tab=plugins-updates"><?php esc_html_e( 'Plugins Updates', 'mainwp' ); ?></a>
1159 <a class="item" href="admin.php?page=UpdatesManage&tab=themes-updates"><?php esc_html_e( 'Themes Updates', 'mainwp' ); ?></a>
1160 <a class="item" href="admin.php?page=UpdatesManage&tab=wordpress-updates"><?php esc_html_e( 'WordPress Updates', 'mainwp' ); ?></a>
1161 <?php if ( $mainwp_show_language_updates ) : ?>
1162 <a class="item" href="admin.php?page=UpdatesManage&tab=translations-updates"><?php esc_html_e( 'Translation Plugins', 'mainwp' ); ?></a>
1163 <?php endif; ?>
1164 <a class="item" href="admin.php?page=UpdatesManage&tab=abandoned-plugins"><?php esc_html_e( 'Abandoned Plugins', 'mainwp' ); ?></a>
1165 <a class="item" href="admin.php?page=UpdatesManage&tab=abandoned-themes"><?php esc_html_e( 'Abandoned Themes', 'mainwp' ); ?></a>
1166 </div>
1167 </div>
1168 <div class="item accordion">
1169 <div class="title"><a href="admin.php?page=PluginsManage"><?php esc_html_e( 'Plugins', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1170 <div class="content menu">
1171 <a class="item" href="admin.php?page=PluginsManage"><?php esc_html_e( 'Manage Plugins', 'mainwp' ); ?></a>
1172 <a class="item" href="admin.php?page=PluginsInstall"><?php esc_html_e( 'Install', 'mainwp' ); ?></a>
1173 <a class="item" href="admin.php?page=PluginsAutoUpdate"><?php esc_html_e( 'Advanced Auto Updates', 'mainwp' ); ?></a>
1174 <a class="item" href="admin.php?page=PluginsIgnore"><?php esc_html_e( 'Ignored Updates', 'mainwp' ); ?></a>
1175 <a class="item" href="admin.php?page=PluginsIgnoredAbandoned"><?php esc_html_e( 'Ignored Abandoned', 'mainwp' ); ?></a>
1176 </div>
1177 </div>
1178 <div class="item accordion">
1179 <div class="title"><a href="admin.php?page=ThemesManage"><?php esc_html_e( 'Themes', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1180 <div class="content menu">
1181 <a class="item" href="admin.php?page=ThemesManage"><?php esc_html_e( 'Manage Themes', 'mainwp' ); ?></a>
1182 <a class="item" href="admin.php?page=ThemesInstall"><?php esc_html_e( 'Install', 'mainwp' ); ?></a>
1183 <a class="item" href="admin.php?page=ThemesAutoUpdate"><?php esc_html_e( 'Advanced Auto Updates', 'mainwp' ); ?></a>
1184 <a class="item" href="admin.php?page=ThemesIgnore"><?php esc_html_e( 'Ignored Updates', 'mainwp' ); ?></a>
1185 <a class="item" href="admin.php?page=ThemesIgnoredAbandoned"><?php esc_html_e( 'Ignored Abandoned', 'mainwp' ); ?></a>
1186 </div>
1187 </div>
1188 <div class="item accordion">
1189 <div class="title"><a href="admin.php?page=UserBulkManage"><?php esc_html_e( 'Users', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1190 <div class="content menu">
1191 <a class="item" href="admin.php?page=UserBulkManage"><?php esc_html_e( 'Manage Users', 'mainwp' ); ?></a>
1192 <a class="item" href="admin.php?page=UserBulkAdd"><?php esc_html_e( 'Add New User', 'mainwp' ); ?></a>
1193 <a class="item" href="admin.php?page=BulkImportUsers"><?php esc_html_e( 'Import Users', 'mainwp' ); ?></a>
1194 <a class="item" href="admin.php?page=UpdateAdminPasswords"><?php esc_html_e( 'Admin Passwords', 'mainwp' ); ?></a>
1195 </div>
1196 </div>
1197 <div class="item accordion">
1198 <div class="title"><a href="admin.php?page=PostBulkManage"><?php esc_html_e( 'Posts', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1199 <div class="content menu">
1200 <a class="item" href="admin.php?page=PostBulkManage"><?php esc_html_e( 'Manage Pages', 'mainwp' ); ?></a>
1201 <a class="item" href="admin.php?page=PostBulkAdd"><?php esc_html_e( 'Add New Post', 'mainwp' ); ?></a>
1202 </div>
1203 </div>
1204 <div class="item accordion">
1205 <div class="title"><a href="admin.php?page=PageBulkManage"><?php esc_html_e( 'Pages', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1206 <div class="content menu">
1207 <a class="item" href="admin.php?page=PageBulkManage"><?php esc_html_e( 'Manage Pages', 'mainwp' ); ?></a>
1208 <a class="item" href="admin.php?page=PageBulkAdd"><?php esc_html_e( 'Add New Page', 'mainwp' ); ?></a>
1209 </div>
1210 </div>
1211 <div class="item accordion">
1212 <div class="title"><a href="admin.php?page=ManageApiBackups"><?php esc_html_e( 'Backups', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1213 <div class="content menu">
1214 <a class="item" href="admin.php?page=ManageApiBackups"><?php esc_html_e( 'Backups', 'mainwp' ); ?></a>
1215 </div>
1216 </div>
1217 </div>
1218 </div>
1219 <div class="item">
1220 <div class="title"><a href="admin.php?page=ManageClients" class="with-sub"><?php esc_html_e( 'Clients', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1221 <div class="content menu">
1222 <a class="item" href="admin.php?page=ManageClients"><?php esc_html_e( 'Clients', 'mainwp' ); ?></a>
1223 <a class="item" href="admin.php?page=ClientAddNew"><?php esc_html_e( 'Add Client', 'mainwp' ); ?></a>
1224 <a class="item" href="admin.php?page=ClientAddField"><?php esc_html_e( 'Client Fields', 'mainwp' ); ?></a>
1225 </div>
1226 </div>
1227
1228 <div class="item">
1229 <div class="title"><a href="admin.php?page=ManageCostTracker" class="with-sub"><?php esc_html_e( 'Cost Tracker', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1230 <div class="content menu">
1231 <a class="item" href="admin.php?page=ManageCostTracker"><?php esc_html_e( 'Cost Tracker', 'mainwp' ); ?></a>
1232 <a class="item" href="admin.php?page=CostTrackerAdd"><?php esc_html_e( 'Add Cost', 'mainwp' ); ?></a>
1233 <a class="item" href="admin.php?page=CostTrackerSettings"><?php esc_html_e( 'Cost Tracker Settings', 'mainwp' ); ?></a>
1234 </div>
1235 </div>
1236
1237 <div class="item">
1238 <div class="title"><a href="admin.php?page=InsightsOverview" class="with-sub"><?php esc_html_e( 'Insights', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1239 <div class="content menu">
1240 <a class="item" href="admin.php?page=InsightsOverview"><?php esc_html_e( 'Insights', 'mainwp' ); ?></a>
1241 </div>
1242 </div>
1243
1244 <div class="item">
1245 <div class="title"><a href="admin.php?page=RESTAPI" class="with-sub"><?php esc_html_e( 'REST API', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1246 <div class="content menu">
1247 <a class="item" href="admin.php?page=RESTAPI"><?php esc_html_e( 'Manage API Keys', 'mainwp' ); ?></a>
1248 <a class="item" href="admin.php?page=AddApiKeys"><?php esc_html_e( 'Add API Keys', 'mainwp' ); ?></a>
1249 </div>
1250 </div>
1251 <div class="item">
1252 <div class="title"><a href="admin.php?page=Extensions" class=""><?php esc_html_e( 'Extensions', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1253 <div class="content menu">
1254 <a class="item" href="admin.php?page=Extensions"><?php esc_html_e( 'Manage Extensions', 'mainwp' ); ?></a>
1255 </div>
1256 </div>
1257 <div class="item">
1258 <div class="title"><a href="admin.php?page=Settings" class="with-sub"><?php esc_html_e( 'Settings', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1259 <div class="content menu">
1260 <a class="item" href="admin.php?page=Settings"><?php esc_html_e( 'General Settings', 'mainwp' ); ?></a>
1261 <a class="item" href="admin.php?page=SettingsAdvanced"><?php esc_html_e( 'Advanced Settings', 'mainwp' ); ?></a>
1262 <a class="item" href="admin.php?page=SettingsEmail"><?php esc_html_e( 'Email Settings', 'mainwp' ); ?></a>
1263 <a class="item" href="admin.php?page=MainWPTools"><?php esc_html_e( 'Tools', 'mainwp' ); ?></a>
1264 </div>
1265 </div>
1266 <div class="item">
1267 <div class="title"><a href="admin.php?page=ServerInformation" class="with-sub"><?php esc_html_e( 'Info', 'mainwp' ); ?></a><i class="dropdown icon"></i></div>
1268 <div class="content menu">
1269 <a class="item" href="admin.php?page=ServerInformation"><?php esc_html_e( 'Server', 'mainwp' ); ?></a>
1270 <a class="item" href="admin.php?page=ServerInformationCron"><?php esc_html_e( 'Cron Schedules', 'mainwp' ); ?></a>
1271 <a class="item" href="admin.php?page=ErrorLog"><?php esc_html_e( 'Error Log', 'mainwp' ); ?></a>
1272 <a class="item" href="admin.php?page=ActionLogs"><?php esc_html_e( 'Custom Event Monitor', 'mainwp' ); ?></a>
1273 <a class="item" href="admin.php?page=PluginPrivacy"><?php esc_html_e( 'Plugin Privacy', 'mainwp' ); ?></a>
1274 </div>
1275 </div>
1276 <?php
1277 $go_back_wpadmin_url = admin_url( 'index.php' );
1278
1279 $link = array(
1280 'url' => $go_back_wpadmin_url,
1281 'text' => esc_html__( 'WP Admin', 'mainwp' ),
1282 'tip' => esc_html__( 'Click to go back to the site WP Admin area.', 'mainwp' ),
1283 );
1284
1285 /**
1286 * Filter: mainwp_go_back_wpadmin_link
1287 *
1288 * Filters URL for the Go to WP Admin button in Main navigation.
1289 *
1290 * @since 4.0
1291 */
1292 $go_back_link = apply_filters( 'mainwp_go_back_wpadmin_link', $link );
1293
1294 if ( false !== $go_back_link ) {
1295 if ( is_array( $go_back_link ) ) {
1296 if ( isset( $go_back_link['url'] ) ) {
1297 $link['url'] = $go_back_link['url'];
1298 }
1299 if ( isset( $go_back_link['text'] ) ) {
1300 $link['text'] = $go_back_link['text'];
1301 }
1302 if ( isset( $go_back_link['tip'] ) ) {
1303 $link['tip'] = $go_back_link['tip'];
1304 }
1305 }
1306 ?>
1307 <div class="item item-wp-admin">
1308 <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="icon wordpress"></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 icon wordpress ?>
1309 </div>
1310 <?php } ?>
1311 <div class="hamburger">
1312 <span class="hamburger-bun"></span>
1313 <span class="hamburger-patty"></span>
1314 <span class="hamburger-bun"></span>
1315 </div>
1316 </div>
1317 <?php
1318 /**
1319 * Action: after_mainwp_menu
1320 *
1321 * Fires after the main navigation element.
1322 *
1323 * @since 4.0
1324 */
1325 do_action( 'after_mainwp_menu' );
1326 ?>
1327 </div>
1328 </div>
1329 <?php
1330 }
1331
1332 /**
1333 * Method render_sub_item
1334 *
1335 * Grabs all submenu items and attatches to Main Menu.
1336 *
1337 * @param mixed $parent_key The parent key.
1338 */
1339 public static function render_sub_item( $parent_key ) { //phpcs:ignore -- complex method.
1340 if ( empty( $parent_key ) ) {
1341 return;
1342 }
1343
1344 /**
1345 * MainWP Left Menu.
1346 *
1347 * @global object $mainwp_sub_leftmenu
1348 */
1349 global $mainwp_sub_leftmenu;
1350
1351 $submenu_items = $mainwp_sub_leftmenu[ $parent_key ];
1352
1353 if ( ! is_array( $submenu_items ) || 0 === count( $submenu_items ) ) {
1354 return;
1355 }
1356
1357 global $plugin_page;
1358
1359 MainWP_Utility::array_sort_existed_keys( $submenu_items, 5 ); //phpcs:ignore Squiz.PHP.CommentedOutCode.Found -- 5 => 'leftsub_order_level2'.
1360
1361 foreach ( $submenu_items as $sub_key => $sub_item ) {
1362 $title = $sub_item[0];
1363 $href = $sub_item[1];
1364 $right = $sub_item[2];
1365 $id = isset( $sub_item[3] ) ? $sub_item[3] : '';
1366 $slug = isset( $sub_item[4] ) ? $sub_item[4] : '';
1367 $ext_state = isset( $sub_item[6] ) ? $sub_item[6] : '';
1368 $active_path = isset( $sub_item[7] ) ? $sub_item[7] : '';
1369
1370 $item_classes = 'inactive' === $ext_state ? 'extension-inactive' : '';
1371
1372 $_blank = false;
1373 if ( '_blank' === $id ) {
1374 $_blank = true;
1375 }
1376
1377 $level2_active = self::is_level2_menu_item_active( $href ) ? true : false;
1378
1379 if ( is_array( $active_path ) && ! empty( $active_path ) ) {
1380 reset( $active_path );
1381 $item = key( $active_path );
1382 if ( $item === $plugin_page ) {
1383 $level2_active = true;
1384 }
1385 }
1386
1387 $right_group = 'dashboard';
1388 if ( ! empty( $right ) ) {
1389 if ( strpos( $right, 'extension_' ) === 0 ) {
1390 $right_group = 'extension';
1391 $right = str_replace( 'extension_', '', $right );
1392 }
1393 }
1394 if ( empty( $right ) || ( ! empty( $right ) && mainwp_current_user_have_right( $right_group, $right ) ) ) {
1395 ?>
1396 <a class="item <?php echo $level2_active ? 'active level-two-active' : ''; ?> <?php echo esc_attr( $item_classes ); ?>" href="<?php echo esc_url( $href ); ?>" id="<?php echo esc_attr( $slug ); ?>" <?php echo $_blank ? 'target="_blank"' : ''; ?>>
1397 <?php echo $title; //phpcs:ignore -- requires escaped. ?>
1398 </a>
1399
1400 <?php
1401 }
1402 }
1403 }
1404
1405
1406 /**
1407 * Method is_level2_menu_item_active().
1408 *
1409 * Check if menu item level 2 is active.
1410 *
1411 * @param mixed $href The href value.
1412 */
1413 public static function is_level2_menu_item_active( $href ) {
1414 $current_path = isset( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '';
1415 $san_path = $current_path;
1416
1417 if ( 0 === stripos( $san_path, '/wp-admin/' ) ) {
1418 $san_path = str_replace( '/wp-admin/', '', $san_path );
1419 }
1420
1421 $orther = '';
1422 if ( 0 === stripos( $san_path, $href ) ) {
1423 $orther = str_replace( $href, '', $san_path );
1424 }
1425
1426 if ( ! empty( $orther ) && '&' === substr( $orther, 0, 1 ) ) { // cheat: start by &, it is addition params string.
1427 $san_path = str_replace( $orther, '', $san_path ); // remove other path of uri.
1428 }
1429
1430 $san_path = MainWP_Utility::sanitize_attr_slug( $san_path );
1431 $san_href = MainWP_Utility::sanitize_attr_slug( $href );
1432
1433 return $san_path === $san_href;
1434 }
1435 }
1436