diff --git a/wp-admin/includes/class-wp-ms-themes-list-table.php b/wp-admin/includes/class-wp-ms-themes-list-table.php index 8cbcb660f..0b87b7c74 100644 --- a/wp-admin/includes/class-wp-ms-themes-list-table.php +++ b/wp-admin/includes/class-wp-ms-themes-list-table.php @@ -16,7 +16,7 @@ class WP_MS_Themes_List_Table extends WP_List_Table { global $status, $page; $status = isset( $_REQUEST['theme_status'] ) ? $_REQUEST['theme_status'] : 'all'; - if ( !in_array( $status, array( 'all', 'enabled', 'disabled', 'upgrade', 'search' ) ) ) + if ( !in_array( $status, array( 'all', 'enabled', 'disabled', 'upgrade', 'search', 'broken' ) ) ) $status = 'all'; $page = $this->get_pagenum(); @@ -59,7 +59,8 @@ class WP_MS_Themes_List_Table extends WP_List_Table { 'search' => array(), 'enabled' => array(), 'disabled' => array(), - 'upgrade' => array() + 'upgrade' => array(), + 'broken' => $this->is_site_themes ? array() : wp_get_themes( array( 'errors' => true ) ), ); if ( $this->is_site_themes ) { @@ -70,7 +71,7 @@ class WP_MS_Themes_List_Table extends WP_List_Table { $allowed_where = 'network'; } - $current = current_user_can( 'update_themes' ) && ! $this->is_site_themes && get_site_transient( 'update_themes' ); + $maybe_update = current_user_can( 'update_themes' ) && ! $this->is_site_themes && get_site_transient( 'update_themes' ); foreach ( (array) $themes['all'] as $key => $theme ) { if ( $this->is_site_themes && $theme->is_allowed( 'network' ) ) { @@ -81,7 +82,7 @@ class WP_MS_Themes_List_Table extends WP_List_Table { $filter = $theme->is_allowed( $allowed_where, $this->site_id ) ? 'enabled' : 'disabled'; $themes[ $filter ][ $key ] = $themes['all'][ $key ]; - if ( $current && isset( $current->response[ $key ] ) ) + if ( $maybe_update && isset( $current->response[ $key ] ) ) $themes['upgrade'][ $key ] = $themes['all'][ $key ]; } @@ -206,6 +207,9 @@ class WP_MS_Themes_List_Table extends WP_List_Table { case 'upgrade': $text = _n( 'Update Available (%s)', 'Update Available (%s)', $count ); break; + case 'broken' : + $text = _n( 'Broken (%s)', 'Broken (%s)', $count ); + break; } if ( $this->is_site_themes ) @@ -297,8 +301,6 @@ class WP_MS_Themes_List_Table extends WP_List_Table { $checkbox_id = "checkbox_" . md5( $theme->get('Name') ); $checkbox = ""; - $description = '

' . $theme->display( 'Description' ) . '

'; - $id = sanitize_html_class( $theme->get_stylesheet() ); echo ""; @@ -320,8 +322,10 @@ class WP_MS_Themes_List_Table extends WP_List_Table { echo ""; break; case 'description': - echo " -
" . $theme->display( 'Description' ) . "
+ echo ""; + if ( $theme->errors() ) + echo '

' . $theme->errors()->get_error_message() . '

'; + echo "

" . $theme->display( 'Description' ) . "

"; $theme_meta = array(); diff --git a/wp-admin/network/themes.php b/wp-admin/network/themes.php index 7208db3ba..5ca814518 100644 --- a/wp-admin/network/themes.php +++ b/wp-admin/network/themes.php @@ -40,7 +40,7 @@ if ( $action ) { check_admin_referer('enable-theme_' . $_GET['theme']); $allowed_themes[ $_GET['theme'] ] = true; update_site_option( 'allowedthemes', $allowed_themes ); - wp_redirect( network_admin_url( 'themes.php?enabled=1' ) ); + wp_safe_redirect( add_query_arg( 'enabled', 1, $referer ) ); exit; break; case 'disable': @@ -244,7 +244,12 @@ if ( isset( $_GET['enabled'] ) ) { search_box( __( 'Search Installed Themes' ), 'theme' ); ?> -views(); ?> +views(); + +if ( 'broken' == $status ) + echo '

' . __('The following themes are installed but incomplete. Themes must have a stylesheet and a template.') . '

'; +?>
diff --git a/wp-admin/themes.php b/wp-admin/themes.php index c22b0aebe..edf3ce1c5 100644 --- a/wp-admin/themes.php +++ b/wp-admin/themes.php @@ -214,7 +214,7 @@ if ( ! current_user_can( 'switch_themes' ) ) { true ) ) ) { +if ( ! is_multisite() && current_user_can('edit_themes') && $broken_themes = wp_get_themes( array( 'errors' => true ) ) ) { ?>