| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Build Administration Menu. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package WordPress | 
					
						
							|  |  |  |  * @subpackage Administration | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if ( is_network_admin() ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Fires before the administration menu loads in the Network Admin. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * The hook fires before menus and sub-menus are removed based on user privileges. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @private | 
					
						
							|  |  |  | 	 * @since 3.1.0 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	do_action( '_network_admin_menu' ); | 
					
						
							|  |  |  | } elseif ( is_user_admin() ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Fires before the administration menu loads in the User Admin. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * The hook fires before menus and sub-menus are removed based on user privileges. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @private | 
					
						
							|  |  |  | 	 * @since 3.1.0 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	do_action( '_user_admin_menu' ); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Fires before the administration menu loads in the admin. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * The hook fires before menus and sub-menus are removed based on user privileges. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @private | 
					
						
							|  |  |  | 	 * @since 2.2.0 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	do_action( '_admin_menu' ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Create list of page plugin hook names.
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | foreach ( $menu as $menu_page ) { | 
					
						
							|  |  |  | 	if ( false !== $pos = strpos( $menu_page[2], '?' ) ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		// Handle post_type=post|page|foo pages.
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		$hook_name = substr( $menu_page[2], 0, $pos ); | 
					
						
							|  |  |  | 		$hook_args = substr( $menu_page[2], $pos + 1 ); | 
					
						
							|  |  |  | 		wp_parse_str( $hook_args, $hook_args ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		// Set the hook name to be the post type.
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		if ( isset( $hook_args['post_type'] ) ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 			$hook_name = $hook_args['post_type']; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			$hook_name = basename( $hook_name, '.php' ); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		unset( $hook_args ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		$hook_name = basename( $menu_page[2], '.php' ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	$hook_name = sanitize_title( $hook_name ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	if ( isset( $compat[ $hook_name ] ) ) { | 
					
						
							|  |  |  | 		$hook_name = $compat[ $hook_name ]; | 
					
						
							|  |  |  | 	} elseif ( ! $hook_name ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		continue; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	$admin_page_hooks[ $menu_page[2] ] = $hook_name; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | unset( $menu_page, $compat ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | $_wp_submenu_nopriv = array(); | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | $_wp_menu_nopriv    = array(); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | // Loop over submenus and remove pages for which the user does not have privs.
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | foreach ( $submenu as $parent => $sub ) { | 
					
						
							|  |  |  | 	foreach ( $sub as $index => $data ) { | 
					
						
							|  |  |  | 		if ( ! current_user_can( $data[1] ) ) { | 
					
						
							|  |  |  | 			unset( $submenu[ $parent ][ $index ] ); | 
					
						
							|  |  |  | 			$_wp_submenu_nopriv[ $parent ][ $data[2] ] = true; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	unset( $index, $data ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	if ( empty( $submenu[ $parent ] ) ) { | 
					
						
							|  |  |  | 		unset( $submenu[ $parent ] ); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | unset( $sub, $parent ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * 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. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | foreach ( $menu as $id => $data ) { | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	if ( empty( $submenu[ $data[2] ] ) ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		continue; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	$subs       = $submenu[ $data[2] ]; | 
					
						
							|  |  |  | 	$first_sub  = reset( $subs ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	$old_parent = $data[2]; | 
					
						
							|  |  |  | 	$new_parent = $first_sub[2]; | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	 * If the first submenu is not the same as the assigned parent, | 
					
						
							|  |  |  | 	 * make the first submenu the new parent. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	if ( $new_parent != $old_parent ) { | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		$_wp_real_parent_file[ $old_parent ] = $new_parent; | 
					
						
							|  |  |  | 		$menu[ $id ][2]                      = $new_parent; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		foreach ( $submenu[ $old_parent ] as $index => $data ) { | 
					
						
							|  |  |  | 			$submenu[ $new_parent ][ $index ] = $submenu[ $old_parent ][ $index ]; | 
					
						
							|  |  |  | 			unset( $submenu[ $old_parent ][ $index ] ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		unset( $submenu[ $old_parent ], $index ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		if ( isset( $_wp_submenu_nopriv[ $old_parent ] ) ) { | 
					
						
							|  |  |  | 			$_wp_submenu_nopriv[ $new_parent ] = $_wp_submenu_nopriv[ $old_parent ]; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | unset( $id, $data, $subs, $first_sub, $old_parent, $new_parent ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | if ( is_network_admin() ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Fires before the administration menu loads in the Network Admin. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @since 3.1.0 | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param string $context Empty context. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	do_action( 'network_admin_menu', '' ); | 
					
						
							|  |  |  | } elseif ( is_user_admin() ) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Fires before the administration menu loads in the User Admin. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @since 3.1.0 | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param string $context Empty context. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	do_action( 'user_admin_menu', '' ); | 
					
						
							|  |  |  | } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Fires before the administration menu loads in the admin. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @since 1.5.0 | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param string $context Empty context. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	do_action( 'admin_menu', '' ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * Remove menus that have no accessible submenus and require privileges | 
					
						
							|  |  |  |  * that the user does not have. Run re-parent loop again. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | foreach ( $menu as $id => $data ) { | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	if ( ! current_user_can( $data[1] ) ) { | 
					
						
							|  |  |  | 		$_wp_menu_nopriv[ $data[2] ] = true; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* | 
					
						
							|  |  |  | 	 * If there is only one submenu and it is has same destination as the parent, | 
					
						
							|  |  |  | 	 * remove the submenu. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	if ( ! empty( $submenu[ $data[2] ] ) && 1 == count( $submenu[ $data[2] ] ) ) { | 
					
						
							|  |  |  | 		$subs      = $submenu[ $data[2] ]; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		$first_sub = reset( $subs ); | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		if ( $data[2] == $first_sub[2] ) { | 
					
						
							|  |  |  | 			unset( $submenu[ $data[2] ] ); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// If submenu is empty...
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	if ( empty( $submenu[ $data[2] ] ) ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		// And user doesn't have privs, remove menu.
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		if ( isset( $_wp_menu_nopriv[ $data[2] ] ) ) { | 
					
						
							|  |  |  | 			unset( $menu[ $id ] ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | unset( $id, $data, $subs, $first_sub ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param string $add | 
					
						
							|  |  |  |  * @param string $class | 
					
						
							|  |  |  |  * @return string | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | function add_cssclass( $add, $class ) { | 
					
						
							|  |  |  | 	$class = empty( $class ) ? $add : $class .= ' ' . $add; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	return $class; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param array $menu | 
					
						
							|  |  |  |  * @return array | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | function add_menu_classes( $menu ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	$first = $lastorder = false; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	$i     = 0; | 
					
						
							|  |  |  | 	$mc    = count( $menu ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	foreach ( $menu as $order => $top ) { | 
					
						
							|  |  |  | 		$i++; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( 0 == $order ) { // dashboard is always shown/single
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 			$menu[0][4] = add_cssclass( 'menu-top-first', $top[4] ); | 
					
						
							|  |  |  | 			$lastorder  = 0; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		if ( 0 === strpos( $top[2], 'separator' ) && false !== $lastorder ) { // if separator
 | 
					
						
							|  |  |  | 			$first                 = true; | 
					
						
							|  |  |  | 			$c                     = $menu[ $lastorder ][4]; | 
					
						
							|  |  |  | 			$menu[ $lastorder ][4] = add_cssclass( 'menu-top-last', $c ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 			continue; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( $first ) { | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 			$c                 = $menu[ $order ][4]; | 
					
						
							|  |  |  | 			$menu[ $order ][4] = add_cssclass( 'menu-top-first', $c ); | 
					
						
							|  |  |  | 			$first             = false; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ( $mc == $i ) { // last item
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 			$c                 = $menu[ $order ][4]; | 
					
						
							|  |  |  | 			$menu[ $order ][4] = add_cssclass( 'menu-top-last', $c ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$lastorder = $order; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Filters administration menus array with classes added for top-level items. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @since 2.7.0 | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param array $menu Associative array of administration menu items. | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	return apply_filters( 'add_menu_classes', $menu ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | uksort( $menu, 'strnatcasecmp' ); // make it all pretty
 | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Filters whether to enable custom ordering of the administration menu. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * See the {@see 'menu_order'} filter for reordering menu items. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @since 2.8.0 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @param bool $custom Whether custom ordering is enabled. Default false. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | if ( apply_filters( 'custom_menu_order', false ) ) { | 
					
						
							|  |  |  | 	$menu_order = array(); | 
					
						
							|  |  |  | 	foreach ( $menu as $menu_item ) { | 
					
						
							|  |  |  | 		$menu_order[] = $menu_item[2]; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	unset( $menu_item ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	$default_menu_order = $menu_order; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Filters the order of administration menu items. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * A truthy value must first be passed to the {@see 'custom_menu_order'} filter | 
					
						
							|  |  |  | 	 * for this filter to work. Use the following to enable custom menu ordering: | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 *     add_filter( 'custom_menu_order', '__return_true' ); | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @since 2.8.0 | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param array $menu_order An ordered array of menu items. | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	$menu_order         = apply_filters( 'menu_order', $menu_order ); | 
					
						
							|  |  |  | 	$menu_order         = array_flip( $menu_order ); | 
					
						
							|  |  |  | 	$default_menu_order = array_flip( $default_menu_order ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @global array $menu_order | 
					
						
							|  |  |  | 	 * @global array $default_menu_order | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @param array $a | 
					
						
							|  |  |  | 	 * @param array $b | 
					
						
							|  |  |  | 	 * @return int | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	function sort_menu( $a, $b ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		global $menu_order, $default_menu_order; | 
					
						
							|  |  |  | 		$a = $a[2]; | 
					
						
							|  |  |  | 		$b = $b[2]; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		if ( isset( $menu_order[ $a ] ) && ! isset( $menu_order[ $b ] ) ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 			return -1; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		} elseif ( ! isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 			return 1; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 		} elseif ( isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) { | 
					
						
							|  |  |  | 			if ( $menu_order[ $a ] == $menu_order[ $b ] ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 				return 0; | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			return ( $menu_order[ $a ] < $menu_order[ $b ] ) ? -1 : 1; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 			return ( $default_menu_order[ $a ] <= $default_menu_order[ $b ] ) ? -1 : 1; | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | 	usort( $menu, 'sort_menu' ); | 
					
						
							|  |  |  | 	unset( $menu_order, $default_menu_order ); | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Prevent adjacent separators
 | 
					
						
							|  |  |  | $prev_menu_was_separator = false; | 
					
						
							|  |  |  | foreach ( $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( $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( $menu ); | 
					
						
							|  |  |  | $last_menu_key = array_pop( $last_menu_key ); | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | if ( ! empty( $menu ) && 'wp-menu-separator' == $menu[ $last_menu_key ][4] ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 	unset( $menu[ $last_menu_key ] ); | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | unset( $last_menu_key ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | if ( ! user_can_access_admin_page() ) { | 
					
						
							| 
									
										
										
										
											2019-03-12 09:27:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * Fires when access to an admin page is denied. | 
					
						
							|  |  |  | 	 * | 
					
						
							|  |  |  | 	 * @since 2.5.0 | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	do_action( 'admin_page_access_denied' ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	wp_die( __( 'Sorry, you are not allowed to access this page.' ), 403 ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-04-16 20:56:22 +01:00
										 |  |  | $menu = add_menu_classes( $menu ); |