2009-02-12 00:10:11 +01:00
< ? php
/**
* WordPress Theme Install Administration API
*
* @ package WordPress
* @ subpackage Administration
*/
2009-02-18 22:55:00 +01:00
$themes_allowedtags = array ( 'a' => array ( 'href' => array (), 'title' => array (), 'target' => array ()),
2009-02-27 22:22:49 +01:00
'abbr' => array ( 'title' => array ()), 'acronym' => array ( 'title' => array ()),
'code' => array (), 'pre' => array (), 'em' => array (), 'strong' => array (),
'div' => array (), 'p' => array (), 'ul' => array (), 'ol' => array (), 'li' => array (),
'h1' => array (), 'h2' => array (), 'h3' => array (), 'h4' => array (), 'h5' => array (), 'h6' => array (),
'img' => array ( 'src' => array (), 'class' => array (), 'alt' => array ())
);
$theme_field_defaults = array ( 'description' => true , 'sections' => false , 'tested' => true , 'requires' => true ,
'rating' => true , 'downloaded' => true , 'downloadlink' => true , 'last_updated' => true , 'homepage' => true ,
'tags' => true , 'num_ratings' => true
);
2009-03-18 03:43:45 +01:00
2009-02-12 00:10:11 +01:00
/**
2009-04-08 01:58:35 +02:00
* Retrieve list of WordPress theme features ( aka theme tags )
2009-02-12 00:10:11 +01:00
*
* @ since 2.8 . 0
*
2011-12-14 18:36:38 +01:00
* @ deprecated since 3.1 . 0 Use get_theme_feature_list () instead .
2010-09-24 17:28:28 +02:00
*
2009-02-12 00:10:11 +01:00
* @ return array
*/
2009-04-07 11:44:41 +02:00
function install_themes_feature_list ( ) {
2009-04-07 23:44:23 +02:00
if ( ! $cache = get_transient ( 'wporg_theme_feature_list' ) )
2011-12-14 18:36:38 +01:00
set_transient ( 'wporg_theme_feature_list' , array ( ), 10800 );
2009-02-12 00:10:11 +01:00
2011-12-14 18:36:38 +01:00
if ( $cache )
2009-04-07 23:44:23 +02:00
return $cache ;
2009-02-12 00:10:11 +01:00
2009-04-07 11:44:41 +02:00
$feature_list = themes_api ( 'feature_list' , array ( ) );
if ( is_wp_error ( $feature_list ) )
return $features ;
2009-02-12 00:10:11 +01:00
2009-04-07 23:44:23 +02:00
set_transient ( 'wporg_theme_feature_list' , $feature_list , 10800 );
2009-02-12 00:10:11 +01:00
2009-04-07 11:44:41 +02:00
return $feature_list ;
2009-02-12 00:10:11 +01:00
}
2009-04-07 11:44:41 +02:00
/**
* Display search form for searching themes .
*
* @ since 2.8 . 0
*/
function install_theme_search_form () {
$type = isset ( $_REQUEST [ 'type' ] ) ? stripslashes ( $_REQUEST [ 'type' ] ) : '' ;
$term = isset ( $_REQUEST [ 's' ] ) ? stripslashes ( $_REQUEST [ 's' ] ) : '' ;
2009-02-12 00:10:11 +01:00
?>
2009-03-20 01:14:57 +01:00
< p class = " install-help " >< ? php _e ( 'Search for themes by keyword, author, or tag.' ) ?> </p>
2009-02-12 00:10:11 +01:00
2010-08-11 23:54:51 +02:00
< form id = " search-themes " method = " get " action = " " >
< input type = " hidden " name = " tab " value = " search " />
2009-04-07 11:44:41 +02:00
< select name = " type " id = " typeselector " >
< option value = " term " < ? php selected ( 'term' , $type ) ?> ><?php _e('Term'); ?></option>
< option value = " author " < ? php selected ( 'author' , $type ) ?> ><?php _e('Author'); ?></option>
2010-05-14 23:46:25 +02:00
< option value = " tag " < ? php selected ( 'tag' , $type ) ?> ><?php _ex('Tag', 'Theme Installer'); ?></option>
2009-04-07 11:44:41 +02:00
</ select >
2009-05-05 21:43:53 +02:00
< input type = " text " name = " s " size = " 30 " value = " <?php echo esc_attr( $term ) ?> " />
2010-10-28 23:56:43 +02:00
< ? php submit_button ( __ ( 'Search' ), 'button' , 'search' , false ); ?>
2009-04-07 11:44:41 +02:00
</ form >
< ? php
2009-02-12 00:10:11 +01:00
}
/**
2009-04-07 11:44:41 +02:00
* Display tags filter for themes .
2009-02-12 00:10:11 +01:00
*
* @ since 2.8 . 0
*/
2009-04-07 11:44:41 +02:00
function install_themes_dashboard () {
install_theme_search_form ();
?>
< h4 >< ? php _e ( 'Feature Filter' ) ?> </h4>
< p class = " install-help " >< ? php _e ( 'Find a theme based on specific features' ) ?> </p>
2012-02-07 22:06:52 +01:00
< form method = " get " action = " " >
< input type = " hidden " name = " tab " value = " search " />
2009-02-27 00:35:38 +01:00
< ? php
2010-09-24 17:28:28 +02:00
$feature_list = get_theme_feature_list ( );
2009-04-07 11:44:41 +02:00
echo '<div class="feature-filter">' ;
foreach ( ( array ) $feature_list as $feature_name => $features ) {
2009-05-18 17:11:07 +02:00
$feature_name = esc_html ( $feature_name );
2009-04-07 19:02:25 +02:00
echo '<div class="feature-name">' . $feature_name . '</div>' ;
2009-04-07 11:44:41 +02:00
2010-12-26 07:31:46 +01:00
echo '<ol class="feature-group">' ;
2010-09-24 17:28:28 +02:00
foreach ( $features as $feature => $feature_name ) {
2009-05-18 17:11:07 +02:00
$feature_name = esc_html ( $feature_name );
2009-05-05 21:43:53 +02:00
$feature = esc_attr ( $feature );
2009-04-07 11:44:41 +02:00
?>
< li >
2012-02-07 22:06:52 +01:00
< input type = " checkbox " name = " features[] " id = " feature-id-<?php echo $feature ; ?> " value = " <?php echo $feature ; ?> " />
2009-04-07 19:02:25 +02:00
< label for = " feature-id-<?php echo $feature ; ?> " >< ? php echo $feature_name ; ?> </label>
2009-04-07 11:44:41 +02:00
</ li >
< ? php } ?>
</ ol >
< br class = " clear " />
< ? php
} ?>
</ div >
< br class = " clear " />
2010-10-28 23:56:43 +02:00
< ? php submit_button ( __ ( 'Find Themes' ), 'button' , 'search' ); ?>
2009-04-07 11:44:41 +02:00
</ form >
< ? php
2009-02-12 00:10:11 +01:00
}
2010-08-11 23:54:51 +02:00
add_action ( 'install_themes_dashboard' , 'install_themes_dashboard' );
2009-02-12 00:10:11 +01:00
2009-02-26 00:43:30 +01:00
function install_themes_upload ( $page = 1 ) {
2009-04-09 15:16:14 +02:00
?>
2009-02-27 00:35:38 +01:00
< h4 >< ? php _e ( 'Install a theme in .zip format' ) ?> </h4>
2009-03-20 01:14:57 +01:00
< p class = " install-help " >< ? php _e ( 'If you have a theme in a .zip format, you may install it by uploading it here.' ) ?> </p>
2010-10-21 19:06:52 +02:00
< form method = " post " enctype = " multipart/form-data " action = " <?php echo self_admin_url('update.php?action=upload-theme') ?> " >
2009-04-09 15:16:14 +02:00
< ? php wp_nonce_field ( 'theme-upload' ) ?>
< input type = " file " name = " themezip " />
2010-12-16 22:35:39 +01:00
< ? php submit_button ( __ ( 'Install Now' ), 'button' , 'install-theme-submit' , false ); ?>
2009-04-09 15:16:14 +02:00
</ form >
2009-04-19 21:36:28 +02:00
< ? php
2009-02-27 00:35:38 +01:00
}
2010-08-11 23:54:51 +02:00
add_action ( 'install_themes_upload' , 'install_themes_upload' , 10 , 1 );
2009-02-27 00:35:38 +01:00
2012-03-07 18:35:17 +01:00
/*
* Prints a theme on the Install Themes pages .
*
* @ param object $theme An object that contains theme data returned by the WordPress . org API .
*
* Example theme data :
* object ( stdClass )[ 59 ]
* public 'name' => string 'Magazine Basic' ( length = 14 )
* public 'slug' => string 'magazine-basic' ( length = 14 )
* public 'version' => string '1.1' ( length = 3 )
* public 'author' => string 'tinkerpriest' ( length = 12 )
* public 'preview_url' => string 'http://wp-themes.com/?magazine-basic' ( length = 36 )
* public 'screenshot_url' => string 'http://wp-themes.com/wp-content/themes/magazine-basic/screenshot.png' ( length = 68 )
* public 'rating' => float 80
* public 'num_ratings' => int 1
* public 'homepage' => string 'http://wordpress.org/extend/themes/magazine-basic' ( length = 49 )
* public 'description' => string 'A basic magazine style layout with a fully customizable layout through a backend interface. Designed by <a href="http://bavotasan.com">c.bavota</a> of <a href="http://tinkerpriestmedia.com">Tinker Priest Media</a>.' ( length = 214 )
* public 'download_link' => string 'http://wordpress.org/extend/themes/download/magazine-basic.1.1.zip' ( length = 66 )
*/
function display_theme ( $theme ) {
2009-02-27 00:35:38 +01:00
global $themes_allowedtags ;
2012-03-07 18:35:17 +01:00
if ( empty ( $theme ) )
2009-02-27 22:24:19 +01:00
return ;
2009-02-27 00:35:38 +01:00
2012-03-07 18:35:17 +01:00
$name = wp_kses ( $theme -> name , $themes_allowedtags );
$author = wp_kses ( $theme -> author , $themes_allowedtags );
$num_ratings = sprintf ( _n ( '(based on %s rating)' , '(based on %s ratings)' , $theme -> num_ratings ), number_format_i18n ( $theme -> num_ratings ) );
$preview_url = add_query_arg ( 'theme_preview' , '1' );
$preview_title = sprintf ( __ ( 'Preview “%s”' ), $name );
$install_url = add_query_arg ( array (
'action' => 'install-theme' ,
'theme' => $theme -> slug ,
), self_admin_url ( 'update.php' ) );
2009-02-27 00:35:38 +01:00
?>
2012-03-07 18:35:17 +01:00
< a class = " screenshot " href = " <?php echo esc_url( $preview_url ); ?> " title = " <?php echo esc_attr( $preview_title ); ?> " >
< img src = '<?php echo esc_url( $theme->screenshot_url ); ?>' width = '150' />
</ a >
< h3 >< ? php
/* translators: 1: theme name, 2: author name */
printf ( __ ( '%1$s <span>by %2$s</span>' ), $name , $author );
?> </h3>
< div class = " install-theme-info " >
< a class = " theme-install button-primary " href = " <?php echo wp_nonce_url( $install_url , 'install-theme_' . $theme->slug ); ?> " >< ? php _e ( 'Install' ); ?> </a>
< h3 class = " theme-name " >< ? php echo $name ; ?> </h3>
< span class = " theme-by " >< ? php printf ( __ ( 'By %s' ), $author ); ?> </span>
< img class = " theme-screenshot " src = " <?php echo esc_url( $theme->screenshot_url ); ?> " />
< div class = " theme-rating " title = " <?php echo esc_attr( $num_ratings ); ?> " >
< div style = " width:<?php echo esc_attr( intval( $theme->rating ) . 'px' ); ?>; " ></ div >
</ div >
< div class = " theme-version " >
< strong >< ? php _e ( 'Version:' ) ?> </strong>
< ? php echo wp_kses ( $theme -> version , $themes_allowedtags ); ?>
</ div >
< div class = " theme-description " >
< ? php echo wp_kses ( $theme -> description , $themes_allowedtags ); ?>
</ div >
< input class = " theme-preview-url " type = " hidden " value = " <?php echo esc_url( $theme->preview_url ); ?> " />
</ div >
< ? php
2009-02-12 23:12:57 +01:00
}
2009-02-12 00:10:11 +01:00
/**
* Display theme content based on theme list .
*
* @ since 2.8 . 0
*/
2010-08-11 23:54:51 +02:00
function display_themes () {
2010-08-22 13:22:46 +02:00
global $wp_list_table ;
2009-04-19 21:36:28 +02:00
2010-08-22 13:22:46 +02:00
$wp_list_table -> display ();
2009-02-12 00:10:11 +01:00
}
2010-08-11 23:54:51 +02:00
add_action ( 'install_themes_search' , 'display_themes' );
add_action ( 'install_themes_featured' , 'display_themes' );
add_action ( 'install_themes_new' , 'display_themes' );
add_action ( 'install_themes_updated' , 'display_themes' );
2009-02-12 00:10:11 +01:00
/**
* Display theme information in dialog box form .
*
* @ since 2.8 . 0
*/
function install_theme_information () {
//TODO: This function needs a LOT of UI work :)
2009-03-20 01:14:57 +01:00
global $tab , $themes_allowedtags ;
2009-02-12 00:10:11 +01:00
$api = themes_api ( 'theme_information' , array ( 'slug' => stripslashes ( $_REQUEST [ 'theme' ] ) ));
if ( is_wp_error ( $api ) )
wp_die ( $api );
2009-02-27 00:35:38 +01:00
// Sanitize HTML
2009-02-12 00:10:11 +01:00
foreach ( ( array ) $api -> sections as $section_name => $content )
$api -> sections [ $section_name ] = wp_kses ( $content , $themes_allowedtags );
2010-03-19 09:03:52 +01:00
foreach ( array ( 'version' , 'author' , 'requires' , 'tested' , 'homepage' , 'downloaded' , 'slug' ) as $key ) {
if ( isset ( $api -> $key ) )
$api -> $key = wp_kses ( $api -> $key , $themes_allowedtags );
}
2009-02-12 00:10:11 +01:00
iframe_header ( __ ( 'Theme Install' ) );
2009-02-27 00:35:38 +01:00
2009-03-20 01:14:57 +01:00
if ( empty ( $api -> download_link ) ) {
2011-09-30 19:18:35 +02:00
echo '<div id="message" class="error"><p>' . __ ( '<strong>ERROR:</strong> This theme is currently not available. Please try again later.' ) . '</p></div>' ;
2009-03-20 01:14:57 +01:00
iframe_footer ();
exit ;
}
2009-04-13 18:24:37 +02:00
if ( ! empty ( $api -> tested ) && version_compare ( $GLOBALS [ 'wp_version' ], $api -> tested , '>' ) )
2009-02-27 00:35:38 +01:00
echo '<div class="updated"><p>' . __ ( '<strong>Warning:</strong> This theme has <strong>not been tested</strong> with your current version of WordPress.' ) . '</p></div>' ;
2009-04-13 18:24:37 +02:00
else if ( ! empty ( $api -> requires ) && version_compare ( $GLOBALS [ 'wp_version' ], $api -> requires , '<' ) )
2009-02-27 00:35:38 +01:00
echo '<div class="updated"><p>' . __ ( '<strong>Warning:</strong> This theme has not been marked as <strong>compatible</strong> with your version of WordPress.' ) . '</p></div>' ;
// Default to a "new" theme
$type = 'install' ;
// Check to see if this theme is known to be installed, and has an update awaiting it.
2010-01-08 21:49:55 +01:00
$update_themes = get_site_transient ( 'update_themes' );
2009-04-13 18:24:37 +02:00
if ( is_object ( $update_themes ) && isset ( $update_themes -> response ) ) {
foreach ( ( array ) $update_themes -> response as $theme_slug => $theme_info ) {
if ( $theme_slug === $api -> slug ) {
2009-03-20 01:14:57 +01:00
$type = 'update_available' ;
2009-04-13 18:24:37 +02:00
$update_file = $theme_slug ;
2009-03-20 01:14:57 +01:00
break ;
}
}
2009-02-27 00:35:38 +01:00
}
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: https://develop.svn.wordpress.org/trunk@20029 602fd350-edb4-49c9-b593-d223f7449a82
2012-02-28 22:24:44 +01:00
$theme = wp_get_theme ( $api -> slug );
if ( is_a ( $theme , 'WP_Theme' ) ) {
switch ( version_compare ( $theme -> get ( 'Version' ), $api -> version ) ) {
case 0 ; // equal
2009-03-20 01:14:57 +01:00
$type = 'latest_installed' ;
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: https://develop.svn.wordpress.org/trunk@20029 602fd350-edb4-49c9-b593-d223f7449a82
2012-02-28 22:24:44 +01:00
case 1 : // installed theme > api version
2009-03-20 01:14:57 +01:00
$type = 'newer_installed' ;
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: https://develop.svn.wordpress.org/trunk@20029 602fd350-edb4-49c9-b593-d223f7449a82
2012-02-28 22:24:44 +01:00
$newer_version = $theme -> get ( 'Version' );
2009-03-20 01:14:57 +01:00
}
}
?>
< div class = 'available-theme' >
2009-05-18 18:00:33 +02:00
< img src = '<?php echo esc_url($api->screenshot_url) ?>' width = '300' class = " theme-preview-img " />
2009-03-20 01:14:57 +01:00
< h3 >< ? php echo $api -> name ; ?> </h3>
< p >< ? php printf ( __ ( 'by %s' ), $api -> author ); ?> </p>
< p >< ? php printf ( __ ( 'Version: %s' ), $api -> version ); ?> </p>
< ? php
$buttons = '<a class="button" id="cancel" href="#" onclick="tb_close();return false;">' . __ ( 'Cancel' ) . '</a> ' ;
2009-02-27 00:35:38 +01:00
switch ( $type ) {
2009-03-20 01:14:57 +01:00
default :
case 'install' :
if ( current_user_can ( 'install_themes' ) ) :
2010-10-21 19:06:52 +02:00
$buttons .= '<a class="button-primary" id="install" href="' . wp_nonce_url ( self_admin_url ( 'update.php?action=install-theme&theme=' . $api -> slug ), 'install-theme_' . $api -> slug ) . '" target="_parent">' . __ ( 'Install Now' ) . '</a>' ;
2009-02-27 00:35:38 +01:00
endif ;
break ;
case 'update_available' :
if ( current_user_can ( 'update_themes' ) ) :
2010-10-21 19:06:52 +02:00
$buttons .= '<a class="button-primary" id="install" href="' . wp_nonce_url ( self_admin_url ( 'update.php?action=upgrade-theme&theme=' . $update_file ), 'upgrade-theme_' . $update_file ) . '" target="_parent">' . __ ( 'Install Update Now' ) . '</a>' ;
2009-02-27 00:35:38 +01:00
endif ;
break ;
case 'newer_installed' :
if ( current_user_can ( 'install_themes' ) || current_user_can ( 'update_themes' ) ) :
2009-03-20 01:14:57 +01:00
?> <p><?php printf(__('Newer version (%s) is installed.'), $newer_version); ?></p><?php
2009-02-27 00:35:38 +01:00
endif ;
break ;
case 'latest_installed' :
if ( current_user_can ( 'install_themes' ) || current_user_can ( 'update_themes' ) ) :
2009-03-20 01:14:57 +01:00
?> <p><?php _e('This version is already installed.'); ?></p><?php
2009-02-27 00:35:38 +01:00
endif ;
break ;
2009-03-20 01:14:57 +01:00
} ?>
< br class = " clear " />
2009-02-27 00:35:38 +01:00
</ div >
2009-03-20 01:14:57 +01:00
< p class = " action-button " >
< ? php echo $buttons ; ?>
< br class = " clear " />
</ p >
< ? php
2009-02-12 00:10:11 +01:00
iframe_footer ();
exit ;
}
2010-08-11 23:54:51 +02:00
add_action ( 'install_themes_pre_theme-information' , 'install_theme_information' );