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
2012-02-29 17:19:18 -05:00
protected $search_terms = array ();
2010-10-24 22:57:43 -04:00
var $features = array ();
2012-02-29 17:19:18 -05:00
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.
2012-03-02 17:09:26 -05:00
return current_user_can ( 'switch_themes' );
2010-10-24 22:57:43 -04:00
}
function prepare_items () {
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
$themes = wp_get_themes ( array ( 'allowed' => true ) );
2010-10-24 22:57:43 -04:00
2012-02-29 17:19:18 -05:00
if ( ! empty ( $_REQUEST [ 's' ] ) )
$this -> search_terms = array_unique ( array_filter ( array_map ( 'trim' , explode ( ',' , strtolower ( stripslashes ( $_REQUEST [ 's' ] ) ) ) ) ) );
2010-10-24 22:57:43 -04:00
2012-03-01 19:13:05 -05:00
if ( ! empty ( $_REQUEST [ 'features' ] ) )
2010-10-24 22:57:43 -04:00
$this -> features = $_REQUEST [ 'features' ];
2012-02-29 17:19:18 -05:00
if ( $this -> search_terms || $this -> features ) {
2010-10-24 22:57:43 -04:00
foreach ( $themes as $key => $theme ) {
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
if ( ! $this -> search_theme ( $theme ) )
2010-10-24 22:57:43 -04:00
unset ( $themes [ $key ] );
}
}
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
unset ( $themes [ get_option ( 'stylesheet' ) ] );
WP_Theme :: sort_by_name ( $themes );
2010-10-24 22:57:43 -04:00
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 ;
2012-02-23 09:42:01 -05:00
$this -> items = array_slice ( $themes , $start , $per_page , true );
2010-10-24 22:57:43 -04:00
$this -> set_pagination_args ( array (
'total_items' => count ( $themes ),
'per_page' => $per_page ,
2012-03-02 17:09:26 -05:00
'infinite_scroll' => true ,
2010-10-24 22:57:43 -04:00
) );
}
function no_items () {
2012-02-29 17:19:18 -05:00
if ( $this -> search_terms || $this -> features ) {
2011-01-14 19:35:29 -05:00
_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 ;
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
foreach ( $themes as $theme ) {
echo '<div class="available-theme">' ;
$template = $theme -> get_template ();
$stylesheet = $theme -> get_stylesheet ();
$title = $theme -> display ( 'Name' );
$version = $theme -> display ( 'Version' );
$author = $theme -> display ( 'Author' );
$activate_link = wp_nonce_url ( " themes.php?action=activate&template= " . urlencode ( $template ) . " &stylesheet= " . urlencode ( $stylesheet ), 'switch-theme_' . $template );
$preview_link = esc_url ( add_query_arg (
array ( 'preview' => 1 , 'template' => $template , 'stylesheet' => $stylesheet , 'preview_iframe' => true , 'TB_iframe' => 'true' ),
home_url ( '/' ) ) );
$actions = array ();
$actions [] = '<a href="' . $activate_link . '" class="activatelink" title="'
. esc_attr ( sprintf ( __ ( 'Activate “%s”' ), $title ) ) . '">' . __ ( 'Activate' ) . '</a>' ;
$actions [] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="'
. esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $title ) ) . '">' . __ ( 'Preview' ) . '</a>' ;
if ( ! is_multisite () && 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. " ), $title ) )
. " ' ); " . '">' . __ ( 'Delete' ) . '</a>' ;
$actions = apply_filters ( 'theme_action_links' , $actions , $theme );
$actions = implode ( ' | ' , $actions );
?>
< a href = " <?php echo $preview_link ; ?> " class = " thickbox thickbox-preview screenshot " >
2012-02-29 15:31:56 -05:00
< ? php if ( $screenshot = $theme -> get_screenshot () ) : ?>
< img src = " <?php echo esc_url( $screenshot ); ?> " alt = " " />
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
< ? 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>
< span class = 'action-links' >< ? php echo $actions ?> </span>
< 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 $theme -> display ( 'Description' ); ?> </p>
< ? php if ( current_user_can ( 'edit_themes' ) && $theme -> parent () ) :
/* 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 , '' , $theme -> get_template_directory () ), str_replace ( WP_CONTENT_DIR , '' , $theme -> get_stylesheet_directory () ), $title , $theme -> parent () -> display ( 'Name' ) ); ?> </p>
< ? php else :
/* translators: 1: theme title, 2: template dir, 3: stylesheet_dir */ ?>
< p >< ? php printf ( __ ( 'All of this theme’s files are located in <code>%2$s</code>.' ),
$title , str_replace ( WP_CONTENT_DIR , '' , $theme -> get_template_directory () ), str_replace ( WP_CONTENT_DIR , '' , $theme -> get_stylesheet_directory () ) ); ?> </p>
< ? php endif ; ?>
</ div >
< ? php theme_update_available ( $theme ); ?>
</ div >
< ? php
}
2010-10-24 22:57:43 -04:00
}
function search_theme ( $theme ) {
2012-02-28 15:51:19 -05:00
// Search the features
2012-02-29 17:19:18 -05:00
foreach ( $this -> features as $word ) {
if ( ! in_array ( $word , $theme -> get ( 'Tags' ) ) )
return false ;
2012-02-28 15:51:19 -05:00
}
2010-10-24 22:57:43 -04:00
// Match all phrases
2012-02-29 17:19:18 -05:00
foreach ( $this -> search_terms as $word ) {
if ( in_array ( $word , $theme -> get ( 'Tags' ) ) )
continue ;
foreach ( array ( 'Name' , 'Description' , 'Author' , 'AuthorURI' ) as $header ) {
// Don't mark up; Do translate.
if ( false !== stripos ( $theme -> display ( $header , false , true ), $word ) )
continue 2 ;
Introduce WP_Theme, wp_get_themes(), and wp_get_theme() to replace get_themes(), get_theme(), get_theme_data(), current_theme_info(), and others.
* Getters and Helpers: Introduces a series of methods to allow for easy generation of headers for display, and other theme metadata, including page templates.
* Screenshots: Handles support for multiple screenshots. (see # Additional screenshots must be PNG and start with screenshot-2.png, and be sequential to be counted. see #19816.
* Error Handling: Broken themes have a WP_Error object attached to them.
* Caching: Introduces a wp_cache_themes_persistently filter (also in [20020]) to enable persistent caching of all filesystem and sanitization operations normally handled by WP_Theme (and formerly get_file_data() and get_themes()). Themes are cached individually and across five different cache keys for different data pieces.
* Compatibility: A WP_Theme object is backwards compatible with a theme's array formerly returned by get_themes() and get_theme(), and an stdClass object formerly returned by current_theme_info().
* i18n/L10n: Theme headers are now localizable with proper Text Domain and Domain Path headers, like plugins. (Language packs may remove the requirement for headers.) For page templates, see #6007 (not fixed yet, but will be easy now). For headers, fixes #15858.
* PHP and CSS files: New methods that fetch a list of theme files (for the theme editor) only on demand, rather than only loading them into memory. fixes #11214.
Functions deprecated:
* get_themes(), get_allowed_themes() and get_broken_themes() -- use wp_get_themes()
* get_theme() and current_theme_info() -- use wp_get_theme()
* get_site_allowed_themes() -- use WP_Theme::get_allowed_on_network()
* wpmu_get_blog_allowedthemes() -- use WP_theme::get_allowed_on_site()
see also [20016], [20018], [20019], [20020], [20021], [20022], [20025], [20026], [20027]. also fixes #19244.
see #20103.
git-svn-id: http://svn.automattic.com/wordpress/trunk@20029 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-02-28 16:24:44 -05:00
}
2012-02-29 17:19:18 -05:00
if ( false !== stripos ( $theme -> get_stylesheet (), $word ) )
continue ;
if ( false !== stripos ( $theme -> get_template (), $word ) )
continue ;
return false ;
2010-10-24 22:57:43 -04:00
}
return true ;
}
2012-03-02 17:09:26 -05:00
/**
* Send required variables to JavaScript land
*
* @ since 3.4
* @ access private
*
* @ uses $this -> features Array of all feature search terms .
* @ uses get_pagenum ()
* @ uses _pagination_args [ 'total_pages' ]
*/
function _js_vars ( $extra_args = array () ) {
$search_string = isset ( $_REQUEST [ 's' ] ) ? esc_attr ( stripslashes ( $_REQUEST [ 's' ] ) ) : '' ;
$args = array (
'search' => $search_string ,
'features' => $this -> features ,
'paged' => $this -> get_pagenum (),
2012-03-02 18:06:31 -05:00
'total_pages' => ! empty ( $this -> _pagination_args [ 'total_pages' ] ) ? $this -> _pagination_args [ 'total_pages' ] : 1 ,
2012-03-02 17:09:26 -05:00
);
if ( is_array ( $extra_args ) )
2012-03-02 18:06:31 -05:00
$args = array_merge ( $args , $extra_args );
2012-03-02 17:09:26 -05:00
2012-03-02 18:06:31 -05:00
parent :: _js_vars ( $args );
2012-03-02 17:09:26 -05:00
}
2010-10-24 22:57:43 -04:00
}