176 } |
176 } |
177 } |
177 } |
178 } |
178 } |
179 unset($id, $data, $subs, $first_sub); |
179 unset($id, $data, $subs, $first_sub); |
180 |
180 |
181 // Remove any duplicated separators |
181 /** |
182 $separator_found = false; |
182 * |
183 foreach ( $menu as $id => $data ) { |
183 * @param string $add |
184 if ( 0 == strcmp('wp-menu-separator', $data[4] ) ) { |
184 * @param string $class |
185 if (false == $separator_found) { |
185 * @return string |
186 $separator_found = true; |
186 */ |
187 } else { |
|
188 unset($menu[$id]); |
|
189 $separator_found = false; |
|
190 } |
|
191 } else { |
|
192 $separator_found = false; |
|
193 } |
|
194 } |
|
195 unset($id, $data); |
|
196 |
|
197 function add_cssclass($add, $class) { |
187 function add_cssclass($add, $class) { |
198 $class = empty($class) ? $add : $class .= ' ' . $add; |
188 $class = empty($class) ? $add : $class .= ' ' . $add; |
199 return $class; |
189 return $class; |
200 } |
190 } |
201 |
191 |
|
192 /** |
|
193 * |
|
194 * @param array $menu |
|
195 * @return array |
|
196 */ |
202 function add_menu_classes($menu) { |
197 function add_menu_classes($menu) { |
203 |
|
204 $first = $lastorder = false; |
198 $first = $lastorder = false; |
205 $i = 0; |
199 $i = 0; |
206 $mc = count($menu); |
200 $mc = count($menu); |
207 foreach ( $menu as $order => $top ) { |
201 foreach ( $menu as $order => $top ) { |
208 $i++; |
202 $i++; |
245 } |
239 } |
246 |
240 |
247 uksort($menu, "strnatcasecmp"); // make it all pretty |
241 uksort($menu, "strnatcasecmp"); // make it all pretty |
248 |
242 |
249 /** |
243 /** |
250 * Filter whether to enable custom ordering of the administration menu. |
244 * Filters whether to enable custom ordering of the administration menu. |
251 * |
245 * |
252 * See the 'menu_order' filter for reordering menu items. |
246 * See the {@see 'menu_order'} filter for reordering menu items. |
253 * |
247 * |
254 * @since 2.8.0 |
248 * @since 2.8.0 |
255 * |
249 * |
256 * @param bool $custom Whether custom ordering is enabled. Default false. |
250 * @param bool $custom Whether custom ordering is enabled. Default false. |
257 */ |
251 */ |
262 } |
256 } |
263 unset($menu_item); |
257 unset($menu_item); |
264 $default_menu_order = $menu_order; |
258 $default_menu_order = $menu_order; |
265 |
259 |
266 /** |
260 /** |
267 * Filter the order of administration menu items. |
261 * Filters the order of administration menu items. |
268 * |
262 * |
269 * A truthy value must first be passed to the 'custom_menu_order' filter |
263 * A truthy value must first be passed to the {@see 'custom_menu_order'} filter |
270 * for this filter to work. Use the following to enable custom menu ordering: |
264 * for this filter to work. Use the following to enable custom menu ordering: |
271 * |
265 * |
272 * add_filter( 'custom_menu_order', '__return_true' ); |
266 * add_filter( 'custom_menu_order', '__return_true' ); |
273 * |
267 * |
274 * @since 2.8.0 |
268 * @since 2.8.0 |
277 */ |
271 */ |
278 $menu_order = apply_filters( 'menu_order', $menu_order ); |
272 $menu_order = apply_filters( 'menu_order', $menu_order ); |
279 $menu_order = array_flip($menu_order); |
273 $menu_order = array_flip($menu_order); |
280 $default_menu_order = array_flip($default_menu_order); |
274 $default_menu_order = array_flip($default_menu_order); |
281 |
275 |
|
276 /** |
|
277 * |
|
278 * @global array $menu_order |
|
279 * @global array $default_menu_order |
|
280 * |
|
281 * @param array $a |
|
282 * @param array $b |
|
283 * @return int |
|
284 */ |
282 function sort_menu($a, $b) { |
285 function sort_menu($a, $b) { |
283 global $menu_order, $default_menu_order; |
286 global $menu_order, $default_menu_order; |
284 $a = $a[2]; |
287 $a = $a[2]; |
285 $b = $b[2]; |
288 $b = $b[2]; |
286 if ( isset($menu_order[$a]) && !isset($menu_order[$b]) ) { |
289 if ( isset($menu_order[$a]) && !isset($menu_order[$b]) ) { |
298 |
301 |
299 usort($menu, 'sort_menu'); |
302 usort($menu, 'sort_menu'); |
300 unset($menu_order, $default_menu_order); |
303 unset($menu_order, $default_menu_order); |
301 } |
304 } |
302 |
305 |
|
306 // Prevent adjacent separators |
|
307 $prev_menu_was_separator = false; |
|
308 foreach ( $menu as $id => $data ) { |
|
309 if ( false === stristr( $data[4], 'wp-menu-separator' ) ) { |
|
310 |
|
311 // This item is not a separator, so falsey the toggler and do nothing |
|
312 $prev_menu_was_separator = false; |
|
313 } else { |
|
314 |
|
315 // The previous item was a separator, so unset this one |
|
316 if ( true === $prev_menu_was_separator ) { |
|
317 unset( $menu[ $id ] ); |
|
318 } |
|
319 |
|
320 // This item is a separator, so truthy the toggler and move on |
|
321 $prev_menu_was_separator = true; |
|
322 } |
|
323 } |
|
324 unset( $id, $data, $prev_menu_was_separator ); |
|
325 |
303 // Remove the last menu item if it is a separator. |
326 // Remove the last menu item if it is a separator. |
304 $last_menu_key = array_keys( $menu ); |
327 $last_menu_key = array_keys( $menu ); |
305 $last_menu_key = array_pop( $last_menu_key ); |
328 $last_menu_key = array_pop( $last_menu_key ); |
306 if ( !empty( $menu ) && 'wp-menu-separator' == $menu[ $last_menu_key ][ 4 ] ) |
329 if ( !empty( $menu ) && 'wp-menu-separator' == $menu[ $last_menu_key ][ 4 ] ) |
307 unset( $menu[ $last_menu_key ] ); |
330 unset( $menu[ $last_menu_key ] ); |