PluginProbe ʕ •ᴥ•ʔ
Admin and Site Enhancements (ASE) / 4.2.2
Admin and Site Enhancements (ASE) v4.2.2
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
931 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 => $priorities ) {
518 foreach ( $priorities as $priority => $widgets ) {
519 foreach( $widgets as $widget_id => $data ) {
520 $dashboard_widgets[$widget_id] = array(
521 'id' => $widget_id,
522 'title' => wp_strip_all_tags( preg_replace( '/ <span.*span>/im', '', $data['title'] ) ),
523 'context' => $context, // 'normal' or 'side'
524 'priority' => $priority, // 'core'
525 );
526 }
527 }
528 }
529 }
530
531 $dashboard_widgets = wp_list_sort( $dashboard_widgets, 'title', 'ASC', true );
532
533 return $dashboard_widgets;
534
535 }
536
537 /**
538 * Disable dashboard widgets
539 *
540 * @since 4.2.0
541 */
542 public function disable_dashboard_widgets() {
543
544 global $wp_meta_boxes;
545
546 // Get list of disabled widgets
547 $options = get_option( ASENHA_SLUG_U, array() );
548 $disabled_dashboard_widgets = $options['disabled_dashboard_widgets'];
549
550 // Store default widgets in extra options. This will be referenced from settings field.
551 $dashboard_widgets = $this->get_dashboard_widgets();
552 $extra_options = get_option( 'admin_site_enhancements_extra', array() );
553 $extra_options['dashboard_widgets'] = $dashboard_widgets;
554 update_option( 'admin_site_enhancements_extra', $extra_options );
555
556 // Disable widgets
557 foreach( $disabled_dashboard_widgets as $disabled_widget_id_context_priority => $is_disabled ) {
558 // e.g. dashboard_activity__normal__core => true/false
559 if ( $is_disabled ) {
560 $disabled_widget = explode('__', $disabled_widget_id_context_priority);
561 $widget_id = $disabled_widget[0];
562 $widget_context = $disabled_widget[1];
563 $widget_priority = $disabled_widget[2];
564 // remove_meta_box( $widget_id, get_current_screen()->base, $widget_context );
565 unset( $wp_meta_boxes['dashboard'][$widget_context][$widget_priority][$widget_id] );
566 }
567 }
568
569 }
570
571 /**
572 * Modify admin bar menu for Admin Interface >> Hide or Modify Elements feature
573 *
574 * @param $wp_admin_bar object The admin bar.
575 * @since 1.9.0
576 */
577 public function modify_admin_bar_menu( $wp_admin_bar ) {
578
579 $options = get_option( ASENHA_SLUG_U, array() );
580
581 // Hide WP Logo Menu
582 if ( array_key_exists( 'hide_ab_wp_logo_menu', $options ) && $options['hide_ab_wp_logo_menu'] ) {
583 remove_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 ); // priority needs to match default value. Use QM to reference.
584 }
585
586 // Hide Customize Menu
587 if ( array_key_exists( 'hide_ab_customize_menu', $options ) && $options['hide_ab_customize_menu'] ) {
588 remove_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 ); // priority needs to match default value. Use QM to reference.
589 }
590
591 // Hide Updates Counter/Link
592 if ( array_key_exists( 'hide_ab_updates_menu', $options ) && $options['hide_ab_updates_menu'] ) {
593 remove_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 ); // priority needs to match default value. Use QM to reference.
594 }
595
596 // Hide Comments Counter/Link
597 if ( array_key_exists( 'hide_ab_comments_menu', $options ) && $options['hide_ab_comments_menu'] ) {
598 remove_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 ); // priority needs to match default value. Use QM to reference.
599 }
600
601 // Hide New Content Menu
602 if ( array_key_exists( 'hide_ab_new_content_menu', $options ) && $options['hide_ab_new_content_menu'] ) {
603 remove_action( 'admin_bar_menu', 'wp_admin_bar_new_content_menu', 70 ); // priority needs to match default value. Use QM to reference.
604 }
605
606 // Hide 'Howdy' text
607 if ( array_key_exists( 'hide_ab_howdy', $options ) && $options['hide_ab_howdy'] ) {
608
609 // Remove the whole my account sectino and later rebuild it
610 remove_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 7 );
611
612 $current_user = wp_get_current_user();
613 $user_id = get_current_user_id();
614 $profile_url = get_edit_profile_url( $user_id );
615
616 $avatar = get_avatar( $user_id, 26 ); // size 26x26 pixels
617 $display_name = $current_user->display_name;
618 $class = 'with-avatar';
619
620 $wp_admin_bar->add_menu( array(
621 'id' => 'my-account',
622 'parent' => 'top-secondary',
623 'title' => $display_name . $avatar,
624 'href' => $profile_url,
625 'meta' => array(
626 'class' => $class,
627 ),
628 ) );
629
630 }
631
632 }
633
634 /**
635 * Save custom menu order into an option
636 *
637 * @since 2.0.0
638 */
639 public function save_custom_menu_order() {
640
641 if ( isset( $_REQUEST ) && ( 'save_custom_menu_order' == $_REQUEST['action'] ) ) {
642
643 $options = get_option( ASENHA_SLUG_U );
644
645 // Empty option value first
646 // $options['custom_menu_order'] = '';
647 // update_option( ASENHA_SLUG_U, $options );
648
649 // Save new value
650 // $options = get_option( ASENHA_SLUG_U );
651 $options['custom_menu_order'] = sanitize_text_field( $_REQUEST['menu_order'] );
652 $success = update_option( ASENHA_SLUG_U, $options ); // true or false
653
654 if ( $success ) {
655
656 $data = array(
657 'status' => 'success',
658 'message' => 'Custom menu order was successfully saved.',
659 );
660
661 } else {
662
663 $data = array(
664 'status' => 'error',
665 'message' => 'Custom menu order was not saved.',
666 );
667
668 }
669
670 echo json_encode( $data );
671
672 }
673
674 }
675
676 /**
677 * Render custom menu order
678 *
679 * @param $menu_order array an ordered array of menu items
680 * @link https://developer.wordpress.org/reference/hooks/menu_order/
681 * @since 2.0.0
682 */
683 public function render_custom_menu_order( $menu_order ) {
684
685 global $menu;
686
687 $options = get_option( ASENHA_SLUG_U );
688
689 // Get current menu order. We're not using the default $menu_order which uses index.php, edit.php as array values.
690
691 $current_menu_order = array();
692
693 foreach ( $menu as $menu_key => $menu_info ) {
694
695 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
696 $menu_item_id = $menu_info[2];
697 } else {
698 $menu_item_id = $menu_info[5];
699 }
700
701 $current_menu_order[] = array( $menu_item_id, $menu_info[2] );
702
703 }
704
705 // Get custom menu order
706 $custom_menu_order = $options['custom_menu_order']; // comma separated
707 $custom_menu_order = explode( ",", $custom_menu_order ); // array of menu ID, e.g. menu-dashboard
708
709 // Return menu order for rendering
710
711 $rendered_menu_order = array();
712
713 // Render menu based on items saved in custom menu order
714
715 foreach ( $custom_menu_order as $custom_menu_item_id ) {
716
717 foreach ( $current_menu_order as $current_menu_item_id => $current_menu_item ) {
718
719 if ( $custom_menu_item_id == $current_menu_item[0] ) {
720
721 $rendered_menu_order[] = $current_menu_item[1];
722
723 }
724
725 }
726
727 }
728
729 // do_action( 'inspect', [ 'rendered_menu_order_1', $rendered_menu_order ] );
730
731 // Add items from current menu not already part of custom menu order, e.g. new plugin activated and adds new menu item
732
733 foreach ( $current_menu_order as $current_menu_item_id => $current_menu_item ) {
734
735 if ( ! in_array( $current_menu_item[0], $custom_menu_order ) ) {
736
737 $rendered_menu_order[] = $current_menu_item[1];
738
739 }
740
741 }
742
743 // do_action( 'inspect', [ 'rendered_menu_order_2', $rendered_menu_order ] );
744
745 return $rendered_menu_order;
746
747 }
748
749 /**
750 * Save menu items that was chosen to be hidden
751 *
752 * @since 2.0.0
753 */
754 public function save_hidden_menu_items() {
755
756 if ( isset( $_REQUEST ) && ( 'save_hidden_menu_items' == $_REQUEST['action'] ) ) {
757
758 $options = get_option( ASENHA_SLUG_U );
759
760 // Empty option value first
761 // $options['custom_menu_order'] = '';
762 // update_option( ASENHA_SLUG_U, $options );
763
764 // Save new value
765 // $options = get_option( ASENHA_SLUG_U );
766 $options['custom_menu_hidden'] = sanitize_text_field( $_REQUEST['hidden_menu_items'] );
767 $success = update_option( ASENHA_SLUG_U, $options ); // true or false
768
769 if ( $success ) {
770
771 $data = array(
772 'status' => 'success',
773 'message' => 'Hidden menu items was successfully saved.',
774 );
775
776 } else {
777
778 $data = array(
779 'status' => 'error',
780 'message' => 'Hidden menu items was not saved.',
781 );
782
783 }
784
785 echo json_encode( $data );
786
787 }
788
789 }
790
791 /**
792 * Apply custom menu item titles
793 *
794 * @since 2.9.0
795 */
796 public function apply_custom_menu_item_titles() {
797
798 global $menu;
799
800 $options = get_option( ASENHA_SLUG_U );
801
802 // Get custom menu item titles
803 $custom_menu_titles = $options['custom_menu_titles'];
804 $custom_menu_titles = explode( ',', $custom_menu_titles );
805
806 foreach ( $menu as $menu_key => $menu_info ) {
807
808 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
809 $menu_item_id = $menu_info[2];
810 } else {
811 $menu_item_id = $menu_info[5];
812 }
813
814 // Get defaul/custom menu item title
815 foreach ( $custom_menu_titles as $custom_menu_title ) {
816
817 // At this point, $custom_menu_title value looks like toplevel_page_snippets__Code Snippets
818
819 $custom_menu_title = explode( '__', $custom_menu_title );
820
821 if ( $custom_menu_title[0] == $menu_item_id ) {
822 $menu_item_title = $custom_menu_title[1]; // e.g. Code Snippets
823 break; // stop foreach loop so $menu_item_title is not overwritten in the next iteration
824 } else {
825 $menu_item_title = $menu_info[0];
826 }
827
828 }
829
830 $menu[$menu_key][0] = $menu_item_title;
831
832 }
833 }
834
835 /**
836 * Hide menu items by adding 'hidden' class (part of WP Core's common.css)
837 *
838 * @since 2.0.0
839 */
840 public function hide_menu_items() {
841
842 global $menu;
843
844 $options = get_option( ASENHA_SLUG_U );
845
846 // Get hidden menu items
847 $hidden_menu = $options['custom_menu_hidden'];
848 $hidden_menu = explode( ',', $hidden_menu );
849
850 foreach ( $menu as $menu_key => $menu_info ) {
851
852 if ( false !== strpos( $menu_info[4], 'wp-menu-separator' ) ) {
853 $menu_item_id = $menu_info[2];
854 } else {
855 $menu_item_id = $menu_info[5];
856 }
857
858 if ( in_array( $menu_item_id, $hidden_menu ) ) {
859
860 $menu[$menu_key][4] = $menu_info[4] . ' hidden asenha_hidden_menu';
861
862 }
863
864 }
865
866 }
867
868 /**
869 * Add toggle to show hidden menu items
870 *
871 * @since 2.0.0
872 */
873 public function add_hidden_menu_toggle() {
874
875 $options = get_option( ASENHA_SLUG_U );
876
877 // Get hidden menu items
878 $hidden_menu = $options['custom_menu_hidden'];
879
880 if ( ! empty( $hidden_menu ) ) {
881
882 add_menu_page(
883 'Show All',
884 'Show All',
885 'manage_options',
886 'asenha_show_hidden_menu',
887 function () { return false; },
888 "dashicons-arrow-down-alt2",
889 300 // position
890 );
891
892 add_menu_page(
893 'Show Less',
894 'Show Less',
895 'manage_options',
896 'asenha_hide_hidden_menu',
897 function () { return false; },
898 "dashicons-arrow-up-alt2",
899 301 // position
900 );
901 }
902
903 }
904
905 /**
906 * Script to toggle hidden menu itesm
907 *
908 * @since 2.0.0
909 */
910 public function enqueue_toggle_hidden_menu_script() {
911
912 $options = get_option( ASENHA_SLUG_U );
913
914 // Get hidden menu items
915
916 if ( array_key_exists( 'custom_menu_hidden', $options ) ) {
917 $hidden_menu = $options['custom_menu_hidden'];
918 } else {
919 $hidden_menu = '';
920 }
921
922 if ( ! empty( $hidden_menu ) ) {
923
924 // Script to set behaviour and actions of the sortable menu
925 wp_enqueue_script( 'asenha-toggle-hidden-menu', ASENHA_URL . 'assets/js/toggle-hidden-menu.js', array(), ASENHA_VERSION, false );
926
927 }
928
929 }
930
931 }