67 */ |
67 */ |
68 function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { |
68 function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { |
69 global $self, $parent_file, $submenu_file, $plugin_page, $typenow; |
69 global $self, $parent_file, $submenu_file, $plugin_page, $typenow; |
70 |
70 |
71 $first = true; |
71 $first = true; |
72 // 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes, 5 = hookname, 6 = icon_url |
72 // 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes, 5 = hookname, 6 = icon_url. |
73 foreach ( $menu as $key => $item ) { |
73 foreach ( $menu as $key => $item ) { |
74 $admin_is_parent = false; |
74 $admin_is_parent = false; |
75 $class = array(); |
75 $class = array(); |
76 $aria_attributes = ''; |
76 $aria_attributes = ''; |
77 $aria_hidden = ''; |
77 $aria_hidden = ''; |
86 if ( ! empty( $submenu[ $item[2] ] ) ) { |
86 if ( ! empty( $submenu[ $item[2] ] ) ) { |
87 $class[] = 'wp-has-submenu'; |
87 $class[] = 'wp-has-submenu'; |
88 $submenu_items = $submenu[ $item[2] ]; |
88 $submenu_items = $submenu[ $item[2] ]; |
89 } |
89 } |
90 |
90 |
91 if ( ( $parent_file && $item[2] == $parent_file ) || ( empty( $typenow ) && $self == $item[2] ) ) { |
91 if ( ( $parent_file && $item[2] === $parent_file ) || ( empty( $typenow ) && $self === $item[2] ) ) { |
92 if ( ! empty( $submenu_items ) ) { |
92 if ( ! empty( $submenu_items ) ) { |
93 $class[] = 'wp-has-current-submenu wp-menu-open'; |
93 $class[] = 'wp-has-current-submenu wp-menu-open'; |
94 } else { |
94 } else { |
95 $class[] = 'current'; |
95 $class[] = 'current'; |
96 $aria_attributes .= 'aria-current="page"'; |
96 $aria_attributes .= 'aria-current="page"'; |
106 $class[] = esc_attr( $item[4] ); |
106 $class[] = esc_attr( $item[4] ); |
107 } |
107 } |
108 |
108 |
109 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
109 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
110 $id = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : ''; |
110 $id = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : ''; |
111 $img = $img_style = ''; |
111 $img = ''; |
|
112 $img_style = ''; |
112 $img_class = ' dashicons-before'; |
113 $img_class = ' dashicons-before'; |
113 |
114 |
114 if ( false !== strpos( $class, 'wp-menu-separator' ) ) { |
115 if ( false !== strpos( $class, 'wp-menu-separator' ) ) { |
115 $is_separator = true; |
116 $is_separator = true; |
116 } |
117 } |
150 echo '<div class="separator"></div>'; |
151 echo '<div class="separator"></div>'; |
151 } elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) { |
152 } elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) { |
152 $submenu_items = array_values( $submenu_items ); // Re-index. |
153 $submenu_items = array_values( $submenu_items ); // Re-index. |
153 $menu_hook = get_plugin_page_hook( $submenu_items[0][2], $item[2] ); |
154 $menu_hook = get_plugin_page_hook( $submenu_items[0][2], $item[2] ); |
154 $menu_file = $submenu_items[0][2]; |
155 $menu_file = $submenu_items[0][2]; |
155 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) { |
156 $pos = strpos( $menu_file, '?' ); |
|
157 |
|
158 if ( false !== $pos ) { |
156 $menu_file = substr( $menu_file, 0, $pos ); |
159 $menu_file = substr( $menu_file, 0, $pos ); |
157 } |
160 } |
158 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $submenu_items[0][2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { |
161 |
|
162 if ( ! empty( $menu_hook ) |
|
163 || ( ( 'index.php' !== $submenu_items[0][2] ) |
|
164 && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) |
|
165 && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) |
|
166 ) { |
159 $admin_is_parent = true; |
167 $admin_is_parent = true; |
160 echo "<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>"; |
168 echo "<a href='admin.php?page={$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>"; |
161 } else { |
169 } else { |
162 echo "\n\t<a href='{$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>"; |
170 echo "\n\t<a href='{$submenu_items[0][2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>$title</div></a>"; |
163 } |
171 } |
164 } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { |
172 } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { |
165 $menu_hook = get_plugin_page_hook( $item[2], 'admin.php' ); |
173 $menu_hook = get_plugin_page_hook( $item[2], 'admin.php' ); |
166 $menu_file = $item[2]; |
174 $menu_file = $item[2]; |
167 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) { |
175 $pos = strpos( $menu_file, '?' ); |
|
176 |
|
177 if ( false !== $pos ) { |
168 $menu_file = substr( $menu_file, 0, $pos ); |
178 $menu_file = substr( $menu_file, 0, $pos ); |
169 } |
179 } |
170 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $item[2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { |
180 |
|
181 if ( ! empty( $menu_hook ) |
|
182 || ( ( 'index.php' !== $item[2] ) |
|
183 && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) |
|
184 && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) |
|
185 ) { |
171 $admin_is_parent = true; |
186 $admin_is_parent = true; |
172 echo "\n\t<a href='admin.php?page={$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; |
187 echo "\n\t<a href='admin.php?page={$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; |
173 } else { |
188 } else { |
174 echo "\n\t<a href='{$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; |
189 echo "\n\t<a href='{$item[2]}'$class $aria_attributes>$arrow<div class='wp-menu-image$img_class'$img_style>$img</div><div class='wp-menu-name'>{$item[0]}</div></a>"; |
175 } |
190 } |
179 echo "\n\t<ul class='wp-submenu wp-submenu-wrap'>"; |
194 echo "\n\t<ul class='wp-submenu wp-submenu-wrap'>"; |
180 echo "<li class='wp-submenu-head' aria-hidden='true'>{$item[0]}</li>"; |
195 echo "<li class='wp-submenu-head' aria-hidden='true'>{$item[0]}</li>"; |
181 |
196 |
182 $first = true; |
197 $first = true; |
183 |
198 |
184 // 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes |
199 // 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes. |
185 foreach ( $submenu_items as $sub_key => $sub_item ) { |
200 foreach ( $submenu_items as $sub_key => $sub_item ) { |
186 if ( ! current_user_can( $sub_item[1] ) ) { |
201 if ( ! current_user_can( $sub_item[1] ) ) { |
187 continue; |
202 continue; |
188 } |
203 } |
189 |
204 |
190 $class = array(); |
205 $class = array(); |
191 $aria_attributes = ''; |
206 $aria_attributes = ''; |
|
207 |
192 if ( $first ) { |
208 if ( $first ) { |
193 $class[] = 'wp-first-item'; |
209 $class[] = 'wp-first-item'; |
194 $first = false; |
210 $first = false; |
195 } |
211 } |
196 |
212 |
197 $menu_file = $item[2]; |
213 $menu_file = $item[2]; |
198 |
214 $pos = strpos( $menu_file, '?' ); |
199 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) { |
215 |
|
216 if ( false !== $pos ) { |
200 $menu_file = substr( $menu_file, 0, $pos ); |
217 $menu_file = substr( $menu_file, 0, $pos ); |
201 } |
218 } |
202 |
219 |
203 // Handle current for post_type=post|page|foo pages, which won't match $self. |
220 // Handle current for post_type=post|page|foo pages, which won't match $self. |
204 $self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing'; |
221 $self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing'; |
205 |
222 |
206 if ( isset( $submenu_file ) ) { |
223 if ( isset( $submenu_file ) ) { |
207 if ( $submenu_file == $sub_item[2] ) { |
224 if ( $submenu_file === $sub_item[2] ) { |
208 $class[] = 'current'; |
225 $class[] = 'current'; |
209 $aria_attributes .= ' aria-current="page"'; |
226 $aria_attributes .= ' aria-current="page"'; |
210 } |
227 } |
211 // If plugin_page is set the parent must either match the current page or not physically exist. |
228 // If plugin_page is set the parent must either match the current page or not physically exist. |
212 // This allows plugin pages with the same hook to exist under different parents. |
229 // This allows plugin pages with the same hook to exist under different parents. |
213 } elseif ( |
230 } elseif ( |
214 ( ! isset( $plugin_page ) && $self == $sub_item[2] ) || |
231 ( ! isset( $plugin_page ) && $self === $sub_item[2] ) |
215 ( isset( $plugin_page ) && $plugin_page == $sub_item[2] && ( $item[2] == $self_type || $item[2] == $self || file_exists( $menu_file ) === false ) ) |
232 || ( isset( $plugin_page ) && $plugin_page === $sub_item[2] |
|
233 && ( $item[2] === $self_type || $item[2] === $self || file_exists( $menu_file ) === false ) ) |
216 ) { |
234 ) { |
217 $class[] = 'current'; |
235 $class[] = 'current'; |
218 $aria_attributes .= ' aria-current="page"'; |
236 $aria_attributes .= ' aria-current="page"'; |
219 } |
237 } |
220 |
238 |
224 |
242 |
225 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
243 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
226 |
244 |
227 $menu_hook = get_plugin_page_hook( $sub_item[2], $item[2] ); |
245 $menu_hook = get_plugin_page_hook( $sub_item[2], $item[2] ); |
228 $sub_file = $sub_item[2]; |
246 $sub_file = $sub_item[2]; |
229 if ( false !== ( $pos = strpos( $sub_file, '?' ) ) ) { |
247 $pos = strpos( $sub_file, '?' ); |
|
248 if ( false !== $pos ) { |
230 $sub_file = substr( $sub_file, 0, $pos ); |
249 $sub_file = substr( $sub_file, 0, $pos ); |
231 } |
250 } |
232 |
251 |
233 $title = wptexturize( $sub_item[0] ); |
252 $title = wptexturize( $sub_item[0] ); |
234 |
253 |
235 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $sub_item[2] ) && file_exists( WP_PLUGIN_DIR . "/$sub_file" ) && ! file_exists( ABSPATH . "/wp-admin/$sub_file" ) ) ) { |
254 if ( ! empty( $menu_hook ) |
236 // If admin.php is the current page or if the parent exists as a file in the plugins or admin dir |
255 || ( ( 'index.php' !== $sub_item[2] ) |
|
256 && file_exists( WP_PLUGIN_DIR . "/$sub_file" ) |
|
257 && ! file_exists( ABSPATH . "/wp-admin/$sub_file" ) ) |
|
258 ) { |
|
259 // If admin.php is the current page or if the parent exists as a file in the plugins or admin directory. |
237 if ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/{$item[2]}" ) ) || file_exists( $menu_file ) ) { |
260 if ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/{$item[2]}" ) ) || file_exists( $menu_file ) ) { |
238 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] ); |
261 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] ); |
239 } else { |
262 } else { |
240 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' ); |
263 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' ); |
241 } |
264 } |