Index: /trunk/wp-admin/admin.php =================================================================== --- /trunk/wp-admin/admin.php (revision 13578) +++ /trunk/wp-admin/admin.php (revision 13579) @@ -73,8 +73,13 @@ $editing = false; -if (isset($_GET['page'])) { +if ( isset($_GET['page']) ) { $plugin_page = stripslashes($_GET['page']); $plugin_page = plugin_basename($plugin_page); } + +if ( isset($_GET['post_type']) ) + $typenow = sanitize_user($_GET['post_type'], true); +else + $typenow = ''; require(ABSPATH . 'wp-admin/menu.php'); @@ -82,6 +87,10 @@ do_action('admin_init'); -if (isset($plugin_page) ) { - if ( ! $page_hook = get_plugin_page_hook($plugin_page, $pagenow) ) { +if ( isset($plugin_page) ) { + if ( !empty($typenow) ) + $the_parent = $pagenow . '?post_type=' . $typenow; + else + $the_parent = $pagenow; + if ( ! $page_hook = get_plugin_page_hook($plugin_page, $the_parent) ) { $page_hook = get_plugin_page_hook($plugin_page, $plugin_page); // backwards compatibility for plugins using add_management_page @@ -96,4 +105,5 @@ } } + unset($the_parent); } @@ -105,10 +115,4 @@ else if ( isset($pagenow) ) $hook_suffix = $pagenow; - -if ( isset($_GET['post_type']) ) - $typenow = $_GET['post_type']; -else - $typenow = ''; -// @todo validate typenow against post types. set_current_screen(); Index: /trunk/wp-admin/includes/plugin.php =================================================================== --- /trunk/wp-admin/includes/plugin.php (revision 13578) +++ /trunk/wp-admin/includes/plugin.php (revision 13579) @@ -818,4 +818,5 @@ $hookname = get_plugin_page_hookname( $menu_slug, '' ); + if (!empty ( $function ) && !empty ( $hookname ) && current_user_can( $capability ) ) add_action( $hookname, $function ); @@ -1168,4 +1169,5 @@ global $submenu; global $pagenow; + global $typenow; global $plugin_page; global $_wp_real_parent_file; @@ -1216,5 +1218,8 @@ if ( isset( $_wp_real_parent_file[$parent] ) ) $parent = $_wp_real_parent_file[$parent]; - if ( $submenu_array[2] == $pagenow && ( empty($parent_file) || false === strpos($parent_file, '?') ) ) { + if ( !empty($typenow) && ($submenu_array[2] == "$pagenow?post_type=$typenow") ) { + $parent_file = $parent; + return $parent; + } elseif ( $submenu_array[2] == $pagenow && empty($typenow) && ( empty($parent_file) || false === strpos($parent_file, '?') ) ) { $parent_file = $parent; return $parent; @@ -1327,4 +1332,5 @@ } + $plugin_name = preg_replace( '!\.php!', '', $plugin_page ); @@ -1351,4 +1357,5 @@ $hookname = get_plugin_page_hookname($plugin_page, $parent); + if ( !isset($_registered_pages[$hookname]) ) return false; Index: /trunk/wp-admin/includes/template.php =================================================================== --- /trunk/wp-admin/includes/template.php (revision 13578) +++ /trunk/wp-admin/includes/template.php (revision 13579) @@ -3948,6 +3948,4 @@ $current_screen->id = $typenow; $current_screen->post_type = $typenow; - } else { - $typenow = ''; } Index: /trunk/wp-admin/menu-header.php =================================================================== --- /trunk/wp-admin/menu-header.php (revision 13578) +++ /trunk/wp-admin/menu-header.php (revision 13579) @@ -34,5 +34,5 @@ */ function _wp_menu_output( $menu, $submenu, $submenu_as_parent = true ) { - global $self, $parent_file, $submenu_file, $plugin_page, $pagenow; + global $self, $parent_file, $submenu_file, $plugin_page, $pagenow, $typenow; $first = true; @@ -48,5 +48,5 @@ $class[] = 'wp-has-submenu'; - if ( ( $parent_file && $item[2] == $parent_file ) || ( false === strpos($parent_file, '?') && strcmp($self, $item[2]) == 0 ) ) { + if ( ( $parent_file && $item[2] == $parent_file ) || ( false === strpos($parent_file, '?') && $self == $item[2] ) ) { if ( !empty($submenu[$item[2]]) ) $class[] = 'wp-has-current-submenu wp-menu-open'; @@ -113,6 +113,13 @@ $menu_file = $item[2]; + if ( false !== $pos = strpos($menu_file, '?') ) $menu_file = substr($menu_file, 0, $pos); + + // Handle current for post_type=post|page|foo pages, which won't match $self. + if ( !empty($typenow) ) + $self_type = $self . '?post_type=' . $typenow; + else + $self_type = 'nothing'; if ( isset($submenu_file) ) { @@ -121,5 +128,5 @@ // If plugin_page is set the parent must either match the current page or not physically exist. // This allows plugin pages with the same hook to exist under different parents. - } else if ( (isset($plugin_page) && $plugin_page == $sub_item[2] && (!file_exists($menu_file) || ($item[2] == $self))) || (!isset($plugin_page) && $self == $sub_item[2]) ) { + } else if ( (isset($plugin_page) && $plugin_page == $sub_item[2] && (!file_exists($menu_file) || ($item[2] == $self) || ($item[2] == $self_type))) || (!isset($plugin_page) && $self == $sub_item[2]) ) { $class[] = 'current'; } @@ -134,12 +141,9 @@ if ( ( ('index.php' != $sub_item[2]) && file_exists(WP_PLUGIN_DIR . "/$sub_file") ) || ! empty($menu_hook) ) { // If admin.php is the current page or if the parent exists as a file in the plugins or admin dir - - $parent_exists = (!$admin_is_parent && file_exists(WP_PLUGIN_DIR . "/$menu_file") && !is_dir(WP_PLUGIN_DIR . "/{$item[2]}") ) || file_exists($menu_file); - if ( $parent_exists ) - echo "