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
This commit is contained in:
nacin 2012-02-28 21:24:44 +00:00
parent f596a23899
commit d130a63e25
17 changed files with 1520 additions and 646 deletions

View File

@ -50,53 +50,41 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
}
function prepare_items() {
global $status, $themes, $totals, $page, $orderby, $order, $s;
global $status, $totals, $page, $orderby, $order, $s;
wp_reset_vars( array( 'orderby', 'order', 's' ) );
$themes = array(
'all' => apply_filters( 'all_themes', get_themes() ),
'all' => apply_filters( 'all_themes', wp_get_themes() ),
'search' => array(),
'enabled' => array(),
'disabled' => array(),
'upgrade' => array()
);
$site_allowed_themes = get_site_allowed_themes();
if ( !$this->is_site_themes ) {
$allowed_themes = $site_allowed_themes;
$themes_per_page = $this->get_items_per_page( 'themes_network_per_page' );
} else {
$allowed_themes = wpmu_get_blog_allowedthemes( $this->site_id );
if ( $this->is_site_themes ) {
$themes_per_page = $this->get_items_per_page( 'site_themes_network_per_page' );
$allowed_where = 'site';
} else {
$themes_per_page = $this->get_items_per_page( 'themes_network_per_page' );
$allowed_where = 'network';
}
$current = get_site_transient( 'update_themes' );
$current = current_user_can( 'update_themes' ) && ! $this->is_site_themes && get_site_transient( 'update_themes' );
foreach ( (array) $themes['all'] as $key => $theme ) {
$theme_key = $theme['Stylesheet'];
if ( $this->is_site_themes && $theme->is_allowed( 'network' ) ) {
unset( $themes['all'][ $key ] );
continue;
}
if ( isset( $allowed_themes [ $theme_key ] ) ) {
$themes['all'][$key]['enabled'] = true;
$themes['enabled'][$key] = $themes['all'][$key];
}
else {
$themes['all'][$key]['enabled'] = false;
$themes['disabled'][$key] = $themes['all'][$key];
}
if ( isset( $current->response[ $theme['Template'] ] ) )
$themes['upgrade'][$key] = $themes['all'][$key];
$filter = $theme->is_allowed( $allowed_where, $this->site_id ) ? 'enabled' : 'disabled';
$themes[ $filter ][ $key ] = $themes['all'][ $key ];
if ( $this->is_site_themes && isset( $site_allowed_themes[$theme_key] ) ) {
unset( $themes['all'][$key] );
unset( $themes['enabled'][$key] );
unset( $themes['disabled'][$key] );
}
if ( $current && isset( $current->response[ $key ] ) )
$themes['upgrade'][ $key ] = $themes['all'][ $key ];
}
if ( !current_user_can( 'update_themes' ) || $this->is_site_themes )
$themes['upgrade'] = array();
if ( $s ) {
$status = 'search';
$themes['search'] = array_filter( $themes['all'], array( &$this, '_search_callback' ) );
@ -110,19 +98,27 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
$status = 'all';
$this->items = $themes[ $status ];
WP_Theme::sort_by_name( $this->items );
$this->has_items = ! empty( $themes['all'] );
$total_this_page = $totals[ $status ];
if ( $orderby ) {
$orderby = ucfirst( $orderby );
$order = strtoupper( $order );
uasort( $this->items, array( &$this, '_order_callback' ) );
if ( $orderby == 'Name' ) {
if ( 'ASC' == $order )
$this->items = array_reverse( $this->items );
} else {
uasort( $this->items, array( &$this, '_order_callback' ) );
}
}
$start = ( $page - 1 ) * $themes_per_page;
if ( $total_this_page > $themes_per_page )
$this->items = array_slice( $this->items, $start, $themes_per_page );
$this->items = array_slice( $this->items, $start, $themes_per_page, true );
$this->set_pagination_args( array(
'total_items' => $total_this_page,
@ -135,19 +131,27 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
if ( is_null( $term ) )
$term = stripslashes( $_REQUEST['s'] );
$search_fields = array( 'Name', 'Title', 'Description', 'Author', 'Author Name', 'Author URI', 'Template', 'Stylesheet' );
foreach ( $search_fields as $field )
if ( stripos( $theme[ $field ], $term ) !== false )
foreach ( array( 'Name', 'Description', 'Author', 'Author', 'AuthorURI' ) as $field ) {
// Don't mark up; Do translate.
if ( false !== stripos( $theme->display( $field, false, true ), $term ) )
return true;
}
if ( false !== stripos( $theme->get_stylesheet(), $term ) )
return true;
if ( false !== stripos( $theme->get_template(), $term ) )
return true;
return false;
}
// Not used by any core columns.
function _order_callback( $theme_a, $theme_b ) {
global $orderby, $order;
$a = $theme_a[$orderby];
$b = $theme_b[$orderby];
$a = $theme_a[ $orderby ];
$b = $theme_b[ $orderby ];
if ( $a == $b )
return 0;
@ -159,9 +163,7 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
}
function no_items() {
global $themes;
if ( !empty( $themes['all'] ) )
if ( ! $$this->has_items )
_e( 'No themes found.' );
else
_e( 'You do not appear to have any themes available at this time.' );
@ -259,10 +261,13 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
$context = $status;
if ( $this->is_site_themes )
if ( $this->is_site_themes ) {
$url = "site-themes.php?id={$this->site_id}&";
else
$allowed = $theme->is_allowed( 'site', $this->site_id );
} else {
$url = 'themes.php?';
$allowed = $theme->is_allowed( 'network' );
}
// preorder
$actions = array(
@ -272,30 +277,29 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
'delete' => ''
);
$theme_key = $theme['Stylesheet'];
$theme_key = $theme->get_stylesheet();
if ( empty( $theme['enabled'] ) )
if ( ! $allowed )
$actions['enable'] = '<a href="' . esc_url( wp_nonce_url($url . 'action=enable&amp;theme=' . $theme_key . '&amp;paged=' . $page . '&amp;s=' . $s, 'enable-theme_' . $theme_key) ) . '" title="' . esc_attr__('Enable this theme') . '" class="edit">' . ( $this->is_site_themes ? __( 'Enable' ) : __( 'Network Enable' ) ) . '</a>';
else
$actions['disable'] = '<a href="' . esc_url( wp_nonce_url($url . 'action=disable&amp;theme=' . $theme_key . '&amp;paged=' . $page . '&amp;s=' . $s, 'disable-theme_' . $theme_key) ) . '" title="' . esc_attr__('Disable this theme') . '">' . ( $this->is_site_themes ? __( 'Disable' ) : __( 'Network Disable' ) ) . '</a>';
if ( current_user_can('edit_themes') )
$actions['edit'] = '<a href="' . esc_url('theme-editor.php?theme=' . urlencode( $theme['Name'] )) . '" title="' . esc_attr__('Open this theme in the Theme Editor') . '" class="edit">' . __('Edit') . '</a>';
$actions['edit'] = '<a href="' . esc_url('theme-editor.php?theme=' . $theme_key ) . '" title="' . esc_attr__('Open this theme in the Theme Editor') . '" class="edit">' . __('Edit') . '</a>';
if ( empty( $theme['enabled'] ) && current_user_can( 'delete_themes' ) && ! $this->is_site_themes && $theme_key != get_option( 'stylesheet' ) && $theme_key != get_option( 'template' ) )
if ( ! $allowed && current_user_can( 'delete_themes' ) && ! $this->is_site_themes && $theme_key != get_option( 'stylesheet' ) && $theme_key != get_option( 'template' ) )
$actions['delete'] = '<a href="' . esc_url( wp_nonce_url( 'themes.php?action=delete-selected&amp;checked[]=' . $theme_key . '&amp;theme_status=' . $context . '&amp;paged=' . $page . '&amp;s=' . $s, 'bulk-themes' ) ) . '" title="' . esc_attr__( 'Delete this theme' ) . '" class="delete">' . __( 'Delete' ) . '</a>';
$actions = apply_filters( 'theme_action_links', array_filter( $actions ), $theme_key, $theme, $context );
$actions = apply_filters( "theme_action_links_$theme_key", $actions, $theme_key, $theme, $context );
$class = empty( $theme['enabled'] ) ? 'inactive' : 'active';
$checkbox_id = "checkbox_" . md5($theme['Name']);
$checkbox = "<input type='checkbox' name='checked[]' value='" . esc_attr( $theme_key ) . "' id='" . $checkbox_id . "' /><label class='screen-reader-text' for='" . $checkbox_id . "' >" . __('Select') . " " . $theme['Name'] . "</label>";
$class = ! $allowed ? 'inactive' : 'active';
$checkbox_id = "checkbox_" . md5( $theme->get('Name') );
$checkbox = "<input type='checkbox' name='checked[]' value='" . esc_attr( $theme_key ) . "' id='" . $checkbox_id . "' /><label class='screen-reader-text' for='" . $checkbox_id . "' >" . __('Select') . " " . $theme->display('Name') . "</label>";
$description = '<p>' . $theme['Description'] . '</p>';
$theme_name = $theme['Name'];
$description = '<p>' . $theme->display( 'Description' ) . '</p>';
$id = sanitize_title( $theme_name );
$id = sanitize_html_class( $theme->get_stylesheet() );
echo "<tr id='$id' class='$class'>";
@ -311,25 +315,25 @@ class WP_MS_Themes_List_Table extends WP_List_Table {
echo "<th scope='row' class='check-column'>$checkbox</th>";
break;
case 'name':
echo "<td class='theme-title'$style><strong>$theme_name</strong>";
echo "<td class='theme-title'$style><strong>" . $theme->display('Name') . "</strong>";
echo $this->row_actions( $actions, true );
echo "</td>";
break;
case 'description':
echo "<td class='column-description desc'$style>
<div class='theme-description'>$description</div>
<div class='theme-description'>" . $theme->display( 'Description' ) . "</div>
<div class='$class second theme-version-author-uri'>";
$theme_meta = array();
if ( !empty( $theme['Version'] ) )
$theme_meta[] = sprintf( __( 'Version %s' ), $theme['Version'] );
if ( $theme->get('Version') )
$theme_meta[] = sprintf( __( 'Version %s' ), $theme->display('Version') );
if ( !empty( $theme['Author'] ) )
$theme_meta[] = sprintf( __( 'By %s' ), $theme['Author'] );
if ( $theme->get('Author') )
$theme_meta[] = sprintf( __( 'By %s' ), $theme->display('Author') );
if ( !empty( $theme['Theme URI'] ) )
$theme_meta[] = '<a href="' . $theme['Theme URI'] . '" title="' . esc_attr__( 'Visit theme homepage' ) . '">' . __( 'Visit Theme Site' ) . '</a>';
if ( $theme->get('ThemeURI') )
$theme_meta[] = '<a href="' . $theme->display('ThemeURI') . '" title="' . esc_attr__( 'Visit theme homepage' ) . '">' . __( 'Visit Theme Site' ) . '</a>';
$theme_meta = apply_filters( 'theme_row_meta', $theme_meta, $theme_key, $theme, $status );
echo implode( ' | ', $theme_meta );

View File

@ -24,11 +24,7 @@ class WP_Themes_List_Table extends WP_List_Table {
}
function prepare_items() {
global $ct;
$ct = current_theme_info();
$themes = get_allowed_themes();
$themes = wp_get_themes( array( 'allowed' => true ) );
if ( ! empty( $_REQUEST['s'] ) ) {
$search = strtolower( stripslashes( $_REQUEST['s'] ) );
@ -45,13 +41,13 @@ class WP_Themes_List_Table extends WP_List_Table {
if ( $this->search || $this->features ) {
foreach ( $themes as $key => $theme ) {
if ( !$this->search_theme( $theme ) )
if ( ! $this->search_theme( $theme ) )
unset( $themes[ $key ] );
}
}
unset( $themes[$ct->name] );
uksort( $themes, "strnatcasecmp" );
unset( $themes[ get_option( 'stylesheet' ) ] );
WP_Theme::sort_by_name( $themes );
$per_page = 999;
$page = $this->get_pagenum();
@ -125,75 +121,74 @@ class WP_Themes_List_Table extends WP_List_Table {
function display_rows() {
$themes = $this->items;
$theme_names = array_keys( $themes );
natcasesort( $theme_names );
foreach ( $theme_names as $theme_name ) {
$class = array( 'available-theme' );
?>
<div class="<?php echo join( ' ', $class ); ?>">
<?php if ( !empty( $theme_name ) ) :
$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'];
$template_dir = $themes[$theme_name]['Template Dir'];
$parent_theme = $themes[$theme_name]['Parent Theme'];
$theme_root = $themes[$theme_name]['Theme Root'];
$theme_root_uri = $themes[$theme_name]['Theme Root URI'];
$preview_link = esc_url( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'preview_iframe' => true, 'TB_iframe' => 'true' ), home_url( '/' ) ) );
$preview_text = esc_attr( sprintf( __( 'Preview of &#8220;%s&#8221;' ), $title ) );
$tags = $themes[$theme_name]['Tags'];
$thickbox_class = 'thickbox thickbox-preview';
$activate_link = wp_nonce_url( "themes.php?action=activate&amp;template=" . urlencode( $template ) . "&amp;stylesheet=" . urlencode( $stylesheet ), 'switch-theme_' . $template );
$activate_text = esc_attr( sprintf( __( 'Activate &#8220;%s&#8221;' ), $title ) );
$actions = array();
$actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>';
$actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>';
if ( ! is_multisite() && current_user_can( 'delete_themes' ) )
$actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&amp;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." ), $theme_name ) ) . "' );" . '">' . __( 'Delete' ) . '</a>';
$actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );
foreach ( $themes as $theme ) {
echo '<div class="available-theme">';
$actions = implode ( ' | ', $actions );
?>
<a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">
<?php if ( $screenshot ) : ?>
<img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />
<?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>
$template = $theme->get_template();
$stylesheet = $theme->get_stylesheet();
<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 $description; ?></p>
<?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) {
/* 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, '', $template_dir ), str_replace( WP_CONTENT_DIR, '', $stylesheet_dir ), $title, $parent_theme ); ?></p>
<?php } else { ?>
<p><?php printf( __( 'All of this theme&#8217;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>
<?php } ?>
<?php if ( $tags ) : ?>
<p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p>
<?php endif; ?>
<?php endif; // end if not empty theme_name ?>
</div>
<?php theme_update_available( $themes[$theme_name] ); ?>
</div>
<?php } // end foreach $theme_names
$title = $theme->display('Name');
$version = $theme->display('Version');
$author = $theme->display('Author');
$activate_link = wp_nonce_url( "themes.php?action=activate&amp;template=" . urlencode( $template ) . "&amp;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 &#8220;%s&#8221;' ), $title ) ) . '">' . __( 'Activate' ) . '</a>';
$actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="'
. esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $title ) ) . '">' . __( 'Preview' ) . '</a>';
if ( ! is_multisite() && current_user_can( 'delete_themes' ) )
$actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&amp;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">
<?php if ( $theme->get_screenshot() ) : ?>
<img src="<?php echo esc_url( $theme->get_screenshot( 'absolute' ) ); ?>" alt="" />
<?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&#8217;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; ?>
<?php
if ( $theme->get('Tags') )
printf( '<p>' . __( 'Tags: %s.' ) . '</p>', $theme->display('Tags') );
?>
</div>
<?php theme_update_available( $theme ); ?>
</div>
<?php
}
}
function search_theme( $theme ) {
// Search the features
if ( $this->features ) {
foreach ( $this->features as $word ) {
if ( ! in_array( $word, $theme['Tags'] ) )
if ( ! in_array( $word, $theme->get('Tags') ) )
return false;
}
}
@ -201,16 +196,23 @@ class WP_Themes_List_Table extends WP_List_Table {
// Match all phrases
if ( $this->search ) {
foreach ( $this->search as $word ) {
if ( in_array( $word, $theme['Tags'] ) )
if ( in_array( $word, $theme->get('Tags') ) )
continue;
}
foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) as $header ) {
if ( false !== stripos( $theme[ $header ], $word ) )
continue 2;
}
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;
}
return false;
if ( false !== stripos( $theme->get_stylesheet(), $word ) )
continue;
if ( false !== stripos( $theme->get_template(), $word ) )
continue;
return false;
}
}
return true;

View File

@ -383,11 +383,11 @@ function wp_dashboard_right_now() {
echo "\n\t</table>\n\t</div>";
echo "\n\t".'<div class="versions">';
$ct = current_theme_info();
$theme = wp_get_theme();
echo "\n\t<p>";
if ( empty( $ct->stylesheet_dir ) ) {
if ( $theme->errors() ) {
if ( ! is_multisite() || is_super_admin() )
echo '<span class="error-message">' . __('ERROR: The themes directory is either empty or doesn&#8217;t exist. Please check your installation.') . '</span>';
} elseif ( ! empty($wp_registered_sidebars) ) {
@ -401,7 +401,7 @@ function wp_dashboard_right_now() {
}
$num = number_format_i18n( $num_widgets );
$switch_themes = $ct->title;
$switch_themes = $theme->display('Name');
if ( current_user_can( 'switch_themes') )
$switch_themes = '<a href="themes.php">' . $switch_themes . '</a>';
if ( current_user_can( 'edit_theme_options' ) ) {
@ -411,9 +411,9 @@ function wp_dashboard_right_now() {
}
} else {
if ( current_user_can( 'switch_themes' ) )
printf( __('Theme <span class="b"><a href="themes.php">%1$s</a></span>'), $ct->title );
printf( __('Theme <span class="b"><a href="themes.php">%1$s</a></span>'), $theme->display('Name') );
else
printf( __('Theme <span class="b">%1$s</span>'), $ct->title );
printf( __('Theme <span class="b">%1$s</span>'), $theme->display('Name') );
}
echo '</p>';
@ -1313,14 +1313,14 @@ function wp_welcome_panel() {
<div class="welcome-panel-column welcome-panel-last">
<h4><span class="icon16 icon-appearance"></span> <?php _e( 'Customize Your Site' ); ?></h4>
<?php
$ct = current_theme_info();
if ( empty ( $ct->stylesheet_dir ) ) :
$theme = wp_get_theme();
if ( $theme->errors() ) :
echo '<p>';
printf( __( '<a href="%s">Install a theme</a> to get started customizing your site.' ), esc_url( admin_url( 'themes.php' ) ) );
echo '</p>';
else:
$customize_links = array();
if ( 'twentyeleven' == $ct->stylesheet )
if ( 'twentyeleven' == $theme->get_stylesheet() )
$customize_links[] = sprintf( __( '<a href="%s">Choose light or dark</a>' ), esc_url( admin_url( 'themes.php?page=theme_options' ) ) );
if ( current_theme_supports( 'custom-background' ) )
@ -1334,7 +1334,7 @@ function wp_welcome_panel() {
if ( ! empty( $customize_links ) ) {
echo '<p>';
printf( __( 'Use the current theme &mdash; %1$s &mdash; or <a href="%2$s">choose a new one</a>. If you stick with %3$s, here are a few ways to make your site look unique.' ), $ct->title, esc_url( admin_url( 'themes.php' ) ), $ct->title );
printf( __( 'Use the current theme &mdash; %1$s &mdash; or <a href="%2$s">choose a new one</a>. If you stick with %1$s, here are a few ways to make your site look unique.' ), $theme->display('Name'), esc_url( admin_url( 'themes.php' ) ) );
echo '</p>';
?>
<ul>
@ -1345,7 +1345,7 @@ function wp_welcome_panel() {
<?php
} else {
echo '<p>';
printf( __( 'Use the current theme &mdash; %1$s &mdash; or <a href="%2$s">choose a new one</a>.' ), $ct->title, esc_url( admin_url( 'themes.php' ) ) );
printf( __( 'Use the current theme &mdash; %1$s &mdash; or <a href="%2$s">choose a new one</a>.' ), $this->display('Name'), esc_url( admin_url( 'themes.php' ) ) );
echo '</p>';
}
endif; ?>

View File

@ -879,4 +879,61 @@ function add_contextual_help( $screen, $help ) {
$screen = convert_to_screen( $screen );
WP_Screen::add_old_compat_help( $screen, $help );
}
/**
* Get the allowed themes for the current blog.
*
* @since 3.0.0
* @deprecated 3.4.0
* @deprecated Use wp_get_themes()
* @see wp_get_themes()
*
* @return array $themes Array of allowed themes.
*/
function get_allowed_themes() {
_deprecated_function( __FUNCTION__, '3.4', "wp_get_themes( array( 'allowed' => true ) )" );
$themes = wp_get_themes( array( 'allowed' => true ) );
$wp_themes = array();
foreach ( $themes as $theme ) {
$wp_themes[ $theme->get('Name') ] = $theme;
}
return $wp_themes;
}
/**
* {@internal Missing Short Description}}
*
* @since 1.5.0
*
* @return unknown
*/
function get_broken_themes() {
_deprecated_function( __FUNCTION__, '3.4', "wp_get_themes( array( 'errors' => true )" );
$themes = wp_get_themes( array( 'errors' => true ) );
$broken = array();
foreach ( $themes as $theme ) {
$broken[ $theme->get('Name') ] = array(
'Title' => $theme->get('Name'),
'Description' => $theme->errors()->get_error_message(),
);
}
return $broken;
}
/**
* {@internal Missing Short Description}}
*
* @since 2.0.0
*
* @return unknown
*/
function current_theme_info() {
_deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme()' );
return wp_get_theme();
}

View File

@ -64,3 +64,13 @@ function is_wpmu_sitewide_plugin( $file ) {
_deprecated_function(__FUNCTION__, '3.0', 'is_network_only_plugin()' );
return is_network_only_plugin( $file );
}
function get_site_allowed_themes() {
_deprecated_function( __FUNCTION__, '3.4', 'WP_Theme::get_allowed_on_network()' );
return array_map( 'intval', WP_Theme::get_allowed_on_network() );
}
function wpmu_get_blog_allowedthemes( $blog_id = 0 ) {
_deprecated_function( __FUNCTION__, '3.4', 'WP_Theme::get_allowed_on_site()' );
return array_map( 'intval', WP_Theme::get_allowed_on_site( $blog_id ) );
}

View File

@ -169,35 +169,6 @@ function wpmu_delete_user( $id ) {
return true;
}
function wpmu_get_blog_allowedthemes( $blog_id = 0 ) {
$themes = get_themes();
if ( $blog_id != 0 )
switch_to_blog( $blog_id );
$blog_allowed_themes = get_option( 'allowedthemes' );
if ( !is_array( $blog_allowed_themes ) || empty( $blog_allowed_themes ) ) { // convert old allowed_themes to new allowedthemes
$blog_allowed_themes = get_option( 'allowed_themes' );
if ( is_array( $blog_allowed_themes ) ) {
foreach( (array) $themes as $key => $theme ) {
$theme_key = esc_html( $theme['Stylesheet'] );
if ( isset( $blog_allowed_themes[$key] ) == true ) {
$blog_allowedthemes[$theme_key] = 1;
}
}
$blog_allowed_themes = $blog_allowedthemes;
add_option( 'allowedthemes', $blog_allowed_themes );
delete_option( 'allowed_themes' );
}
}
if ( $blog_id != 0 )
restore_current_blog();
return $blog_allowed_themes;
}
function update_option_new_admin_email( $old_value, $value ) {
$email = get_option( 'admin_email' );
if ( $value == get_option( 'admin_email' ) || !is_email( $value ) )
@ -296,26 +267,6 @@ function new_user_email_admin_notice() {
}
add_action( 'admin_notices', 'new_user_email_admin_notice' );
function get_site_allowed_themes() {
$themes = get_themes();
$allowed_themes = get_site_option( 'allowedthemes' );
if ( !is_array( $allowed_themes ) || empty( $allowed_themes ) ) {
$allowed_themes = get_site_option( 'allowed_themes' ); // convert old allowed_themes format
if ( !is_array( $allowed_themes ) ) {
$allowed_themes = array();
} else {
foreach( (array) $themes as $key => $theme ) {
$theme_key = esc_html( $theme['Stylesheet'] );
if ( isset( $allowed_themes[ $key ] ) == true ) {
$allowedthemes[ $theme_key ] = 1;
}
}
$allowed_themes = $allowedthemes;
}
}
return $allowed_themes;
}
/**
* Determines if there is any upload space left in the current blog's quota.
*

View File

@ -343,12 +343,9 @@ function populate_options() {
$template = WP_DEFAULT_THEME;
// If default theme is a child theme, we need to get its template
foreach ( (array) get_themes() as $theme ) {
if ( WP_DEFAULT_THEME == $theme['Stylesheet'] ) {
$template = $theme['Template'];
break;
}
}
$theme = wp_get_theme( $template );
if ( ! $theme->errors() )
$template = $theme->get_template();
$timezone_string = '';
$gmt_offset = 0;

View File

@ -265,16 +265,14 @@ function install_theme_information() {
}
}
$themes = get_themes();
foreach ( (array) $themes as $this_theme ) {
if ( is_array($this_theme) && $this_theme['Stylesheet'] == $api->slug ) {
if ( version_compare( $this_theme['Version'], $api->version, '=' ) ) {
$theme = wp_get_theme( $api->slug );
if ( is_a( $theme, 'WP_Theme' ) ) {
switch ( version_compare( $theme->get('Version'), $api->version ) ) {
case 0; // equal
$type = 'latest_installed';
} elseif ( version_compare( $this_theme['Version'], $api->version, '>' ) ) {
case 1: // installed theme > api version
$type = 'newer_installed';
$newer_version = $this_theme['Version'];
}
break;
$newer_version = $theme->get('Version');
}
}
?>

View File

@ -6,46 +6,6 @@
* @subpackage Administration
*/
/**
* {@internal Missing Short Description}}
*
* @since 2.0.0
*
* @return unknown
*/
function current_theme_info() {
$themes = get_themes();
$current_theme = get_current_theme();
if ( ! $themes ) {
$ct = new stdClass;
$ct->name = $current_theme;
return $ct;
}
if ( ! isset( $themes[$current_theme] ) ) {
delete_option( 'current_theme' );
$current_theme = get_current_theme();
}
$ct = new stdClass;
$ct->name = $current_theme;
$ct->title = $themes[$current_theme]['Title'];
$ct->version = $themes[$current_theme]['Version'];
$ct->parent_theme = $themes[$current_theme]['Parent Theme'];
$ct->template_dir = $themes[$current_theme]['Template Dir'];
$ct->stylesheet_dir = $themes[$current_theme]['Stylesheet Dir'];
$ct->template = $themes[$current_theme]['Template'];
$ct->stylesheet = $themes[$current_theme]['Stylesheet'];
$ct->screenshot = $themes[$current_theme]['Screenshot'];
$ct->description = $themes[$current_theme]['Description'];
$ct->author = $themes[$current_theme]['Author'];
$ct->tags = $themes[$current_theme]['Tags'];
$ct->theme_root = $themes[$current_theme]['Theme Root'];
$ct->theme_root_uri = $themes[$current_theme]['Theme Root URI'];
return $ct;
}
/**
* Remove a theme
*
@ -113,59 +73,6 @@ function delete_theme($template, $redirect = '') {
return true;
}
/**
* {@internal Missing Short Description}}
*
* @since 1.5.0
*
* @return unknown
*/
function get_broken_themes() {
global $wp_broken_themes;
get_themes();
return $wp_broken_themes;
}
/**
* Get the allowed themes for the current blog.
*
* @since 3.0.0
*
* @uses get_themes()
* @uses current_theme_info()
* @uses get_site_allowed_themes()
* @uses wpmu_get_blog_allowedthemes
*
* @return array $themes Array of allowed themes.
*/
function get_allowed_themes() {
if ( !is_multisite() )
return get_themes();
$themes = get_themes();
$ct = current_theme_info();
$allowed_themes = apply_filters("allowed_themes", get_site_allowed_themes() );
if ( $allowed_themes == false )
$allowed_themes = array();
$blog_allowed_themes = wpmu_get_blog_allowedthemes();
if ( is_array( $blog_allowed_themes ) )
$allowed_themes = array_merge( $allowed_themes, $blog_allowed_themes );
if ( isset( $allowed_themes[ esc_html( $ct->stylesheet ) ] ) == false )
$allowed_themes[ esc_html( $ct->stylesheet ) ] = true;
reset( $themes );
foreach ( $themes as $key => $theme ) {
if ( isset( $allowed_themes[ esc_html( $theme[ 'Stylesheet' ] ) ] ) == false )
unset( $themes[ $key ] );
}
reset( $themes );
return $themes;
}
/**
* Get the Page Templates available in this theme
*
@ -174,37 +81,7 @@ function get_allowed_themes() {
* @return array Key is the template name, value is the filename of the template
*/
function get_page_templates() {
$themes = get_themes();
$theme = get_current_theme();
$templates = $themes[$theme]['Template Files'];
$page_templates = array();
if ( is_array( $templates ) ) {
$base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );
foreach ( $templates as $template ) {
$basename = str_replace($base, '', $template);
// don't allow template files in subdirectories
if ( false !== strpos($basename, '/') )
continue;
if ( 'functions.php' == $basename )
continue;
$template_data = implode( '', file( $template ));
$name = '';
if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) )
$name = _cleanup_header_comment($name[1]);
if ( !empty( $name ) ) {
$page_templates[trim( $name )] = $basename;
}
}
}
return $page_templates;
return wp_get_theme()->get_page_templates();
}
/**
@ -240,16 +117,14 @@ function theme_update_available( $theme ) {
if ( !isset($themes_update) )
$themes_update = get_site_transient('update_themes');
if ( is_object($theme) && isset($theme->stylesheet) )
$stylesheet = $theme->stylesheet;
elseif ( is_array($theme) && isset($theme['Stylesheet']) )
$stylesheet = $theme['Stylesheet'];
else
return false; //No valid info passed.
if ( ! is_a( $theme, 'WP_Theme' ) )
return;
$stylesheet = $theme->get_stylesheet();
if ( isset($themes_update->response[ $stylesheet ]) ) {
$update = $themes_update->response[ $stylesheet ];
$theme_name = is_object($theme) ? $theme->name : (is_array($theme) ? $theme['Name'] : '');
$theme_name = $theme->get('Name');
$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&amp;theme=' . urlencode($stylesheet), 'upgrade-theme_' . $stylesheet);
$update_onclick = 'onclick="if ( confirm(\'' . esc_js( __("Updating this theme will lose any customizations you have made. 'Cancel' to stop, 'OK' to update.") ) . '\') ) {return true;}return false;"';

View File

@ -217,16 +217,13 @@ function wp_update_plugin($plugin, $feedback = '') {
}
function get_theme_updates() {
$themes = get_themes();
$themes = wp_get_themes();
$current = get_site_transient('update_themes');
$update_themes = array();
foreach ( $themes as $theme ) {
$theme = (object) $theme;
if ( isset($current->response[ $theme->Stylesheet ]) ) {
$update_themes[$theme->Stylesheet] = $theme;
$update_themes[$theme->Stylesheet]->update = $current->response[ $theme->Stylesheet ];
}
foreach ( $current->response as $stylesheet => $data ) {
$update_themes[ $stylesheet ] = wp_get_theme( $stylesheet );
$update_themes[ $stylesheet ]->update = $data;
}
return $update_themes;

View File

@ -96,16 +96,16 @@ if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>
<h2><?php echo esc_html( $title ); ?>
<?php endif; ?>
</h2>
<h3><?php _e('Current Theme'); ?></h3>
<?php $ct = wp_get_theme(); ?>
<h3><?php _e( 'Current Theme' ); ?></h3>
<div id="current-theme">
<?php if ( $ct->screenshot ) : ?>
<img src="<?php echo $ct->theme_root_uri . '/' . $ct->stylesheet . '/' . $ct->screenshot; ?>" alt="<?php esc_attr_e('Current theme preview'); ?>" />
<?php if ( $ct->get_screenshot() ) : ?>
<img src="<?php echo $ct->get_screenshot( 'absolute' ); ?>" alt="<?php esc_attr_e( 'Current theme preview'); ?>" />
<?php endif; ?>
<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>
<p class="theme-description"><?php echo $ct->description; ?></p>
printf( __( '%1$s %2$s by %3$s' ), $ct->display('Name'), $ct->display('Version'), $ct->display('Author') ) ; ?></h4>
<p class="theme-description"><?php echo $ct->display('Description'); ?></p>
<div class="theme-options">
<span><?php _e( 'Options:' )?></span>
<?php
@ -117,8 +117,8 @@ if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>
if ( 'themes.php' == $item[2] || 'theme-editor.php' == $item[2] )
continue;
// 0 = name, 1 = capability, 2 = file
if ( ( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file)) ) $class = ' class="current"';
if ( ( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file)) )
$class = ' class="current"';
if ( !empty($submenu[$item[2]]) ) {
$submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index.
$menu_hook = get_plugin_page_hook($submenu[$item[2]][0][2], $item[2]);
@ -137,8 +137,8 @@ if ( ! is_multisite() && current_user_can( 'install_themes' ) ) : ?>
}
echo implode ( ' | ', $options );
if ( $ct->tags ) : ?>
<p><?php _e('Tags:'); ?> <?php echo join(', ', $ct->tags); ?></p>
if ( $ct->get('Tags') ) : ?>
<p><?php _e('Tags:'); ?> <?php echo $ct->display('Tags'); ?></p>
<?php endif; ?>
</div>
<?php theme_update_available($ct); ?>
@ -218,8 +218,7 @@ if ( ! current_user_can( 'switch_themes' ) ) {
<?php
// List broken themes, if any.
$broken_themes = get_broken_themes();
if ( current_user_can('edit_themes') && count( $broken_themes ) ) {
if ( current_user_can('edit_themes') && $broken_themes = wp_get_themes( array( 'errors' => true ) ) ) {
?>
<h3><?php _e('Broken Themes'); ?></h3>
@ -231,20 +230,13 @@ if ( current_user_can('edit_themes') && count( $broken_themes ) ) {
<th><?php _e('Description'); ?></th>
</tr>
<?php
$theme = '';
$theme_names = array_keys($broken_themes);
natcasesort($theme_names);
foreach ($theme_names as $theme_name) {
$name = $broken_themes[$theme_name]['Title'];
$description = $broken_themes[$theme_name]['Description'];
$theme = ('class="alternate"' == $theme) ? '' : 'class="alternate"';
$alt = '';
foreach ( $broken_themes as $broken_theme ) {
$alt = ('class="alternate"' == $alt) ? '' : 'class="alternate"';
echo "
<tr $theme>
<td>$name</td>
<td>$description</td>
<tr $alt>
<td>" . $broken_theme->get('Name') ."</td>
<td>" . $broken_theme->errors()->get_error_message() . "</td>
</tr>";
}
?>
@ -254,4 +246,4 @@ if ( current_user_can('edit_themes') && count( $broken_themes ) ) {
?>
</div>
<?php require('./admin-footer.php'); ?>
<?php require('./admin-footer.php'); ?>

View File

@ -242,17 +242,7 @@ final class WP_Customize {
* @return string Theme name.
*/
public function current_theme( $current_theme ) {
$themes = get_themes();
if ( ! $themes )
return $current_theme;
foreach ( $themes as $theme ) {
if ( $theme['Stylesheet'] == $this->stylesheet && $theme['Template'] == $this->template )
return $theme['Name'];
}
return $current_theme;
return wp_get_theme( $this->stylesheet )->get('Name');
}
/**

File diff suppressed because it is too large Load Diff

View File

@ -2906,4 +2906,50 @@ function debug_fwrite( $fp, $string ) {
*/
function debug_fclose( $fp ) {
_deprecated_function( __FUNCTION__, 'error_log()' );
}
/**
* Retrieve list of themes with theme data in theme directory.
*
* The theme is broken, if it doesn't have a parent theme and is missing either
* style.css and, or index.php. If the theme has a parent theme then it is
* broken, if it is missing style.css; index.php is optional.
*
* @since 1.5.0
* @global array $wp_themes Stores the working themes.
*
* @return array Theme list with theme data.
*/
function get_themes() {
_deprecated_function( __FUNCTION__, '3.4', 'wp_get_themes()' );
global $wp_themes;
if ( isset( $wp_themes ) )
return $wp_themes;
$themes = wp_get_themes();
$wp_themes = array();
foreach ( $themes as $theme ) {
$wp_themes[ $theme->get('Name') ] = $theme;
}
return $wp_themes;
}
/**
* Retrieve theme data.
*
* @since 1.5.0
*
* @param string $theme Theme name.
* @return array|null Null, if theme name does not exist. Theme data, if exists.
*/
function get_theme( $theme ) {
_deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme($stylesheet)' );
$themes = get_themes();
if ( is_array( $themes ) && array_key_exists( $theme, $themes ) )
return $themes[$theme];
return null;
}

View File

@ -6,6 +6,95 @@
* @subpackage Theme
*/
/**
* Returns an array of WP_Theme objects based on the arguments.
*
* Despite advances over get_themes(), this function is still quite expensive, and grows
* linearly with additional themes. Stick to wp_get_theme() if possible.
*
* @since 3.4.0
*
* @param array $args Arguments. Currently 'errors' (defaults to false), 'allowed'
* (true, false; null for either; defaults to null; only applies to multisite), and 'blog_id'
* (defaults to current blog; used to find allowed themes; only applies to multisite).
* @return Array of WP_Theme objects.
*/
function wp_get_themes( $args = array() ) {
global $wp_theme_directories;
$defaults = array( 'errors' => false, 'allowed' => null, 'blog_id' => 0 );
$args = wp_parse_args( $args, $defaults );
static $_themes;
if ( ! isset( $_themes ) ) {
$_themes = array();
$theme_data = search_theme_directories();
// Make sure the current theme wins out, in case search_theme_directories() picks the wrong
// one in the case of a conflict. (Normally, last registered theme root wins.)
$current_theme = get_stylesheet();
$current_theme_root = get_raw_theme_root( $current_theme );
if ( ! in_array( $current_theme_root, $wp_theme_directories ) )
$current_theme_root = WP_CONTENT_DIR . $current_theme_root;
foreach ( (array) $theme_data as $theme_slug => $data ) {
if ( $current_theme == $theme_slug && $current_theme_root != $data['theme_root'] )
$_themes[ $theme_slug ] = new WP_Theme( $theme_slug, $current_theme_root );
else
$_themes[ $theme_slug ] = new WP_Theme( $theme_slug, $data['theme_root'] );
}
}
$themes = $_themes;
if ( empty( $themes ) )
return $themes;
if ( null !== $args['errors'] ) {
foreach ( $themes as $theme_slug => $theme ) {
if ( $theme->errors() != $args['errors'] )
unset( $themes[ $theme_slug ] );
}
}
if ( is_multisite() && null !== $args['allowed'] ) {
if ( $allowed = $args['allowed'] ) {
if ( 'network' == $allowed )
$themes = array_intersect_key( $themes, WP_Theme::get_allowed_on_network( $args['blog_id'] ) );
elseif ( 'site' == $allowed )
$themes = array_intersect_key( $themes, WP_Theme::get_allowed_on_site( $args['blog_id'] ) );
else
$themes = array_intersect_key( $themes, WP_Theme::get_allowed( $args['blog_id'] ) );
} else {
$themes = array_diff_key( $themes, WP_Theme::get_allowed( $args['blog_id'] ) );
}
}
return $themes;
}
/**
* Gets a WP_Theme object for a theme.
*
* @since 3.4.0
*
* @param string $stylesheet Directory name for the theme. Optional. Defaults to current theme.
* @param string $theme_root Absolute path of the theme root to look in. Optional. If not specified, get_raw_theme_root()
* is used to calculate the theme root for the $stylesheet provided (or current theme).
* @return WP_Theme
*/
function wp_get_theme( $stylesheet = null, $theme_root = null ) {
global $wp_theme_directories;
if ( empty( $stylesheet ) )
$stylesheet = get_stylesheet();
if ( empty( $theme_root ) ) {
$theme_root = get_raw_theme_root( $stylesheet );
if ( ! in_array( $theme_root, $wp_theme_directories ) )
$theme_root = WP_CONTENT_DIR . $theme_root;
}
return new WP_Theme( $stylesheet, $theme_root );
}
/**
* Whether a child theme is in use.
*
@ -246,218 +335,6 @@ function get_theme_data( $theme_file ) {
return $theme_data;
}
/**
* Retrieve list of themes with theme data in theme directory.
*
* The theme is broken, if it doesn't have a parent theme and is missing either
* style.css and, or index.php. If the theme has a parent theme then it is
* broken, if it is missing style.css; index.php is optional. The broken theme
* list is saved in the {@link $wp_broken_themes} global, which is displayed on
* the theme list in the administration panels.
*
* @since 1.5.0
* @global array $wp_broken_themes Stores the broken themes.
* @global array $wp_themes Stores the working themes.
*
* @return array Theme list with theme data.
*/
function get_themes() {
global $wp_themes, $wp_broken_themes;
if ( isset($wp_themes) )
return $wp_themes;
if ( !$theme_files = search_theme_directories() )
return false;
asort( $theme_files );
$wp_themes = array();
foreach ( (array) $theme_files as $theme_file ) {
$theme_root = $theme_file['theme_root'];
$theme_file = $theme_file['theme_file'];
if ( !is_readable("$theme_root/$theme_file") ) {
$wp_broken_themes[$theme_file] = array('Name' => $theme_file, 'Title' => $theme_file, 'Description' => __('File not readable.'));
continue;
}
$theme_data = get_theme_data("$theme_root/$theme_file");
$name = $theme_data['Name'];
$title = $theme_data['Title'];
$description = wptexturize($theme_data['Description']);
$version = $theme_data['Version'];
$author = $theme_data['Author'];
$template = $theme_data['Template'];
$stylesheet = dirname($theme_file);
$screenshot = false;
foreach ( array('png', 'gif', 'jpg', 'jpeg') as $ext ) {
if (file_exists("$theme_root/$stylesheet/screenshot.$ext")) {
$screenshot = "screenshot.$ext";
break;
}
}
if ( empty($name) ) {
$name = dirname($theme_file);
$title = $name;
}
$parent_template = $template;
if ( empty($template) ) {
if ( file_exists("$theme_root/$stylesheet/index.php") )
$template = $stylesheet;
else
continue;
}
$template = trim( $template );
if ( !file_exists("$theme_root/$template/index.php") ) {
$parent_dir = dirname(dirname($theme_file));
if ( file_exists("$theme_root/$parent_dir/$template/index.php") ) {
$template = "$parent_dir/$template";
$template_directory = "$theme_root/$template";
} else {
/**
* The parent theme doesn't exist in the current theme's folder or sub folder
* so lets use the theme root for the parent template.
*/
if ( isset($theme_files[$template]) && file_exists( $theme_files[$template]['theme_root'] . "/$template/index.php" ) ) {
$template_directory = $theme_files[$template]['theme_root'] . "/$template";
} else {
if ( empty( $parent_template) )
$wp_broken_themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => __('Template is missing.'), 'error' => 'no_template');
else
$wp_broken_themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => sprintf( __('The parent theme is missing. Please install the "%s" parent theme.'), $parent_template ), 'error' => 'no_parent', 'parent' => $parent_template );
continue;
}
}
} else {
$template_directory = trim( $theme_root . '/' . $template );
}
$stylesheet_files = array();
$template_files = array();
$stylesheet_dir = @ dir("$theme_root/$stylesheet");
if ( $stylesheet_dir ) {
while ( ($file = $stylesheet_dir->read()) !== false ) {
if ( !preg_match('|^\.+$|', $file) ) {
if ( preg_match('|\.css$|', $file) )
$stylesheet_files[] = "$theme_root/$stylesheet/$file";
elseif ( preg_match('|\.php$|', $file) )
$template_files[] = "$theme_root/$stylesheet/$file";
}
}
@ $stylesheet_dir->close();
}
$template_dir = @ dir("$template_directory");
if ( $template_dir ) {
while ( ($file = $template_dir->read()) !== false ) {
if ( preg_match('|^\.+$|', $file) )
continue;
if ( preg_match('|\.php$|', $file) ) {
$template_files[] = "$template_directory/$file";
} elseif ( is_dir("$template_directory/$file") ) {
$template_subdir = @ dir("$template_directory/$file");
if ( !$template_subdir )
continue;
while ( ($subfile = $template_subdir->read()) !== false ) {
if ( preg_match('|^\.+$|', $subfile) )
continue;
if ( preg_match('|\.php$|', $subfile) )
$template_files[] = "$template_directory/$file/$subfile";
}
@ $template_subdir->close();
}
}
@ $template_dir->close();
}
//Make unique and remove duplicates when stylesheet and template are the same i.e. most themes
$template_files = array_unique($template_files);
$stylesheet_files = array_unique($stylesheet_files);
$template_dir = $template_directory;
$stylesheet_dir = $theme_root . '/' . $stylesheet;
if ( empty($template_dir) )
$template_dir = '/';
if ( empty($stylesheet_dir) )
$stylesheet_dir = '/';
// Check for theme name collision. This occurs if a theme is copied to
// a new theme directory and the theme header is not updated. Whichever
// theme is first keeps the name. Subsequent themes get a suffix applied.
// Default themes themes always trump their pretenders.
if ( isset($wp_themes[$name]) ) {
$trump_cards = array(
'classic' => 'WordPress Classic',
'default' => 'WordPress Default',
'twentyten' => 'Twenty Ten',
'twentyeleven' => 'Twenty Eleven',
'twentytwelve' => 'Twenty Twelve',
);
if ( isset( $trump_cards[ $stylesheet ] ) && $name == $trump_cards[ $stylesheet ] ) {
// If another theme has claimed to be one of our default themes, move
// them aside.
$suffix = $wp_themes[$name]['Stylesheet'];
$new_name = "$name/$suffix";
$wp_themes[$new_name] = $wp_themes[$name];
$wp_themes[$new_name]['Name'] = $new_name;
} else {
$name = "$name/$stylesheet";
}
}
$wp_themes[$name] = array(
'Name' => $name,
'Title' => $title,
'Description' => $description,
'Author' => $author,
'Author Name' => $theme_data['AuthorName'],
'Author URI' => $theme_data['AuthorURI'],
'Version' => $version,
'Template' => $template,
'Stylesheet' => $stylesheet,
'Template Files' => $template_files,
'Stylesheet Files' => $stylesheet_files,
'Template Dir' => $template_dir,
'Stylesheet Dir' => $stylesheet_dir,
'Status' => $theme_data['Status'],
'Screenshot' => $screenshot,
'Tags' => $theme_data['Tags'],
'Theme Root' => $theme_root,
'Theme Root URI' => str_replace( WP_CONTENT_DIR, content_url(), $theme_root ),
);
}
unset($theme_files);
/* Resolve theme dependencies. */
$theme_names = array_keys( $wp_themes );
foreach ( (array) $theme_names as $theme_name ) {
$wp_themes[$theme_name]['Parent Theme'] = '';
if ( $wp_themes[$theme_name]['Stylesheet'] != $wp_themes[$theme_name]['Template'] ) {
foreach ( (array) $theme_names as $parent_theme_name ) {
if ( ($wp_themes[$parent_theme_name]['Stylesheet'] == $wp_themes[$parent_theme_name]['Template']) && ($wp_themes[$parent_theme_name]['Template'] == $wp_themes[$theme_name]['Template']) ) {
$wp_themes[$theme_name]['Parent Theme'] = $wp_themes[$parent_theme_name]['Name'];
break;
}
}
}
}
return $wp_themes;
}
/**
* Retrieve theme roots.
*
@ -479,23 +356,6 @@ function get_theme_roots() {
return $theme_roots;
}
/**
* Retrieve theme data.
*
* @since 1.5.0
*
* @param string $theme Theme name.
* @return array|null Null, if theme name does not exist. Theme data, if exists.
*/
function get_theme($theme) {
$themes = get_themes();
if ( is_array( $themes ) && array_key_exists( $theme, $themes ) )
return $themes[$theme];
return null;
}
/**
* Retrieve current theme display name.
*
@ -508,29 +368,10 @@ function get_theme($theme) {
* @return string
*/
function get_current_theme() {
if ( $theme = get_option('current_theme') )
if ( $theme = get_option( 'current_theme' ) )
return $theme;
$themes = get_themes();
$current_theme = 'Twenty Eleven';
if ( $themes ) {
$theme_names = array_keys( $themes );
$current_template = get_option( 'template' );
$current_stylesheet = get_option( 'stylesheet' );
foreach ( (array) $theme_names as $theme_name ) {
if ( $themes[$theme_name]['Stylesheet'] == $current_stylesheet &&
$themes[$theme_name]['Template'] == $current_template ) {
$current_theme = $themes[$theme_name]['Name'];
break;
}
}
}
update_option('current_theme', $current_theme);
return $current_theme;
return wp_get_theme()->get('Name');
}
/**

View File

@ -235,32 +235,29 @@ function wp_update_themes() {
if ( defined( 'WP_INSTALLING' ) )
return false;
if ( !function_exists( 'get_themes' ) )
require_once( ABSPATH . 'wp-includes/theme.php' );
$installed_themes = get_themes( );
$installed_themes = wp_get_themes();
$last_update = get_site_transient( 'update_themes' );
if ( ! is_object($last_update) )
$last_update = new stdClass;
$themes = array();
$checked = array();
$exclude_fields = array('Template Files', 'Stylesheet Files', 'Status', 'Theme Root', 'Theme Root URI', 'Template Dir', 'Stylesheet Dir', 'Description', 'Tags', 'Screenshot');
// Put slug of current theme into request.
$themes['current_theme'] = get_option( 'stylesheet' );
foreach ( (array) $installed_themes as $theme_title => $theme ) {
$themes[$theme['Stylesheet']] = array();
$checked[$theme['Stylesheet']] = $theme['Version'];
foreach ( $installed_themes as $theme ) {
$checked[ $theme->get_stylesheet() ] = $theme->get('Version');
$themes[$theme['Stylesheet']]['Name'] = $theme['Name'];
$themes[$theme['Stylesheet']]['Version'] = $theme['Version'];
foreach ( (array) $theme as $key => $value ) {
if ( !in_array($key, $exclude_fields) )
$themes[$theme['Stylesheet']][$key] = $value;
}
$themes[ $theme->get_stylesheet() ] = array(
'Name' => $theme->get('Name'),
'Title' => $theme->get('Name'),
'Version' => $theme->get('Version'),
'Author' => $theme->get('Author'),
'Author URI' => $theme->get('AuthorURI'),
'Template' => $theme->get_template(),
'Stylesheet' => $theme->get_stylesheet(),
);
}
// Check for update on a different schedule, depending on the page.

View File

@ -112,6 +112,7 @@ require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/capabilities.php' );
require( ABSPATH . WPINC . '/query.php' );
require( ABSPATH . WPINC . '/theme.php' );
require( ABSPATH . WPINC . '/class-wp-theme.php' );
require( ABSPATH . WPINC . '/template.php' );
require( ABSPATH . WPINC . '/user.php' );
require( ABSPATH . WPINC . '/meta.php' );