-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmenu_editor_settings.php
More file actions
142 lines (103 loc) · 3.61 KB
/
menu_editor_settings.php
File metadata and controls
142 lines (103 loc) · 3.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
<?php
// Create a Temporary User
$user_id = wp_insert_user(array(
'user_login' => 'amr_temp_user'.rand(1000,9999),
'user_pass' => wp_generate_password( 12, false ),
'role' => $_REQUEST['role']
));
// If not successful
if ( is_wp_error( $user_id ) ) $user_id = null;
$filtred_submenu = $submenu;
// Loop over submenus and remove pages for which the user does not have privs.
foreach ($submenu as $parent => $sub) {
foreach ($sub as $index => $data) {
if (
$data[1] == "switch_themes" &&
( user_can($user_id, 'switch_themes') || user_can($user_id, 'edit_theme_options') )
) continue;
if ( !user_can($user_id, $data[1]) ) {
unset($filtred_submenu[$parent][$index]);
}
}
unset($index, $data);
if ( empty($filtred_submenu[$parent]) )
unset($filtred_submenu[$parent]);
}
unset($sub, $parent);
/*
* Loop over the top-level menu.
* Menus for which the original parent is not accessible due to lack of privileges
* will have the next submenu in line be assigned as the new menu parent.
*/
$filtred_menu = $menu;
foreach ($menu as $id => $data) {
if ( empty($submenu[$data[2]]) )
continue;
$subs = $submenu[$data[2]];
$first_sub = reset( $subs );
$old_parent = $data[2];
$new_parent = $first_sub[2];
if ( $new_parent != $old_parent ) {
$_wp_real_parent_file[$old_parent] = $new_parent;
$menu[$id][2] = $new_parent;
foreach ($submenu[$old_parent] as $index => $data) {
$filtred_submenu[$new_parent][$index] = $submenu[$old_parent][$index];
unset($filtred_submenu[$old_parent][$index]);
}
unset($filtred_submenu[$old_parent], $index);
if ( isset($_wp_submenu_nopriv[$old_parent]) )
$_wp_submenu_nopriv[$new_parent] = $_wp_submenu_nopriv[$old_parent];
}
}
unset($id, $data, $subs, $first_sub, $old_parent, $new_parent);
/*
* Remove menus that have no accessible submenus and require privileges
* that the user does not have. Run re-parent loop again.
*/
foreach ( $filtred_menu as $id => $data ) {
if ( ! user_can($user_id, $data[1]) )
$_wp_menu_nopriv[$data[2]] = true;
/*
* If there is only one submenu and it is has same destination as the parent,
* remove the submenu.
*/
if ( ! empty( $filtred_submenu[$data[2]] ) && 1 == count ( $filtred_submenu[$data[2]] ) ) {
$subs = $filtred_submenu[$data[2]];
$first_sub = reset( $subs );
if ( $data[2] == $first_sub[2] )
unset( $filtred_submenu[$data[2]] );
}
// If submenu is empty...
if ( empty($filtred_submenu[$data[2]]) ) {
// And user doesn't have privs, remove menu.
if ( isset( $_wp_menu_nopriv[$data[2]] ) ) {
unset($filtred_menu[$id]);
}
}
if ($data[4] == "wp-menu-separator") $filtred_menu[$id][4] .= ' '.$data[2];
}
unset($id, $data, $subs, $first_sub);
// Prevent adjacent separators
$prev_menu_was_separator = false;
foreach ( $filtred_menu as $id => $data ) {
if ( false === stristr( $data[4], 'wp-menu-separator' ) ) {
// This item is not a separator, so falsey the toggler and do nothing
$prev_menu_was_separator = false;
} else {
// The previous item was a separator, so unset this one
if ( true === $prev_menu_was_separator ) {
unset( $filtred_menu[ $id ] );
}
// This item is a separator, so truthy the toggler and move on
$prev_menu_was_separator = true;
}
}
unset( $id, $data, $prev_menu_was_separator );
// Remove the last menu item if it is a separator.
$last_menu_key = array_keys( $filtred_menu );
$last_menu_key = array_pop( $last_menu_key );
if ( !empty( $filtred_menu ) && 'wp-menu-separator' == $filtred_menu[ $last_menu_key ][ 4 ] )
unset( $filtred_menu[ $last_menu_key ] );
unset( $last_menu_key );
// Delete the Created Temporary User
wp_delete_user($user_id);