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