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