2003-05-28 09:54:49 +02:00
< ? php
2008-08-14 08:30:38 +02:00
/**
* Build Administration Menu .
*
* @ package WordPress
* @ subpackage Administration
*/
/**
2013-08-23 15:53:11 +02:00
* Constructs the admin menu .
2008-08-14 08:30:38 +02: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 07:10:16 +02:00
* 3 : Class
2008-10-24 00:19:19 +02:00
* 4 : ID
2008-12-09 19:03:31 +01:00
* 5 : Icon for top level menu
2008-08-14 08:30:38 +02:00
*
* @ global array $menu
*/
2007-02-27 16:24:54 +01:00
2014-03-05 21:04:14 +01:00
$menu [ 2 ] = array ( __ ( 'Dashboard' ), 'read' , 'index.php' , '' , 'menu-top menu-top-first menu-icon-dashboard' , 'menu-dashboard' , 'dashicons-dashboard' );
2010-02-04 21:32:06 +01:00
2011-05-11 22:09:28 +02:00
$submenu [ 'index.php' ][ 0 ] = array ( __ ( 'Home' ), 'read' , 'index.php' );
2010-11-14 19:49:18 +01:00
if ( is_multisite () ) {
$submenu [ 'index.php' ][ 5 ] = array ( __ ( 'My Sites' ), 'read' , 'my-sites.php' );
2011-01-04 09:36:06 +01:00
}
2016-12-07 23:14:42 +01:00
if ( ! is_multisite () || current_user_can ( 'update_core' ) ) {
2011-07-26 20:39:57 +02:00
$update_data = wp_get_update_data ();
2016-12-07 23:14:42 +01:00
}
2010-11-14 19:49:18 +01:00
2011-01-04 09:36:06 +01:00
if ( ! is_multisite () ) {
2012-06-30 14:54:05 +02:00
if ( current_user_can ( 'update_core' ) )
$cap = 'update_core' ;
elseif ( current_user_can ( 'update_plugins' ) )
$cap = 'update_plugins' ;
else
$cap = 'update_themes' ;
2016-10-19 12:27:29 +02:00
$submenu [ 'index.php' ][ 10 ] = array ( sprintf ( __ ( 'Updates %s' ), " <span class='update-plugins count- { $update_data [ 'counts' ][ 'total' ] } '><span class='update-count'> " . number_format_i18n ( $update_data [ 'counts' ][ 'total' ]) . " </span></span> " ), $cap , 'update-core.php' );
2012-06-30 14:54:05 +02:00
unset ( $cap );
2010-03-05 07:20:41 +01:00
}
2010-01-07 00:41:03 +01:00
2011-05-18 08:20:30 +02:00
$menu [ 4 ] = array ( '' , 'read' , 'separator1' , '' , 'wp-menu-separator' );
2008-10-14 07:10:16 +02:00
2015-08-24 23:19:24 +02:00
// $menu[5] = Posts
2009-02-12 09:00:29 +01:00
2014-03-05 21:04:14 +01:00
$menu [ 10 ] = array ( __ ( 'Media' ), 'upload_files' , 'upload.php' , '' , 'menu-top menu-icon-media' , 'menu-media' , 'dashicons-admin-media' );
2008-11-25 20:07:57 +01:00
$submenu [ 'upload.php' ][ 5 ] = array ( __ ( 'Library' ), 'upload_files' , 'upload.php' );
2009-03-02 20:20:19 +01:00
/* translators: add new file */
2012-04-12 02:16:37 +02:00
$submenu [ 'upload.php' ][ 10 ] = array ( _x ( 'Add New' , 'file' ), 'upload_files' , 'media-new.php' );
2015-09-02 20:48:22 +02:00
$i = 15 ;
2012-09-22 00:52:54 +02:00
foreach ( get_taxonomies_for_attachments ( 'objects' ) as $tax ) {
2013-08-27 00:35:10 +02:00
if ( ! $tax -> show_ui || ! $tax -> show_in_menu )
2012-09-22 00:52:54 +02: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' );
}
2015-09-02 20:48:22 +02:00
unset ( $tax , $i );
2008-11-25 20:05:48 +01:00
2014-03-05 21:04:14 +01:00
$menu [ 15 ] = array ( __ ( 'Links' ), 'manage_links' , 'link-manager.php' , '' , 'menu-top menu-icon-links' , 'menu-links' , 'dashicons-admin-links' );
2011-11-07 18:28:20 +01:00
$submenu [ 'link-manager.php' ][ 5 ] = array ( _x ( 'All Links' , 'admin menu' ), 'manage_links' , 'link-manager.php' );
2009-03-02 20:20:19 +01:00
/* translators: add new links */
2010-01-21 22:37:43 +01:00
$submenu [ 'link-manager.php' ][ 10 ] = array ( _x ( 'Add New' , 'link' ), 'manage_links' , 'link-add.php' );
2010-08-11 23:54:51 +02:00
$submenu [ 'link-manager.php' ][ 15 ] = array ( __ ( 'Link Categories' ), 'manage_categories' , 'edit-tags.php?taxonomy=link_category' );
2008-11-25 20:05:48 +01:00
2015-08-24 23:19:24 +02:00
// $menu[20] = Pages
2008-09-25 21:33:53 +02:00
2015-11-18 22:34:26 +01:00
// Avoid the comment count query for users who cannot edit_posts.
if ( current_user_can ( 'edit_posts' ) ) {
$awaiting_mod = wp_count_comments ();
$awaiting_mod = $awaiting_mod -> moderated ;
$menu [ 25 ] = array (
sprintf ( __ ( 'Comments %s' ), '<span class="awaiting-mod count-' . absint ( $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' ,
);
unset ( $awaiting_mod );
}
2008-09-25 21:33:53 +02:00
2011-05-11 22:09:28 +02:00
$submenu [ 'edit-comments.php' ][ 0 ] = array ( __ ( 'All Comments' ), 'edit_posts' , 'edit-comments.php' );
2008-11-05 23:46:58 +01:00
$_wp_last_object_menu = 25 ; // The index of the last top-level menu in the object menu group
2015-08-24 23:19:24 +02:00
$types = ( array ) get_post_types ( array ( 'show_ui' => true , '_builtin' => false , 'show_in_menu' => true ) );
$builtin = array ( 'post' , 'page' );
foreach ( array_merge ( $builtin , $types ) as $ptype ) {
2010-04-16 05:29:34 +02:00
$ptype_obj = get_post_type_object ( $ptype );
2010-10-19 09:58:02 +02:00
// Check if it should be a submenu.
if ( $ptype_obj -> show_in_menu !== true )
continue ;
2010-06-27 06:21:33 +02: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 07:38:40 +02:00
$ptype_for_id = sanitize_html_class ( $ptype );
2013-12-05 07:38:09 +01:00
2015-11-09 23:00:26 +01:00
$menu_icon = 'dashicons-admin-post' ;
2010-04-16 05:29:34 +02:00
if ( is_string ( $ptype_obj -> menu_icon ) ) {
2013-12-05 07:38:09 +01: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 );
}
2015-08-24 23:19:24 +02:00
} elseif ( in_array ( $ptype , $builtin ) ) {
$menu_icon = 'dashicons-admin-' . $ptype ;
}
$menu_class = 'menu-top menu-icon-' . $ptype_for_id ;
// 'post' special case
if ( 'post' === $ptype ) {
$menu_class .= ' open-if-no-js' ;
$ptype_file = " edit.php " ;
$post_new_file = " post-new.php " ;
$edit_tags_file = " edit-tags.php?taxonomy=%s " ;
2010-04-16 05:29:34 +02:00
} else {
2015-08-24 23:19:24 +02:00
$ptype_file = " edit.php?post_type= $ptype " ;
$post_new_file = " post-new.php?post_type= $ptype " ;
$edit_tags_file = " edit-tags.php?taxonomy=%s&post_type= $ptype " ;
2010-04-16 05:29:34 +02:00
}
2010-04-10 12:48:30 +02:00
2015-08-24 23:19:24 +02:00
if ( in_array ( $ptype , $builtin ) ) {
$ptype_menu_id = 'menu-' . $ptype_for_id . 's' ;
} else {
$ptype_menu_id = 'menu-posts-' . $ptype_for_id ;
}
2014-07-17 11:14:16 +02:00
/*
* If $ptype_menu_position is already populated or will be populated
* by a hard - coded value below , increment the position .
*/
2010-04-10 12:48:30 +02:00
$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 ++ ;
2015-08-24 23:19:24 +02:00
$menu [ $ptype_menu_position ] = array ( esc_attr ( $ptype_obj -> labels -> menu_name ), $ptype_obj -> cap -> edit_posts , $ptype_file , '' , $menu_class , $ptype_menu_id , $menu_icon );
$submenu [ $ptype_file ][ 5 ] = array ( $ptype_obj -> labels -> all_items , $ptype_obj -> cap -> edit_posts , $ptype_file );
$submenu [ $ptype_file ][ 10 ] = array ( $ptype_obj -> labels -> add_new , $ptype_obj -> cap -> create_posts , $post_new_file );
2010-01-04 17:58:43 +01:00
$i = 15 ;
2010-12-02 22:32:19 +01:00
foreach ( get_taxonomies ( array (), 'objects' ) as $tax ) {
2013-08-27 00:35:10 +02:00
if ( ! $tax -> show_ui || ! $tax -> show_in_menu || ! in_array ( $ptype , ( array ) $tax -> object_type , true ) )
2010-01-04 17:58:43 +01:00
continue ;
2015-08-24 23:19:24 +02:00
$submenu [ $ptype_file ][ $i ++ ] = array ( esc_attr ( $tax -> labels -> menu_name ), $tax -> cap -> manage_terms , sprintf ( $edit_tags_file , $tax -> name ) );
2010-01-04 17:58:43 +01:00
}
}
2015-10-01 02:48:25 +02:00
unset ( $ptype , $ptype_obj , $ptype_for_id , $ptype_menu_position , $menu_icon , $i , $tax , $post_new_file );
2010-01-04 17:58:43 +01:00
2011-05-18 08:20:30 +02:00
$menu [ 59 ] = array ( '' , 'read' , 'separator2' , '' , 'wp-menu-separator' );
2008-10-14 07:10:16 +02:00
2013-03-29 21:39:54 +01:00
$appearance_cap = current_user_can ( 'switch_themes' ) ? 'switch_themes' : 'edit_theme_options' ;
2013-04-22 21:33:39 +02:00
2015-02-11 23:48:27 +01:00
$menu [ 60 ] = array ( __ ( 'Appearance' ), $appearance_cap , 'themes.php' , '' , 'menu-top menu-icon-appearance' , 'menu-appearance' , 'dashicons-admin-appearance' );
2013-04-22 21:33:39 +02:00
$submenu [ 'themes.php' ][ 5 ] = array ( __ ( 'Themes' ), $appearance_cap , 'themes.php' );
2014-07-08 19:15:14 +02:00
2017-03-23 00:04:42 +01:00
$customize_url = add_query_arg ( 'return' , urlencode ( remove_query_arg ( wp_removable_query_args (), wp_unslash ( $_SERVER [ 'REQUEST_URI' ] ) ) ), 'customize.php' );
2015-02-11 23:48:27 +01:00
$submenu [ 'themes.php' ][ 6 ] = array ( __ ( 'Customize' ), 'customize' , esc_url ( $customize_url ), '' , 'hide-if-no-customize' );
2014-11-20 16:29:23 +01:00
2014-07-08 19:15:14 +02:00
if ( current_theme_supports ( 'menus' ) || current_theme_supports ( 'widgets' ) ) {
2015-02-11 23:48:27 +01:00
$submenu [ 'themes.php' ][ 10 ] = array ( __ ( 'Menus' ), 'edit_theme_options' , 'nav-menus.php' );
2014-07-08 19:15:14 +02:00
}
2013-03-29 21:39:54 +01:00
2014-11-20 16:29:23 +01:00
if ( current_theme_supports ( 'custom-header' ) && current_user_can ( 'customize' ) ) {
2015-02-11 23:48:27 +01:00
$customize_header_url = add_query_arg ( array ( 'autofocus' => array ( 'control' => 'header_image' ) ), $customize_url );
$submenu [ 'themes.php' ][ 15 ] = array ( __ ( 'Header' ), $appearance_cap , esc_url ( $customize_header_url ), '' , 'hide-if-no-customize' );
2014-11-20 16:29:23 +01:00
}
if ( current_theme_supports ( 'custom-background' ) && current_user_can ( 'customize' ) ) {
2015-02-11 23:48:27 +01:00
$customize_background_url = add_query_arg ( array ( 'autofocus' => array ( 'control' => 'background_image' ) ), $customize_url );
$submenu [ 'themes.php' ][ 20 ] = array ( __ ( 'Background' ), $appearance_cap , esc_url ( $customize_background_url ), '' , 'hide-if-no-customize' );
2014-11-20 16:29:23 +01:00
}
unset ( $customize_url );
2013-03-29 21:39:54 +01:00
unset ( $appearance_cap );
2010-03-04 13:23:21 +01:00
2011-09-03 16:18:10 +02:00
// Add 'Editor' to the bottom of the Appearance menu.
2015-05-29 22:17:26 +02:00
if ( ! is_multisite () ) {
2010-12-06 16:41:19 +01:00
add_action ( 'admin_menu' , '_add_themes_utility_last' , 101 );
2015-05-29 22:17:26 +02:00
}
/**
2016-02-03 21:07:27 +01:00
* Adds the ( theme ) 'Editor' link to the bottom of the Appearance menu .
2015-05-29 22:17:26 +02:00
*
2016-02-03 21:07:27 +01:00
* @ access private
* @ since 3.0 . 0
2015-05-29 22:17:26 +02:00
*/
2010-03-04 13:23:21 +01:00
function _add_themes_utility_last () {
2010-03-21 02:01:45 +01: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 13:23:21 +01:00
}
2008-09-25 21:33:53 +02:00
2012-06-30 14:55:09 +02: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 18:59:24 +02:00
2014-03-05 21:04:14 +01:00
$menu [ 65 ] = array ( sprintf ( __ ( 'Plugins %s' ), $count ), 'activate_plugins' , 'plugins.php' , '' , 'menu-top menu-icon-plugins' , 'menu-plugins' , 'dashicons-admin-plugins' );
2011-06-11 01:01:45 +02:00
2012-06-30 14:55:09 +02:00
$submenu [ 'plugins.php' ][ 5 ] = array ( __ ( 'Installed Plugins' ), 'activate_plugins' , 'plugins.php' );
2011-05-25 18:06:42 +02:00
2012-06-30 14:55:09 +02: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 14:40:25 +02:00
unset ( $update_data );
2008-10-02 20:52:45 +02:00
2010-04-22 21:48:13 +02:00
if ( current_user_can ( 'list_users' ) )
2014-03-05 21:04:14 +01:00
$menu [ 70 ] = array ( __ ( 'Users' ), 'list_users' , 'users.php' , '' , 'menu-top menu-icon-users' , 'menu-users' , 'dashicons-admin-users' );
2008-10-02 20:52:45 +02:00
else
2014-03-05 21:04:14 +01:00
$menu [ 70 ] = array ( __ ( 'Profile' ), 'read' , 'profile.php' , '' , 'menu-top menu-icon-users' , 'menu-users' , 'dashicons-admin-users' );
2008-10-02 20:52:45 +02:00
2010-04-22 21:48:13 +02:00
if ( current_user_can ( 'list_users' ) ) {
2008-10-02 20:52:45 +02:00
$_wp_real_parent_file [ 'profile.php' ] = 'users.php' ; // Back-compat for plugins adding submenus to profile.php.
2011-05-11 22:09:28 +02:00
$submenu [ 'users.php' ][ 5 ] = array ( __ ( 'All Users' ), 'list_users' , 'users.php' );
2014-11-30 20:18:23 +01:00
if ( current_user_can ( 'create_users' ) ) {
2011-02-09 18:30:26 +01:00
$submenu [ 'users.php' ][ 10 ] = array ( _x ( 'Add New' , 'user' ), 'create_users' , 'user-new.php' );
2014-11-30 20:18:23 +01:00
} elseif ( is_multisite () ) {
2011-02-09 18:30:26 +01:00
$submenu [ 'users.php' ][ 10 ] = array ( _x ( 'Add New' , 'user' ), 'promote_users' , 'user-new.php' );
2014-11-30 20:18:23 +01:00
}
2010-01-15 23:11:12 +01:00
2008-11-11 20:47:22 +01:00
$submenu [ 'users.php' ][ 15 ] = array ( __ ( 'Your Profile' ), 'read' , 'profile.php' );
2008-10-02 20:52:45 +02:00
} else {
$_wp_real_parent_file [ 'users.php' ] = 'profile.php' ;
$submenu [ 'profile.php' ][ 5 ] = array ( __ ( 'Your Profile' ), 'read' , 'profile.php' );
2014-11-30 20:18:23 +01:00
if ( current_user_can ( 'create_users' ) ) {
2011-02-09 18:30:26 +01:00
$submenu [ 'profile.php' ][ 10 ] = array ( __ ( 'Add New User' ), 'create_users' , 'user-new.php' );
2014-11-30 20:18:23 +01:00
} elseif ( is_multisite () ) {
2011-02-09 18:30:26 +01:00
$submenu [ 'profile.php' ][ 10 ] = array ( __ ( 'Add New User' ), 'promote_users' , 'user-new.php' );
2014-11-30 20:18:23 +01:00
}
2008-10-02 20:52:45 +02:00
}
2014-03-05 21:04:14 +01:00
$menu [ 75 ] = array ( __ ( 'Tools' ), 'edit_posts' , 'tools.php' , '' , 'menu-top menu-icon-tools' , 'menu-tools' , 'dashicons-admin-tools' );
2011-05-24 23:58:01 +02:00
$submenu [ 'tools.php' ][ 5 ] = array ( __ ( 'Available Tools' ), 'edit_posts' , 'tools.php' );
2008-11-27 22:11:25 +01:00
$submenu [ 'tools.php' ][ 10 ] = array ( __ ( 'Import' ), 'import' , 'import.php' );
2011-05-16 12:44:42 +02:00
$submenu [ 'tools.php' ][ 15 ] = array ( __ ( 'Export' ), 'export' , 'export.php' );
2010-03-10 17:06:53 +01:00
if ( is_multisite () && ! is_main_site () )
2015-03-08 03:10:30 +01:00
$submenu [ 'tools.php' ][ 25 ] = array ( __ ( 'Delete Site' ), 'delete_site' , 'ms-delete-site.php' );
2011-01-11 22:00:23 +01:00
if ( ! is_multisite () && defined ( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE )
2011-05-24 23:58:01 +02:00
$submenu [ 'tools.php' ][ 50 ] = array ( __ ( 'Network Setup' ), 'manage_options' , 'network.php' );
2008-10-02 20:52:45 +02:00
2014-03-05 21:04:14 +01:00
$menu [ 80 ] = array ( __ ( 'Settings' ), 'manage_options' , 'options-general.php' , '' , 'menu-top menu-icon-settings' , 'menu-settings' , 'dashicons-admin-settings' );
2010-01-21 22:37:43 +01:00
$submenu [ 'options-general.php' ][ 10 ] = array ( _x ( 'General' , 'settings screen' ), 'manage_options' , 'options-general.php' );
2008-08-22 01:18:51 +02: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-17 00:37:49 +02: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 18:12:40 +02:00
2009-02-13 23:57:02 +01:00
$_wp_last_utility_menu = 80 ; // The index of the last top-level menu in the utility menu group
2008-11-28 20:34:49 +01:00
2011-06-01 16:41:43 +02:00
$menu [ 99 ] = array ( '' , 'read' , 'separator-last' , '' , 'wp-menu-separator' );
2008-10-15 08:54:25 +02:00
2008-08-22 06:32:42 +02:00
// Back-compat for old top-levels
2008-12-09 19:03:31 +01:00
$_wp_real_parent_file [ 'post.php' ] = 'edit.php' ;
2008-11-25 20:05:48 +01:00
$_wp_real_parent_file [ 'post-new.php' ] = 'edit.php' ;
2010-02-04 23:09:35 +01: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 20:23:42 +01:00
$_wp_real_parent_file [ 'wpmu-admin.php' ] = 'tools.php' ;
$_wp_real_parent_file [ 'ms-admin.php' ] = 'tools.php' ;
2008-08-22 06:32:42 +02:00
2016-05-13 20:41:31 +02:00
// Ensure backward compatibility.
2010-07-30 22:34:54 +02:00
$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 21:34:18 +02:00
require_once ( ABSPATH . 'wp-admin/includes/menu.php' );