2004-09-11 18:12:40 +02:00
< ? php
2008-08-16 09:27:34 +02:00
/**
* Themes administration panel .
*
* @ package WordPress
* @ subpackage Administration
*/
/** WordPress Administration Bootstrap */
2004-10-19 05:03:06 +02:00
require_once ( 'admin.php' );
2004-09-11 18:12:40 +02:00
2009-08-01 23:12:17 +02:00
if ( ! current_user_can ( 'switch_themes' ) )
wp_die ( __ ( 'Cheatin’ uh?' ) );
2004-09-11 18:12:40 +02:00
if ( isset ( $_GET [ 'action' ]) ) {
2009-03-05 19:45:26 +01:00
if ( 'activate' == $_GET [ 'action' ] ) {
check_admin_referer ( 'switch-theme_' . $_GET [ 'template' ]);
2007-11-13 06:07:44 +01:00
switch_theme ( $_GET [ 'template' ], $_GET [ 'stylesheet' ]);
2006-06-27 07:38:56 +02:00
wp_redirect ( 'themes.php?activated=true' );
2005-09-06 01:33:10 +02:00
exit ;
2009-03-05 19:45:26 +01:00
} else if ( 'delete' == $_GET [ 'action' ] ) {
check_admin_referer ( 'delete-theme_' . $_GET [ 'template' ]);
2009-03-05 20:15:56 +01:00
if ( ! current_user_can ( 'update_themes' ) )
wp_die ( __ ( 'Cheatin’ uh?' ) );
delete_theme ( $_GET [ 'template' ]);
wp_redirect ( 'themes.php?deleted=true' );
exit ;
2004-09-11 18:12:40 +02:00
}
2005-09-06 01:33:10 +02:00
}
2004-09-11 18:12:40 +02:00
2006-11-18 08:31:29 +01:00
$title = __ ( 'Manage Themes' );
$parent_file = 'themes.php' ;
2008-05-20 19:19:33 +02:00
2009-05-11 20:59:09 +02:00
$help = '<p>' . __ ( 'Themes give your WordPress style. Once a theme is installed, you may preview it, activate it or deactivate it here.' ) . '</p>' ;
2010-01-14 20:15:00 +01:00
if ( current_user_can ( 'install_themes' ) ) {
2009-05-12 01:42:46 +02:00
$help .= '<p>' . sprintf ( __ ( 'You can find additional themes for your site by using the new <a href="%1$s">Theme Browser/Installer</a> functionality or by browsing the <a href="http://wordpress.org/extend/themes/">WordPress Theme Directory</a> directly and installing manually. To install a theme <em>manually</em>, <a href="%2$s">upload its ZIP archive with the new uploader</a> or copy its folder via FTP into your <code>wp-content/themes</code> directory.' ), 'theme-install.php' , 'theme-install.php?tab=upload' ) . '</p>' ;
$help .= '<p>' . __ ( 'Once a theme is uploaded, you should see it on this page.' ) . '</p>' ;
}
2009-05-11 20:59:09 +02:00
2010-01-15 17:58:36 +01:00
add_contextual_help ( $current_screen , $help );
2009-05-11 20:59:09 +02:00
2008-05-20 19:19:33 +02:00
add_thickbox ();
wp_enqueue_script ( 'theme-preview' );
2004-09-11 18:12:40 +02:00
require_once ( 'admin-header.php' );
2010-01-18 23:21:36 +01:00
if ( is_multisite () && current_user_can ( 'edit_themes' ) ) {
2010-01-26 16:27:35 +01:00
?> <div id="message0" class="updated fade"><p><?php _e('Administrator: new themes must be activated in the <a href="ms-themes.php">Themes Admin</a> page before they appear here.'); ?></p></div><?php
2010-01-14 03:02:19 +01:00
}
2004-09-11 18:12:40 +02:00
?>
2005-09-06 01:33:10 +02:00
2004-09-16 20:09:32 +02:00
< ? php if ( ! validate_current_theme () ) : ?>
2009-12-26 10:00:58 +01:00
< div id = " message1 " class = " updated " >< p >< ? php _e ( 'The active theme is broken. Reverting to the default theme.' ); ?> </p></div>
2009-05-24 17:46:09 +02:00
< ? php elseif ( isset ( $_GET [ 'activated' ]) ) :
if ( isset ( $wp_registered_sidebars ) && count ( ( array ) $wp_registered_sidebars ) ) { ?>
2009-12-26 10:00:58 +01:00
< div id = " message2 " class = " updated " >< p >< ? php printf ( __ ( 'New theme activated. This theme supports widgets, please visit the <a href="%s">widgets settings page</a> to configure them.' ), admin_url ( 'widgets.php' ) ); ?> </p></div><?php
2009-05-24 17:46:09 +02:00
} else { ?>
2009-12-26 10:00:58 +01:00
< div id = " message2 " class = " updated " >< p >< ? php printf ( __ ( 'New theme activated. <a href="%s">Visit site</a>' ), get_bloginfo ( 'url' ) . '/' ); ?> </p></div><?php
2009-05-24 17:46:09 +02:00
}
elseif ( isset ( $_GET [ 'deleted' ]) ) : ?>
2009-12-26 10:00:58 +01:00
< div id = " message3 " class = " updated " >< p >< ? php _e ( 'Theme deleted.' ) ?> </p></div>
2004-09-14 14:01:31 +02:00
< ? php endif ; ?>
2004-09-11 18:12:40 +02:00
< ? php
2010-01-19 00:34:36 +01:00
$themes = get_allowed_themes ();
2005-09-06 01:33:10 +02:00
$ct = current_theme_info ();
2009-04-19 22:56:02 +02:00
unset ( $themes [ $ct -> name ]);
2008-05-21 19:36:41 +02:00
2009-04-17 23:31:57 +02:00
uksort ( $themes , " strnatcasecmp " );
2008-05-21 19:36:41 +02:00
$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' => '' ,
2008-11-27 01:28:24 +01:00
'prev_text' => __ ( '«' ),
'next_text' => __ ( '»' ),
2008-05-21 19:36:41 +02:00
'total' => ceil ( $theme_total / $per_page ),
'current' => $page
));
$themes = array_slice ( $themes , $start , $per_page );
2008-10-10 20:21:16 +02:00
/**
* Check if there is an update for a theme available .
*
* Will display link , if there is an update available .
*
* @ since 2.7 . 0
*
* @ param object $theme Theme data object .
* @ return bool False if no valid info was passed .
*/
2008-09-26 08:43:53 +02:00
function theme_update_available ( $theme ) {
static $themes_update ;
2010-01-14 03:02:19 +01:00
2010-01-18 23:21:36 +01:00
if ( ! current_user_can ( 'update_themes' ) )
2010-01-14 03:02:19 +01:00
return ;
2008-09-26 08:43:53 +02:00
if ( ! isset ( $themes_update ) )
2010-01-08 21:49:55 +01:00
$themes_update = get_site_transient ( 'update_themes' );
2008-09-26 08:43:53 +02:00
2008-10-17 20:30:04 +02:00
if ( is_object ( $theme ) && isset ( $theme -> stylesheet ) )
2008-09-26 08:43:53 +02:00
$stylesheet = $theme -> stylesheet ;
2008-10-17 20:30:04 +02:00
elseif ( is_array ( $theme ) && isset ( $theme [ 'Stylesheet' ]) )
2008-09-26 08:43:53 +02:00
$stylesheet = $theme [ 'Stylesheet' ];
else
return false ; //No valid info passed.
if ( isset ( $themes_update -> response [ $stylesheet ]) ) {
$update = $themes_update -> response [ $stylesheet ];
2009-04-13 18:24:37 +02:00
$theme_name = is_object ( $theme ) ? $theme -> name : ( is_array ( $theme ) ? $theme [ 'Name' ] : '' );
2008-09-26 08:43:53 +02:00
$details_url = add_query_arg ( array ( 'TB_iframe' => 'true' , 'width' => 1024 , 'height' => 800 ), $update [ 'url' ]); //Theme browser inside WP? replace this, Also, theme preview JS will override this on the available list.
$update_url = wp_nonce_url ( 'update.php?action=upgrade-theme&theme=' . urlencode ( $stylesheet ), 'upgrade-theme_' . $stylesheet );
2009-05-27 21:05:58 +02:00
$update_onclick = 'onclick="if ( confirm(\'' . esc_js ( __ ( " Upgrading this theme will lose any customizations you have made. 'Cancel' to stop, 'OK' to upgrade. " ) ) . '\') ) {return true;}return false;"' ;
2008-09-26 08:43:53 +02:00
if ( ! current_user_can ( 'update_themes' ) )
2009-06-06 10:14:41 +02:00
printf ( '<p><strong>' . __ ( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%1$s">View version %3$s Details</a>.' ) . '</strong></p>' , $theme_name , $details_url , $update [ 'new_version' ]);
2010-01-17 08:04:31 +01:00
else if ( empty ( $update [ 'package' ]) )
2009-06-06 10:14:41 +02:00
printf ( '<p><strong>' . __ ( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%1$s">View version %3$s Details</a> <em>automatic upgrade unavailable for this theme</em>.' ) . '</strong></p>' , $theme_name , $details_url , $update [ 'new_version' ]);
2008-09-26 08:43:53 +02:00
else
2010-01-21 22:37:43 +01:00
printf ( '<p><strong>' . __ ( 'There is a new version of %1$s available. <a href="%2$s" class="thickbox" title="%1$s">View version %3$s Details</a> or <a href="%4$s" %5$s>upgrade automatically</a>.' ) . '</strong></p>' , $theme_name , $details_url , $update [ 'new_version' ], $update_url , $update_onclick );
2008-09-26 08:43:53 +02:00
}
}
2004-09-11 18:12:40 +02:00
?>
2004-09-14 14:01:31 +02:00
< div class = " wrap " >
2008-11-26 14:51:25 +01:00
< ? php screen_icon (); ?>
2010-03-01 16:27:42 +01:00
< h2 >< a href = " themes.php " class = " menu-tabs " >< ? php echo esc_html ( $title ); if ( current_user_can ( 'install_themes' ) ) { ?> </a> <a href="theme-install.php" class="menu-tabs menu-tab-inactive"><?php echo esc_html_x('Install Themes', 'theme'); ?></a><?php } ?></h2>
2008-10-17 22:02:03 +02:00
2008-11-08 08:56:42 +01:00
< h3 >< ? php _e ( 'Current Theme' ); ?> </h3>
2008-05-20 19:19:33 +02:00
< div id = " current-theme " >
2005-09-06 01:33:10 +02:00
< ? php if ( $ct -> screenshot ) : ?>
2009-10-13 21:06:35 +02:00
< img src = " <?php echo $ct->theme_root_uri . '/' . $ct->stylesheet . '/' . $ct->screenshot ; ?> " alt = " <?php _e('Current theme preview'); ?> " />
2005-08-07 12:11:30 +02:00
< ? php endif ; ?>
2009-03-02 20:20:19 +01:00
< h4 >< ? php
/* 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>
2009-04-30 04:33:22 +02:00
< p class = " theme-description " >< ? php echo $ct -> description ; ?> </p>
2010-01-18 23:21:36 +01:00
< ? php if ( current_user_can ( 'edit_themes' ) && $ct -> parent_theme ) { ?>
2009-10-13 21:06:35 +02:00
< 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>
2004-09-11 18:12:40 +02:00
< ? php } else { ?>
2009-10-13 21:06:35 +02:00
< 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>
2004-09-11 18:12:40 +02:00
< ? php } ?>
2007-12-31 19:39:43 +01:00
< ? php if ( $ct -> tags ) : ?>
< p >< ? php _e ( 'Tags:' ); ?> <?php echo join(', ', $ct->tags); ?></p>
< ? php endif ; ?>
2008-09-26 08:43:53 +02:00
< ? php theme_update_available ( $ct ); ?>
2004-09-14 14:01:31 +02:00
</ div >
2009-04-19 22:56:02 +02:00
2008-11-27 12:53:32 +01:00
< div class = " clear " ></ div >
2008-11-08 08:56:42 +01:00
< h3 >< ? php _e ( 'Available Themes' ); ?> </h3>
< div class = " clear " ></ div >
2008-05-21 19:36:41 +02:00
2009-04-19 22:56:02 +02:00
< ? php if ( $theme_total ) { ?>
2008-05-21 19:36:41 +02:00
< ? php if ( $page_links ) : ?>
2008-11-27 13:13:08 +01:00
< div class = " tablenav " >
2008-11-10 18:42:51 +01:00
< div class = " tablenav-pages " >< ? php $page_links_text = sprintf ( '<span class="displaying-num">' . __ ( 'Displaying %s–%s of %s' ) . '</span>%s' ,
2008-11-06 22:56:29 +01:00
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>
2008-11-27 13:13:08 +01:00
</ div >
2008-05-21 19:36:41 +02:00
< ? php endif ; ?>
2008-05-20 19:19:33 +02:00
< table id = " availablethemes " cellspacing = " 0 " cellpadding = " 0 " >
2005-08-07 12:11:30 +02:00
< ? php
$style = '' ;
$theme_names = array_keys ( $themes );
natcasesort ( $theme_names );
2009-05-24 01:42:28 +02:00
$table = array ();
2008-05-20 19:19:33 +02:00
$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 );
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 ) ) :
2005-08-07 12:11:30 +02: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' ];
2009-04-19 22:56:02 +02:00
$template_dir = $themes [ $theme_name ][ 'Template Dir' ];
$parent_theme = $themes [ $theme_name ][ 'Parent Theme' ];
2009-10-13 21:06:35 +02:00
$theme_root = $themes [ $theme_name ][ 'Theme Root' ];
$theme_root_uri = $themes [ $theme_name ][ 'Theme Root URI' ];
2009-06-10 08:55:29 +02:00
$preview_link = esc_url ( get_option ( 'home' ) . '/' );
if ( is_ssl () )
$preview_link = str_replace ( 'http://' , 'https://' , $preview_link );
2009-03-20 01:14:57 +01:00
$preview_link = htmlspecialchars ( add_query_arg ( array ( 'preview' => 1 , 'template' => $template , 'stylesheet' => $stylesheet , 'TB_iframe' => 'true' ), $preview_link ) );
2009-05-05 21:43:53 +02:00
$preview_text = esc_attr ( sprintf ( __ ( 'Preview of “%s”' ), $title ) );
2007-12-31 19:39:43 +01:00
$tags = $themes [ $theme_name ][ 'Tags' ];
2009-02-18 23:32:42 +01:00
$thickbox_class = 'thickbox thickbox-preview' ;
2007-09-03 18:11:10 +02:00
$activate_link = wp_nonce_url ( " themes.php?action=activate&template= " . urlencode ( $template ) . " &stylesheet= " . urlencode ( $stylesheet ), 'switch-theme_' . $template );
2009-05-05 21:43:53 +02:00
$activate_text = esc_attr ( sprintf ( __ ( 'Activate “%s”' ), $title ) );
2009-03-05 19:32:09 +01:00
$actions = array ();
2009-03-20 01:14:57 +01:00
$actions [] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __ ( 'Activate' ) . '</a>' ;
2009-05-05 21:43:53 +02:00
$actions [] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $theme_name )) . '">' . __ ( 'Preview' ) . '</a>' ;
2010-01-14 20:15:00 +01:00
if ( current_user_can ( 'update_themes' ) )
2009-05-09 09:27:22 +02:00
$actions [] = '<a class="submitdelete deletion" href="' . wp_nonce_url ( " themes.php?action=delete&template= $stylesheet " , 'delete-theme_' . $stylesheet ) . '" onclick="' . " if ( confirm(' " . esc_js ( sprintf ( __ ( " You are about to delete this theme '%s' \n 'Cancel' to stop, 'OK' to delete. " ), $theme_name )) . " ') ) { return true;}return false; " . '">' . __ ( 'Delete' ) . '</a>' ;
2009-03-05 19:32:09 +01:00
$actions = apply_filters ( 'theme_action_links' , $actions , $themes [ $theme_name ]);
$actions = implode ( ' | ' , $actions );
2005-08-07 12:11:30 +02:00
?>
2009-03-20 01:14:57 +01:00
< a href = " <?php echo $preview_link ; ?> " class = " <?php echo $thickbox_class ; ?> screenshot " >
2005-08-07 12:11:30 +02:00
< ? php if ( $screenshot ) : ?>
2009-10-13 21:06:35 +02:00
< img src = " <?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot ; ?> " alt = " " />
2005-08-07 12:11:30 +02:00
< ? php endif ; ?>
2008-05-20 19:19:33 +02:00
</ a >
2009-04-19 22:56:02 +02:00
< 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>
2010-01-18 23:21:36 +01:00
< ? php if ( current_user_can ( 'edit_themes' ) && $parent_theme ) {
2009-06-02 02:36:49 +02:00
/* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>
2009-10-13 21:06:35 +02:00
< 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>
2009-04-19 22:56:02 +02:00
< ? php } else { ?>
2009-10-13 21:06:35 +02:00
< 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>
2009-04-19 22:56:02 +02:00
< ? php } ?>
2007-12-31 19:39:43 +01:00
< ? php if ( $tags ) : ?>
2009-04-19 22:56:02 +02:00
< p >< ? php _e ( 'Tags:' ); ?> <?php echo join(', ', $tags); ?></p>
2007-12-31 19:39:43 +01:00
< ? php endif ; ?>
2008-09-26 08:43:53 +02:00
< ? php theme_update_available ( $themes [ $theme_name ] ); ?>
2008-05-20 19:19:33 +02:00
< ? php endif ; // end if not empty theme_name ?>
</ td >
< ? php } // end foreach $cols ?>
</ tr >
< ? php } // end foreach $table ?>
</ table >
2009-04-19 22:56:02 +02:00
< ? php } else { ?>
< p >< ? php _e ( 'You only have one theme installed at the moment so there is nothing to show you here. Maybe you should download some more to try out.' ); ?> </p>
< ? php } // end if $theme_total?>
2008-05-21 19:36:41 +02:00
< br class = " clear " />
< ? php if ( $page_links ) : ?>
< div class = " tablenav " >
2008-11-06 22:56:29 +01:00
< ? php echo " <div class='tablenav-pages'> $page_links_text </div> " ; ?>
2008-05-21 19:36:41 +02:00
< br class = " clear " />
</ div >
< ? php endif ; ?>
< br class = " clear " />
2004-10-25 01:48:51 +02:00
< ? php
// List broken themes, if any.
$broken_themes = get_broken_themes ();
2010-01-18 23:21:36 +01:00
if ( current_user_can ( 'edit_themes' ) && count ( $broken_themes ) ) {
2004-10-25 01:48:51 +02:00
?>
2010-01-14 03:02:19 +01:00
< h2 >< ? php _e ( 'Broken Themes' ); ?> <?php if ( is_multisite() ) _e( '(Site admin only)' ); ?></h2>
2004-10-25 01:48:51 +02:00
< p >< ? php _e ( 'The following themes are installed but incomplete. Themes must have a stylesheet and a template.' ); ?> </p>
2009-10-22 22:15:54 +02:00
< table id = " broken-themes " >
2004-10-25 01:48:51 +02:00
< tr >
< th >< ? php _e ( 'Name' ); ?> </th>
< th >< ? php _e ( 'Description' ); ?> </th>
</ tr >
< ? php
$theme = '' ;
2006-02-12 08:53:23 +01:00
2004-10-25 01:48:51 +02:00
$theme_names = array_keys ( $broken_themes );
natcasesort ( $theme_names );
foreach ( $theme_names as $theme_name ) {
$title = $broken_themes [ $theme_name ][ 'Title' ];
$description = $broken_themes [ $theme_name ][ 'Description' ];
$theme = ( 'class="alternate"' == $theme ) ? '' : 'class="alternate"' ;
echo "
2006-11-19 08:56:05 +01:00
< tr $theme >
< td > $title </ td >
< td > $description </ td >
</ tr > " ;
2004-10-25 01:48:51 +02:00
}
?>
</ table >
< ? php
}
?>
2004-09-11 18:12:40 +02:00
</ div >
2005-11-17 11:10:10 +01:00
< ? php require ( 'admin-footer.php' ); ?>