PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.2.1
Admin and Site Enhancements (ASE) v4.2.1
9.1.0 9.0.2 9.0.1 9.0.0 8.9.2 8.9.1 8.9.0 8.8.8 8.8.7 8.8.6 8.8.5 8.8.4 8.8.3 8.8.2 8.8.1 8.8.0 8.7.3 8.7.2 8.7.1 8.2.1 8.2.2 8.2.3 8.3.0 8.3.1 8.3.2 8.4.0 8.4.1 8.4.2 8.5.0 8.5.1 8.5.2 8.6.0 8.6.1 8.6.2 8.7.0 5.0.1 5.0.2 5.0.2.1 5.0.2.2 5.0.2.3 5.0.2.4 5.1.0 5.2.0 5.2.1 5.2.10 5.2.11 5.2.2 5.2.3 5.2.4 5.2.5 5.2.6 5.2.7 5.2.8 5.2.9 5.3.0 5.3.1 5.3.2 5.4.0 5.4.1 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.8.0 5.8.1 6.0.0 6.0.3 6.0.4 6.0.5 6.0.5.1 6.0.6 6.0.7 6.0.8.1 6.1.0 6.1.3 6.2.0 6.2.1 6.2.2 6.2.3 6.2.4 6.2.5 6.2.6 6.2.7 6.3.0 6.3.1 6.3.2 6.4.0 6.5.0 6.5.1 6.6.0 6.7.0 6.8.0 6.8.2 6.8.3 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13.1 6.9.13.2 6.9.2 6.9.3 6.9.4 6.9.5 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.2 7.0.2.1 7.0.2.2 7.0.2.3 7.0.3 7.1.0 7.1.1 7.1.2 7.1.3 7.1.4 7.1.5 7.2.0 7.2.1 7.3.0 7.3.1 7.3.2 7.3.3 7.4.0 7.4.2 7.4.4 7.4.5 7.4.6 7.4.7 7.4.8 7.5.0 7.5.1 7.5.2 7.5.3 7.5.4 7.6.0 7.6.1 7.6.1.1 7.6.10 7.6.11 7.6.2 7.6.3 7.6.4 7.6.5 7.6.6 7.6.7 7.6.7.1 7.6.8 7.6.9 7.7.0 7.8.0 7.8.1 7.8.10 7.8.11 7.8.12 7.8.13 7.8.14 7.8.15 7.8.16 7.8.17 7.8.18 7.8.2 7.8.3 7.8.4 7.8.5 7.8.5.1 7.8.6 7.8.7 7.8.8 7.8.9 7.9.0 7.9.1 7.9.10 7.9.11 7.9.2 7.9.3 7.9.4 7.9.5 7.9.6 7.9.7 7.9.8 7.9.9 8.0.0 8.0.1 8.0.2 8.0.3 8.0.4 8.0.5 8.0.6 8.0.7 8.0.8 8.1.0 8.1.1 8.1.2 8.1.3 8.1.4 8.2.0 trunk 1.0.0 1.1.0 1.2.0 1.3.0 1.4.0 1.5.0 1.6.0 1.7.0 1.8.0 1.9.0 2.0.0 2.1.0 2.2.0 2.3.0 2.4.0 2.5.0 2.6.0 2.7.0 2.8.0 2.8.1 2.8.2 2.8.3 2.9.0 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.1.0 3.2.0 3.3.0 3.4.0 3.5.0 3.6.1 3.7.0 3.8.0 3.9.0 3.9.1 3.9.2 4.0.0 4.0.1 4.1.0 4.2.0 4.2.1 4.2.2 4.3.0 4.3.1 4.4.0 4.5.0 4.6.0 4.7.0 4.7.1 4.7.2 4.7.3 4.7.4 4.8.0 4.8.1 4.8.2 4.8.3 4.9.0 4.9.1 4.9.2 4.9.3 5.0.0
admin-site-enhancements / classes / class-admin-interface.php
admin-site-enhancements / classes Last commit date
class-activation.php 3 years ago class-admin-interface.php 3 years ago class-common-methods.php 3 years ago class-content-management.php 3 years ago class-custom-code.php 3 years ago class-deactivation.php 3 years ago class-disable-components.php 3 years ago class-login-logout.php 3 years ago class-optimizations.php 3 years ago class-security.php 3 years ago class-settings-fields-render.php 3 years ago class-settings-sanitization.php 3 years ago class-settings-sections-fields.php 3 years ago class-utilities.php 3 years ago
class-admin-interface.php
932 lines
1 <?php
2
3 namespace ASENHA\Classes;
4 use WP_Admin_Bar;
5
6 /**
7 * Class related to Admin Interface features
8 *
9 * @since 1.2.0
10 */
11 class Admin_Interface {
12
13 /**
14 * Wrapper for admin notices being output on admin screens
15 *
16 * @since 1.2.0
17 */
18 public function admin_notices_wrapper() {
19
20 echo '<div class="asenha-admin-notices-drawer" style="display:none;"><h2>Admin Notices</h2></div>';
21
22 }
23
24 /**
25 * Admin bar menu item for the hidden admin notices
26 *
27 * @link https://developer.wordpress.org/reference/classes/wp_admin_bar/add_menu/
28 * @link https://developer.wordpress.org/reference/classes/wp_admin_bar/add_node/
29 * @since 1.2.0
30 */
31 public function admin_notices_menu( WP_Admin_Bar $wp_admin_bar ) {
32
33 $wp_admin_bar->add_menu( array(
34 'id' => 'asenha-hide-admin-notices',
35 'parent' => 'top-secondary',
36 'grou' => null,
37 'title' => 'Notices<span class="asenha-admin-notices-counter" style="opacity:0;">0</span>',
38 // 'href' => '',
39 'meta' => array(
40 'class' => 'asenha-admin-notices-menu',
41 'title' => 'Click to view hidden admin notices',
42 ),
43 ) );
44
45 }
46
47 /**
48 * Inline CSS for the admin bar notices menu
49 *
50 * @since 1.2.0
51 */
52 public function admin_notices_menu_inline_css() {
53
54 wp_add_inline_style( 'admin-bar', '
55
56 #wpadminbar .asenha-admin-notices-counter {
57 box-sizing: border-box;
58 margin: 1px 0 -1px 6px ;
59 padding: 2px 6px 3px 5px;
60 min-width: 18px;
61 height: 18px;
62 border-radius: 50%;
63 background-color: #ca4a1f;
64 color: #fff;
65 font-size: 11px;
66 line-height: 1.6;
67 text-align: center;
68 }
69
70 ' );
71
72 }
73
74 /**
75 * Hide admin bar on the frontend for the user roles selected
76 *
77 * @since 1.3.0
78 */
79 public function hide_admin_bar_for_roles() {
80
81 $options = get_option( ASENHA_SLUG_U );
82 $hide_admin_bar = $options['hide_admin_bar'];
83 $for_roles = $options['hide_admin_bar_for'];
84
85 $current_user = wp_get_current_user();
86 $current_user_roles = (array) $current_user->roles; // single dimensional array of role slugs
87
88 // User has no role, i.e. logged-out
89
90 if ( count( $current_user_roles ) == 0 ) {
91 return false; // hide admin bar
92 }
93
94 // User has role(s). Do further checks.
95
96 if ( isset( $for_roles ) && ( count( $for_roles ) > 0 ) ) {
97
98 // Assemble single-dimensional array of roles for which admin bar would be hidden
99
100 $roles_admin_bar_hidden = array();
101
102 foreach( $for_roles as $role_slug => $admin_bar_hidden ) {
103 if ( $admin_bar_hidden ) {
104 $roles_admin_bar_hidden[] = $role_slug;
105 }
106 }
107
108 // Check if any of the current user roles is one for which admin bar should be hidden
109
110 foreach ( $current_user_roles as $role ) {
111 if ( in_array( $role, $roles_admin_bar_hidden ) ) {
112 return false; // hide admin bar
113 }
114 }
115
116 }
117
118 return true; // show admin bar
119
120 }
121
122 /**
123 * Add menu bar item to view admin as one of the user roles
124 *
125 * @param $wp_admin_bar The WP_Admin_Bar instance
126 * @link https://developer.wordpress.org/reference/hooks/admin_bar_menu/
127 * @link https://developer.wordpress.org/reference/classes/wp_admin_bar/
128 * @since 1.8.0
129 */
130 public function view_admin_as_admin_bar_menu( $wp_admin_bar ) {
131
132 // Get which role slug is currently set to "View as"
133 $viewing_admin_as = get_user_meta( get_current_user_id(), '_asenha_viewing_admin_as', true );
134
135 if ( empty( $viewing_admin_as ) ) {
136 update_user_meta( get_current_user_id(), '_asenha_viewing_admin_as', 'administrator' );
137 }
138
139 // Get the role name, translated if available, from the role slug
140 $wp_roles = wp_roles()->roles;
141
142 foreach ( $wp_roles as $wp_role_slug => $wp_role_info ) {
143
144 if ( $wp_role_slug == $viewing_admin_as ) {
145
146 $viewing_admin_as_role_name = $wp_role_info['name'];
147
148 }
149
150 }
151
152 if ( ! isset( $viewing_admin_as_role_name ) ) {
153
154 $viewing_admin_as_role_name = $viewing_admin_as;
155
156 }
157
158 $translated_name_for_viewing_admin_as = ucfirst( $viewing_admin_as_role_name );
159
160 // Add parent menu basd on the role being set to "View as"
161
162 if ( 'administrator' == $viewing_admin_as ) {
163
164 // Add parent menu
165 $wp_admin_bar->add_menu( array(
166 'id' => 'asenha-view-admin-as-role',
167 'parent' => 'top-secondary',
168 'title' => 'View as <span style="font-size:0.8125em;">&#9660;</span>',
169 'href' => '#',
170 'meta' => array(
171 'title' => 'View admin pages and the site (logged-in) as one of the following user roles.'
172 ),
173 ) );
174
175 } else {
176
177 // Add parent menu
178 $wp_admin_bar->add_menu( array(
179 'id' => 'asenha-view-admin-as-role',
180 'parent' => 'top-secondary',
181 'title' => 'Viewing as ' . $translated_name_for_viewing_admin_as . ' <span style="font-size:0.8125em;">&#9660;</span>',
182 'href' => '#',
183 ) );
184
185 }
186
187 // Get available role(s) to switch to
188 $roles_to_switch_to = $this->get_roles_to_switch_to();
189
190 // Add role(s) to switch to as sub-menu
191
192 if ( 'administrator' == $viewing_admin_as ) {
193
194 // Add submenu for each role other than Administrator
195
196 $i = 1;
197
198 foreach ( $roles_to_switch_to as $role_slug => $data ) {
199
200 $wp_admin_bar->add_menu( array(
201 'id' => 'role' . $i . '_' . $role_slug, // id based on role slug, e.g. role1_editor, role5_shop_manager
202 'parent' => 'asenha-view-admin-as-role',
203 'title' => $data['role_name'], // role name, e.g. Editor, Shop Manager
204 'href' => $data['nonce_url'], // nonce URL for each role
205 ) );
206
207 $i++;
208
209 }
210
211 } else {
212
213 // Add submenu to switch back to Administrator role
214
215 foreach ( $roles_to_switch_to as $role_slug => $data ) {
216
217 $wp_admin_bar->add_menu( array(
218 'id' => 'role_' . $role_slug, // id based on role slug, e.g. role1_editor, role5_shop_manager
219 'parent' => 'asenha-view-admin-as-role',
220 'title' => 'Switch back to ' . $data['role_name'], // role name, e.g. Editor, Shop Manager
221 'href' => $data['nonce_url'], // nonce URL for each role
222
223 ) );
224
225 }
226
227 }
228
229 }
230
231 /**
232 * Get roles availble to switch to
233 *
234 * @since 1.8.0
235 */
236 private function get_roles_to_switch_to() {
237
238 $current_user = wp_get_current_user();
239 $current_user_role_slugs = $current_user->roles; // indexed array of current user role slug(s)
240
241 // Get full list of roles defined in WordPress
242 $wp_roles = wp_roles()->roles;
243
244 $roles_to_switch_to = array();
245
246 // Get which role slug is currently active for viewing
247 $viewing_admin_as = get_user_meta( get_current_user_id(), '_asenha_viewing_admin_as', true );
248
249 if ( 'administrator' == $viewing_admin_as ) {
250
251 // Exclude 'Administrator' from the "View as" menu
252
253 foreach ( $wp_roles as $wp_role_slug => $wp_role_info ) {
254
255 if ( ! in_array( $wp_role_slug,$current_user_role_slugs ) ) {
256
257 $roles_to_switch_to[$wp_role_slug] = array(
258 'role_name' => $wp_role_info['name'], // role name, e.g. Editor, Shop Manager
259 'nonce_url' => wp_nonce_url(
260 add_query_arg( array(
261 'action' => 'switch_role_to',
262 'role' => $wp_role_slug,
263 ) ), // add query parameters to current URl, this is the $actionurl that will be appended with the nonce action
264 'asenha_view_admin_as_' . $wp_role_slug, // the nonce $action name
265 'nonce', // the nonce url parameter name
266 ), // will result in a URL that looks like https://www.example.com/wp-admin/index.php?action=switch_role_to&role=editor&nonce=2ced3a40df
267 );
268
269 }
270
271 }
272
273 } else {
274
275 // Only show switch back to Administrator in the "View as" menu
276
277 $roles_to_switch_to['administrator'] = array(
278 'role_name' => 'Administrator', // role name, e.g. Editor, Shop Manager
279 'nonce_url' => wp_nonce_url(
280 add_query_arg( array(
281 'action' => 'switch_back_to_administrator',
282 'role' => 'administrator',
283 ) ), // add query parameters to current URl, this is the $actionurl that will be appended with the nonce action
284 'asenha_view_admin_as_administrator', // the nonce $action name
285 'nonce', // the nonce url parameter name
286 ), // will result in a URL that looks like https://www.example.com/wp-admin/index.php?action=switch_role_to&role=editor&nonce=2ced3a40df
287 );
288 }
289
290 return $roles_to_switch_to; // array of $role_slug => $nonce_url
291
292 }
293
294 /**
295 * Switch user role to view admin and site
296 *
297 * @since 1.8.0
298 */
299 public function role_switcher_to_view_admin_as() {
300
301 $current_user = wp_get_current_user();
302 $current_user_role_slugs = $current_user->roles; // indexed array of current user role slug(s)
303
304 if ( isset( $_REQUEST['action'] ) && isset( $_REQUEST['role'] ) && isset( $_REQUEST['nonce'] ) ) {
305
306 $action = sanitize_text_field( $_REQUEST['action'] );
307 $new_role = sanitize_text_field( $_REQUEST['role'] );
308 $nonce = sanitize_text_field( $_REQUEST['nonce'] );
309
310 if ( 'switch_role_to' === $action ) {
311
312 // Check nonce validity and role existence
313
314 $wp_roles = array_keys( wp_roles()->roles ); // indexed array of all WP roles
315
316 if ( ! wp_verify_nonce( $nonce, 'asenha_view_admin_as_' . $new_role ) || ! in_array( $new_role, $wp_roles ) ) {
317 return; // cancel role switching
318 }
319
320 // Get original roles (before role switching) of the current user
321 $original_role_slugs = get_user_meta( get_current_user_id(), '_asenha_view_admin_as_original_roles', true );
322
323 // Store original user role(s) before switching it to another role
324
325 if ( empty( $original_role_slugs ) ) {
326
327 update_user_meta( get_current_user_id(), '_asenha_view_admin_as_original_roles', $current_user_role_slugs );
328
329 }
330
331 // Remove all current roles from current user.
332 foreach ( $current_user_role_slugs as $current_user_role_slug ) {
333
334 $current_user->remove_role( $current_user_role_slug );
335
336 }
337
338 // Add new role to current user
339 $current_user->add_role( $new_role );
340
341 // Mark that the user has switched to a non-administrator role
342 update_user_meta( get_current_user_id(), '_asenha_viewing_admin_as', $new_role );
343
344 // Redirect to admin dashboard
345 wp_safe_redirect( get_admin_url() );
346 exit;
347
348 }
349
350 if ( 'switch_back_to_administrator' === $action ) {
351
352 // Check nonce validity
353
354 if ( ! wp_verify_nonce( $nonce, 'asenha_view_admin_as_administrator' ) || ( $new_role != 'administrator' ) ) {
355 return; // cancel role switching
356 }
357
358 // Remove all current roles from current user.
359 foreach ( $current_user_role_slugs as $current_role_slug ) {
360
361 $current_user->remove_role( $current_role_slug );
362
363 }
364
365 // Get original roles (before role switching) of the current user
366 $original_role_slugs = get_user_meta( get_current_user_id(), '_asenha_view_admin_as_original_roles', true );
367
368 // Add the original roles to the current user
369 foreach ( $original_role_slugs as $original_role_slug ) {
370
371 $current_user->add_role( $original_role_slug );
372
373 }
374
375 // Mark that the user has switched back to an administrator role
376 update_user_meta( get_current_user_id(), '_asenha_viewing_admin_as', 'administrator' );
377
378 }
379
380 } elseif ( isset( $_REQUEST['reset-view-as'] ) ) {
381
382 $reset_view_as = sanitize_text_field( $_REQUEST['reset-view-as'] );
383
384 if ( $reset_view_as == 'yes' ) {
385
386 // Remove all current roles from current user.
387 foreach ( $current_user_role_slugs as $current_role_slug ) {
388
389 $current_user->remove_role( $current_role_slug );
390
391 }
392
393 // Get original roles (before role switching) of the current user
394 $original_role_slugs = get_user_meta( get_current_user_id(), '_asenha_view_admin_as_original_roles', true );
395
396 // Add the original roles to the current user
397 foreach ( $original_role_slugs as $original_role_slug ) {
398
399 $current_user->add_role( $original_role_slug );
400
401 }
402
403 // Mark that the user has switched back to an administrator role
404 update_user_meta( get_current_user_id(), '_asenha_viewing_admin_as', 'administrator' );
405
406 // Redirect to admin dashboard
407 wp_safe_redirect( get_admin_url() );
408 exit;
409
410 }
411
412 }
413
414 }
415
416 /**
417 * Show custom error page on switch failure, which causes inability to view admin dashboard/pages
418 *
419 * @since 1.8.0
420 */
421 public function custom_error_page_on_switch_failure( $callback ) {
422
423 ?>
424 <!DOCTYPE html>
425 <html>
426 <head>
427 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8; ?>" />
428 <meta name="viewport" content="width=device-width">
429 <title>WordPress Error</title>
430 <style type="text/css">
431 html {
432 background: #f1f1f1;
433 }
434 body {
435 background: #fff;
436 border: 1px solid #ccd0d4;
437 color: #444;
438 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
439 margin: 2em auto;
440 padding: 1em 2em;
441 max-width: 700px;
442 -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .04);
443 box-shadow: 0 1px 1px rgba(0, 0, 0, .04);
444 }
445 h1 {
446 border-bottom: 1px solid #dadada;
447 clear: both;
448 color: #666;
449 font-size: 24px;
450 margin: 30px 0 0 0;
451 padding: 0;
452 padding-bottom: 7px;
453 }
454 #error-page {
455 margin-top: 50px;
456 }
457 #error-page p,
458 #error-page .wp-die-message {
459 font-size: 14px;
460 line-height: 1.5;
461 margin: 20px 0;
462 }
463 #error-page .wp-die-message:last-of-type {
464 display: none;
465 }
466 #error-page code {
467 font-family: Consolas, Monaco, monospace;
468 }
469 a {
470 color: #0073aa;
471 }
472 a:hover,
473 a:active {
474 color: #006799;
475 }
476 a:focus {
477 color: #124964;
478 -webkit-box-shadow:
479 0 0 0 1px #5b9dd9,
480 0 0 2px 1px rgba(30, 140, 190, 0.8);
481 box-shadow:
482 0 0 0 1px #5b9dd9,
483 0 0 2px 1px rgba(30, 140, 190, 0.8);
484 outline: none;
485 }
486 </style>
487 </head>
488 <body id="error-page">
489 <div class="wp-die-message">Something went wrong. <a href="<?php echo home_url( '?reset-view-as=yes' ); ?>">Click here</a> to go back to the admin dashboard.</div>
490 </body>
491 </html>
492 <?php
493
494 }
495
496 /**
497 * Get dashboard widgets
498 *
499 * @since 4.2.0
500 */
501 public function get_dashboard_widgets() {
502
503 global $wp_meta_boxes;
504
505 $dashboard_widgets = array();
506
507 if ( ! isset( $wp_meta_boxes['dashboard'] ) ) {
508 $extra_options = get_option( 'admin_site_enhancements_extra', array() );
509 if ( ! array_key_exists( 'dashboard_widgets', $extra_options ) ) {
510 require_once ABSPATH . '/wp-admin/includes/dashboard.php';
511 set_current_screen( 'dashboard' );
512 wp_dashboard_setup();
513 }
514 }
515
516 if ( isset( $wp_meta_boxes['dashboard'] ) ) {
517 foreach( $wp_meta_boxes['dashboard'] as $context => $priority ) {
518 foreach ( $priority as $info ) {
519 $priority = key( $priority ); // we only need the array key
520 foreach( $info as $widget => $data ) {
521 $dashboard_widgets[$widget] = array(
522 'id' => $widget,
523 'title' => wp_strip_all_tags( preg_replace( '/ <span.*span>/im', '', $data['title'] ) ),
524 'context' => $context, // 'normal' or 'side'
525 'priority' => $priority, // 'core'
526 );
527 }
528 }
529 }
530 }
531
532 $dashboard_widgets = wp_list_sort( $dashboard_widgets, 'title', 'ASC', true );
533
534 return $dashboard_widgets;
535
536 }
537
538 /**
539 * Disable dashboard widgets
540 *
541 * @since 4.2.0
542 */
543 public function disable_dashboard_widgets() {
544
545 global $wp_meta_boxes;
546
547 // Get list of disabled widgets
548 $options = get_option( ASENHA_SLUG_U, array() );
549 $disabled_dashboard_widgets = $options['disabled_dashboard_widgets'];
550
551 // Store default widgets in extra options. This will be referenced from settings field.
552 $dashboard_widgets = $this->get_dashboard_widgets();
553 $extra_options = get_option( 'admin_site_enhancements_extra', array() );
554 $extra_options['dashboard_widgets'] = $dashboard_widgets;
555 update_option( 'admin_site_enhancements_extra', $extra_options );
556
557 // Disable widgets
558 foreach( $disabled_dashboard_widgets as $disabled_widget_id_context_priority => $is_disabled ) {
559 // e.g. dashboard_activity__normal__core => true/false
560 if ( $is_disabled ) {
561 $disabled_widget = explode('__', $disabled_widget_id_context_priority);
562 $widget_id = $disabled_widget[0];
563 $widget_context = $disabled_widget[1];
564 $widget_priority = $disabled_widget[2];
565 // remove_meta_box( $widget_id, get_current_screen()->base, $widget_context );
566 unset( $wp_meta_boxes['dashboard'][$widget_context][$widget_priority][$widget_id] );
567 }
568 }
569
570 }
571
572 /**
573 * Modify admin bar menu for Admin Interface >> Hide or Modify Elements feature
574 *
575 * @param $wp_admin_bar object The admin bar.
576 * @since 1.9.0
577 */
578 public function modify_admin_bar_menu( $wp_admin_bar ) {
579
580 $options = get_option( ASENHA_SLUG_U, array() );
581
582 // Hide WP Logo Menu
583 if ( array_key_exists( 'hide_ab_wp_logo_menu', $options ) && $options['hide_ab_wp_logo_menu'] ) {
584 remove_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 ); // priority needs to match default value. Use QM to reference.
585 }
586
587 // Hide Customize Menu
588 if ( array_key_exists( 'hide_ab_customize_menu', $options ) && $options['hide_ab_customize_menu'] ) {
589 remove_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 ); // priority needs to match default value. Use QM to reference.
590 }
591
592 // Hide Updates Counter/Link
593 if ( array_key_exists( 'hide_ab_updates_menu', $options ) && $options['hide_ab_updates_menu'] ) {
594 remove_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 ); // priority needs to match default value. Use QM to reference.
595 }
596
597 // Hide Comments Counter/Link
598 if ( array_key_exists( 'hide_ab_comments_menu', $options ) && $options['hide_ab_comments_menu'] ) {
599 remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 ); // priority needs to match default value. Use QM to reference.
600 }
601
602 // Hide New Content Menu
603 if ( array_key_exists( 'hide_ab_new_content_menu', $options ) && $options['hide_ab_new_content_menu'] ) {
604 remove_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 ); // priority needs to match default value. Use QM to reference.
605 }
606
607 // Hide 'Howdy' text
608 if ( array_key_exists( 'hide_ab_howdy', $options ) && $options['hide_ab_howdy'] ) {
609
610 // Remove the whole my account sectino and later rebuild it
611 remove_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 );
612
613 $current_user = wp_get_current_user();
614 $user_id = get_current_user_id();
615 $profile_url = get_edit_profile_url( $user_id );
616
617 $avatar = get_avatar( $user_id, 26 ); // size 26x26 pixels
618 $display_name = $current_user->display_name;
619 $class = 'with-avatar';
620
621 $wp_admin_bar->add_menu( array(
622 'id' => 'my-account',
623 'parent' => 'top-secondary',
624 'title' => $display_name . $avatar,
625 'href' => $profile_url,
626 'meta' => array(
627 'class' => $class,
628 ),
629 ) );
630
631 }
632
633 }
634
635 /**
636 * Save custom menu order into an option
637 *
638 * @since 2.0.0
639 */
640 public function save_custom_menu_order() {
641
642 if ( isset( $_REQUEST ) && ( 'save_custom_menu_order' == $_REQUEST['action'] ) ) {
643
644 $options = get_option( ASENHA_SLUG_U );
645
646 // Empty option value first
647 // $options['custom_menu_order'] = '';
648 // update_option( ASENHA_SLUG_U, $options );
649
650 // Save new value
651 // $options = get_option( ASENHA_SLUG_U );
652 $options['custom_menu_order'] = sanitize_text_field( $_REQUEST['menu_order'] );
653 $success = update_option( ASENHA_SLUG_U, $options ); // true or false
654
655 if ( $success ) {
656
657 $data = array(
658 'status' => 'success',
659 'message' => 'Custom menu order was successfully saved.',
660 );
661
662 } else {
663
664 $data = array(
665 'status' => 'error',
666 'message' => 'Custom menu order was not saved.',
667 );
668
669 }
670
671 echo json_encode( $data );
672
673 }
674
675 }
676
677 /**
678 * Render custom menu order
679 *
680 * @param $menu_order array an ordered array of menu items
681 * @link https://developer.wordpress.org/reference/hooks/menu_order/
682 * @since 2.0.0
683 */
684 public function render_custom_menu_order( $menu_order ) {
685
686 global $menu;
687
688 $options = get_option( ASENHA_SLUG_U );
689
690 // Get current menu order. We're not using the default $menu_order which uses index.php, edit.php as array values.
691
692 $current_menu_order = array();
693
694 foreach ( $menu as $menu_key => $menu_info ) {
695
696 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
697 $menu_item_id = $menu_info[2];
698 } else {
699 $menu_item_id = $menu_info[5];
700 }
701
702 $current_menu_order[] = array( $menu_item_id, $menu_info[2] );
703
704 }
705
706 // Get custom menu order
707 $custom_menu_order = $options['custom_menu_order']; // comma separated
708 $custom_menu_order = explode( ",", $custom_menu_order ); // array of menu ID, e.g. menu-dashboard
709
710 // Return menu order for rendering
711
712 $rendered_menu_order = array();
713
714 // Render menu based on items saved in custom menu order
715
716 foreach ( $custom_menu_order as $custom_menu_item_id ) {
717
718 foreach ( $current_menu_order as $current_menu_item_id => $current_menu_item ) {
719
720 if ( $custom_menu_item_id == $current_menu_item[0] ) {
721
722 $rendered_menu_order[] = $current_menu_item[1];
723
724 }
725
726 }
727
728 }
729
730 // do_action( 'inspect', [ 'rendered_menu_order_1', $rendered_menu_order ] );
731
732 // Add items from current menu not already part of custom menu order, e.g. new plugin activated and adds new menu item
733
734 foreach ( $current_menu_order as $current_menu_item_id => $current_menu_item ) {
735
736 if ( ! in_array( $current_menu_item[0], $custom_menu_order ) ) {
737
738 $rendered_menu_order[] = $current_menu_item[1];
739
740 }
741
742 }
743
744 // do_action( 'inspect', [ 'rendered_menu_order_2', $rendered_menu_order ] );
745
746 return $rendered_menu_order;
747
748 }
749
750 /**
751 * Save menu items that was chosen to be hidden
752 *
753 * @since 2.0.0
754 */
755 public function save_hidden_menu_items() {
756
757 if ( isset( $_REQUEST ) && ( 'save_hidden_menu_items' == $_REQUEST['action'] ) ) {
758
759 $options = get_option( ASENHA_SLUG_U );
760
761 // Empty option value first
762 // $options['custom_menu_order'] = '';
763 // update_option( ASENHA_SLUG_U, $options );
764
765 // Save new value
766 // $options = get_option( ASENHA_SLUG_U );
767 $options['custom_menu_hidden'] = sanitize_text_field( $_REQUEST['hidden_menu_items'] );
768 $success = update_option( ASENHA_SLUG_U, $options ); // true or false
769
770 if ( $success ) {
771
772 $data = array(
773 'status' => 'success',
774 'message' => 'Hidden menu items was successfully saved.',
775 );
776
777 } else {
778
779 $data = array(
780 'status' => 'error',
781 'message' => 'Hidden menu items was not saved.',
782 );
783
784 }
785
786 echo json_encode( $data );
787
788 }
789
790 }
791
792 /**
793 * Apply custom menu item titles
794 *
795 * @since 2.9.0
796 */
797 public function apply_custom_menu_item_titles() {
798
799 global $menu;
800
801 $options = get_option( ASENHA_SLUG_U );
802
803 // Get custom menu item titles
804 $custom_menu_titles = $options['custom_menu_titles'];
805 $custom_menu_titles = explode( ',', $custom_menu_titles );
806
807 foreach ( $menu as $menu_key => $menu_info ) {
808
809 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
810 $menu_item_id = $menu_info[2];
811 } else {
812 $menu_item_id = $menu_info[5];
813 }
814
815 // Get defaul/custom menu item title
816 foreach ( $custom_menu_titles as $custom_menu_title ) {
817
818 // At this point, $custom_menu_title value looks like toplevel_page_snippets__Code Snippets
819
820 $custom_menu_title = explode( '__', $custom_menu_title );
821
822 if ( $custom_menu_title[0] == $menu_item_id ) {
823 $menu_item_title = $custom_menu_title[1]; // e.g. Code Snippets
824 break; // stop foreach loop so $menu_item_title is not overwritten in the next iteration
825 } else {
826 $menu_item_title = $menu_info[0];
827 }
828
829 }
830
831 $menu[$menu_key][0] = $menu_item_title;
832
833 }
834 }
835
836 /**
837 * Hide menu items by adding 'hidden' class (part of WP Core's common.css)
838 *
839 * @since 2.0.0
840 */
841 public function hide_menu_items() {
842
843 global $menu;
844
845 $options = get_option( ASENHA_SLUG_U );
846
847 // Get hidden menu items
848 $hidden_menu = $options['custom_menu_hidden'];
849 $hidden_menu = explode( ',', $hidden_menu );
850
851 foreach ( $menu as $menu_key => $menu_info ) {
852
853 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
854 $menu_item_id = $menu_info[2];
855 } else {
856 $menu_item_id = $menu_info[5];
857 }
858
859 if ( in_array( $menu_item_id, $hidden_menu ) ) {
860
861 $menu[$menu_key][4] = $menu_info[4] . ' hidden asenha_hidden_menu';
862
863 }
864
865 }
866
867 }
868
869 /**
870 * Add toggle to show hidden menu items
871 *
872 * @since 2.0.0
873 */
874 public function add_hidden_menu_toggle() {
875
876 $options = get_option( ASENHA_SLUG_U );
877
878 // Get hidden menu items
879 $hidden_menu = $options['custom_menu_hidden'];
880
881 if ( ! empty( $hidden_menu ) ) {
882
883 add_menu_page(
884 'Show All',
885 'Show All',
886 'manage_options',
887 'asenha_show_hidden_menu',
888 function () { return false; },
889 "dashicons-arrow-down-alt2",
890 300 // position
891 );
892
893 add_menu_page(
894 'Show Less',
895 'Show Less',
896 'manage_options',
897 'asenha_hide_hidden_menu',
898 function () { return false; },
899 "dashicons-arrow-up-alt2",
900 301 // position
901 );
902 }
903
904 }
905
906 /**
907 * Script to toggle hidden menu itesm
908 *
909 * @since 2.0.0
910 */
911 public function enqueue_toggle_hidden_menu_script() {
912
913 $options = get_option( ASENHA_SLUG_U );
914
915 // Get hidden menu items
916
917 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
918 $hidden_menu = $options['custom_menu_hidden'];
919 } else {
920 $hidden_menu = '';
921 }
922
923 if ( ! empty( $hidden_menu ) ) {
924
925 // Script to set behaviour and actions of the sortable menu
926 wp_enqueue_script( 'asenha-toggle-hidden-menu', ASENHA_URL . 'assets/js/toggle-hidden-menu.js', array(), ASENHA_VERSION, false );
927
928 }
929
930 }
931
932 }