wp/wp-admin/includes/menu.php
changeset 21 48c4eec2b7e6
parent 19 3d72ae0968f4
equal deleted inserted replaced
20:7b1b88e27a20 21:48c4eec2b7e6
    11 	/**
    11 	/**
    12 	 * Fires before the administration menu loads in the Network Admin.
    12 	 * Fires before the administration menu loads in the Network Admin.
    13 	 *
    13 	 *
    14 	 * The hook fires before menus and sub-menus are removed based on user privileges.
    14 	 * The hook fires before menus and sub-menus are removed based on user privileges.
    15 	 *
    15 	 *
    16 	 * @private
       
    17 	 * @since 3.1.0
    16 	 * @since 3.1.0
       
    17 	 * @access private
    18 	 */
    18 	 */
    19 	do_action( '_network_admin_menu' );
    19 	do_action( '_network_admin_menu' );
    20 } elseif ( is_user_admin() ) {
    20 } elseif ( is_user_admin() ) {
    21 
    21 
    22 	/**
    22 	/**
    23 	 * Fires before the administration menu loads in the User Admin.
    23 	 * Fires before the administration menu loads in the User Admin.
    24 	 *
    24 	 *
    25 	 * The hook fires before menus and sub-menus are removed based on user privileges.
    25 	 * The hook fires before menus and sub-menus are removed based on user privileges.
    26 	 *
    26 	 *
    27 	 * @private
       
    28 	 * @since 3.1.0
    27 	 * @since 3.1.0
       
    28 	 * @access private
    29 	 */
    29 	 */
    30 	do_action( '_user_admin_menu' );
    30 	do_action( '_user_admin_menu' );
    31 } else {
    31 } else {
    32 
    32 
    33 	/**
    33 	/**
    34 	 * Fires before the administration menu loads in the admin.
    34 	 * Fires before the administration menu loads in the admin.
    35 	 *
    35 	 *
    36 	 * The hook fires before menus and sub-menus are removed based on user privileges.
    36 	 * The hook fires before menus and sub-menus are removed based on user privileges.
    37 	 *
    37 	 *
    38 	 * @private
       
    39 	 * @since 2.2.0
    38 	 * @since 2.2.0
       
    39 	 * @access private
    40 	 */
    40 	 */
    41 	do_action( '_admin_menu' );
    41 	do_action( '_admin_menu' );
    42 }
    42 }
    43 
    43 
    44 // Create list of page plugin hook names.
    44 // Create list of page plugin hook names.
    45 foreach ( $menu as $menu_page ) {
    45 foreach ( $menu as $menu_page ) {
    46 	$pos = strpos( $menu_page[2], '?' );
    46 	$pos = strpos( $menu_page[2], '?' );
       
    47 
    47 	if ( false !== $pos ) {
    48 	if ( false !== $pos ) {
    48 		// Handle post_type=post|page|foo pages.
    49 		// Handle post_type=post|page|foo pages.
    49 		$hook_name = substr( $menu_page[2], 0, $pos );
    50 		$hook_name = substr( $menu_page[2], 0, $pos );
    50 		$hook_args = substr( $menu_page[2], $pos + 1 );
    51 		$hook_args = substr( $menu_page[2], $pos + 1 );
    51 		wp_parse_str( $hook_args, $hook_args );
    52 		wp_parse_str( $hook_args, $hook_args );
       
    53 
    52 		// Set the hook name to be the post type.
    54 		// Set the hook name to be the post type.
    53 		if ( isset( $hook_args['post_type'] ) ) {
    55 		if ( isset( $hook_args['post_type'] ) ) {
    54 			$hook_name = $hook_args['post_type'];
    56 			$hook_name = $hook_args['post_type'];
    55 		} else {
    57 		} else {
    56 			$hook_name = basename( $hook_name, '.php' );
    58 			$hook_name = basename( $hook_name, '.php' );
    57 		}
    59 		}
    58 		unset( $hook_args );
    60 		unset( $hook_args );
    59 	} else {
    61 	} else {
    60 		$hook_name = basename( $menu_page[2], '.php' );
    62 		$hook_name = basename( $menu_page[2], '.php' );
    61 	}
    63 	}
       
    64 
    62 	$hook_name = sanitize_title( $hook_name );
    65 	$hook_name = sanitize_title( $hook_name );
    63 
    66 
    64 	if ( isset( $compat[ $hook_name ] ) ) {
    67 	if ( isset( $compat[ $hook_name ] ) ) {
    65 		$hook_name = $compat[ $hook_name ];
    68 		$hook_name = $compat[ $hook_name ];
    66 	} elseif ( ! $hook_name ) {
    69 	} elseif ( ! $hook_name ) {
    96  */
    99  */
    97 foreach ( $menu as $id => $data ) {
   100 foreach ( $menu as $id => $data ) {
    98 	if ( empty( $submenu[ $data[2] ] ) ) {
   101 	if ( empty( $submenu[ $data[2] ] ) ) {
    99 		continue;
   102 		continue;
   100 	}
   103 	}
       
   104 
   101 	$subs       = $submenu[ $data[2] ];
   105 	$subs       = $submenu[ $data[2] ];
   102 	$first_sub  = reset( $subs );
   106 	$first_sub  = reset( $subs );
   103 	$old_parent = $data[2];
   107 	$old_parent = $data[2];
   104 	$new_parent = $first_sub[2];
   108 	$new_parent = $first_sub[2];
       
   109 
   105 	/*
   110 	/*
   106 	 * If the first submenu is not the same as the assigned parent,
   111 	 * If the first submenu is not the same as the assigned parent,
   107 	 * make the first submenu the new parent.
   112 	 * make the first submenu the new parent.
   108 	 */
   113 	 */
   109 	if ( $new_parent != $old_parent ) {
   114 	if ( $new_parent !== $old_parent ) {
   110 		$_wp_real_parent_file[ $old_parent ] = $new_parent;
   115 		$_wp_real_parent_file[ $old_parent ] = $new_parent;
   111 		$menu[ $id ][2]                      = $new_parent;
   116 
       
   117 		$menu[ $id ][2] = $new_parent;
   112 
   118 
   113 		foreach ( $submenu[ $old_parent ] as $index => $data ) {
   119 		foreach ( $submenu[ $old_parent ] as $index => $data ) {
   114 			$submenu[ $new_parent ][ $index ] = $submenu[ $old_parent ][ $index ];
   120 			$submenu[ $new_parent ][ $index ] = $submenu[ $old_parent ][ $index ];
   115 			unset( $submenu[ $old_parent ][ $index ] );
   121 			unset( $submenu[ $old_parent ][ $index ] );
   116 		}
   122 		}
   169 	 * remove the submenu.
   175 	 * remove the submenu.
   170 	 */
   176 	 */
   171 	if ( ! empty( $submenu[ $data[2] ] ) && 1 === count( $submenu[ $data[2] ] ) ) {
   177 	if ( ! empty( $submenu[ $data[2] ] ) && 1 === count( $submenu[ $data[2] ] ) ) {
   172 		$subs      = $submenu[ $data[2] ];
   178 		$subs      = $submenu[ $data[2] ];
   173 		$first_sub = reset( $subs );
   179 		$first_sub = reset( $subs );
   174 		if ( $data[2] == $first_sub[2] ) {
   180 
       
   181 		if ( $data[2] === $first_sub[2] ) {
   175 			unset( $submenu[ $data[2] ] );
   182 			unset( $submenu[ $data[2] ] );
   176 		}
   183 		}
   177 	}
   184 	}
   178 
   185 
   179 	// If submenu is empty...
   186 	// If submenu is empty...
   215  */
   222  */
   216 function add_menu_classes( $menu ) {
   223 function add_menu_classes( $menu ) {
   217 	$first_item  = false;
   224 	$first_item  = false;
   218 	$last_order  = false;
   225 	$last_order  = false;
   219 	$items_count = count( $menu );
   226 	$items_count = count( $menu );
   220 	$i           = 0;
   227 
       
   228 	$i = 0;
   221 
   229 
   222 	foreach ( $menu as $order => $top ) {
   230 	foreach ( $menu as $order => $top ) {
   223 		$i++;
   231 		++$i;
   224 
   232 
   225 		if ( 0 == $order ) { // Dashboard is always shown/single.
   233 		if ( 0 === $order ) { // Dashboard is always shown/single.
   226 			$menu[0][4] = add_cssclass( 'menu-top-first', $top[4] );
   234 			$menu[0][4] = add_cssclass( 'menu-top-first', $top[4] );
   227 			$last_order = 0;
   235 			$last_order = 0;
   228 			continue;
   236 			continue;
   229 		}
   237 		}
   230 
   238 
   231 		if ( 0 === strpos( $top[2], 'separator' ) && false !== $last_order ) { // If separator.
   239 		if ( str_starts_with( $top[2], 'separator' ) && false !== $last_order ) { // If separator.
   232 			$first_item             = true;
   240 			$first_item = true;
   233 			$classes                = $menu[ $last_order ][4];
   241 			$classes    = $menu[ $last_order ][4];
       
   242 
   234 			$menu[ $last_order ][4] = add_cssclass( 'menu-top-last', $classes );
   243 			$menu[ $last_order ][4] = add_cssclass( 'menu-top-last', $classes );
   235 			continue;
   244 			continue;
   236 		}
   245 		}
   237 
   246 
   238 		if ( $first_item ) {
   247 		if ( $first_item ) {
   239 			$classes           = $menu[ $order ][4];
   248 			$first_item = false;
       
   249 			$classes    = $menu[ $order ][4];
       
   250 
   240 			$menu[ $order ][4] = add_cssclass( 'menu-top-first', $classes );
   251 			$menu[ $order ][4] = add_cssclass( 'menu-top-first', $classes );
   241 			$first_item        = false;
   252 		}
   242 		}
   253 
   243 
   254 		if ( $i === $items_count ) { // Last item.
   244 		if ( $i == $items_count ) { // Last item.
   255 			$classes = $menu[ $order ][4];
   245 			$classes           = $menu[ $order ][4];
   256 
   246 			$menu[ $order ][4] = add_cssclass( 'menu-top-last', $classes );
   257 			$menu[ $order ][4] = add_cssclass( 'menu-top-last', $classes );
   247 		}
   258 		}
   248 
   259 
   249 		$last_order = $order;
   260 		$last_order = $order;
   250 	}
   261 	}
   270  *
   281  *
   271  * @param bool $custom Whether custom ordering is enabled. Default false.
   282  * @param bool $custom Whether custom ordering is enabled. Default false.
   272  */
   283  */
   273 if ( apply_filters( 'custom_menu_order', false ) ) {
   284 if ( apply_filters( 'custom_menu_order', false ) ) {
   274 	$menu_order = array();
   285 	$menu_order = array();
       
   286 
   275 	foreach ( $menu as $menu_item ) {
   287 	foreach ( $menu as $menu_item ) {
   276 		$menu_order[] = $menu_item[2];
   288 		$menu_order[] = $menu_item[2];
   277 	}
   289 	}
   278 	unset( $menu_item );
   290 	unset( $menu_item );
       
   291 
   279 	$default_menu_order = $menu_order;
   292 	$default_menu_order = $menu_order;
   280 
   293 
   281 	/**
   294 	/**
   282 	 * Filters the order of administration menu items.
   295 	 * Filters the order of administration menu items.
   283 	 *
   296 	 *
   288 	 *
   301 	 *
   289 	 * @since 2.8.0
   302 	 * @since 2.8.0
   290 	 *
   303 	 *
   291 	 * @param array $menu_order An ordered array of menu items.
   304 	 * @param array $menu_order An ordered array of menu items.
   292 	 */
   305 	 */
   293 	$menu_order         = apply_filters( 'menu_order', $menu_order );
   306 	$menu_order = apply_filters( 'menu_order', $menu_order );
   294 	$menu_order         = array_flip( $menu_order );
   307 	$menu_order = array_flip( $menu_order );
       
   308 
   295 	$default_menu_order = array_flip( $default_menu_order );
   309 	$default_menu_order = array_flip( $default_menu_order );
   296 
   310 
   297 	/**
   311 	/**
   298 	 * @global array $menu_order
   312 	 * @global array $menu_order
   299 	 * @global array $default_menu_order
   313 	 * @global array $default_menu_order
   302 	 * @param array $b
   316 	 * @param array $b
   303 	 * @return int
   317 	 * @return int
   304 	 */
   318 	 */
   305 	function sort_menu( $a, $b ) {
   319 	function sort_menu( $a, $b ) {
   306 		global $menu_order, $default_menu_order;
   320 		global $menu_order, $default_menu_order;
       
   321 
   307 		$a = $a[2];
   322 		$a = $a[2];
   308 		$b = $b[2];
   323 		$b = $b[2];
       
   324 
   309 		if ( isset( $menu_order[ $a ] ) && ! isset( $menu_order[ $b ] ) ) {
   325 		if ( isset( $menu_order[ $a ] ) && ! isset( $menu_order[ $b ] ) ) {
   310 			return -1;
   326 			return -1;
   311 		} elseif ( ! isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) {
   327 		} elseif ( ! isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) {
   312 			return 1;
   328 			return 1;
   313 		} elseif ( isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) {
   329 		} elseif ( isset( $menu_order[ $a ] ) && isset( $menu_order[ $b ] ) ) {
   314 			if ( $menu_order[ $a ] == $menu_order[ $b ] ) {
   330 			if ( $menu_order[ $a ] === $menu_order[ $b ] ) {
   315 				return 0;
   331 				return 0;
   316 			}
   332 			}
   317 			return ( $menu_order[ $a ] < $menu_order[ $b ] ) ? -1 : 1;
   333 			return ( $menu_order[ $a ] < $menu_order[ $b ] ) ? -1 : 1;
   318 		} else {
   334 		} else {
   319 			return ( $default_menu_order[ $a ] <= $default_menu_order[ $b ] ) ? -1 : 1;
   335 			return ( $default_menu_order[ $a ] <= $default_menu_order[ $b ] ) ? -1 : 1;