PluginProbe ʕ •ᴥ•ʔ
Advanced Access Manager – Access Governance for WordPress / 5.4
Advanced Access Manager – Access Governance for WordPress v5.4
6.8.4 6.8.5 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13 6.9.14 6.9.15 6.9.16 6.9.17 6.9.18 6.9.19 6.9.2 6.9.20 6.9.21 6.9.22 6.9.23 6.9.24 6.9.25 6.9.26 6.9.27 6.9.28 6.9.29 6.9.3 6.9.30 6.9.31 6.9.32 6.9.33 6.9.34 6.9.35 6.9.36 6.9.37 6.9.38 6.9.39 6.9.4 6.9.41 6.9.42 6.9.43 6.9.44 6.9.45 6.9.46 6.9.47 6.9.48 6.9.49 6.9.5 6.9.51 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.0-alpha.6 7.0.0-alpha.7 7.0.0-beta.1 7.0.0-rc1 7.0.0-rc2 7.0.0-rc3 7.0.1 7.0.10 7.0.11 7.0.2 7.0.3 7.0.4 7.0.5 7.0.6 7.0.7 7.0.8 7.0.9 7.1.0 7.1.1 trunk 3.0 4.0 4.0.1 4.1 4.2 4.3 4.4 4.4.1 4.5 4.6 4.6.1 4.6.2 4.7 4.7.1 4.7.2 4.7.5 4.7.6 4.8 4.8.1 4.9 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.9.5.1 4.9.5.2 5.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1 5.1.1 5.10 5.11 5.2 5.2.1 5.2.5 5.2.6 5.2.7 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.4 5.4.1 5.4.2 5.4.3 5.4.3.1 5.4.3.2 5.5 5.5.1 5.5.2 5.6 5.6.1 5.6.1.1 5.7 5.7.1 5.7.2 5.7.3 5.8 5.8.1 5.8.2 5.8.3 5.9 5.9.1 5.9.1.1 5.9.2 5.9.2.1 5.9.3 5.9.4 5.9.5 5.9.6 5.9.6.1 5.9.6.2 5.9.6.3 5.9.7 5.9.7.1 5.9.7.2 5.9.7.3 5.9.8 5.9.8.1 5.9.9 5.9.9.1 6.0.0 6.0.1 6.0.2 6.0.3 6.0.4 6.0.5 6.1.0 6.1.1 6.2.0 6.2.1 6.2.2 6.3.0 6.3.1 6.3.2 6.3.3 6.4.0 6.4.1 6.4.2 6.4.3 6.5.0 6.5.1 6.5.2 6.5.3 6.5.4 6.6.0 6.6.1 6.6.2 6.6.3 6.6.4 6.7.0 6.7.1 6.7.2 6.7.3 6.7.4 6.7.5 6.7.6 6.7.7 6.7.8 6.7.9 6.8.0 6.8.1 6.8.2 6.8.3
advanced-access-manager / Application / Core / Object / Menu.php
advanced-access-manager / Application / Core / Object Last commit date
Cache.php 7 years ago Capability.php 7 years ago LoginRedirect.php 7 years ago LogoutRedirect.php 7 years ago Menu.php 7 years ago Metabox.php 7 years ago Post.php 7 years ago Redirect.php 7 years ago Route.php 7 years ago Toolbar.php 7 years ago Visibility.php 7 years ago
Menu.php
256 lines
1 <?php
2
3 /**
4 * ======================================================================
5 * LICENSE: This file is subject to the terms and conditions defined in *
6 * file 'license.txt', which is part of this source code package. *
7 * ======================================================================
8 */
9
10 /**
11 * Menu object
12 *
13 * @package AAM
14 * @author Vasyl Martyniuk <vasyl@vasyltech.com>
15 */
16 class AAM_Core_Object_Menu extends AAM_Core_Object {
17
18 /**
19 * Constructor
20 *
21 * @param AAM_Core_Subject $subject
22 *
23 * @return void
24 *
25 * @access public
26 */
27 public function __construct(AAM_Core_Subject $subject) {
28 parent::__construct($subject);
29
30 $option = $this->getSubject()->readOption('menu');
31
32 if (empty($option)) {
33 $option = $this->getSubject()->inheritFromParent('menu');
34 } else {
35 $this->setOverwritten(true);
36 }
37
38 $this->setOption($option);
39 }
40
41 /**
42 * Filter Menu List
43 *
44 * Keep in mind that this function only filter the menu items but do not
45 * restrict access to them. You have to explore roles and capabilities to
46 * control the full access to menus.
47 *
48 * @global array $menu
49 * @global array $submenu
50 *
51 * @return void
52 *
53 * @access public
54 */
55 public function filter() {
56 global $menu, $submenu;
57
58 foreach ($menu as $id => $item) {
59 if (!empty($submenu[$item[2]])) {
60 // Cover the scenario when there are some dynamic submenus
61 $subs = $this->filterSubmenu($item, ($this->has('menu-' . $item[2])));
62 } else {
63 $subs = array();
64 }
65
66 // cover scenario like with Visual Composer where landing page
67 // is defined dynamically
68 if ($this->has('menu-' . $item[2])) {
69 unset($menu[$id]);
70 } elseif ($this->has($item[2])) {
71 if (count($subs)) {
72 $menu[$id][2] = $subs[0][2];
73 $submenu[$menu[$id][2]] = $subs;
74 } else {
75 unset($menu[$id]);
76 }
77 }
78 }
79
80 // remove duplicated separators
81 $count = 0;
82 foreach ($menu as $id => $item) {
83 if (preg_match('/^separator/', $item[2])) {
84 if ($count === 0) {
85 $count++;
86 } else {
87 unset($menu[$id]);
88 }
89 } else {
90 $count = 0;
91 }
92 }
93 }
94
95 /**
96 *
97 * @param array $menu
98 * @return array
99 */
100 protected function normalizeItem($menu) {
101 if (strpos($menu, 'customize.php') === 0) {
102 $menu = 'customize.php';
103 }
104
105 return $menu;
106 }
107
108 /**
109 * Filter submenu
110 *
111 * @param array &$parent
112 * @param bool $deny_all
113 *
114 * @return void
115 *
116 * @access protected
117 *
118 * @global array $menu
119 * @global array $submenu
120 */
121 protected function filterSubmenu(&$parent, $deny_all = false) {
122 global $submenu;
123
124 $filtered = array();
125
126 foreach ($submenu[$parent[2]] as $id => $item) {
127 if ($deny_all || $this->has($this->normalizeItem($item[2]))) {
128 unset($submenu[$parent[2]][$id]);
129 } else {
130 $filtered[] = $submenu[$parent[2]][$id];
131 }
132 }
133
134 if (count($filtered)) { //make sure that the parent points to the first sub
135 $values = array_values($filtered);
136 $parent[2] = $values[0][2];
137 }
138
139 return $filtered;
140 }
141
142 /**
143 * Get parent menu
144 *
145 * @param string $search
146 *
147 * @return string|bool
148 *
149 * @access protected
150 * @global array $submenu
151 */
152 protected function getParentMenu($search) {
153 global $submenu;
154
155 $result = null;
156
157 if (is_array($submenu)) {
158 foreach($submenu as $parent => $subs) {
159 foreach($subs as $sub) {
160 if ($sub[2] == $search) {
161 $result = $parent;
162 break;
163 }
164 }
165
166 if ($result !== null) {
167 break;
168 }
169 }
170 }
171
172 return $result;
173 }
174
175 /**
176 * Check is menu defined
177 *
178 * Check if menu defined in options based on the id
179 *
180 * @param string $menu
181 *
182 * @return boolean
183 *
184 * @access public
185 */
186 public function has($menu, $both = false) {
187 //decode URL in case of any special characters like &amp;
188 $decoded = htmlspecialchars_decode($menu);
189 $options = $this->getOption();
190 $parent = $this->getParentMenu($decoded);
191
192 // Step #1. Check if menu is directly restricted
193 $direct = !empty($options[$decoded]);
194
195 // Step #2. Check if whole branch is restricted
196 $branch = ($both && !empty($options['menu-' . $decoded]));
197
198 // Step #3. Check if dynamic submenu is restricted because of whole branch
199 $indirect = ($parent && !empty($options['menu-' . $parent]));
200
201 return $direct || $branch || $indirect;
202 }
203
204 /**
205 * Allow access to a specific menu
206 *
207 * @param string $menu
208 *
209 * @return boolean
210 *
211 * @access public
212 */
213 public function allow($menu) {
214 return $this->save($menu, 0);
215 }
216
217 /**
218 * Deny access to a specific menu
219 *
220 * @param string $menu
221 *
222 * @return boolean
223 *
224 * @access public
225 */
226 public function deny($menu) {
227 return $this->save($menu, 1);
228 }
229
230 /**
231 * Save menu option
232 *
233 * @return bool
234 *
235 * @access public
236 */
237 public function save($item = null, $value = null) {
238 if (!is_null($item)) { // keep it compatible with main Manager.save
239 $this->updateOptionItem($item, $value);
240 }
241
242 return $this->getSubject()->updateOption($this->getOption(), 'menu');
243 }
244
245 /**
246 * Reset default settings
247 *
248 * @return bool
249 *
250 * @access public
251 */
252 public function reset() {
253 return $this->getSubject()->deleteOption('menu');
254 }
255
256 }