wp/wp-admin/menu-header.php
changeset 16 a86126ab1dd4
parent 9 177826044cd9
child 18 be944660c56a
equal deleted inserted replaced
15:3d4e9c994f10 16:a86126ab1dd4
    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 					}