2010-10-24 22:57:43 -04:00
< ? php
/**
2010-10-25 00:04:18 -04:00
* Themes List Table class .
2010-10-24 22:57:43 -04:00
*
* @ package WordPress
2010-10-25 00:04:18 -04:00
* @ subpackage List_Table
* @ since 3.1 . 0
2011-01-16 16:47:24 -05:00
* @ access private
2010-10-24 22:57:43 -04:00
*/
2010-11-04 04:07:03 -04:00
class WP_Themes_List_Table extends WP_List_Table {
2010-10-24 22:57:43 -04:00
var $search = array ();
var $features = array ();
2012-02-09 12:20:26 -05:00
function __construct () {
parent :: __construct ( array (
'ajax' => true ,
) );
}
2010-10-24 22:57:43 -04:00
2010-12-16 04:18:28 -05:00
function ajax_user_can () {
2010-12-16 03:43:22 -05:00
// Do not check edit_theme_options here. AJAX calls for available themes require switch_themes.
2010-12-16 04:18:28 -05:00
return current_user_can ( 'switch_themes' );
2010-10-24 22:57:43 -04:00
}
function prepare_items () {
global $ct ;
$ct = current_theme_info ();
$themes = get_allowed_themes ();
2011-04-23 09:01:52 -04:00
if ( ! empty ( $_REQUEST [ 's' ] ) ) {
$search = strtolower ( stripslashes ( $_REQUEST [ 's' ] ) );
2010-10-24 22:57:43 -04:00
$this -> search = array_merge ( $this -> search , array_filter ( array_map ( 'trim' , explode ( ',' , $search ) ) ) );
$this -> search = array_unique ( $this -> search );
}
if ( ! empty ( $_REQUEST [ 'features' ] ) ) {
$this -> features = $_REQUEST [ 'features' ];
$this -> features = array_map ( 'trim' , $this -> features );
$this -> features = array_map ( 'sanitize_title_with_dashes' , $this -> features );
$this -> features = array_unique ( $this -> features );
}
if ( $this -> search || $this -> features ) {
foreach ( $themes as $key => $theme ) {
if ( ! $this -> search_theme ( $theme ) )
unset ( $themes [ $key ] );
}
}
unset ( $themes [ $ct -> name ] );
uksort ( $themes , " strnatcasecmp " );
2012-02-09 12:20:26 -05:00
$per_page = 999 ;
2010-10-24 22:57:43 -04:00
$page = $this -> get_pagenum ();
$start = ( $page - 1 ) * $per_page ;
$this -> items = array_slice ( $themes , $start , $per_page );
$this -> set_pagination_args ( array (
'total_items' => count ( $themes ),
'per_page' => $per_page ,
) );
}
function no_items () {
2011-01-14 19:35:29 -05:00
if ( $this -> search || $this -> features ) {
_e ( 'No items found.' );
return ;
}
2011-02-09 12:35:36 -05:00
2010-12-09 11:12:04 -05:00
if ( is_multisite () ) {
if ( current_user_can ( 'install_themes' ) && current_user_can ( 'manage_network_themes' ) ) {
printf ( __ ( 'You only have one theme enabled for this site right now. Visit the Network Admin to <a href="%1$s">enable</a> or <a href="%2$s">install</a> more themes.' ), network_admin_url ( 'site-themes.php?id=' . $GLOBALS [ 'blog_id' ] ), network_admin_url ( 'theme-install.php' ) );
return ;
} elseif ( current_user_can ( 'manage_network_themes' ) ) {
printf ( __ ( 'You only have one theme enabled for this site right now. Visit the Network Admin to <a href="%1$s">enable</a> more themes.' ), network_admin_url ( 'site-themes.php?id=' . $GLOBALS [ 'blog_id' ] ) );
return ;
}
// else, fallthrough. install_themes doesn't help if you can't enable it.
2010-12-06 16:37:35 -05:00
} else {
2010-12-09 11:12:04 -05:00
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 <a href="%s">Install Themes</a> tab above.' ), admin_url ( 'theme-install.php' ) );
return ;
}
2010-12-06 16:37:35 -05:00
}
2010-12-09 11:12:04 -05:00
// Fallthrough.
printf ( __ ( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ), get_site_option ( 'site_name' ) );
2010-10-24 22:57:43 -04:00
}
2011-02-09 12:35:36 -05:00
function tablenav ( $which = 'top' ) {
2011-01-14 19:35:29 -05:00
if ( $this -> get_pagination_arg ( 'total_pages' ) <= 1 )
return ;
2011-02-09 12:35:36 -05:00
?>
2011-09-15 00:26:26 -04:00
< div class = " tablenav themes <?php echo $which ; ?> " >
2011-02-09 12:35:36 -05:00
< ? php $this -> pagination ( $which ); ?>
< img src = " <?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?> " class = " ajax-loading list-ajax-loading " alt = " " />
< br class = " clear " />
</ div >
< ? php
2011-01-14 19:35:29 -05:00
}
2010-10-24 22:57:43 -04:00
2010-12-16 14:05:14 -05:00
function display () {
2012-02-09 12:20:26 -05:00
wp_nonce_field ( " fetch-list- " . get_class ( $this ), '_ajax_fetch_list_nonce' );
2010-10-24 22:57:43 -04:00
?>
2011-02-09 12:35:36 -05:00
< ? php $this -> tablenav ( 'top' ); ?>
2010-10-24 22:57:43 -04:00
2011-09-15 00:26:26 -04:00
< div id = " availablethemes " >
< ? php $this -> display_rows_or_placeholder (); ?>
</ div >
2010-10-24 22:57:43 -04:00
2011-02-09 12:35:36 -05:00
< ? php $this -> tablenav ( 'bottom' ); ?>
2010-10-24 22:57:43 -04:00
< ? php
}
function get_columns () {
return array ();
}
function display_rows () {
$themes = $this -> items ;
$theme_names = array_keys ( $themes );
natcasesort ( $theme_names );
2011-09-15 00:26:26 -04:00
foreach ( $theme_names as $theme_name ) {
$class = array ( 'available-theme' );
?>
< div class = " <?php echo join( ' ', $class ); ?> " >
< ? php if ( ! empty ( $theme_name ) ) :
2010-10-24 22:57:43 -04:00
$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' ];
2012-02-01 17:31:35 -05:00
$preview_link = esc_url ( add_query_arg ( array ( 'preview' => 1 , 'template' => $template , 'stylesheet' => $stylesheet , 'preview_iframe' => true , 'TB_iframe' => 'true' ), home_url ( '/' ) ) );
2010-10-24 22:57:43 -04:00
$preview_text = esc_attr ( sprintf ( __ ( 'Preview of “%s”' ), $title ) );
$tags = $themes [ $theme_name ][ 'Tags' ];
$thickbox_class = 'thickbox thickbox-preview' ;
2012-02-01 17:31:35 -05:00
$activate_link = wp_nonce_url ( " themes.php?action=activate&template= " . urlencode ( $template ) . " &stylesheet= " . urlencode ( $stylesheet ), 'switch-theme_' . $template );
2010-10-24 22:57:43 -04:00
$activate_text = esc_attr ( sprintf ( __ ( 'Activate “%s”' ), $title ) );
$actions = array ();
2011-12-13 18:45:31 -05:00
$actions [] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __ ( 'Activate' ) . '</a>' ;
2010-10-24 22:57:43 -04:00
$actions [] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $theme_name ) ) . '">' . __ ( 'Preview' ) . '</a>' ;
2010-12-06 15:48:41 -05:00
if ( ! is_multisite () && current_user_can ( 'delete_themes' ) )
2010-10-24 22:57:43 -04:00
$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>
2012-02-06 15:54:01 -05:00
2010-10-24 22:57:43 -04:00
< span class = 'action-links' >< ? php echo $actions ?> </span>
2012-02-06 15:54:01 -05:00
< span class = " separator hide-if-no-js " >| </ span >< a href = " # " class = " theme-detail hide-if-no-js " tabindex = '4' >< ? php _e ( 'Details' ) ?> </a>
< div class = " themedetaildiv hide-if-js " >
< p >< ? php echo $description ; ?> </p>
2010-10-24 22:57:43 -04:00
< ? 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 endif ; // end if not empty theme_name ?>
2012-02-06 15:54:01 -05:00
</ div >
< ? php theme_update_available ( $themes [ $theme_name ] ); ?>
2011-09-15 00:26:26 -04:00
</ div >
< ? php } // end foreach $theme_names
2010-10-24 22:57:43 -04:00
}
function search_theme ( $theme ) {
$matched = 0 ;
// Match all phrases
if ( count ( $this -> search ) > 0 ) {
foreach ( $this -> search as $word ) {
$matched = 0 ;
// In a tag?
if ( in_array ( $word , array_map ( 'sanitize_title_with_dashes' , $theme [ 'Tags' ] ) ) )
$matched = 1 ;
// In one of the fields?
foreach ( array ( 'Name' , 'Title' , 'Description' , 'Author' , 'Template' , 'Stylesheet' ) AS $field ) {
if ( stripos ( $theme [ $field ], $word ) !== false )
$matched ++ ;
}
if ( $matched == 0 )
return false ;
}
}
// Now search the features
if ( count ( $this -> features ) > 0 ) {
foreach ( $this -> features as $word ) {
// In a tag?
if ( ! in_array ( $word , array_map ( 'sanitize_title_with_dashes' , $theme [ 'Tags' ] ) ) )
return false ;
}
}
// Only get here if each word exists in the tags or one of the fields
return true ;
}
}