/wp-admin/menu-header.php

  1. <?php 
  2. /** 
  3. * Displays Administration Menu. 
  4. * 
  5. * @package WordPress 
  6. * @subpackage Administration 
  7. */ 
  8.  
  9. /** 
  10. * The current page. 
  11. * 
  12. * @global string $self 
  13. */ 
  14. $self = preg_replace('|^.*/wp-admin/network/|i', '', $_SERVER['PHP_SELF']); 
  15. $self = preg_replace('|^.*/wp-admin/|i', '', $self); 
  16. $self = preg_replace('|^.*/plugins/|i', '', $self); 
  17. $self = preg_replace('|^.*/mu-plugins/|i', '', $self); 
  18.  
  19. /** 
  20. * For when admin-header is included from within a function. 
  21. * 
  22. * @global array $menu 
  23. * @global array $submenu 
  24. * @global string $parent_file 
  25. * @global string $submenu_file 
  26. */ 
  27. global $menu, $submenu, $parent_file, $submenu_file; 
  28.  
  29. /** 
  30. * Filters the parent file of an admin menu sub-menu item. 
  31. * 
  32. * Allows plugins to move sub-menu items around. 
  33. * 
  34. * @since MU 
  35. * 
  36. * @param string $parent_file The parent file. 
  37. */ 
  38. $parent_file = apply_filters( 'parent_file', $parent_file ); 
  39.  
  40. /** 
  41. * Filters the file of an admin menu sub-menu item. 
  42. * 
  43. * @since 4.4.0 
  44. * 
  45. * @param string $submenu_file The submenu file. 
  46. * @param string $parent_file The submenu item's parent file. 
  47. */ 
  48. $submenu_file = apply_filters( 'submenu_file', $submenu_file, $parent_file ); 
  49.  
  50. get_admin_page_parent(); 
  51.  
  52. /** 
  53. * Display menu. 
  54. * 
  55. * @access private 
  56. * @since 2.7.0 
  57. * 
  58. * @global string $self 
  59. * @global string $parent_file 
  60. * @global string $submenu_file 
  61. * @global string $plugin_page 
  62. * @global string $typenow 
  63. * 
  64. * @param array $menu 
  65. * @param array $submenu 
  66. * @param bool $submenu_as_parent 
  67. */ 
  68. function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { 
  69. global $self, $parent_file, $submenu_file, $plugin_page, $typenow; 
  70.  
  71. $first = true; 
  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 ) { 
  74. $admin_is_parent = false; 
  75. $class = array(); 
  76. $aria_attributes = ''; 
  77. $aria_hidden = ''; 
  78. $is_separator = false; 
  79.  
  80. if ( $first ) { 
  81. $class[] = 'wp-first-item'; 
  82. $first = false; 
  83.  
  84. $submenu_items = array(); 
  85. if ( ! empty( $submenu[$item[2]] ) ) { 
  86. $class[] = 'wp-has-submenu'; 
  87. $submenu_items = $submenu[$item[2]]; 
  88.  
  89. if ( ( $parent_file && $item[2] == $parent_file ) || ( empty($typenow) && $self == $item[2] ) ) { 
  90. $class[] = ! empty( $submenu_items ) ? 'wp-has-current-submenu wp-menu-open' : 'current'; 
  91. } else { 
  92. $class[] = 'wp-not-current-submenu'; 
  93. if ( ! empty( $submenu_items ) ) 
  94. $aria_attributes .= 'aria-haspopup="true"'; 
  95.  
  96. if ( ! empty( $item[4] ) ) 
  97. $class[] = esc_attr( $item[4] ); 
  98.  
  99. $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; 
  100. $id = ! empty( $item[5] ) ? ' id="' . preg_replace( '|[^a-zA-Z0-9_:.]|', '-', $item[5] ) . '"' : ''; 
  101. $img = $img_style = ''; 
  102. $img_class = ' dashicons-before'; 
  103.  
  104. if ( false !== strpos( $class, 'wp-menu-separator' ) ) { 
  105. $is_separator = true; 
  106.  
  107. /** 
  108. * If the string 'none' (previously 'div') is passed instead of a URL, don't output 
  109. * the default menu image so an icon can be added to div.wp-menu-image as background 
  110. * with CSS. Dashicons and base64-encoded data:image/svg_xml URIs are also handled 
  111. * as special cases. 
  112. */ 
  113. if ( ! empty( $item[6] ) ) { 
  114. $img = '<img src="' . $item[6] . '" alt="" />'; 
  115.  
  116. if ( 'none' === $item[6] || 'div' === $item[6] ) { 
  117. $img = '<br />'; 
  118. } elseif ( 0 === strpos( $item[6], 'data:image/svg+xml;base64, ' ) ) { 
  119. $img = '<br />'; 
  120. $img_style = ' style="background-image:url(\'' . esc_attr( $item[6] ) . '\')"'; 
  121. $img_class = ' svg'; 
  122. } elseif ( 0 === strpos( $item[6], 'dashicons-' ) ) { 
  123. $img = '<br />'; 
  124. $img_class = ' dashicons-before ' . sanitize_html_class( $item[6] ); 
  125. $arrow = '<div class="wp-menu-arrow"><div></div></div>'; 
  126.  
  127. $title = wptexturize( $item[0] ); 
  128.  
  129. // hide separators from screen readers 
  130. if ( $is_separator ) { 
  131. $aria_hidden = ' aria-hidden="true"'; 
  132.  
  133. echo "\n\t<li$class$id$aria_hidden>"; 
  134.  
  135. if ( $is_separator ) { 
  136. echo '<div class="separator"></div>'; 
  137. } elseif ( $submenu_as_parent && ! empty( $submenu_items ) ) { 
  138. $submenu_items = array_values( $submenu_items ); // Re-index. 
  139. $menu_hook = get_plugin_page_hook( $submenu_items[0][2], $item[2] ); 
  140. $menu_file = $submenu_items[0][2]; 
  141. if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) 
  142. $menu_file = substr( $menu_file, 0, $pos ); 
  143. if ( ! empty( $menu_hook ) || ( ( 'index.php' != $submenu_items[0][2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { 
  144. $admin_is_parent = true; 
  145. 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>"; 
  146. } else { 
  147. 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>"; 
  148. } elseif ( ! empty( $item[2] ) && current_user_can( $item[1] ) ) { 
  149. $menu_hook = get_plugin_page_hook( $item[2], 'admin.php' ); 
  150. $menu_file = $item[2]; 
  151. if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) 
  152. $menu_file = substr( $menu_file, 0, $pos ); 
  153. if ( ! empty( $menu_hook ) || ( ( 'index.php' != $item[2] ) && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! file_exists( ABSPATH . "/wp-admin/$menu_file" ) ) ) { 
  154. $admin_is_parent = true; 
  155. 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>"; 
  156. } else { 
  157. 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>"; 
  158.  
  159. if ( ! empty( $submenu_items ) ) { 
  160. echo "\n\t<ul class='wp-submenu wp-submenu-wrap'>"; 
  161. echo "<li class='wp-submenu-head' aria-hidden='true'>{$item[0]}</li>"; 
  162.  
  163. $first = true; 
  164.  
  165. // 0 = menu_title, 1 = capability, 2 = menu_slug, 3 = page_title, 4 = classes 
  166. foreach ( $submenu_items as $sub_key => $sub_item ) { 
  167. if ( ! current_user_can( $sub_item[1] ) ) 
  168. continue; 
  169.  
  170. $class = array(); 
  171. if ( $first ) { 
  172. $class[] = 'wp-first-item'; 
  173. $first = false; 
  174.  
  175. $menu_file = $item[2]; 
  176.  
  177. if ( false !== ( $pos = strpos( $menu_file, '?' ) ) ) 
  178. $menu_file = substr( $menu_file, 0, $pos ); 
  179.  
  180. // Handle current for post_type=post|page|foo pages, which won't match $self. 
  181. $self_type = ! empty( $typenow ) ? $self . '?post_type=' . $typenow : 'nothing'; 
  182.  
  183. if ( isset( $submenu_file ) ) { 
  184. if ( $submenu_file == $sub_item[2] ) 
  185. $class[] = 'current'; 
  186. // If plugin_page is set the parent must either match the current page or not physically exist. 
  187. // This allows plugin pages with the same hook to exist under different parents. 
  188. } elseif ( 
  189. ( ! isset( $plugin_page ) && $self == $sub_item[2] ) || 
  190. ( isset( $plugin_page ) && $plugin_page == $sub_item[2] && ( $item[2] == $self_type || $item[2] == $self || file_exists($menu_file) === false ) ) 
  191. ) { 
  192. $class[] = 'current'; 
  193.  
  194. if ( ! empty( $sub_item[4] ) ) { 
  195. $class[] = esc_attr( $sub_item[4] ); 
  196.  
  197. $class = $class ? ' class="' . join( ' ', $class ) . '"' : ''; 
  198.  
  199. $menu_hook = get_plugin_page_hook($sub_item[2], $item[2]); 
  200. $sub_file = $sub_item[2]; 
  201. if ( false !== ( $pos = strpos( $sub_file, '?' ) ) ) 
  202. $sub_file = substr($sub_file, 0, $pos); 
  203.  
  204. $title = wptexturize($sub_item[0]); 
  205.  
  206. if ( ! empty( $menu_hook ) || ( ( 'index.php' != $sub_item[2] ) && file_exists( WP_PLUGIN_DIR . "/$sub_file" ) && ! file_exists( ABSPATH . "/wp-admin/$sub_file" ) ) ) { 
  207. // If admin.php is the current page or if the parent exists as a file in the plugins or admin dir 
  208. if ( ( ! $admin_is_parent && file_exists( WP_PLUGIN_DIR . "/$menu_file" ) && ! is_dir( WP_PLUGIN_DIR . "/{$item[2]}" ) ) || file_exists( $menu_file ) ) 
  209. $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), $item[2] ); 
  210. else 
  211. $sub_item_url = add_query_arg( array( 'page' => $sub_item[2] ), 'admin.php' ); 
  212.  
  213. $sub_item_url = esc_url( $sub_item_url ); 
  214. echo "<li$class><a href='$sub_item_url'$class>$title</a></li>"; 
  215. } else { 
  216. echo "<li$class><a href='{$sub_item[2]}'$class>$title</a></li>"; 
  217. echo "</ul>"; 
  218. echo "</li>"; 
  219.  
  220. echo '<li id="collapse-menu" class="hide-if-no-js">' . 
  221. '<button type="button" id="collapse-button" aria-label="' . esc_attr__( 'Collapse Main menu' ) . '" aria-expanded="true">' . 
  222. '<span class="collapse-button-icon" aria-hidden="true"></span>' . 
  223. '<span class="collapse-button-label">' . __( 'Collapse menu' ) . '</span>' . 
  224. '</button></li>'; 
  225.  
  226. ?> 
  227.  
  228. <div id="adminmenumain" role="navigation" aria-label="<?php esc_attr_e( 'Main menu' ); ?>"> 
  229. <a href="#wpbody-content" class="screen-reader-shortcut"><?php _e( 'Skip to main content' ); ?></a> 
  230. <a href="#wp-toolbar" class="screen-reader-shortcut"><?php _e( 'Skip to toolbar' ); ?></a> 
  231. <div id="adminmenuback"></div> 
  232. <div id="adminmenuwrap"> 
  233. <ul id="adminmenu"> 
  234.  
  235. <?php 
  236.  
  237. _wp_menu_output( $menu, $submenu ); 
  238. /** 
  239. * Fires after the admin menu has been output. 
  240. * 
  241. * @since 2.5.0 
  242. */ 
  243. do_action( 'adminmenu' ); 
  244.  
  245. ?> 
  246. </ul> 
  247. </div> 
  248. </div> 
.