if ( !current_user_can('switch_themes') && !current_user_can('edit_theme_options') )
wp_die( __( 'Cheatin’ uh?' ) );
-if ( current_user_can('switch_themes') && isset($_GET['action']) ) {
+$wp_list_table = _get_list_table('WP_Themes_List_Table');
+
+if ( current_user_can( 'switch_themes' ) && isset($_GET['action'] ) ) {
if ( 'activate' == $_GET['action'] ) {
check_admin_referer('switch-theme_' . $_GET['template']);
switch_theme($_GET['template'], $_GET['stylesheet']);
- wp_redirect('themes.php?activated=true');
+ wp_redirect( admin_url('themes.php?activated=true') );
exit;
- } else if ( 'delete' == $_GET['action'] ) {
+ } elseif ( 'delete' == $_GET['action'] ) {
check_admin_referer('delete-theme_' . $_GET['template']);
if ( !current_user_can('delete_themes') )
wp_die( __( 'Cheatin’ uh?' ) );
delete_theme($_GET['template']);
- wp_redirect('themes.php?deleted=true');
+ wp_redirect( admin_url('themes.php?deleted=true') );
exit;
}
}
+$wp_list_table->prepare_items();
+
$title = __('Manage Themes');
$parent_file = 'themes.php';
add_thickbox();
wp_enqueue_script( 'theme-preview' );
+wp_enqueue_script( 'theme' );
+wp_enqueue_style( 'theme-install' );
endif;
require_once('./admin-header.php');
-if ( is_multisite() && current_user_can('edit_themes') ) {
- ?><div id="message0" class="updated"><p><?php printf( __('Administrator: new themes must be activated in the <a href="%s">Network Themes</a> screen before they appear here.'), admin_url( 'ms-themes.php') ); ?></p></div><?php
-}
?>
<?php if ( ! validate_current_theme() ) : ?>
elseif ( isset($_GET['deleted']) ) : ?>
<div id="message3" class="updated"><p><?php _e('Theme deleted.') ?></p></div>
<?php endif; ?>
-<?php
-$themes = get_allowed_themes();
-$ct = current_theme_info();
-unset($themes[$ct->name]);
-
-uksort( $themes, "strnatcasecmp" );
-$theme_total = count( $themes );
-$per_page = 15;
-
-if ( isset( $_GET['pagenum'] ) )
- $page = absint( $_GET['pagenum'] );
-
-if ( empty($page) )
- $page = 1;
-
-$start = $offset = ( $page - 1 ) * $per_page;
-
-$page_links = paginate_links( array(
- 'base' => add_query_arg( 'pagenum', '%#%' ) . '#themenav',
- 'format' => '',
- 'prev_text' => __('«'),
- 'next_text' => __('»'),
- 'total' => ceil($theme_total / $per_page),
- 'current' => $page
-));
-$themes = array_slice( $themes, $start, $per_page );
-?>
-
-<div class="wrap">
-<?php screen_icon(); ?>
-<h2><a href="themes.php" class="nav-tab nav-tab-active"><?php echo esc_html( $title ); ?></a><?php if ( current_user_can('install_themes') ) { ?><a href="theme-install.php" class="nav-tab"><?php echo esc_html_x('Install Themes', 'theme'); ?></a><?php } ?></h2>
+<div class="wrap"><?php
+screen_icon();
+if ( !is_multisite() ) : ?>
+<h2 class="nav-tab-wrapper">
+<a href="themes.php" class="nav-tab nav-tab-active"><?php echo esc_html( $title ); ?></a>
+ <?php if ( current_user_can('install_themes') ) : ?>
+<a href="<?php echo admin_url( 'theme-install.php'); ?>" class="nav-tab"><?php echo esc_html_x('Install Themes', 'theme'); ?></a>
+ <?php endif;
+else : ?>
+<h2>
+<?php echo esc_html( $title ); ?>
+<?php endif; ?>
+</h2>
<h3><?php _e('Current Theme'); ?></h3>
<div id="current-theme">
/* translators: 1: theme title, 2: theme version, 3: theme author */
printf(__('%1$s %2$s by %3$s'), $ct->title, $ct->version, $ct->author) ; ?></h4>
<p class="theme-description"><?php echo $ct->description; ?></p>
-<?php if ( current_user_can('edit_themes') && $ct->parent_theme ) { ?>
- <p><?php printf(__('The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.'), $ct->title, str_replace( WP_CONTENT_DIR, '', $ct->template_dir ), str_replace( WP_CONTENT_DIR, '', $ct->stylesheet_dir ), $ct->title, $ct->parent_theme); ?></p>
-<?php } else { ?>
- <p><?php printf(__('All of this theme’s files are located in <code>%2$s</code>.'), $ct->title, str_replace( WP_CONTENT_DIR, '', $ct->template_dir ), str_replace( WP_CONTENT_DIR, '', $ct->stylesheet_dir ) ); ?></p>
-<?php } ?>
-<?php if ( $ct->tags ) : ?>
-<p><?php _e('Tags:'); ?> <?php echo join(', ', $ct->tags); ?></p>
-<?php endif; ?>
+<div class="theme-options">
+ <span><?php _e( 'Options:' )?></span>
+ <?php
+ // Pretend you didn't see this.
+ $options = array();
+ if ( is_array( $submenu ) && isset( $submenu['themes.php'] ) ) {
+ foreach ( (array) $submenu['themes.php'] as $item) {
+ $class = '';
+ if ( 'themes.php' == $item[2] || 'theme-editor.php' == $item[2] )
+ continue;
+ // 0 = name, 1 = capability, 2 = file
+ if ( ( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file)) ) $class = ' class="current"';
+
+ if ( !empty($submenu[$item[2]]) ) {
+ $submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index.
+ $menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]);
+ if ( file_exists(ABSPATH . PLUGINDIR . "/{$submenu[$item[2]][0][2]}") || !empty($menu_hook))
+ $options[] = "<a href='admin.php?page={$submenu[$item[2]][0][2]}'$class>{$item[0]}</a>";
+ else
+ $options[] = "<a href='{$submenu[$item[2]][0][2]}'$class>{$item[0]}</a>";
+ } else if ( current_user_can($item[1]) ) {
+ if ( file_exists(ABSPATH . 'wp-admin/' . $item[2]) ) {
+ $options[] = "<a href='{$item[2]}'$class>{$item[0]}</a>";
+ } else {
+ $options[] = "<a href='themes.php?page={$item[2]}'$class>{$item[0]}</a>";
+ }
+ }
+ }
+ }
+ echo implode ( ' | ', $options );
+
+ if ( $ct->tags ) : ?>
+ <p><?php _e('Tags:'); ?> <?php echo join(', ', $ct->tags); ?></p>
+ <?php endif; ?>
+</div>
<?php theme_update_available($ct); ?>
</div>
-<div class="clear"></div>
+<br class="clear" />
<?php
if ( ! current_user_can( 'switch_themes' ) ) {
echo '</div>';
exit;
}
?>
-<h3><?php _e('Available Themes'); ?></h3>
-<div class="clear"></div>
-
-<?php if ( $theme_total ) { ?>
-
-<?php if ( $page_links ) : ?>
-<div class="tablenav">
-<div class="tablenav-pages"><?php $page_links_text = sprintf( '<span class="displaying-num">' . __( 'Displaying %s–%s of %s' ) . '</span>%s',
- number_format_i18n( $start + 1 ),
- number_format_i18n( min( $page * $per_page, $theme_total ) ),
- number_format_i18n( $theme_total ),
- $page_links
-); echo $page_links_text; ?></div>
-</div>
-<?php endif; ?>
-
-<table id="availablethemes" cellspacing="0" cellpadding="0">
-<?php
-$style = '';
-$theme_names = array_keys($themes);
-natcasesort($theme_names);
+<h3><?php _e('Available Themes'); ?></h3>
-$table = array();
-$rows = ceil(count($theme_names) / 3);
-for ( $row = 1; $row <= $rows; $row++ )
- for ( $col = 1; $col <= 3; $col++ )
- $table[$row][$col] = array_shift($theme_names);
+<?php if ( !empty( $_REQUEST['s'] ) || !empty( $_REQUEST['filter'] ) || $wp_list_table->has_items() ) : ?>
+
+<form class="search-form filter-form" action="" method="get">
+
+<p class="search-box">
+ <label class="screen-reader-text" for="theme-search-input"><?php _e('Search Themes'); ?>:</label>
+ <input type="text" id="theme-search-input" name="s" value="<?php _admin_search_query(); ?>" />
+ <?php submit_button( __( 'Search Themes' ), 'button', 'submit', false ); ?>
+ <a id="filter-click" href="?filter=1"><?php _e( 'Feature Filter' ); ?></a>
+</p>
+
+<br class="clear"/>
+
+<div id="filter-box" style="<?php if ( empty($_REQUEST['filter']) ) echo 'display: none;'; ?>">
+<?php $feature_list = get_theme_feature_list(); ?>
+ <div class="feature-filter">
+ <p class="install-help"><?php _e('Theme filters') ?></p>
+ <?php if ( !empty( $_REQUEST['filter'] ) ) : ?>
+ <input type="hidden" name="filter" value="1" />
+ <?php endif; ?>
+ <?php foreach ( $feature_list as $feature_name => $features ) :
+ $feature_name = esc_html( $feature_name ); ?>
+
+ <div class="feature-container">
+ <div class="feature-name"><?php echo $feature_name ?></div>
+
+ <ol class="feature-group">
+ <?php foreach ( $features as $key => $feature ) :
+ $feature_name = $feature;
+ $feature_name = esc_html( $feature_name );
+ $feature = esc_attr( $feature );
+ ?>
+ <li>
+ <input type="checkbox" name="features[]" id="feature-id-<?php echo $key; ?>" value="<?php echo $key; ?>" <?php checked( in_array( $key, $wp_list_table->features ) ); ?>/>
+ <label for="feature-id-<?php echo $key; ?>"><?php echo $feature_name; ?></label>
+ </li>
+ <?php endforeach; ?>
+ </ol>
+ </div>
+ <?php endforeach; ?>
+
+ <div class="feature-container">
+ <?php submit_button( __( 'Apply Filters' ), 'button-secondary submitter', 'submit', false, array( 'style' => 'margin-left: 120px' ) ); ?>
+
+ <small><a id="mini-filter-click" href="<?php echo esc_url( remove_query_arg( array('filter', 'features', 'submit') ) ); ?>"><?php _e( 'Close filters' )?></a></small>
+ </div>
+ <br/>
+ </div>
+ <br class="clear"/>
+</div>
-foreach ( $table as $row => $cols ) {
-?>
-<tr>
-<?php
-foreach ( $cols as $col => $theme_name ) {
- $class = array('available-theme');
- if ( $row == 1 ) $class[] = 'top';
- if ( $col == 1 ) $class[] = 'left';
- if ( $row == $rows ) $class[] = 'bottom';
- if ( $col == 3 ) $class[] = 'right';
-?>
- <td class="<?php echo join(' ', $class); ?>">
-<?php if ( !empty($theme_name) ) :
- $template = $themes[$theme_name]['Template'];
- $stylesheet = $themes[$theme_name]['Stylesheet'];
- $title = $themes[$theme_name]['Title'];
- $version = $themes[$theme_name]['Version'];
- $description = $themes[$theme_name]['Description'];
- $author = $themes[$theme_name]['Author'];
- $screenshot = $themes[$theme_name]['Screenshot'];
- $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];
- $template_dir = $themes[$theme_name]['Template Dir'];
- $parent_theme = $themes[$theme_name]['Parent Theme'];
- $theme_root = $themes[$theme_name]['Theme Root'];
- $theme_root_uri = $themes[$theme_name]['Theme Root URI'];
- $preview_link = esc_url(get_option('home') . '/');
- if ( is_ssl() )
- $preview_link = str_replace( 'http://', 'https://', $preview_link );
- $preview_link = htmlspecialchars( add_query_arg( array('preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), $preview_link ) );
- $preview_text = esc_attr( sprintf( __('Preview of “%s”'), $title ) );
- $tags = $themes[$theme_name]['Tags'];
- $thickbox_class = 'thickbox thickbox-preview';
- $activate_link = wp_nonce_url("themes.php?action=activate&template=".urlencode($template)."&stylesheet=".urlencode($stylesheet), 'switch-theme_' . $template);
- $activate_text = esc_attr( sprintf( __('Activate “%s”'), $title ) );
- $actions = array();
- $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __('Activate') . '</a>';
- $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr(sprintf(__('Preview “%s”'), $theme_name)) . '">' . __('Preview') . '</a>';
- if ( current_user_can('delete_themes') )
- $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url("themes.php?action=delete&template=$stylesheet", 'delete-theme_' . $stylesheet) . '" onclick="' . "return confirm('" . esc_js(sprintf( __("You are about to delete this theme '%s'\n 'Cancel' to stop, 'OK' to delete."), $theme_name )) . "');" . '">' . __('Delete') . '</a>';
- $actions = apply_filters('theme_action_links', $actions, $themes[$theme_name]);
-
- $actions = implode ( ' | ', $actions );
-?>
- <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">
-<?php if ( $screenshot ) : ?>
- <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />
-<?php endif; ?>
- </a>
-<h3><?php
- /* translators: 1: theme title, 2: theme version, 3: theme author */
- printf(__('%1$s %2$s by %3$s'), $title, $version, $author) ; ?></h3>
-<p class="description"><?php echo $description; ?></p>
-<span class='action-links'><?php echo $actions ?></span>
- <?php if ( current_user_can('edit_themes') && $parent_theme ) {
- /* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>
- <p><?php printf(__('The template files are located in <code>%2$s</code>. The stylesheet files are located in <code>%3$s</code>. <strong>%4$s</strong> uses templates from <strong>%5$s</strong>. Changes made to the templates will affect both themes.'), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme); ?></p>
-<?php } else { ?>
- <p><?php printf(__('All of this theme’s files are located in <code>%2$s</code>.'), $title, str_replace( WP_CONTENT_DIR, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ) ); ?></p>
-<?php } ?>
-<?php if ( $tags ) : ?>
-<p><?php _e('Tags:'); ?> <?php echo join(', ', $tags); ?></p>
-<?php endif; ?>
- <?php theme_update_available( $themes[$theme_name] ); ?>
-<?php endif; // end if not empty theme_name ?>
- </td>
-<?php } // end foreach $cols ?>
-</tr>
-<?php } // end foreach $table ?>
-</table>
-<?php } else { ?>
-<p><?php
- if ( current_user_can('install_themes') )
- printf(__('You only have one theme installed right now. Live a little! You can choose from over 1,000 free themes in the WordPress.org Theme Directory at any time: just click on the <em><a href="%s">Install Themes</a></em> tab above.'), 'theme-install.php');
- else
- printf(__('Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.'), get_site_option('site_name'));
- ?></p>
-<?php } // end if $theme_total?>
<br class="clear" />
-<?php if ( $page_links ) : ?>
-<div class="tablenav">
-<?php echo "<div class='tablenav-pages'>$page_links_text</div>"; ?>
-<br class="clear" />
-</div>
<?php endif; ?>
+<?php $wp_list_table->display(); ?>
+
+</form>
<br class="clear" />
<?php
if ( current_user_can('edit_themes') && count( $broken_themes ) ) {
?>
-<h2><?php _e('Broken Themes'); ?> <?php if ( is_multisite() ) _e( '(Site admin only)' ); ?></h2>
+<h3><?php _e('Broken Themes'); ?></h3>
<p><?php _e('The following themes are installed but incomplete. Themes must have a stylesheet and a template.'); ?></p>
<table id="broken-themes">