2004-09-11 12:12:40 -04:00
< ? php
2008-08-16 03:27:34 -04:00
/**
* Themes administration panel .
*
* @ package WordPress
* @ subpackage Administration
*/
/** WordPress Administration Bootstrap */
2010-04-18 02:14:45 -04:00
require_once ( './admin.php' );
2004-09-11 12:12:40 -04:00
2009-08-01 17:12:17 -04:00
if ( ! current_user_can ( 'switch_themes' ) )
wp_die ( __ ( 'Cheatin’ uh?' ) );
2004-09-11 12:12:40 -04:00
if ( isset ( $_GET [ 'action' ]) ) {
2009-03-05 13:45:26 -05:00
if ( 'activate' == $_GET [ 'action' ] ) {
check_admin_referer ( 'switch-theme_' . $_GET [ 'template' ]);
2007-11-13 00:07:44 -05:00
switch_theme ( $_GET [ 'template' ], $_GET [ 'stylesheet' ]);
2006-06-27 01:38:56 -04:00
wp_redirect ( 'themes.php?activated=true' );
2005-09-05 19:33:10 -04:00
exit ;
2009-03-05 13:45:26 -05:00
} else if ( 'delete' == $_GET [ 'action' ] ) {
check_admin_referer ( 'delete-theme_' . $_GET [ 'template' ]);
2009-03-05 14:15:56 -05: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 12:12:40 -04:00
}
2005-09-05 19:33:10 -04:00
}
2004-09-11 12:12:40 -04:00
2006-11-18 02:31:29 -05:00
$title = __ ( 'Manage Themes' );
$parent_file = 'themes.php' ;
2008-05-20 13:19:33 -04:00
2009-05-11 14:59:09 -04: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 14:15:00 -05:00
if ( current_user_can ( 'install_themes' ) ) {
2009-05-11 19:42:46 -04: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 14:59:09 -04:00
2010-01-15 11:58:36 -05:00
add_contextual_help ( $current_screen , $help );
2009-05-11 14:59:09 -04:00
2008-05-20 13:19:33 -04:00
add_thickbox ();
wp_enqueue_script ( 'theme-preview' );
2010-04-18 02:14:45 -04:00
require_once ( './admin-header.php' );
2010-01-18 17:21:36 -05:00
if ( is_multisite () && current_user_can ( 'edit_themes' ) ) {
2010-04-07 23:36:52 -04:00
?> <div id="message0" class="updated"><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-13 21:02:19 -05:00
}
2004-09-11 12:12:40 -04:00
?>
2005-09-05 19:33:10 -04:00
2004-09-16 14:09:32 -04:00
< ? php if ( ! validate_current_theme () ) : ?>
2009-12-26 04:00:58 -05:00
< div id = " message1 " class = " updated " >< p >< ? php _e ( 'The active theme is broken. Reverting to the default theme.' ); ?> </p></div>
2009-05-24 11:46:09 -04:00
< ? php elseif ( isset ( $_GET [ 'activated' ]) ) :
if ( isset ( $wp_registered_sidebars ) && count ( ( array ) $wp_registered_sidebars ) ) { ?>
2009-12-26 04:00:58 -05: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 11:46:09 -04:00
} else { ?>
2009-12-26 04:00:58 -05: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 11:46:09 -04:00
}
elseif ( isset ( $_GET [ 'deleted' ]) ) : ?>
2009-12-26 04:00:58 -05:00
< div id = " message3 " class = " updated " >< p >< ? php _e ( 'Theme deleted.' ) ?> </p></div>
2004-09-14 08:01:31 -04:00
< ? php endif ; ?>
2004-09-11 12:12:40 -04:00
< ? php
2010-01-18 18:34:36 -05:00
$themes = get_allowed_themes ();
2005-09-05 19:33:10 -04:00
$ct = current_theme_info ();
2009-04-19 16:56:02 -04:00
unset ( $themes [ $ct -> name ]);
2008-05-21 13:36:41 -04:00
2009-04-17 17:31:57 -04:00
uksort ( $themes , " strnatcasecmp " );
2008-05-21 13:36:41 -04: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-26 19:28:24 -05:00
'prev_text' => __ ( '«' ),
'next_text' => __ ( '»' ),
2008-05-21 13:36:41 -04:00
'total' => ceil ( $theme_total / $per_page ),
'current' => $page
));
$themes = array_slice ( $themes , $start , $per_page );
2008-10-10 14:21:16 -04: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 02:43:53 -04:00
function theme_update_available ( $theme ) {
static $themes_update ;
2010-01-13 21:02:19 -05:00
2010-01-18 17:21:36 -05:00
if ( ! current_user_can ( 'update_themes' ) )
2010-01-13 21:02:19 -05:00
return ;
2008-09-26 02:43:53 -04:00
if ( ! isset ( $themes_update ) )
2010-01-08 15:49:55 -05:00
$themes_update = get_site_transient ( 'update_themes' );
2008-09-26 02:43:53 -04:00
2008-10-17 14:30:04 -04:00
if ( is_object ( $theme ) && isset ( $theme -> stylesheet ) )
2008-09-26 02:43:53 -04:00
$stylesheet = $theme -> stylesheet ;
2008-10-17 14:30:04 -04:00
elseif ( is_array ( $theme ) && isset ( $theme [ 'Stylesheet' ]) )
2008-09-26 02:43:53 -04: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 12:24:37 -04:00
$theme_name = is_object ( $theme ) ? $theme -> name : ( is_array ( $theme ) ? $theme [ 'Name' ] : '' );
2008-09-26 02:43:53 -04: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 15:05:58 -04: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 02:43:53 -04:00
if ( ! current_user_can ( 'update_themes' ) )
2009-06-06 04:14:41 -04: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 02:04:31 -05:00
else if ( empty ( $update [ 'package' ]) )
2009-06-06 04:14:41 -04: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 02:43:53 -04:00
else
2010-01-21 16:37:43 -05: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 02:43:53 -04:00
}
}
2004-09-11 12:12:40 -04:00
?>
2004-09-14 08:01:31 -04:00
< div class = " wrap " >
2008-11-26 08:51:25 -05:00
< ? php screen_icon (); ?>
2010-04-04 20:00:53 -04:00
< h2 >< a href = " themes.php " class = " menu-tabs " >< ? php echo esc_html ( $title ); ?> </a><?php if ( current_user_can('install_themes') ) { ?><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 16:02:03 -04:00
2008-11-08 02:56:42 -05:00
< h3 >< ? php _e ( 'Current Theme' ); ?> </h3>
2008-05-20 13:19:33 -04:00
< div id = " current-theme " >
2005-09-05 19:33:10 -04:00
< ? php if ( $ct -> screenshot ) : ?>
2009-10-13 15:06:35 -04:00
< img src = " <?php echo $ct->theme_root_uri . '/' . $ct->stylesheet . '/' . $ct->screenshot ; ?> " alt = " <?php _e('Current theme preview'); ?> " />
2005-08-07 06:11:30 -04:00
< ? php endif ; ?>
2009-03-02 14:20:19 -05: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-29 22:33:22 -04:00
< p class = " theme-description " >< ? php echo $ct -> description ; ?> </p>
2010-01-18 17:21:36 -05:00
< ? php if ( current_user_can ( 'edit_themes' ) && $ct -> parent_theme ) { ?>
2009-10-13 15:06:35 -04: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 12:12:40 -04:00
< ? php } else { ?>
2009-10-13 15:06:35 -04: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 12:12:40 -04:00
< ? php } ?>
2007-12-31 13:39:43 -05:00
< ? php if ( $ct -> tags ) : ?>
< p >< ? php _e ( 'Tags:' ); ?> <?php echo join(', ', $ct->tags); ?></p>
< ? php endif ; ?>
2008-09-26 02:43:53 -04:00
< ? php theme_update_available ( $ct ); ?>
2004-09-14 08:01:31 -04:00
</ div >
2009-04-19 16:56:02 -04:00
2008-11-27 06:53:32 -05:00
< div class = " clear " ></ div >
2008-11-08 02:56:42 -05:00
< h3 >< ? php _e ( 'Available Themes' ); ?> </h3>
< div class = " clear " ></ div >
2008-05-21 13:36:41 -04:00
2009-04-19 16:56:02 -04:00
< ? php if ( $theme_total ) { ?>
2008-05-21 13:36:41 -04:00
< ? php if ( $page_links ) : ?>
2008-11-27 07:13:08 -05:00
< div class = " tablenav " >
2008-11-10 12:42:51 -05:00
< div class = " tablenav-pages " >< ? php $page_links_text = sprintf ( '<span class="displaying-num">' . __ ( 'Displaying %s–%s of %s' ) . '</span>%s' ,
2008-11-06 16:56:29 -05: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 07:13:08 -05:00
</ div >
2008-05-21 13:36:41 -04:00
< ? php endif ; ?>
2008-05-20 13:19:33 -04:00
< table id = " availablethemes " cellspacing = " 0 " cellpadding = " 0 " >
2005-08-07 06:11:30 -04:00
< ? php
$style = '' ;
$theme_names = array_keys ( $themes );
natcasesort ( $theme_names );
2009-05-23 19:42:28 -04:00
$table = array ();
2008-05-20 13:19:33 -04: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 06:11:30 -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' ];
2009-04-19 16:56:02 -04:00
$template_dir = $themes [ $theme_name ][ 'Template Dir' ];
$parent_theme = $themes [ $theme_name ][ 'Parent Theme' ];
2009-10-13 15:06:35 -04:00
$theme_root = $themes [ $theme_name ][ 'Theme Root' ];
$theme_root_uri = $themes [ $theme_name ][ 'Theme Root URI' ];
2009-06-10 02:55:29 -04:00
$preview_link = esc_url ( get_option ( 'home' ) . '/' );
if ( is_ssl () )
$preview_link = str_replace ( 'http://' , 'https://' , $preview_link );
2009-03-19 20:14:57 -04:00
$preview_link = htmlspecialchars ( add_query_arg ( array ( 'preview' => 1 , 'template' => $template , 'stylesheet' => $stylesheet , 'TB_iframe' => 'true' ), $preview_link ) );
2009-05-05 15:43:53 -04:00
$preview_text = esc_attr ( sprintf ( __ ( 'Preview of “%s”' ), $title ) );
2007-12-31 13:39:43 -05:00
$tags = $themes [ $theme_name ][ 'Tags' ];
2009-02-18 17:32:42 -05:00
$thickbox_class = 'thickbox thickbox-preview' ;
2007-09-03 12:11:10 -04:00
$activate_link = wp_nonce_url ( " themes.php?action=activate&template= " . urlencode ( $template ) . " &stylesheet= " . urlencode ( $stylesheet ), 'switch-theme_' . $template );
2009-05-05 15:43:53 -04:00
$activate_text = esc_attr ( sprintf ( __ ( 'Activate “%s”' ), $title ) );
2009-03-05 13:32:09 -05:00
$actions = array ();
2009-03-19 20:14:57 -04:00
$actions [] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __ ( 'Activate' ) . '</a>' ;
2009-05-05 15:43:53 -04:00
$actions [] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr ( sprintf ( __ ( 'Preview “%s”' ), $theme_name )) . '">' . __ ( 'Preview' ) . '</a>' ;
2010-01-14 14:15:00 -05:00
if ( current_user_can ( 'update_themes' ) )
2009-05-09 03:27:22 -04: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 13:32:09 -05:00
$actions = apply_filters ( 'theme_action_links' , $actions , $themes [ $theme_name ]);
$actions = implode ( ' | ' , $actions );
2005-08-07 06:11:30 -04:00
?>
2009-03-19 20:14:57 -04:00
< a href = " <?php echo $preview_link ; ?> " class = " <?php echo $thickbox_class ; ?> screenshot " >
2005-08-07 06:11:30 -04:00
< ? php if ( $screenshot ) : ?>
2009-10-13 15:06:35 -04:00
< img src = " <?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot ; ?> " alt = " " />
2005-08-07 06:11:30 -04:00
< ? php endif ; ?>
2008-05-20 13:19:33 -04:00
</ a >
2009-04-19 16:56:02 -04: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 17:21:36 -05:00
< ? php if ( current_user_can ( 'edit_themes' ) && $parent_theme ) {
2009-06-01 20:36:49 -04:00
/* translators: 1: theme title, 2: template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>
2009-10-13 15:06:35 -04: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 16:56:02 -04:00
< ? php } else { ?>
2009-10-13 15:06:35 -04: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 16:56:02 -04:00
< ? php } ?>
2007-12-31 13:39:43 -05:00
< ? php if ( $tags ) : ?>
2009-04-19 16:56:02 -04:00
< p >< ? php _e ( 'Tags:' ); ?> <?php echo join(', ', $tags); ?></p>
2007-12-31 13:39:43 -05:00
< ? php endif ; ?>
2008-09-26 02:43:53 -04:00
< ? php theme_update_available ( $themes [ $theme_name ] ); ?>
2008-05-20 13:19:33 -04:00
< ? php endif ; // end if not empty theme_name ?>
</ td >
< ? php } // end foreach $cols ?>
</ tr >
< ? php } // end foreach $table ?>
</ table >
2009-04-19 16:56:02 -04:00
< ? php } else { ?>
2010-04-09 23:27:22 -04:00
< p >< ? php
if ( current_user_can ( 'install_themes' ) )
_e ( '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 repository at any time: just click on the <em><a href="theme-install.php">Install Themes</a></em> tab above.' );
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>
2009-04-19 16:56:02 -04:00
< ? php } // end if $theme_total?>
2008-05-21 13:36:41 -04:00
< br class = " clear " />
< ? php if ( $page_links ) : ?>
< div class = " tablenav " >
2008-11-06 16:56:29 -05:00
< ? php echo " <div class='tablenav-pages'> $page_links_text </div> " ; ?>
2008-05-21 13:36:41 -04:00
< br class = " clear " />
</ div >
< ? php endif ; ?>
< br class = " clear " />
2004-10-24 19:48:51 -04:00
< ? php
// List broken themes, if any.
$broken_themes = get_broken_themes ();
2010-01-18 17:21:36 -05:00
if ( current_user_can ( 'edit_themes' ) && count ( $broken_themes ) ) {
2004-10-24 19:48:51 -04:00
?>
2010-01-13 21:02:19 -05:00
< h2 >< ? php _e ( 'Broken Themes' ); ?> <?php if ( is_multisite() ) _e( '(Site admin only)' ); ?></h2>
2004-10-24 19:48:51 -04:00
< p >< ? php _e ( 'The following themes are installed but incomplete. Themes must have a stylesheet and a template.' ); ?> </p>
2009-10-22 16:15:54 -04:00
< table id = " broken-themes " >
2004-10-24 19:48:51 -04:00
< tr >
< th >< ? php _e ( 'Name' ); ?> </th>
< th >< ? php _e ( 'Description' ); ?> </th>
</ tr >
< ? php
$theme = '' ;
2006-02-12 02:53:23 -05:00
2004-10-24 19:48:51 -04: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 02:56:05 -05:00
< tr $theme >
< td > $title </ td >
< td > $description </ td >
</ tr > " ;
2004-10-24 19:48:51 -04:00
}
?>
</ table >
< ? php
}
?>
2004-09-11 12:12:40 -04:00
</ div >
2010-04-18 02:14:45 -04:00
< ? php require ( './admin-footer.php' ); ?>