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 = ''; |
78 $is_separator = false; |
78 $is_separator = false; |
79 |
79 |
80 if ( $first ) { |
80 if ( $first ) { |
81 $class[] = 'wp-first-item'; |
81 $class[] = 'wp-first-item'; |
82 $first = false; |
82 $first = false; |
83 } |
83 } |
84 |
84 |
85 $submenu_items = array(); |
85 $submenu_items = array(); |
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"'; |
97 } |
97 } |
98 } else { |
98 } else { |
99 $class[] = 'wp-not-current-submenu'; |
99 $class[] = 'wp-not-current-submenu'; |
100 if ( ! empty( $submenu_items ) ) |
100 if ( ! empty( $submenu_items ) ) { |
101 $aria_attributes .= 'aria-haspopup="true"'; |
101 $aria_attributes .= 'aria-haspopup="true"'; |
102 } |
102 } |
103 |
103 } |
104 if ( ! empty( $item[4] ) ) |
104 |
|
105 if ( ! empty( $item[4] ) ) { |
105 $class[] = esc_attr( $item[4] ); |
106 $class[] = esc_attr( $item[4] ); |
106 |
107 } |
107 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
108 |
108 $id = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : ''; |
109 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
109 $img = $img_style = ''; |
110 $id = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : ''; |
|
111 $img = $img_style = ''; |
110 $img_class = ' dashicons-before'; |
112 $img_class = ' dashicons-before'; |
111 |
113 |
112 if ( false !== strpos( $class, 'wp-menu-separator' ) ) { |
114 if ( false !== strpos( $class, 'wp-menu-separator' ) ) { |
113 $is_separator = true; |
115 $is_separator = true; |
114 } |
116 } |
123 $img = '<img src="' . $item[6] . '" alt="" />'; |
125 $img = '<img src="' . $item[6] . '" alt="" />'; |
124 |
126 |
125 if ( 'none' === $item[6] || 'div' === $item[6] ) { |
127 if ( 'none' === $item[6] || 'div' === $item[6] ) { |
126 $img = '<br />'; |
128 $img = '<br />'; |
127 } elseif ( 0 === strpos( $item[6], 'data:image/svg+xml;base64,' ) ) { |
129 } elseif ( 0 === strpos( $item[6], 'data:image/svg+xml;base64,' ) ) { |
128 $img = '<br />'; |
130 $img = '<br />'; |
129 $img_style = ' style="background-image:url(\'' . esc_attr( $item[6] ) . '\')"'; |
131 $img_style = ' style="background-image:url(\'' . esc_attr( $item[6] ) . '\')"'; |
130 $img_class = ' svg'; |
132 $img_class = ' svg'; |
131 } elseif ( 0 === strpos( $item[6], 'dashicons-' ) ) { |
133 } elseif ( 0 === strpos( $item[6], 'dashicons-' ) ) { |
132 $img = '<br />'; |
134 $img = '<br />'; |
133 $img_class = ' dashicons-before ' . sanitize_html_class( $item[6] ); |
135 $img_class = ' dashicons-before ' . sanitize_html_class( $item[6] ); |
134 } |
136 } |
135 } |
137 } |
136 $arrow = '<div class="wp-menu-arrow"><div></div></div>'; |
138 $arrow = '<div class="wp-menu-arrow"><div></div></div>'; |
137 |
139 |
138 $title = wptexturize( $item[0] ); |
140 $title = wptexturize( $item[0] ); |
139 |
141 |
140 // hide separators from screen readers |
142 // Hide separators from screen readers. |
141 if ( $is_separator ) { |
143 if ( $is_separator ) { |
142 $aria_hidden = ' aria-hidden="true"'; |
144 $aria_hidden = ' aria-hidden="true"'; |
143 } |
145 } |
144 |
146 |
145 echo "\n\t<li$class$id$aria_hidden>"; |
147 echo "\n\t<li$class$id$aria_hidden>"; |
146 |
148 |
147 if ( $is_separator ) { |
149 if ( $is_separator ) { |
148 echo '<div class="separator"></div>'; |
150 echo '<div class="separator"></div>'; |
149 } elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) { |
151 } elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) { |
150 $submenu_items = array_values( $submenu_items ); // Re-index. |
152 $submenu_items = array_values( $submenu_items ); // Re-index. |
151 $menu_hook = get_plugin_page_hook( $submenu_items[0][2], $item[2] ); |
153 $menu_hook = get_plugin_page_hook( $submenu_items[0][2], $item[2] ); |
152 $menu_file = $submenu_items[0][2]; |
154 $menu_file = $submenu_items[0][2]; |
153 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) |
155 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) { |
154 $menu_file = substr( $menu_file, 0, $pos ); |
156 $menu_file = substr( $menu_file, 0, $pos ); |
|
157 } |
155 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $submenu_items[0][2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { |
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" ) ) ) { |
156 $admin_is_parent = true; |
159 $admin_is_parent = true; |
157 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>"; |
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>"; |
158 } else { |
161 } else { |
159 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>"; |
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>"; |
160 } |
163 } |
161 } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { |
164 } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { |
162 $menu_hook = get_plugin_page_hook( $item[2], 'admin.php' ); |
165 $menu_hook = get_plugin_page_hook( $item[2], 'admin.php' ); |
163 $menu_file = $item[2]; |
166 $menu_file = $item[2]; |
164 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) |
167 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) { |
165 $menu_file = substr( $menu_file, 0, $pos ); |
168 $menu_file = substr( $menu_file, 0, $pos ); |
|
169 } |
166 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $item[2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { |
170 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $item[2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { |
167 $admin_is_parent = true; |
171 $admin_is_parent = true; |
168 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>"; |
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>"; |
169 } else { |
173 } else { |
170 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>"; |
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>"; |
177 |
181 |
178 $first = true; |
182 $first = true; |
179 |
183 |
180 // 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes |
184 // 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes |
181 foreach ( $submenu_items as $sub_key => $sub_item ) { |
185 foreach ( $submenu_items as $sub_key => $sub_item ) { |
182 if ( ! current_user_can( $sub_item[1] ) ) |
186 if ( ! current_user_can( $sub_item[1] ) ) { |
183 continue; |
187 continue; |
184 |
188 } |
185 $class = array(); |
189 |
|
190 $class = array(); |
186 $aria_attributes = ''; |
191 $aria_attributes = ''; |
187 if ( $first ) { |
192 if ( $first ) { |
188 $class[] = 'wp-first-item'; |
193 $class[] = 'wp-first-item'; |
189 $first = false; |
194 $first = false; |
190 } |
195 } |
191 |
196 |
192 $menu_file = $item[2]; |
197 $menu_file = $item[2]; |
193 |
198 |
194 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) |
199 if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) { |
195 $menu_file = substr( $menu_file, 0, $pos ); |
200 $menu_file = substr( $menu_file, 0, $pos ); |
|
201 } |
196 |
202 |
197 // Handle current for post_type=post|page|foo pages, which won't match $self. |
203 // Handle current for post_type=post|page|foo pages, which won't match $self. |
198 $self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing'; |
204 $self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing'; |
199 |
205 |
200 if ( isset( $submenu_file ) ) { |
206 if ( isset( $submenu_file ) ) { |
201 if ( $submenu_file == $sub_item[2] ) { |
207 if ( $submenu_file == $sub_item[2] ) { |
202 $class[] = 'current'; |
208 $class[] = 'current'; |
203 $aria_attributes .= ' aria-current="page"'; |
209 $aria_attributes .= ' aria-current="page"'; |
204 } |
210 } |
205 // If plugin_page is set the parent must either match the current page or not physically exist. |
211 // If plugin_page is set the parent must either match the current page or not physically exist. |
206 // This allows plugin pages with the same hook to exist under different parents. |
212 // This allows plugin pages with the same hook to exist under different parents. |
207 } elseif ( |
213 } elseif ( |
208 ( ! isset( $plugin_page ) && $self == $sub_item[2] ) || |
214 ( ! isset( $plugin_page ) && $self == $sub_item[2] ) || |
209 ( isset( $plugin_page ) && $plugin_page == $sub_item[2] && ( $item[2] == $self_type || $item[2] == $self || file_exists($menu_file) === false ) ) |
215 ( isset( $plugin_page ) && $plugin_page == $sub_item[2] && ( $item[2] == $self_type || $item[2] == $self || file_exists( $menu_file ) === false ) ) |
210 ) { |
216 ) { |
211 $class[] = 'current'; |
217 $class[] = 'current'; |
212 $aria_attributes .= ' aria-current="page"'; |
218 $aria_attributes .= ' aria-current="page"'; |
213 } |
219 } |
214 |
220 |
215 if ( ! empty( $sub_item[4] ) ) { |
221 if ( ! empty( $sub_item[4] ) ) { |
216 $class[] = esc_attr( $sub_item[4] ); |
222 $class[] = esc_attr( $sub_item[4] ); |
217 } |
223 } |
218 |
224 |
219 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
225 $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; |
220 |
226 |
221 $menu_hook = get_plugin_page_hook($sub_item[2], $item[2]); |
227 $menu_hook = get_plugin_page_hook( $sub_item[2], $item[2] ); |
222 $sub_file = $sub_item[2]; |
228 $sub_file = $sub_item[2]; |
223 if ( false !== ( $pos = strpos( $sub_file, '?' ) ) ) |
229 if ( false !== ( $pos = strpos( $sub_file, '?' ) ) ) { |
224 $sub_file = substr($sub_file, 0, $pos); |
230 $sub_file = substr( $sub_file, 0, $pos ); |
225 |
231 } |
226 $title = wptexturize($sub_item[0]); |
232 |
|
233 $title = wptexturize( $sub_item[0] ); |
227 |
234 |
228 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $sub_item[2] ) && file_exists( WP_PLUGIN_DIR . "/$sub_file" ) && ! file_exists( ABSPATH . "/wp-admin/$sub_file" ) ) ) { |
235 if ( ! empty( $menu_hook ) || ( ( 'index.php' != $sub_item[2] ) && file_exists( WP_PLUGIN_DIR . "/$sub_file" ) && ! file_exists( ABSPATH . "/wp-admin/$sub_file" ) ) ) { |
229 // If admin.php is the current page or if the parent exists as a file in the plugins or admin dir |
236 // If admin.php is the current page or if the parent exists as a file in the plugins or admin dir |
230 if ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/{$item[2]}" ) ) || file_exists( $menu_file ) ) |
237 if ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/{$item[2]}" ) ) || file_exists( $menu_file ) ) { |
231 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] ); |
238 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] ); |
232 else |
239 } else { |
233 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' ); |
240 $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' ); |
|
241 } |
234 |
242 |
235 $sub_item_url = esc_url( $sub_item_url ); |
243 $sub_item_url = esc_url( $sub_item_url ); |
236 echo "<li$class><a href='$sub_item_url'$class$aria_attributes>$title</a></li>"; |
244 echo "<li$class><a href='$sub_item_url'$class$aria_attributes>$title</a></li>"; |
237 } else { |
245 } else { |
238 echo "<li$class><a href='{$sub_item[2]}'$class$aria_attributes>$title</a></li>"; |
246 echo "<li$class><a href='{$sub_item[2]}'$class$aria_attributes>$title</a></li>"; |
239 } |
247 } |
240 } |
248 } |
241 echo "</ul>"; |
249 echo '</ul>'; |
242 } |
250 } |
243 echo "</li>"; |
251 echo '</li>'; |
244 } |
252 } |
245 |
253 |
246 echo '<li id="collapse-menu" class="hide-if-no-js">' . |
254 echo '<li id="collapse-menu" class="hide-if-no-js">' . |
247 '<button type="button" id="collapse-button" aria-label="' . esc_attr__( 'Collapse Main menu' ) . '" aria-expanded="true">' . |
255 '<button type="button" id="collapse-button" aria-label="' . esc_attr__( 'Collapse Main menu' ) . '" aria-expanded="true">' . |
248 '<span class="collapse-button-icon" aria-hidden="true"></span>' . |
256 '<span class="collapse-button-icon" aria-hidden="true"></span>' . |