2019-03-12 09:27:46 +00:00
< ? php
/**
* List Table API : WP_Themes_List_Table class
*
* @ package WordPress
* @ subpackage Administration
* @ since 3.1 . 0
*/
/**
* Core class used to implement displaying installed themes in a list table .
*
* @ since 3.1 . 0
* @ access private
*
* @ see WP_List_Table
*/
class WP_Themes_List_Table extends WP_List_Table {
protected $search_terms = array ();
2019-04-16 19:56:22 +00:00
public $features = array ();
2019-03-12 09:27:46 +00:00
/**
* Constructor .
*
* @ since 3.1 . 0
*
* @ see WP_List_Table :: __construct () for more information on default arguments .
*
* @ param array $args An associative array of arguments .
*/
public function __construct ( $args = array () ) {
2019-04-16 19:56:22 +00:00
parent :: __construct (
array (
'ajax' => true ,
'screen' => isset ( $args [ 'screen' ] ) ? $args [ 'screen' ] : null ,
)
);
2019-03-12 09:27:46 +00:00
}
/**
* @ return bool
*/
public function ajax_user_can () {
// Do not check edit_theme_options here. Ajax calls for available themes require switch_themes.
return current_user_can ( 'switch_themes' );
}
/**
*/
public function prepare_items () {
$themes = wp_get_themes ( array ( 'allowed' => true ) );
2019-04-16 19:56:22 +00:00
if ( ! empty ( $_REQUEST [ 's' ] ) ) {
2019-03-12 09:27:46 +00:00
$this -> search_terms = array_unique ( array_filter ( array_map ( 'trim' , explode ( ',' , strtolower ( wp_unslash ( $_REQUEST [ 's' ] ) ) ) ) ) );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( ! empty ( $_REQUEST [ 'features' ] ) ) {
2019-03-12 09:27:46 +00:00
$this -> features = $_REQUEST [ 'features' ];
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
if ( $this -> search_terms || $this -> features ) {
foreach ( $themes as $key => $theme ) {
2019-04-16 19:56:22 +00:00
if ( ! $this -> search_theme ( $theme ) ) {
2019-03-12 09:27:46 +00:00
unset ( $themes [ $key ] );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
}
}
unset ( $themes [ get_option ( 'stylesheet' ) ] );
WP_Theme :: sort_by_name ( $themes );
$per_page = 36 ;
2019-04-16 19:56:22 +00:00
$page = $this -> get_pagenum ();
2019-03-12 09:27:46 +00:00
$start = ( $page - 1 ) * $per_page ;
$this -> items = array_slice ( $themes , $start , $per_page , true );
2019-04-16 19:56:22 +00:00
$this -> set_pagination_args (
array (
'total_items' => count ( $themes ),
'per_page' => $per_page ,
'infinite_scroll' => true ,
)
);
2019-03-12 09:27:46 +00:00
}
/**
*/
public function no_items () {
if ( $this -> search_terms || $this -> features ) {
_e ( 'No items found.' );
return ;
}
$blog_id = get_current_blog_id ();
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=' . $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=' . $blog_id ) );
return ;
}
// Else, fallthrough. install_themes doesn't help if you can't enable it.
} else {
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 Theme Directory at any time: just click on the <a href="%s">Install Themes</a> tab above.' ), admin_url ( 'theme-install.php' ) );
return ;
}
}
// 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' ) );
}
/**
* @ param string $which
*/
public function tablenav ( $which = 'top' ) {
2019-04-16 19:56:22 +00:00
if ( $this -> get_pagination_arg ( 'total_pages' ) <= 1 ) {
2019-03-12 09:27:46 +00:00
return ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
?>
< div class = " tablenav themes <?php echo $which ; ?> " >
< ? php $this -> pagination ( $which ); ?>
< span class = " spinner " ></ span >
< br class = " clear " />
</ div >
< ? php
}
/**
*/
public function display () {
2019-04-16 19:56:22 +00:00
wp_nonce_field ( 'fetch-list-' . get_class ( $this ), '_ajax_fetch_list_nonce' );
?>
2019-03-12 09:27:46 +00:00
< ? php $this -> tablenav ( 'top' ); ?>
< div id = " availablethemes " >
< ? php $this -> display_rows_or_placeholder (); ?>
</ div >
< ? php $this -> tablenav ( 'bottom' ); ?>
2019-04-16 19:56:22 +00:00
< ? php
2019-03-12 09:27:46 +00:00
}
/**
* @ return array
*/
public function get_columns () {
return array ();
}
/**
*/
public function display_rows_or_placeholder () {
if ( $this -> has_items () ) {
$this -> display_rows ();
} else {
echo '<div class="no-items">' ;
$this -> no_items ();
echo '</div>' ;
}
}
/**
*/
public function display_rows () {
$themes = $this -> items ;
2019-04-16 19:56:22 +00:00
foreach ( $themes as $theme ) :
?>
< div class = " available-theme " >
< ? php
2019-03-12 09:27:46 +00:00
$template = $theme -> get_template ();
$stylesheet = $theme -> get_stylesheet ();
2019-04-16 19:56:22 +00:00
$title = $theme -> display ( 'Name' );
$version = $theme -> display ( 'Version' );
$author = $theme -> display ( 'Author' );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$activate_link = wp_nonce_url ( 'themes.php?action=activate&template=' . urlencode ( $template ) . '&stylesheet=' . urlencode ( $stylesheet ), 'switch-theme_' . $stylesheet );
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
$actions = array ();
2019-03-12 09:27:46 +00:00
$actions [ 'activate' ] = '<a href="' . $activate_link . '" class="activatelink" title="'
. esc_attr ( sprintf ( __ ( 'Activate “%s”' ), $title ) ) . '">' . __ ( 'Activate' ) . '</a>' ;
if ( current_user_can ( 'edit_theme_options' ) && current_user_can ( 'customize' ) ) {
$actions [ 'preview' ] .= '<a href="' . wp_customize_url ( $stylesheet ) . '" class="load-customize hide-if-no-customize">'
. __ ( 'Live Preview' ) . '</a>' ;
}
2019-04-16 19:56:22 +00:00
if ( ! is_multisite () && current_user_can ( 'delete_themes' ) ) {
2019-03-12 09:27:46 +00:00
$actions [ 'delete' ] = '<a class="submitdelete deletion" href="' . wp_nonce_url ( 'themes.php?action=delete&stylesheet=' . urlencode ( $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>' ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
/** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */
2019-04-16 19:56:22 +00:00
$actions = apply_filters ( 'theme_action_links' , $actions , $theme , 'all' );
2019-03-12 09:27:46 +00:00
/** This filter is documented in wp-admin/includes/class-wp-ms-themes-list-table.php */
$actions = apply_filters ( " theme_action_links_ $stylesheet " , $actions , $theme , 'all' );
$delete_action = isset ( $actions [ 'delete' ] ) ? '<div class="delete-theme">' . $actions [ 'delete' ] . '</div>' : '' ;
unset ( $actions [ 'delete' ] );
?>
< span class = " screenshot hide-if-customize " >
< ? php if ( $screenshot = $theme -> get_screenshot () ) : ?>
< img src = " <?php echo esc_url( $screenshot ); ?> " alt = " " />
< ? php endif ; ?>
</ span >
< a href = " <?php echo wp_customize_url( $stylesheet ); ?> " class = " screenshot load-customize hide-if-no-customize " >
< ? php if ( $screenshot = $theme -> get_screenshot () ) : ?>
< img src = " <?php echo esc_url( $screenshot ); ?> " alt = " " />
< ? php endif ; ?>
</ a >
< h3 >< ? php echo $title ; ?> </h3>
< div class = " theme-author " >< ? php printf ( __ ( 'By %s' ), $author ); ?> </div>
< div class = " action-links " >
< ul >
2019-04-16 19:56:22 +00:00
< ? php foreach ( $actions as $action ) : ?>
2019-03-12 09:27:46 +00:00
< li >< ? php echo $action ; ?> </li>
< ? php endforeach ; ?>
2019-04-16 19:56:22 +00:00
< li class = " hide-if-no-js " >< a href = " # " class = " theme-detail " >< ? php _e ( 'Details' ); ?> </a></li>
2019-03-12 09:27:46 +00:00
</ ul >
< ? php echo $delete_action ; ?>
< ? php theme_update_available ( $theme ); ?>
</ div >
< div class = " themedetaildiv hide-if-js " >
2019-04-16 19:56:22 +00:00
< p >< strong >< ? php _e ( 'Version:' ); ?> </strong> <?php echo $version; ?></p>
< p >< ? php echo $theme -> display ( 'Description' ); ?> </p>
< ? php
if ( $theme -> parent () ) {
printf (
' <p class="howto">' . __ ( 'This <a href="%1$s">child theme</a> requires its parent theme, %2$s.' ) . '</p>' ,
2019-03-12 09:27:46 +00:00
__ ( 'https://codex.wordpress.org/Child_Themes' ),
2019-04-16 19:56:22 +00:00
$theme -> parent () -> display ( 'Name' )
);
}
?>
2019-03-12 09:27:46 +00:00
</ div >
</ div >
2019-04-16 19:56:22 +00:00
< ? php
2019-03-12 09:27:46 +00:00
endforeach ;
}
/**
* @ param WP_Theme $theme
* @ return bool
*/
public function search_theme ( $theme ) {
// Search the features
foreach ( $this -> features as $word ) {
2019-04-16 19:56:22 +00:00
if ( ! in_array ( $word , $theme -> get ( 'Tags' ) ) ) {
2019-03-12 09:27:46 +00:00
return false ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
}
// Match all phrases
foreach ( $this -> search_terms as $word ) {
2019-04-16 19:56:22 +00:00
if ( in_array ( $word , $theme -> get ( 'Tags' ) ) ) {
2019-03-12 09:27:46 +00:00
continue ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
foreach ( array ( 'Name' , 'Description' , 'Author' , 'AuthorURI' ) as $header ) {
// Don't mark up; Do translate.
if ( false !== stripos ( strip_tags ( $theme -> display ( $header , false , true ) ), $word ) ) {
continue 2 ;
}
}
2019-04-16 19:56:22 +00:00
if ( false !== stripos ( $theme -> get_stylesheet (), $word ) ) {
2019-03-12 09:27:46 +00:00
continue ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
2019-04-16 19:56:22 +00:00
if ( false !== stripos ( $theme -> get_template (), $word ) ) {
2019-03-12 09:27:46 +00:00
continue ;
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
return false ;
}
return true ;
}
/**
* Send required variables to JavaScript land
*
* @ since 3.4 . 0
*
* @ param array $extra_args
*/
public function _js_vars ( $extra_args = array () ) {
$search_string = isset ( $_REQUEST [ 's' ] ) ? esc_attr ( wp_unslash ( $_REQUEST [ 's' ] ) ) : '' ;
$args = array (
2019-04-16 19:56:22 +00:00
'search' => $search_string ,
'features' => $this -> features ,
'paged' => $this -> get_pagenum (),
2019-03-12 09:27:46 +00:00
'total_pages' => ! empty ( $this -> _pagination_args [ 'total_pages' ] ) ? $this -> _pagination_args [ 'total_pages' ] : 1 ,
);
2019-04-16 19:56:22 +00:00
if ( is_array ( $extra_args ) ) {
2019-03-12 09:27:46 +00:00
$args = array_merge ( $args , $extra_args );
2019-04-16 19:56:22 +00:00
}
2019-03-12 09:27:46 +00:00
printf ( " <script type='text/javascript'>var theme_list_args = %s;</script> \n " , wp_json_encode ( $args ) );
parent :: _js_vars ();
}
}