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
*
2020-03-08 01:18:05 +01:00
* The elements in the array are :
* 0 : Menu item name .
2008-08-14 08:30:38 +02:00
* 1 : Minimum level or capability required .
2020-03-08 01:18:05 +01:00
* 2 : The URL of the item ' s file .
* 3 : Page title .
* 4 : Classes .
* 5 : ID .
* 6 : Icon for top level menu .
2008-08-14 08:30:38 +02:00
*
* @ global array $menu
*/
2007-02-27 16:24:54 +01:00
2017-12-01 00:11:00 +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
2017-12-01 00:11:00 +01:00
$submenu [ 'index.php' ][ 0 ] = array ( __ ( 'Home' ), 'read' , 'index.php' );
2010-11-14 19:49:18 +01:00
if ( is_multisite () ) {
2017-12-01 00:11:00 +01:00
$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 () ) {
2017-08-18 20:31:44 +02:00
if ( current_user_can ( 'update_core' ) ) {
2012-06-30 14:54:05 +02:00
$cap = 'update_core' ;
2017-08-18 20:31:44 +02:00
} elseif ( current_user_can ( 'update_plugins' ) ) {
2012-06-30 14:54:05 +02:00
$cap = 'update_plugins' ;
2017-08-18 20:31:44 +02:00
} elseif ( current_user_can ( 'update_themes' ) ) {
2012-06-30 14:54:05 +02:00
$cap = 'update_themes' ;
2017-08-18 20:31:44 +02:00
} else {
$cap = 'update_languages' ;
}
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 19:13:59 +02:00
$submenu [ 'index.php' ][ 10 ] = array (
sprintf (
2019-09-03 02:41:05 +02:00
/* translators: %s: Number of pending updates. */
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 19:13:59 +02:00
__ ( 'Updates %s' ),
sprintf (
'<span class="update-plugins count-%s"><span class="update-count">%s</span></span>' ,
$update_data [ 'counts' ][ 'total' ],
number_format_i18n ( $update_data [ 'counts' ][ 'total' ] )
)
),
$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
2020-01-29 01:45:18 +01:00
// $menu[5] = Posts.
2009-02-12 09:00:29 +01:00
2017-12-01 00:11:00 +01:00
$menu [ 10 ] = array ( __ ( 'Media' ), 'upload_files' , 'upload.php' , '' , 'menu-top menu-icon-media' , 'menu-media' , 'dashicons-admin-media' );
$submenu [ 'upload.php' ][ 5 ] = array ( __ ( 'Library' ), 'upload_files' , 'upload.php' );
2023-09-05 21:26:26 +02:00
$submenu [ 'upload.php' ][ 10 ] = array ( __ ( 'Add New Media File' ), 'upload_files' , 'media-new.php' );
2017-12-01 00:11:00 +01:00
$i = 15 ;
foreach ( get_taxonomies_for_attachments ( 'objects' ) as $tax ) {
if ( ! $tax -> show_ui || ! $tax -> show_in_menu ) {
continue ;
2012-09-22 00:52:54 +02:00
}
2017-12-01 00:11:00 +01:00
$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
2017-12-01 00:11:00 +01:00
$menu [ 15 ] = array ( __ ( 'Links' ), 'manage_links' , 'link-manager.php' , '' , 'menu-top menu-icon-links' , 'menu-links' , 'dashicons-admin-links' );
$submenu [ 'link-manager.php' ][ 5 ] = array ( _x ( 'All Links' , 'admin menu' ), 'manage_links' , 'link-manager.php' );
2023-09-05 21:26:26 +02:00
$submenu [ 'link-manager.php' ][ 10 ] = array ( __ ( 'Add New Link' ), 'manage_links' , 'link-add.php' );
2017-12-01 00:11:00 +01: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
2020-01-29 01:45:18 +01: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' ) ) {
2019-03-18 16:22:53 +01:00
$awaiting_mod = wp_count_comments ();
$awaiting_mod = $awaiting_mod -> moderated ;
$awaiting_mod_i18n = number_format_i18n ( $awaiting_mod );
2019-09-03 02:41:05 +02:00
/* translators: %s: Number of comments. */
2019-03-18 16:22:53 +01:00
$awaiting_mod_text = sprintf ( _n ( '%s Comment in moderation' , '%s Comments in moderation' , $awaiting_mod ), $awaiting_mod_i18n );
$menu [ 25 ] = array (
2019-09-03 02:41:05 +02:00
/* translators: %s: Number of comments. */
2019-03-18 16:22:53 +01:00
sprintf ( __ ( 'Comments %s' ), '<span class="awaiting-mod count-' . absint ( $awaiting_mod ) . '"><span class="pending-count" aria-hidden="true">' . $awaiting_mod_i18n . '</span><span class="comments-in-moderation-text screen-reader-text">' . $awaiting_mod_text . '</span></span>' ),
2015-11-18 22:34:26 +01:00
'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
2017-12-01 00:11:00 +01:00
$submenu [ 'edit-comments.php' ][ 0 ] = array ( __ ( 'All Comments' ), 'edit_posts' , 'edit-comments.php' );
2011-05-11 22:09:28 +02:00
2020-01-29 01:45:18 +01:00
$_wp_last_object_menu = 25 ; // The index of the last top-level menu in the object menu group.
2008-11-05 23:46:58 +01:00
2017-12-01 00:11:00 +01:00
$types = ( array ) get_post_types (
array (
'show_ui' => true ,
'_builtin' => false ,
'show_in_menu' => true ,
)
);
2015-08-24 23:19:24 +02:00
$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.
2020-02-09 17:55:09 +01:00
if ( true !== $ptype_obj -> show_in_menu ) {
2010-10-19 09:58:02 +02:00
continue ;
2017-12-01 00:11:00 +01:00
}
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.
2017-12-01 00:11:00 +01: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.
Code Modernization: Replace usage of `strpos()` with `str_starts_with()`.
`str_starts_with()` was introduced in PHP 8.0 to perform a case-sensitive check indicating if the string to search in (haystack) begins with the given substring (needle).
WordPress core includes a polyfill for `str_starts_with()` on PHP < 8.0 as of WordPress 5.9.
This commit replaces `0 === strpos( ... )` with `str_starts_with()` in core files, making the code more readable and consistent, as well as improving performance.
While `strpos()` is slightly faster than the polyfill on PHP < 8.0, `str_starts_with()` is noticeably faster on PHP 8.0+, as it is optimized to avoid unnecessarily searching along the whole haystack if it does not find the needle.
Follow-up to [52039], [52040], [52326].
Props spacedmonkey, costdev, sabernhardt, mukesh27, desrosj, jorbin, TobiasBg, ayeshrajans, lgadzhev, SergeyBiryukov.
Fixes #58012.
Built from https://develop.svn.wordpress.org/trunk@55703
git-svn-id: http://core.svn.wordpress.org/trunk@55215 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-05-02 17:45:22 +02:00
if ( str_starts_with ( $ptype_obj -> menu_icon , 'data:image/svg+xml;base64,' ) || str_starts_with ( $ptype_obj -> menu_icon , 'dashicons-' ) ) {
2013-12-05 07:38:09 +01:00
$menu_icon = $ptype_obj -> menu_icon ;
} else {
$menu_icon = esc_url ( $ptype_obj -> menu_icon );
}
2020-04-05 05:02:11 +02:00
} elseif ( in_array ( $ptype , $builtin , true ) ) {
2015-08-24 23:19:24 +02:00
$menu_icon = 'dashicons-admin-' . $ptype ;
}
$menu_class = 'menu-top menu-icon-' . $ptype_for_id ;
2020-01-29 01:45:18 +01:00
// 'post' special case.
2015-08-24 23:19:24 +02:00
if ( 'post' === $ptype ) {
2017-12-01 00:11:00 +01:00
$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 {
2017-12-01 00:11:00 +01:00
$ptype_file = " edit.php?post_type= $ptype " ;
$post_new_file = " post-new.php?post_type= $ptype " ;
2015-08-24 23:19:24 +02:00
$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
2020-04-05 05:02:11 +02:00
if ( in_array ( $ptype , $builtin , true ) ) {
2015-08-24 23:19:24 +02:00
$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 .
*/
2017-12-01 00:11:00 +01:00
$core_menu_positions = array ( 59 , 60 , 65 , 70 , 75 , 80 , 85 , 99 );
2020-04-05 05:02:11 +02:00
while ( isset ( $menu [ $ptype_menu_position ] ) || in_array ( $ptype_menu_position , $core_menu_positions , true ) ) {
2023-09-09 11:28:26 +02:00
++ $ptype_menu_position ;
2017-12-01 00:11:00 +01:00
}
2010-04-10 12:48:30 +02:00
2017-12-01 00:11:00 +01: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 ) {
2017-12-01 00:11:00 +01: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 ;
2017-12-01 00:11:00 +01:00
}
2010-01-04 17:58:43 +01:00
2017-12-01 00:11:00 +01: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
2017-12-01 00:11:00 +01:00
$appearance_cap = current_user_can ( 'switch_themes' ) ? 'switch_themes' : 'edit_theme_options' ;
2013-04-22 21:33:39 +02:00
2021-05-26 03:17:57 +02:00
$menu [ 60 ] = array ( __ ( 'Appearance' ), $appearance_cap , 'themes.php' , '' , 'menu-top menu-icon-appearance' , 'menu-appearance' , 'dashicons-admin-appearance' );
$count = '' ;
if ( ! is_multisite () && current_user_can ( 'update_themes' ) ) {
if ( ! isset ( $update_data ) ) {
$update_data = wp_get_update_data ();
}
$count = sprintf (
'<span class="update-plugins count-%s"><span class="theme-count">%s</span></span>' ,
$update_data [ 'counts' ][ 'themes' ],
number_format_i18n ( $update_data [ 'counts' ][ 'themes' ] )
);
}
/* translators: %s: Number of available theme updates. */
$submenu [ 'themes.php' ][ 5 ] = array ( sprintf ( __ ( 'Themes %s' ), $count ), $appearance_cap , 'themes.php' );
2014-07-08 19:15:14 +02:00
2021-12-07 01:02:02 +01:00
if ( wp_is_block_theme () ) {
2023-02-07 18:42:24 +01:00
$submenu [ 'themes.php' ][ 6 ] = array ( _x ( 'Editor' , 'site editor menu item' ), 'edit_theme_options' , 'site-editor.php' );
2021-11-09 03:17:17 +01:00
}
2022-09-15 14:20:09 +02:00
if ( ! wp_is_block_theme () && current_theme_supports ( 'block-template-parts' ) ) {
$submenu [ 'themes.php' ][ 6 ] = array (
__ ( 'Template Parts' ),
'edit_theme_options' ,
2023-07-25 16:33:23 +02:00
'site-editor.php?path=/wp_template_part/all' ,
2022-09-15 14:20:09 +02:00
);
}
2021-12-25 04:32:03 +01:00
$customize_url = add_query_arg ( 'return' , urlencode ( remove_query_arg ( wp_removable_query_args (), wp_unslash ( $_SERVER [ 'REQUEST_URI' ] ) ) ), 'customize.php' );
// Hide Customize link on block themes unless a plugin or theme
// is using 'customize_register' to add a setting.
2021-12-07 01:02:02 +01:00
if ( ! wp_is_block_theme () || has_action ( 'customize_register' ) ) {
2022-09-15 14:20:09 +02:00
$position = ( wp_is_block_theme () || current_theme_supports ( 'block-template-parts' ) ) ? 7 : 6 ;
2021-11-16 05:45:00 +01:00
$submenu [ 'themes.php' ][ $position ] = array ( __ ( 'Customize' ), 'customize' , esc_url ( $customize_url ), '' , 'hide-if-no-customize' );
2021-11-09 03:17:17 +01:00
}
2014-11-20 16:29:23 +01:00
2017-12-01 00:11:00 +01:00
if ( current_theme_supports ( 'menus' ) || current_theme_supports ( 'widgets' ) ) {
$submenu [ 'themes.php' ][ 10 ] = array ( __ ( 'Menus' ), 'edit_theme_options' , 'nav-menus.php' );
}
2013-03-29 21:39:54 +01:00
2017-12-01 00:11:00 +01:00
if ( current_theme_supports ( 'custom-header' ) && current_user_can ( 'customize' ) ) {
$customize_header_url = add_query_arg ( array ( 'autofocus' => array ( 'control' => 'header_image' ) ), $customize_url );
2023-06-05 23:05:22 +02:00
$submenu [ 'themes.php' ][ 15 ] = array ( _x ( 'Header' , 'custom image header' ), $appearance_cap , esc_url ( $customize_header_url ), '' , 'hide-if-no-customize' );
2017-12-01 00:11:00 +01:00
}
2014-11-20 16:29:23 +01:00
2017-12-01 00:11:00 +01:00
if ( current_theme_supports ( 'custom-background' ) && current_user_can ( 'customize' ) ) {
$customize_background_url = add_query_arg ( array ( 'autofocus' => array ( 'control' => 'background_image' ) ), $customize_url );
2023-06-05 23:05:22 +02:00
$submenu [ 'themes.php' ][ 20 ] = array ( _x ( 'Background' , 'custom background' ), $appearance_cap , esc_url ( $customize_background_url ), '' , 'hide-if-no-customize' );
2017-12-01 00:11:00 +01:00
}
2014-11-20 16:29:23 +01:00
2021-12-25 04:32:03 +01:00
unset ( $customize_url );
2014-11-20 16:29:23 +01:00
2013-03-29 21:39:54 +01:00
unset ( $appearance_cap );
2010-03-04 13:23:21 +01:00
Administration: Add "File" to Theme/Plugin Editor menu names and relocate "Plugin File Editor" to Tools for block themes.
[52232] relocated the Theme Editor menu item from Appearance to Tools for block themes. This commit relocates the Plugin Editor menu item from Plugins to Tools for block themes for a consistent workflow.
Both the Theme Editor and Plugin Editor menu items are renamed to "Theme File Editor" and "Plugin File Editor" respectively. Why? To better identify their purpose, i.e. to directly edit the code in the theme or plugin files. The rename is not limited to only block themes.
Follow-up to [52232].
Props poena, annezazu, audrasjb, clorith, courane01, costdev, dryanpress, desrosj, hellofromTonya, ipstenu, jameskoster, joen, johnbillion, joyously, manfcarlo, marybaum, pbiron, SergeyBiryukov, walbo, youknowriad.
Fixes #54382.
Built from https://develop.svn.wordpress.org/trunk@52406
git-svn-id: http://core.svn.wordpress.org/trunk@51998 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-21 21:06:02 +01:00
// Add 'Theme File Editor' to the bottom of the Appearance (non-block themes) or Tools (block themes) menu.
2015-05-29 22:17:26 +02:00
if ( ! is_multisite () ) {
2021-11-23 06:40:38 +01:00
// Must use API on the admin_menu hook, direct modification is only possible on/before the _admin_menu hook.
2017-12-01 00:11:00 +01:00
add_action ( 'admin_menu' , '_add_themes_utility_last' , 101 );
2015-05-29 22:17:26 +02:00
}
/**
Administration: Add "File" to Theme/Plugin Editor menu names and relocate "Plugin File Editor" to Tools for block themes.
[52232] relocated the Theme Editor menu item from Appearance to Tools for block themes. This commit relocates the Plugin Editor menu item from Plugins to Tools for block themes for a consistent workflow.
Both the Theme Editor and Plugin Editor menu items are renamed to "Theme File Editor" and "Plugin File Editor" respectively. Why? To better identify their purpose, i.e. to directly edit the code in the theme or plugin files. The rename is not limited to only block themes.
Follow-up to [52232].
Props poena, annezazu, audrasjb, clorith, courane01, costdev, dryanpress, desrosj, hellofromTonya, ipstenu, jameskoster, joen, johnbillion, joyously, manfcarlo, marybaum, pbiron, SergeyBiryukov, walbo, youknowriad.
Fixes #54382.
Built from https://develop.svn.wordpress.org/trunk@52406
git-svn-id: http://core.svn.wordpress.org/trunk@51998 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-21 21:06:02 +01:00
* Adds the 'Theme File Editor' menu item to the bottom of the Appearance ( non - block themes )
* or Tools ( block themes ) menu .
2015-05-29 22:17:26 +02:00
*
2016-02-03 21:07:27 +01:00
* @ access private
* @ since 3.0 . 0
Administration: Add "File" to Theme/Plugin Editor menu names and relocate "Plugin File Editor" to Tools for block themes.
[52232] relocated the Theme Editor menu item from Appearance to Tools for block themes. This commit relocates the Plugin Editor menu item from Plugins to Tools for block themes for a consistent workflow.
Both the Theme Editor and Plugin Editor menu items are renamed to "Theme File Editor" and "Plugin File Editor" respectively. Why? To better identify their purpose, i.e. to directly edit the code in the theme or plugin files. The rename is not limited to only block themes.
Follow-up to [52232].
Props poena, annezazu, audrasjb, clorith, courane01, costdev, dryanpress, desrosj, hellofromTonya, ipstenu, jameskoster, joen, johnbillion, joyously, manfcarlo, marybaum, pbiron, SergeyBiryukov, walbo, youknowriad.
Fixes #54382.
Built from https://develop.svn.wordpress.org/trunk@52406
git-svn-id: http://core.svn.wordpress.org/trunk@51998 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-21 21:06:02 +01:00
* @ since 5.9 . 0 Renamed 'Theme Editor' to 'Theme File Editor' .
* Relocates to Tools for block themes .
2015-05-29 22:17:26 +02:00
*/
2010-03-04 13:23:21 +01:00
function _add_themes_utility_last () {
2021-11-23 06:40:38 +01:00
add_submenu_page (
2021-12-07 01:02:02 +01:00
wp_is_block_theme () ? 'tools.php' : 'themes.php' ,
Administration: Add "File" to Theme/Plugin Editor menu names and relocate "Plugin File Editor" to Tools for block themes.
[52232] relocated the Theme Editor menu item from Appearance to Tools for block themes. This commit relocates the Plugin Editor menu item from Plugins to Tools for block themes for a consistent workflow.
Both the Theme Editor and Plugin Editor menu items are renamed to "Theme File Editor" and "Plugin File Editor" respectively. Why? To better identify their purpose, i.e. to directly edit the code in the theme or plugin files. The rename is not limited to only block themes.
Follow-up to [52232].
Props poena, annezazu, audrasjb, clorith, courane01, costdev, dryanpress, desrosj, hellofromTonya, ipstenu, jameskoster, joen, johnbillion, joyously, manfcarlo, marybaum, pbiron, SergeyBiryukov, walbo, youknowriad.
Fixes #54382.
Built from https://develop.svn.wordpress.org/trunk@52406
git-svn-id: http://core.svn.wordpress.org/trunk@51998 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-21 21:06:02 +01:00
__ ( 'Theme File Editor' ),
__ ( 'Theme File Editor' ),
2021-11-23 06:40:38 +01:00
'edit_themes' ,
'theme-editor.php'
);
2010-03-04 13:23:21 +01:00
}
2008-09-25 21:33:53 +02:00
Administration: Add "File" to Theme/Plugin Editor menu names and relocate "Plugin File Editor" to Tools for block themes.
[52232] relocated the Theme Editor menu item from Appearance to Tools for block themes. This commit relocates the Plugin Editor menu item from Plugins to Tools for block themes for a consistent workflow.
Both the Theme Editor and Plugin Editor menu items are renamed to "Theme File Editor" and "Plugin File Editor" respectively. Why? To better identify their purpose, i.e. to directly edit the code in the theme or plugin files. The rename is not limited to only block themes.
Follow-up to [52232].
Props poena, annezazu, audrasjb, clorith, courane01, costdev, dryanpress, desrosj, hellofromTonya, ipstenu, jameskoster, joen, johnbillion, joyously, manfcarlo, marybaum, pbiron, SergeyBiryukov, walbo, youknowriad.
Fixes #54382.
Built from https://develop.svn.wordpress.org/trunk@52406
git-svn-id: http://core.svn.wordpress.org/trunk@51998 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-21 21:06:02 +01:00
/**
* Adds the 'Plugin File Editor' menu item after the 'Themes File Editor' in Tools
* for block themes .
*
* @ access private
* @ since 5.9 . 0
*/
function _add_plugin_file_editor_to_tools () {
if ( ! wp_is_block_theme () ) {
return ;
}
add_submenu_page (
'tools.php' ,
__ ( 'Plugin File Editor' ),
__ ( 'Plugin File Editor' ),
'edit_plugins' ,
'plugin-editor.php'
);
}
2012-06-30 14:55:09 +02:00
$count = '' ;
if ( ! is_multisite () && current_user_can ( 'update_plugins' ) ) {
2017-12-01 00:11:00 +01:00
if ( ! isset ( $update_data ) ) {
2012-06-30 14:55:09 +02:00
$update_data = wp_get_update_data ();
2017-12-01 00:11:00 +01:00
}
I18N: Improve translator comments.
* Add missing translator comments.
* Fix placement of some translator comments. Translator comments should be on the line directly above the line containing the translation function call for optimal compatibility with various `.pot` file generation tools. The CS auto-fixing, which changed some inconsistent function calls to multi-line function calls, is part of the reason why this was no longer the case for a select group of translator comments.
Includes minor code layout fixes.
Polyglots, rejoice! All WordPress core files now have translator comments for all strings with placeholders!
Props jrf, subrataemfluence, GaryJ, webdados, Dency, swissspidy, alvarogois, marcomartins, mihaiiceyro, vladwtz, niq1982, flipkeijzer, michielatyoast, chandrapatel, thrijith, joshuanoyce, FesoVik, tessak22, bhaktirajdev, cleancoded, dhavalkasvala, garrett-eclipse, bibliofille, socalchristina, priyankkpatel, 5hel2l2y, adamsilverstein, JeffPaul, pierlo, SergeyBiryukov.
Fixes #44360.
Built from https://develop.svn.wordpress.org/trunk@45926
git-svn-id: http://core.svn.wordpress.org/trunk@45737 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2019-09-01 19:13:59 +02:00
$count = sprintf (
'<span class="update-plugins count-%s"><span class="plugin-count">%s</span></span>' ,
$update_data [ 'counts' ][ 'plugins' ],
number_format_i18n ( $update_data [ 'counts' ][ 'plugins' ] )
);
2012-06-30 14:55:09 +02:00
}
2011-06-06 18:59:24 +02:00
2021-05-26 03:17:57 +02:00
/* translators: %s: Number of available plugin updates. */
2017-12-01 00:11:00 +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
2017-12-01 00:11:00 +01:00
$submenu [ 'plugins.php' ][ 5 ] = array ( __ ( 'Installed Plugins' ), 'activate_plugins' , 'plugins.php' );
2011-05-25 18:06:42 +02:00
2017-12-01 00:11:00 +01:00
if ( ! is_multisite () ) {
2023-09-05 21:26:26 +02:00
$submenu [ 'plugins.php' ][ 10 ] = array ( __ ( 'Add New Plugin' ), 'install_plugins' , 'plugin-install.php' );
Administration: Add "File" to Theme/Plugin Editor menu names and relocate "Plugin File Editor" to Tools for block themes.
[52232] relocated the Theme Editor menu item from Appearance to Tools for block themes. This commit relocates the Plugin Editor menu item from Plugins to Tools for block themes for a consistent workflow.
Both the Theme Editor and Plugin Editor menu items are renamed to "Theme File Editor" and "Plugin File Editor" respectively. Why? To better identify their purpose, i.e. to directly edit the code in the theme or plugin files. The rename is not limited to only block themes.
Follow-up to [52232].
Props poena, annezazu, audrasjb, clorith, courane01, costdev, dryanpress, desrosj, hellofromTonya, ipstenu, jameskoster, joen, johnbillion, joyously, manfcarlo, marybaum, pbiron, SergeyBiryukov, walbo, youknowriad.
Fixes #54382.
Built from https://develop.svn.wordpress.org/trunk@52406
git-svn-id: http://core.svn.wordpress.org/trunk@51998 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2021-12-21 21:06:02 +01:00
if ( wp_is_block_theme () ) {
// Place the menu item below the Theme File Editor menu item.
add_action ( 'admin_menu' , '_add_plugin_file_editor_to_tools' , 101 );
} else {
$submenu [ 'plugins.php' ][ 15 ] = array ( __ ( 'Plugin File Editor' ), 'edit_plugins' , 'plugin-editor.php' );
}
2017-12-01 00:11:00 +01:00
}
2012-06-30 14:40:25 +02:00
unset ( $update_data );
2008-10-02 20:52:45 +02:00
2017-12-01 00:11:00 +01:00
if ( current_user_can ( 'list_users' ) ) {
$menu [ 70 ] = array ( __ ( 'Users' ), 'list_users' , 'users.php' , '' , 'menu-top menu-icon-users' , 'menu-users' , 'dashicons-admin-users' );
} else {
$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
2017-12-01 00:11:00 +01: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.
2017-12-01 00:11:00 +01: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' ) ) {
2023-09-05 21:26:26 +02:00
$submenu [ 'users.php' ][ 10 ] = array ( __ ( 'Add New User' ), 'create_users' , 'user-new.php' );
2014-11-30 20:18:23 +01:00
} elseif ( is_multisite () ) {
2023-09-05 21:26:26 +02:00
$submenu [ 'users.php' ][ 10 ] = array ( __ ( 'Add New User' ), 'promote_users' , 'user-new.php' );
2014-11-30 20:18:23 +01:00
}
2010-01-15 23:11:12 +01:00
Users: Change "Your Profile" and "My Profile" links in admin menu and toolbar to just "Profile" for consistency.
Props donmhico, bcworkz, seanchayes, mikeschroder, garrett-eclipse, akhileshsabharwal, ScottSmith, nacin, jenmylo, afercia, swissspidy, felix-edelmann, helen, melchoyce, karmatosed.
Fixes #26769.
Built from https://develop.svn.wordpress.org/trunk@47600
git-svn-id: http://core.svn.wordpress.org/trunk@47375 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-04-20 10:39:06 +02:00
$submenu [ 'users.php' ][ 15 ] = array ( __ ( 'Profile' ), 'read' , 'profile.php' );
2008-10-02 20:52:45 +02:00
} else {
$_wp_real_parent_file [ 'users.php' ] = 'profile.php' ;
Users: Change "Your Profile" and "My Profile" links in admin menu and toolbar to just "Profile" for consistency.
Props donmhico, bcworkz, seanchayes, mikeschroder, garrett-eclipse, akhileshsabharwal, ScottSmith, nacin, jenmylo, afercia, swissspidy, felix-edelmann, helen, melchoyce, karmatosed.
Fixes #26769.
Built from https://develop.svn.wordpress.org/trunk@47600
git-svn-id: http://core.svn.wordpress.org/trunk@47375 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2020-04-20 10:39:06 +02:00
$submenu [ 'profile.php' ][ 5 ] = array ( __ ( 'Profile' ), 'read' , 'profile.php' );
2014-11-30 20:18:23 +01:00
if ( current_user_can ( 'create_users' ) ) {
2017-12-01 00:11:00 +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 () ) {
2017-12-01 00:11:00 +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
}
2022-09-14 23:14:14 +02:00
$site_health_count = '' ;
if ( ! is_multisite () && current_user_can ( 'view_site_health_checks' ) ) {
$get_issues = get_transient ( 'health-check-site-status-result' );
$issue_counts = array ();
if ( false !== $get_issues ) {
$issue_counts = json_decode ( $get_issues , true );
}
if ( ! is_array ( $issue_counts ) || ! $issue_counts ) {
$issue_counts = array (
'good' => 0 ,
'recommended' => 0 ,
'critical' => 0 ,
);
}
$site_health_count = sprintf (
'<span class="menu-counter site-health-counter count-%s"><span class="count">%s</span></span>' ,
$issue_counts [ 'critical' ],
number_format_i18n ( $issue_counts [ 'critical' ] )
);
}
2017-12-01 00:11:00 +01:00
$menu [ 75 ] = array ( __ ( 'Tools' ), 'edit_posts' , 'tools.php' , '' , 'menu-top menu-icon-tools' , 'menu-tools' , 'dashicons-admin-tools' );
$submenu [ 'tools.php' ][ 5 ] = array ( __ ( 'Available Tools' ), 'edit_posts' , 'tools.php' );
$submenu [ 'tools.php' ][ 10 ] = array ( __ ( 'Import' ), 'import' , 'import.php' );
$submenu [ 'tools.php' ][ 15 ] = array ( __ ( 'Export' ), 'export' , 'export.php' );
2022-09-14 23:14:14 +02:00
/* translators: %s: Number of critical Site Health checks. */
$submenu [ 'tools.php' ][ 20 ] = array ( sprintf ( __ ( 'Site Health %s' ), $site_health_count ), 'view_site_health_checks' , 'site-health.php' );
2019-05-26 22:50:53 +02:00
$submenu [ 'tools.php' ][ 25 ] = array ( __ ( 'Export Personal Data' ), 'export_others_personal_data' , 'export-personal-data.php' );
$submenu [ 'tools.php' ][ 30 ] = array ( __ ( 'Erase Personal Data' ), 'erase_others_personal_data' , 'erase-personal-data.php' );
2017-12-01 00:11:00 +01:00
if ( is_multisite () && ! is_main_site () ) {
2019-05-26 22:50:53 +02:00
$submenu [ 'tools.php' ][ 35 ] = array ( __ ( 'Delete Site' ), 'delete_site' , 'ms-delete-site.php' );
2017-12-01 00:11:00 +01:00
}
if ( ! is_multisite () && defined ( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE ) {
$submenu [ 'tools.php' ][ 50 ] = array ( __ ( 'Network Setup' ), 'setup_network' , 'network.php' );
}
2020-02-11 22:48:06 +01:00
$menu [ 80 ] = array ( __ ( 'Settings' ), 'manage_options' , 'options-general.php' , '' , 'menu-top menu-icon-settings' , 'menu-settings' , 'dashicons-admin-settings' );
2017-12-01 00:11:00 +01:00
$submenu [ 'options-general.php' ][ 10 ] = array ( _x ( 'General' , 'settings screen' ), 'manage_options' , 'options-general.php' );
$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' );
$submenu [ 'options-general.php' ][ 30 ] = array ( __ ( 'Media' ), 'manage_options' , 'options-media.php' );
$submenu [ 'options-general.php' ][ 40 ] = array ( __ ( 'Permalinks' ), 'manage_options' , 'options-permalink.php' );
2019-05-26 22:50:53 +02:00
$submenu [ 'options-general.php' ][ 45 ] = array ( __ ( 'Privacy' ), 'manage_privacy_options' , 'options-privacy.php' );
2004-09-11 18:12:40 +02:00
2020-01-29 01:45:18 +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
2020-01-29 01:45:18 +01:00
// Back-compat for old top-levels.
2017-12-01 00:11:00 +01:00
$_wp_real_parent_file [ 'post.php' ] = 'edit.php' ;
$_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' ;
2017-12-01 00:11:00 +01:00
$_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' ;
2017-12-01 00:11:00 +01:00
$_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 (
2017-12-01 00:11:00 +01:00
'index' => 'dashboard' ,
'edit' => 'posts' ,
'post' => 'posts' ,
'upload' => 'media' ,
'link-manager' => 'links' ,
'edit-pages' => 'pages' ,
'page' => 'pages' ,
'edit-comments' => 'comments' ,
2010-07-30 22:34:54 +02:00
'options-general' => 'settings' ,
2017-12-01 00:11:00 +01:00
'themes' => 'appearance' ,
);
2010-07-30 22:34:54 +02:00
2020-02-06 07:33:11 +01:00
require_once ABSPATH . 'wp-admin/includes/menu.php' ;