2003-05-28 03:54:49 -04:00
< ? php
2008-08-14 02:30:38 -04:00
/**
* Build Administration Menu .
*
* @ package WordPress
* @ subpackage Administration
*/
/**
2013-08-23 09:53:11 -04:00
* Constructs the admin menu .
2008-08-14 02:30:38 -04:00
*
* The elements in the array are :
* 0 : Menu item name
* 1 : Minimum level or capability required .
* 2 : The URL of the item ' s file
2008-10-14 01:10:16 -04:00
* 3 : Class
2008-10-23 18:19:19 -04:00
* 4 : ID
2008-12-09 13:03:31 -05:00
* 5 : Icon for top level menu
2008-08-14 02:30:38 -04:00
*
* @ global array $menu
* @ name $menu
* @ var array
*/
2007-02-27 10:24:54 -05:00
2014-03-05 15:04:14 -05:00
$menu [ 2 ] = array ( __ ( 'Dashboard' ), 'read' , 'index.php' , '' , 'menu-top menu-top-first menu-icon-dashboard' , 'menu-dashboard' , 'dashicons-dashboard' );
2010-02-04 15:32:06 -05:00
2011-05-11 16:09:28 -04:00
$submenu [ 'index.php' ][ 0 ] = array ( __ ( 'Home' ), 'read' , 'index.php' );
2010-11-14 13:49:18 -05:00
if ( is_multisite () ) {
$submenu [ 'index.php' ][ 5 ] = array ( __ ( 'My Sites' ), 'read' , 'my-sites.php' );
2011-01-04 03:36:06 -05:00
}
2011-07-26 14:39:57 -04:00
if ( ! is_multisite () || is_super_admin () )
$update_data = wp_get_update_data ();
2010-11-14 13:49:18 -05:00
2011-01-04 03:36:06 -05:00
if ( ! is_multisite () ) {
2012-06-30 08:54:05 -04:00
if ( current_user_can ( 'update_core' ) )
$cap = 'update_core' ;
elseif ( current_user_can ( 'update_plugins' ) )
$cap = 'update_plugins' ;
else
$cap = 'update_themes' ;
$submenu [ 'index.php' ][ 10 ] = array ( sprintf ( __ ( 'Updates %s' ), " <span class='update-plugins count- { $update_data [ 'counts' ][ 'total' ] } ' title=' { $update_data [ 'title' ] } '><span class='update-count'> " . number_format_i18n ( $update_data [ 'counts' ][ 'total' ]) . " </span></span> " ), $cap , 'update-core.php' );
unset ( $cap );
2010-03-05 01:20:41 -05:00
}
2010-01-06 18:41:03 -05:00
2011-05-18 02:20:30 -04:00
$menu [ 4 ] = array ( '' , 'read' , 'separator1' , '' , 'wp-menu-separator' );
2008-10-14 01:10:16 -04:00
2014-03-05 15:04:14 -05:00
$menu [ 5 ] = array ( __ ( 'Posts' ), 'edit_posts' , 'edit.php' , '' , 'open-if-no-js menu-top menu-icon-post' , 'menu-posts' , 'dashicons-admin-post' );
2011-05-11 16:09:28 -04:00
$submenu [ 'edit.php' ][ 5 ] = array ( __ ( 'All Posts' ), 'edit_posts' , 'edit.php' );
2009-03-02 14:20:19 -05:00
/* translators: add new post */
2012-11-28 17:28:20 -05:00
$submenu [ 'edit.php' ][ 10 ] = array ( _x ( 'Add New' , 'post' ), get_post_type_object ( 'post' ) -> cap -> create_posts , 'post-new.php' );
2009-02-12 03:00:29 -05:00
$i = 15 ;
2010-12-02 16:32:19 -05:00
foreach ( get_taxonomies ( array (), 'objects' ) as $tax ) {
2013-08-26 18:35:10 -04:00
if ( ! $tax -> show_ui || ! $tax -> show_in_menu || ! in_array ( 'post' , ( array ) $tax -> object_type , true ) )
2009-02-12 03:00:29 -05:00
continue ;
2010-11-08 21:09:00 -05:00
$submenu [ 'edit.php' ][ $i ++ ] = array ( esc_attr ( $tax -> labels -> menu_name ), $tax -> cap -> manage_terms , 'edit-tags.php?taxonomy=' . $tax -> name );
2009-02-12 03:00:29 -05:00
}
2010-01-26 13:09:45 -05:00
unset ( $tax );
2009-02-12 03:00:29 -05:00
2014-03-05 15:04:14 -05:00
$menu [ 10 ] = array ( __ ( 'Media' ), 'upload_files' , 'upload.php' , '' , 'menu-top menu-icon-media' , 'menu-media' , 'dashicons-admin-media' );
2008-11-25 14:07:57 -05:00
$submenu [ 'upload.php' ][ 5 ] = array ( __ ( 'Library' ), 'upload_files' , 'upload.php' );
2009-03-02 14:20:19 -05:00
/* translators: add new file */
2012-04-11 20:16:37 -04:00
$submenu [ 'upload.php' ][ 10 ] = array ( _x ( 'Add New' , 'file' ), 'upload_files' , 'media-new.php' );
2012-09-21 18:52:54 -04:00
foreach ( get_taxonomies_for_attachments ( 'objects' ) as $tax ) {
2013-08-26 18:35:10 -04:00
if ( ! $tax -> show_ui || ! $tax -> show_in_menu )
2012-09-21 18:52:54 -04:00
continue ;
$submenu [ 'upload.php' ][ $i ++ ] = array ( esc_attr ( $tax -> labels -> menu_name ), $tax -> cap -> manage_terms , 'edit-tags.php?taxonomy=' . $tax -> name . '&post_type=attachment' );
}
unset ( $tax );
2008-11-25 14:05:48 -05:00
2014-03-05 15:04:14 -05:00
$menu [ 15 ] = array ( __ ( 'Links' ), 'manage_links' , 'link-manager.php' , '' , 'menu-top menu-icon-links' , 'menu-links' , 'dashicons-admin-links' );
2011-11-07 12:28:20 -05:00
$submenu [ 'link-manager.php' ][ 5 ] = array ( _x ( 'All Links' , 'admin menu' ), 'manage_links' , 'link-manager.php' );
2009-03-02 14:20:19 -05:00
/* translators: add new links */
2010-01-21 16:37:43 -05:00
$submenu [ 'link-manager.php' ][ 10 ] = array ( _x ( 'Add New' , 'link' ), 'manage_links' , 'link-add.php' );
2010-08-11 17:54:51 -04:00
$submenu [ 'link-manager.php' ][ 15 ] = array ( __ ( 'Link Categories' ), 'manage_categories' , 'edit-tags.php?taxonomy=link_category' );
2008-11-25 14:05:48 -05:00
2014-03-05 15:04:14 -05:00
$menu [ 20 ] = array ( __ ( 'Pages' ), 'edit_pages' , 'edit.php?post_type=page' , '' , 'menu-top menu-icon-page' , 'menu-pages' , 'dashicons-admin-page' );
2011-05-11 16:09:28 -04:00
$submenu [ 'edit.php?post_type=page' ][ 5 ] = array ( __ ( 'All Pages' ), 'edit_pages' , 'edit.php?post_type=page' );
2009-03-02 14:20:19 -05:00
/* translators: add new page */
2012-11-28 17:28:20 -05:00
$submenu [ 'edit.php?post_type=page' ][ 10 ] = array ( _x ( 'Add New' , 'page' ), get_post_type_object ( 'page' ) -> cap -> create_posts , 'post-new.php?post_type=page' );
2010-05-26 15:03:46 -04:00
$i = 15 ;
2010-12-02 16:32:19 -05:00
foreach ( get_taxonomies ( array (), 'objects' ) as $tax ) {
2013-08-26 18:35:10 -04:00
if ( ! $tax -> show_ui || ! $tax -> show_in_menu || ! in_array ( 'page' , ( array ) $tax -> object_type , true ) )
2010-05-26 15:03:46 -04:00
continue ;
2010-11-08 21:09:00 -05:00
$submenu [ 'edit.php?post_type=page' ][ $i ++ ] = array ( esc_attr ( $tax -> labels -> menu_name ), $tax -> cap -> manage_terms , 'edit-tags.php?taxonomy=' . $tax -> name . '&post_type=page' );
2010-05-26 15:03:46 -04:00
}
unset ( $tax );
2008-09-25 15:33:53 -04:00
2010-10-07 16:12:49 -04:00
$awaiting_mod = wp_count_comments ();
$awaiting_mod = $awaiting_mod -> moderated ;
2014-03-05 15:04:14 -05:00
$menu [ 25 ] = array ( sprintf ( __ ( 'Comments %s' ), " <span class='awaiting-mod count- $awaiting_mod '><span class='pending-count'> " . number_format_i18n ( $awaiting_mod ) . " </span></span> " ), 'edit_posts' , 'edit-comments.php' , '' , 'menu-top menu-icon-comments' , 'menu-comments' , 'dashicons-admin-comments' );
2010-10-07 16:12:49 -04:00
unset ( $awaiting_mod );
2008-09-25 15:33:53 -04:00
2011-05-11 16:09:28 -04:00
$submenu [ 'edit-comments.php' ][ 0 ] = array ( __ ( 'All Comments' ), 'edit_posts' , 'edit-comments.php' );
2008-11-05 17:46:58 -05:00
$_wp_last_object_menu = 25 ; // The index of the last top-level menu in the object menu group
2010-10-19 03:58:02 -04:00
foreach ( ( array ) get_post_types ( array ( 'show_ui' => true , '_builtin' => false , 'show_in_menu' => true ) ) as $ptype ) {
2010-04-15 23:29:34 -04:00
$ptype_obj = get_post_type_object ( $ptype );
2010-10-19 03:58:02 -04:00
// Check if it should be a submenu.
if ( $ptype_obj -> show_in_menu !== true )
continue ;
2010-06-27 00:21:33 -04:00
$ptype_menu_position = is_int ( $ptype_obj -> menu_position ) ? $ptype_obj -> menu_position : ++ $_wp_last_object_menu ; // If we're to use $_wp_last_object_menu, increment it first.
2010-05-15 01:38:40 -04:00
$ptype_for_id = sanitize_html_class ( $ptype );
2013-12-05 01:38:09 -05:00
2010-04-15 23:29:34 -04:00
if ( is_string ( $ptype_obj -> menu_icon ) ) {
2013-12-05 01:38:09 -05:00
// Special handling for data:image/svg+xml and Dashicons.
if ( 0 === strpos ( $ptype_obj -> menu_icon , 'data:image/svg+xml;base64,' ) || 0 === strpos ( $ptype_obj -> menu_icon , 'dashicons-' ) ) {
$menu_icon = $ptype_obj -> menu_icon ;
} else {
$menu_icon = esc_url ( $ptype_obj -> menu_icon );
}
2010-05-15 01:38:40 -04:00
$ptype_class = $ptype_for_id ;
2010-04-15 23:29:34 -04:00
} else {
2014-03-05 15:04:14 -05:00
$menu_icon = 'dashicons-admin-post' ;
2010-04-15 23:29:34 -04:00
$ptype_class = 'post' ;
}
2010-04-10 06:48:30 -04:00
// if $ptype_menu_position is already populated or will be populated by a hard-coded value below, increment the position.
$core_menu_positions = array ( 59 , 60 , 65 , 70 , 75 , 80 , 85 , 99 );
while ( isset ( $menu [ $ptype_menu_position ]) || in_array ( $ptype_menu_position , $core_menu_positions ) )
$ptype_menu_position ++ ;
2010-11-08 21:09:00 -05:00
$menu [ $ptype_menu_position ] = array ( esc_attr ( $ptype_obj -> labels -> menu_name ), $ptype_obj -> cap -> edit_posts , " edit.php?post_type= $ptype " , '' , 'menu-top menu-icon-' . $ptype_class , 'menu-posts-' . $ptype_for_id , $menu_icon );
2011-05-11 16:09:28 -04:00
$submenu [ " edit.php?post_type= $ptype " ][ 5 ] = array ( $ptype_obj -> labels -> all_items , $ptype_obj -> cap -> edit_posts , " edit.php?post_type= $ptype " );
2012-11-28 13:24:11 -05:00
$submenu [ " edit.php?post_type= $ptype " ][ 10 ] = array ( $ptype_obj -> labels -> add_new , $ptype_obj -> cap -> create_posts , " post-new.php?post_type= $ptype " );
2010-01-04 11:58:43 -05:00
$i = 15 ;
2010-12-02 16:32:19 -05:00
foreach ( get_taxonomies ( array (), 'objects' ) as $tax ) {
2013-08-26 18:35:10 -04:00
if ( ! $tax -> show_ui || ! $tax -> show_in_menu || ! in_array ( $ptype , ( array ) $tax -> object_type , true ) )
2010-01-04 11:58:43 -05:00
continue ;
2010-11-08 21:09:00 -05:00
$submenu [ " edit.php?post_type= $ptype " ][ $i ++ ] = array ( esc_attr ( $tax -> labels -> menu_name ), $tax -> cap -> manage_terms , " edit-tags.php?taxonomy= $tax->name &post_type= $ptype " );
2010-01-04 11:58:43 -05:00
}
}
2010-11-08 22:28:09 -05:00
unset ( $ptype , $ptype_obj , $ptype_class , $ptype_for_id , $ptype_menu_position , $menu_icon , $i , $tax );
2010-01-04 11:58:43 -05:00
2011-05-18 02:20:30 -04:00
$menu [ 59 ] = array ( '' , 'read' , 'separator2' , '' , 'wp-menu-separator' );
2008-10-14 01:10:16 -04:00
2013-03-29 16:39:54 -04:00
$appearance_cap = current_user_can ( 'switch_themes' ) ? 'switch_themes' : 'edit_theme_options' ;
2013-04-22 15:33:39 -04:00
2014-03-05 15:04:14 -05:00
$menu [ 60 ] = array ( __ ( 'Appearance' ), $appearance_cap , 'themes.php' , '' , 'menu-top menu-icon-appearance' , 'menu-appearance' , 'dashicons-admin-appearance' );
2013-04-22 15:33:39 -04:00
$submenu [ 'themes.php' ][ 5 ] = array ( __ ( 'Themes' ), $appearance_cap , 'themes.php' );
2014-07-08 13:15:14 -04:00
$customize_url = add_query_arg ( 'return' , urlencode ( wp_unslash ( $_SERVER [ 'REQUEST_URI' ] ) ), 'customize.php' );
$submenu [ 'themes.php' ][ 6 ] = array ( __ ( 'Customize' ), 'edit_theme_options' , $customize_url , 'hide-if-no-customize' );
unset ( $customize_url );
if ( current_theme_supports ( 'menus' ) || current_theme_supports ( 'widgets' ) ) {
2013-03-29 16:39:54 -04:00
$submenu [ 'themes.php' ][ 10 ] = array ( __ ( 'Menus' ), 'edit_theme_options' , 'nav-menus.php' );
2014-07-08 13:15:14 -04:00
}
2013-03-29 16:39:54 -04:00
unset ( $appearance_cap );
2010-03-04 07:23:21 -05:00
2011-09-03 10:18:10 -04:00
// Add 'Editor' to the bottom of the Appearance menu.
2010-12-06 10:41:19 -05:00
if ( ! is_multisite () )
add_action ( 'admin_menu' , '_add_themes_utility_last' , 101 );
2010-03-04 07:23:21 -05:00
function _add_themes_utility_last () {
2010-03-20 21:01:45 -04:00
// Must use API on the admin_menu hook, direct modification is only possible on/before the _admin_menu hook
add_submenu_page ( 'themes.php' , _x ( 'Editor' , 'theme editor' ), _x ( 'Editor' , 'theme editor' ), 'edit_themes' , 'theme-editor.php' );
2010-03-04 07:23:21 -05:00
}
2008-09-25 15:33:53 -04:00
2012-06-30 08:55:09 -04:00
$count = '' ;
if ( ! is_multisite () && current_user_can ( 'update_plugins' ) ) {
if ( ! isset ( $update_data ) )
$update_data = wp_get_update_data ();
$count = " <span class='update-plugins count- { $update_data [ 'counts' ][ 'plugins' ] } '><span class='plugin-count'> " . number_format_i18n ( $update_data [ 'counts' ][ 'plugins' ]) . " </span></span> " ;
}
2011-06-06 12:59:24 -04:00
2014-03-05 15:04:14 -05:00
$menu [ 65 ] = array ( sprintf ( __ ( 'Plugins %s' ), $count ), 'activate_plugins' , 'plugins.php' , '' , 'menu-top menu-icon-plugins' , 'menu-plugins' , 'dashicons-admin-plugins' );
2011-06-10 19:01:45 -04:00
2012-06-30 08:55:09 -04:00
$submenu [ 'plugins.php' ][ 5 ] = array ( __ ( 'Installed Plugins' ), 'activate_plugins' , 'plugins.php' );
2011-05-25 12:06:42 -04:00
2012-06-30 08:55:09 -04:00
if ( ! is_multisite () ) {
/* translators: add new plugin */
$submenu [ 'plugins.php' ][ 10 ] = array ( _x ( 'Add New' , 'plugin' ), 'install_plugins' , 'plugin-install.php' );
$submenu [ 'plugins.php' ][ 15 ] = array ( _x ( 'Editor' , 'plugin editor' ), 'edit_plugins' , 'plugin-editor.php' );
}
2012-06-30 08:40:25 -04:00
unset ( $update_data );
2008-10-02 14:52:45 -04:00
2010-04-22 15:48:13 -04:00
if ( current_user_can ( 'list_users' ) )
2014-03-05 15:04:14 -05:00
$menu [ 70 ] = array ( __ ( 'Users' ), 'list_users' , 'users.php' , '' , 'menu-top menu-icon-users' , 'menu-users' , 'dashicons-admin-users' );
2008-10-02 14:52:45 -04:00
else
2014-03-05 15:04:14 -05:00
$menu [ 70 ] = array ( __ ( 'Profile' ), 'read' , 'profile.php' , '' , 'menu-top menu-icon-users' , 'menu-users' , 'dashicons-admin-users' );
2008-10-02 14:52:45 -04:00
2010-04-22 15:48:13 -04:00
if ( current_user_can ( 'list_users' ) ) {
2008-10-02 14:52:45 -04:00
$_wp_real_parent_file [ 'profile.php' ] = 'users.php' ; // Back-compat for plugins adding submenus to profile.php.
2011-05-11 16:09:28 -04:00
$submenu [ 'users.php' ][ 5 ] = array ( __ ( 'All Users' ), 'list_users' , 'users.php' );
2011-02-09 12:30:26 -05:00
if ( current_user_can ( 'create_users' ) )
$submenu [ 'users.php' ][ 10 ] = array ( _x ( 'Add New' , 'user' ), 'create_users' , 'user-new.php' );
else
$submenu [ 'users.php' ][ 10 ] = array ( _x ( 'Add New' , 'user' ), 'promote_users' , 'user-new.php' );
2010-01-15 17:11:12 -05:00
2008-11-11 14:47:22 -05:00
$submenu [ 'users.php' ][ 15 ] = array ( __ ( 'Your Profile' ), 'read' , 'profile.php' );
2008-10-02 14:52:45 -04:00
} else {
$_wp_real_parent_file [ 'users.php' ] = 'profile.php' ;
$submenu [ 'profile.php' ][ 5 ] = array ( __ ( 'Your Profile' ), 'read' , 'profile.php' );
2011-02-09 12:30:26 -05:00
if ( current_user_can ( 'create_users' ) )
$submenu [ 'profile.php' ][ 10 ] = array ( __ ( 'Add New User' ), 'create_users' , 'user-new.php' );
else
$submenu [ 'profile.php' ][ 10 ] = array ( __ ( 'Add New User' ), 'promote_users' , 'user-new.php' );
2008-10-02 14:52:45 -04:00
}
2014-03-05 15:04:14 -05:00
$menu [ 75 ] = array ( __ ( 'Tools' ), 'edit_posts' , 'tools.php' , '' , 'menu-top menu-icon-tools' , 'menu-tools' , 'dashicons-admin-tools' );
2011-05-24 17:58:01 -04:00
$submenu [ 'tools.php' ][ 5 ] = array ( __ ( 'Available Tools' ), 'edit_posts' , 'tools.php' );
2008-11-27 16:11:25 -05:00
$submenu [ 'tools.php' ][ 10 ] = array ( __ ( 'Import' ), 'import' , 'import.php' );
2011-05-16 06:44:42 -04:00
$submenu [ 'tools.php' ][ 15 ] = array ( __ ( 'Export' ), 'export' , 'export.php' );
2010-03-10 11:06:53 -05:00
if ( is_multisite () && ! is_main_site () )
$submenu [ 'tools.php' ][ 25 ] = array ( __ ( 'Delete Site' ), 'manage_options' , 'ms-delete-site.php' );
2011-01-11 16:00:23 -05:00
if ( ! is_multisite () && defined ( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE )
2011-05-24 17:58:01 -04:00
$submenu [ 'tools.php' ][ 50 ] = array ( __ ( 'Network Setup' ), 'manage_options' , 'network.php' );
2008-10-02 14:52:45 -04:00
2014-03-05 15:04:14 -05:00
$menu [ 80 ] = array ( __ ( 'Settings' ), 'manage_options' , 'options-general.php' , '' , 'menu-top menu-icon-settings' , 'menu-settings' , 'dashicons-admin-settings' );
2010-01-21 16:37:43 -05:00
$submenu [ 'options-general.php' ][ 10 ] = array ( _x ( 'General' , 'settings screen' ), 'manage_options' , 'options-general.php' );
2008-08-21 19:18:51 -04:00
$submenu [ 'options-general.php' ][ 15 ] = array ( __ ( 'Writing' ), 'manage_options' , 'options-writing.php' );
$submenu [ 'options-general.php' ][ 20 ] = array ( __ ( 'Reading' ), 'manage_options' , 'options-reading.php' );
$submenu [ 'options-general.php' ][ 25 ] = array ( __ ( 'Discussion' ), 'manage_options' , 'options-discussion.php' );
2008-09-16 18:37:49 -04:00
$submenu [ 'options-general.php' ][ 30 ] = array ( __ ( 'Media' ), 'manage_options' , 'options-media.php' );
$submenu [ 'options-general.php' ][ 40 ] = array ( __ ( 'Permalinks' ), 'manage_options' , 'options-permalink.php' );
2004-09-11 12:12:40 -04:00
2009-02-13 17:57:02 -05:00
$_wp_last_utility_menu = 80 ; // The index of the last top-level menu in the utility menu group
2008-11-28 14:34:49 -05:00
2011-06-01 10:41:43 -04:00
$menu [ 99 ] = array ( '' , 'read' , 'separator-last' , '' , 'wp-menu-separator' );
2008-10-15 02:54:25 -04:00
2008-08-22 00:32:42 -04:00
// Back-compat for old top-levels
2008-12-09 13:03:31 -05:00
$_wp_real_parent_file [ 'post.php' ] = 'edit.php' ;
2008-11-25 14:05:48 -05:00
$_wp_real_parent_file [ 'post-new.php' ] = 'edit.php' ;
2010-02-04 17:09:35 -05:00
$_wp_real_parent_file [ 'edit-pages.php' ] = 'edit.php?post_type=page' ;
$_wp_real_parent_file [ 'page-new.php' ] = 'edit.php?post_type=page' ;
2010-11-09 14:23:42 -05:00
$_wp_real_parent_file [ 'wpmu-admin.php' ] = 'tools.php' ;
$_wp_real_parent_file [ 'ms-admin.php' ] = 'tools.php' ;
2008-08-22 00:32:42 -04:00
2010-07-30 16:34:54 -04:00
// ensure we're backwards compatible
$compat = array (
'index' => 'dashboard' ,
'edit' => 'posts' ,
'post' => 'posts' ,
'upload' => 'media' ,
'link-manager' => 'links' ,
'edit-pages' => 'pages' ,
'page' => 'pages' ,
'edit-comments' => 'comments' ,
'options-general' => 'settings' ,
'themes' => 'appearance' ,
);
2010-10-07 15:34:18 -04:00
require_once ( ABSPATH . 'wp-admin/includes/menu.php' );