diff --git a/src/wp-admin/css/themes.css b/src/wp-admin/css/themes.css
index 77ab5be359..9a64086ad3 100644
--- a/src/wp-admin/css/themes.css
+++ b/src/wp-admin/css/themes.css
@@ -1091,7 +1091,8 @@ body.folded .theme-overlay .theme-wrap {
.theme-install-php.show-upload-theme a.browse-themes {
display: inline;
}
-.upload-theme {
+.upload-theme,
+.upload-plugin {
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
@@ -1103,17 +1104,20 @@ body.folded .theme-overlay .theme-wrap {
position: relative;
top: 10px;
}
-body.show-upload-theme .upload-theme {
+body.show-upload-theme .upload-theme,
+.upload-plugin {
display: block;
}
-.upload-theme .wp-upload-form {
+.upload-theme .wp-upload-form,
+.upload-plugin .wp-upload-form {
background: #fafafa;
border: 1px solid #e5e5e5;
padding: 30px;
margin: 30px auto;
max-width: 380px;
}
-.upload-theme .install-help {
+.upload-theme .install-help,
+.upload-plugin .install-help {
color: #999;
font-size: 18px;
font-style: normal;
diff --git a/src/wp-admin/includes/class-wp-plugin-install-list-table.php b/src/wp-admin/includes/class-wp-plugin-install-list-table.php
index 84c34c714f..ec60584b6c 100644
--- a/src/wp-admin/includes/class-wp-plugin-install-list-table.php
+++ b/src/wp-admin/includes/class-wp-plugin-install-list-table.php
@@ -69,8 +69,13 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
if ( $tab === 'beta' || false !== strpos( $GLOBALS['wp_version'], '-' ) ) {
$tabs['beta'] = _x( 'Beta Testing', 'Plugin Installer' );
}
+ if ( current_user_can( 'upload_plugins' ) ) {
+ // No longer a real tab. Here for filter compatibility.
+ // Gets juggled into $nonmenu_tabs below.
+ $tabs['upload'] = __( 'Upload Plugin' );
+ }
- $nonmenu_tabs = array( 'upload', 'plugin-information' ); //Valid actions to perform which do not have a Menu item.
+ $nonmenu_tabs = array( 'plugin-information' ); // Valid actions to perform which do not have a Menu item.
/**
* Filter the tabs shown on the Plugin Install screen.
@@ -91,6 +96,11 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
*/
$nonmenu_tabs = apply_filters( 'install_plugins_nonmenu_tabs', $nonmenu_tabs );
+ if ( isset( $tabs['upload'] ) ) {
+ unset( $tabs['upload'] );
+ $nonmenu_tabs[] = 'upload';
+ }
+
// If a non-valid menu tab has been selected, And it's not a non-menu action.
if ( empty( $tab ) || ( !isset( $tabs[ $tab ] ) && !in_array( $tab, (array) $nonmenu_tabs ) ) )
$tab = key( $tabs );
diff --git a/src/wp-admin/includes/plugin-install.php b/src/wp-admin/includes/plugin-install.php
index 3113e28dc5..e0289b52c7 100644
--- a/src/wp-admin/includes/plugin-install.php
+++ b/src/wp-admin/includes/plugin-install.php
@@ -195,7 +195,7 @@ function install_search_form( $type_selector = true ) {
*/
function install_plugins_upload( $page = 1 ) {
?>
-
+
get_pagenum();
$wp_list_table->prepare_items();
-$title = __('Install Plugins');
+$title = __( 'Add Plugins' );
$parent_file = 'plugins.php';
wp_enqueue_script( 'plugin-install' );
@@ -75,16 +75,26 @@ include(ABSPATH . 'wp-admin/admin-header.php');
' . $text . '';
+ }
?>
-
-views(); ?>
-
-
views();
+ echo '
';
+}
+
/**
* Fires after the plugins list table in each tab of the Install Plugins screen.
*
diff --git a/src/wp-admin/theme-install.php b/src/wp-admin/theme-install.php
index 2ca1c2870b..fd8847c547 100644
--- a/src/wp-admin/theme-install.php
+++ b/src/wp-admin/theme-install.php
@@ -27,11 +27,6 @@ if ( ! is_network_admin() ) {
$submenu_file = 'themes.php';
}
-$tabs = array(
- 'upload' => __( 'Upload Theme' ),
- 'browse-themes' => _x( 'Browse', 'themes' ),
-);
-
$sections = array(
'featured' => __( 'Featured Themes' ),
'popular' => __( 'Popular Themes' ),
@@ -113,22 +108,24 @@ include(ABSPATH . 'wp-admin/admin-header.php');
?>
-
-
- $tab_name ) {
- echo '' . $tab_name . '';
- }
- ?>
-
+
__( 'Upload Theme' ) ) );
+ if ( ! empty( $tabs['upload'] ) && current_user_can( 'upload_themes' ) ) {
+ echo ' ' . __( 'Upload Theme' ) . '';
+ echo ' ' . _x( 'Browse', 'themes' ) . '';
+ }
+ ?>
diff --git a/src/wp-admin/update.php b/src/wp-admin/update.php
index a8568cdf65..c279444320 100644
--- a/src/wp-admin/update.php
+++ b/src/wp-admin/update.php
@@ -123,8 +123,9 @@ if ( isset($_GET['action']) ) {
} elseif ( 'upload-plugin' == $action ) {
- if ( ! current_user_can('install_plugins') )
+ if ( ! current_user_can( 'upload_plugins' ) ) {
wp_die( __( 'You do not have sufficient permissions to install plugins on this site.' ) );
+ }
check_admin_referer('plugin-upload');
@@ -227,8 +228,9 @@ if ( isset($_GET['action']) ) {
} elseif ( 'upload-theme' == $action ) {
- if ( ! current_user_can('install_themes') )
+ if ( ! current_user_can( 'upload_themes' ) ) {
wp_die( __( 'You do not have sufficient permissions to install themes on this site.' ) );
+ }
check_admin_referer('theme-upload');
diff --git a/src/wp-includes/capabilities.php b/src/wp-includes/capabilities.php
index 45be4b5517..30c38b2cbc 100644
--- a/src/wp-includes/capabilities.php
+++ b/src/wp-includes/capabilities.php
@@ -1262,18 +1262,25 @@ function map_meta_cap( $cap, $user_id ) {
case 'update_plugins':
case 'delete_plugins':
case 'install_plugins':
+ case 'upload_plugins':
case 'update_themes':
case 'delete_themes':
case 'install_themes':
+ case 'upload_themes':
case 'update_core':
// Disallow anything that creates, deletes, or updates core, plugin, or theme files.
// Files in uploads are excepted.
- if ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS )
+ if ( defined( 'DISALLOW_FILE_MODS' ) && DISALLOW_FILE_MODS ) {
$caps[] = 'do_not_allow';
- elseif ( is_multisite() && ! is_super_admin( $user_id ) )
+ } elseif ( is_multisite() && ! is_super_admin( $user_id ) ) {
$caps[] = 'do_not_allow';
- else
+ } elseif ( 'upload_themes' === $cap ) {
+ $caps[] = 'install_themes';
+ } elseif ( 'upload_plugins' === $cap ) {
+ $caps[] = 'install_plugins';
+ } else {
$caps[] = $cap;
+ }
break;
case 'activate_plugins':
$caps[] = $cap;