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