Make WordPress Core

Changeset 20029


Ignore:
Timestamp:
02/28/2012 09:24:44 PM (14 years ago)
Author:
nacin
Message:

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.

Location:
trunk
Files:
1 added
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/wp-admin/includes/class-wp-ms-themes-list-table.php

    r20022 r20029  
    5151
    5252        function prepare_items() {
    53                 global $status, $themes, $totals, $page, $orderby, $order, $s;
     53                global $status, $totals, $page, $orderby, $order, $s;
    5454
    5555                wp_reset_vars( array( 'orderby', 'order', 's' ) );
    5656
    5757                $themes = array(
    58                         'all' => apply_filters( 'all_themes', get_themes() ),
     58                        'all' => apply_filters( 'all_themes', wp_get_themes() ),
    5959                        'search' => array(),
    6060                        'enabled' => array(),
     
    6363                );
    6464
    65                 $site_allowed_themes = get_site_allowed_themes();
    66                 if ( !$this->is_site_themes ) {
    67                         $allowed_themes = $site_allowed_themes;
     65                if ( $this->is_site_themes ) {
     66                        $themes_per_page = $this->get_items_per_page( 'site_themes_network_per_page' );
     67                        $allowed_where = 'site';
     68                } else {
    6869                        $themes_per_page = $this->get_items_per_page( 'themes_network_per_page' );
    69                 } else {
    70                         $allowed_themes = wpmu_get_blog_allowedthemes( $this->site_id );
    71                         $themes_per_page = $this->get_items_per_page( 'site_themes_network_per_page' );
    72                 }
    73 
    74                 $current = get_site_transient( 'update_themes' );
     70                        $allowed_where = 'network';
     71                }
     72
     73                $current = current_user_can( 'update_themes' ) && ! $this->is_site_themes && get_site_transient( 'update_themes' );
    7574
    7675                foreach ( (array) $themes['all'] as $key => $theme ) {
    77                         $theme_key = $theme['Stylesheet'];
    78 
    79                         if ( isset( $allowed_themes [ $theme_key ] ) )  {
    80                                 $themes['all'][$key]['enabled'] = true;
    81                                 $themes['enabled'][$key] = $themes['all'][$key];
    82                         }
    83                         else {
    84                                 $themes['all'][$key]['enabled'] = false;
    85                                 $themes['disabled'][$key] = $themes['all'][$key];
    86                         }
    87                         if ( isset( $current->response[ $theme['Template'] ] ) )
    88                                 $themes['upgrade'][$key] = $themes['all'][$key];
    89 
    90                         if ( $this->is_site_themes && isset( $site_allowed_themes[$theme_key] ) ) {
    91                                 unset( $themes['all'][$key] );
    92                                 unset( $themes['enabled'][$key] );
    93                                 unset( $themes['disabled'][$key] );
    94                         }
    95                 }
    96 
    97                 if ( !current_user_can( 'update_themes' ) || $this->is_site_themes )
    98                         $themes['upgrade'] = array();
     76                        if ( $this->is_site_themes && $theme->is_allowed( 'network' ) ) {
     77                                unset( $themes['all'][ $key ] );
     78                                continue;
     79                        }
     80
     81                        $filter = $theme->is_allowed( $allowed_where, $this->site_id ) ? 'enabled' : 'disabled';
     82                        $themes[ $filter ][ $key ] = $themes['all'][ $key ];
     83
     84                        if ( $current && isset( $current->response[ $key ] ) )
     85                                $themes['upgrade'][ $key ] = $themes['all'][ $key ];
     86                }
    9987
    10088                if ( $s ) {
     
    11199
    112100                $this->items = $themes[ $status ];
     101                WP_Theme::sort_by_name( $this->items );
     102
     103                $this->has_items = ! empty( $themes['all'] );
    113104                $total_this_page = $totals[ $status ];
    114105
     
    117108                        $order = strtoupper( $order );
    118109
    119                         uasort( $this->items, array( &$this, '_order_callback' ) );
     110                        if ( $orderby == 'Name' ) {
     111                                if ( 'ASC' == $order )
     112                                        $this->items = array_reverse( $this->items );
     113                        } else {
     114                                uasort( $this->items, array( &$this, '_order_callback' ) );
     115                        }
    120116                }
    121117
     
    123119
    124120                if ( $total_this_page > $themes_per_page )
    125                         $this->items = array_slice( $this->items, $start, $themes_per_page );
     121                        $this->items = array_slice( $this->items, $start, $themes_per_page, true );
    126122
    127123                $this->set_pagination_args( array(
     
    136132                        $term = stripslashes( $_REQUEST['s'] );
    137133
    138                 $search_fields = array( 'Name', 'Title', 'Description', 'Author', 'Author Name', 'Author URI', 'Template', 'Stylesheet' );
    139                 foreach ( $search_fields as $field )
    140                         if ( stripos( $theme[ $field ], $term ) !== false )
     134                foreach ( array( 'Name', 'Description', 'Author', 'Author', 'AuthorURI' ) as $field ) {
     135                        // Don't mark up; Do translate.
     136                        if ( false !== stripos( $theme->display( $field, false, true ), $term ) )
    141137                                return true;
     138                }
     139
     140                if ( false !== stripos( $theme->get_stylesheet(), $term ) )
     141                        return true;
     142
     143                if ( false !== stripos( $theme->get_template(), $term ) )
     144                        return true;
    142145
    143146                return false;
    144147        }
    145148
     149        // Not used by any core columns.
    146150        function _order_callback( $theme_a, $theme_b ) {
    147151                global $orderby, $order;
    148152
    149                 $a = $theme_a[$orderby];
    150                 $b = $theme_b[$orderby];
     153                $a = $theme_a[ $orderby ];
     154                $b = $theme_b[ $orderby ];
    151155
    152156                if ( $a == $b )
     
    160164
    161165        function no_items() {
    162                 global $themes;
    163 
    164                 if ( !empty( $themes['all'] ) )
     166                if ( ! $$this->has_items )
    165167                        _e( 'No themes found.' );
    166168                else
     
    260262                $context = $status;
    261263
    262                 if ( $this->is_site_themes )
     264                if ( $this->is_site_themes ) {
    263265                        $url = "site-themes.php?id={$this->site_id}&";
    264                 else
     266                        $allowed = $theme->is_allowed( 'site', $this->site_id );
     267                } else {
    265268                        $url = 'themes.php?';
     269                        $allowed = $theme->is_allowed( 'network' );
     270                }
    266271
    267272                // preorder
     
    273278                );
    274279
    275                 $theme_key = $theme['Stylesheet'];
    276 
    277                 if ( empty( $theme['enabled'] ) )
     280                $theme_key = $theme->get_stylesheet();
     281
     282                if ( ! $allowed )
    278283                        $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>';
    279284                else
     
    281286
    282287                if ( current_user_can('edit_themes') )
    283                         $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>';
    284 
    285                 if ( empty( $theme['enabled'] ) && current_user_can( 'delete_themes' ) && ! $this->is_site_themes && $theme_key != get_option( 'stylesheet' ) && $theme_key != get_option( 'template' ) )
     288                        $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>';
     289
     290                if ( ! $allowed && current_user_can( 'delete_themes' ) && ! $this->is_site_themes && $theme_key != get_option( 'stylesheet' ) && $theme_key != get_option( 'template' ) )
    286291                        $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>';
    287292
     
    289294                $actions = apply_filters( "theme_action_links_$theme_key", $actions, $theme_key, $theme, $context );
    290295
    291                 $class = empty( $theme['enabled'] ) ? 'inactive' : 'active';
    292                 $checkbox_id = "checkbox_" . md5($theme['Name']);
    293                 $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>";
    294 
    295                 $description = '<p>' . $theme['Description'] . '</p>';
    296                 $theme_name = $theme['Name'];
    297 
    298                 $id = sanitize_title( $theme_name );
     296                $class = ! $allowed ? 'inactive' : 'active';
     297                $checkbox_id = "checkbox_" . md5( $theme->get('Name') );
     298                $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>";
     299
     300                $description = '<p>' . $theme->display( 'Description' ) . '</p>';
     301
     302                $id = sanitize_html_class( $theme->get_stylesheet() );
    299303
    300304                echo "<tr id='$id' class='$class'>";
     
    312316                                        break;
    313317                                case 'name':
    314                                         echo "<td class='theme-title'$style><strong>$theme_name</strong>";
     318                                        echo "<td class='theme-title'$style><strong>" . $theme->display('Name') . "</strong>";
    315319                                        echo $this->row_actions( $actions, true );
    316320                                        echo "</td>";
     
    318322                                case 'description':
    319323                                        echo "<td class='column-description desc'$style>
    320                                                 <div class='theme-description'>$description</div>
     324                                                <div class='theme-description'>" . $theme->display( 'Description' ) . "</div>
    321325                                                <div class='$class second theme-version-author-uri'>";
    322326
    323327                                        $theme_meta = array();
    324328
    325                                         if ( !empty( $theme['Version'] ) )
    326                                                 $theme_meta[] = sprintf( __( 'Version %s' ), $theme['Version'] );
    327 
    328                                         if ( !empty( $theme['Author'] ) )
    329                                                 $theme_meta[] = sprintf( __( 'By %s' ), $theme['Author'] );
    330 
    331                                         if ( !empty( $theme['Theme URI'] ) )
    332                                                 $theme_meta[] = '<a href="' . $theme['Theme URI'] . '" title="' . esc_attr__( 'Visit theme homepage' ) . '">' . __( 'Visit Theme Site' ) . '</a>';
     329                                        if ( $theme->get('Version') )
     330                                                $theme_meta[] = sprintf( __( 'Version %s' ), $theme->display('Version') );
     331
     332                                        if ( $theme->get('Author') )
     333                                                $theme_meta[] = sprintf( __( 'By %s' ), $theme->display('Author') );
     334
     335                                        if ( $theme->get('ThemeURI') )
     336                                                $theme_meta[] = '<a href="' . $theme->display('ThemeURI') . '" title="' . esc_attr__( 'Visit theme homepage' ) . '">' . __( 'Visit Theme Site' ) . '</a>';
    333337
    334338                                        $theme_meta = apply_filters( 'theme_row_meta', $theme_meta, $theme_key, $theme, $status );
  • trunk/wp-admin/includes/class-wp-themes-list-table.php

    r20027 r20029  
    2525
    2626        function prepare_items() {
    27                 global $ct;
    28 
    29                 $ct = current_theme_info();
    30 
    31                 $themes = get_allowed_themes();
     27                $themes = wp_get_themes( array( 'allowed' => true ) );
    3228
    3329                if ( ! empty( $_REQUEST['s'] ) ) {
     
    4642                if ( $this->search || $this->features ) {
    4743                        foreach ( $themes as $key => $theme ) {
    48                                 if ( !$this->search_theme( $theme ) )
     44                                if ( ! $this->search_theme( $theme ) )
    4945                                        unset( $themes[ $key ] );
    5046                        }
    5147                }
    5248
    53                 unset( $themes[$ct->name] );
    54                 uksort( $themes, "strnatcasecmp" );
     49                unset( $themes[ get_option( 'stylesheet' ) ] );
     50                WP_Theme::sort_by_name( $themes );
    5551
    5652                $per_page = 999;
     
    126122        function display_rows() {
    127123                $themes = $this->items;
    128                 $theme_names = array_keys( $themes );
    129                 natcasesort( $theme_names );
    130 
    131         foreach ( $theme_names as $theme_name ) {
    132                 $class = array( 'available-theme' );
    133         ?>
    134         <div class="<?php echo join( ' ', $class ); ?>">
    135         <?php if ( !empty( $theme_name ) ) :
    136         $template = $themes[$theme_name]['Template'];
    137         $stylesheet = $themes[$theme_name]['Stylesheet'];
    138         $title = $themes[$theme_name]['Title'];
    139         $version = $themes[$theme_name]['Version'];
    140         $description = $themes[$theme_name]['Description'];
    141         $author = $themes[$theme_name]['Author'];
    142         $screenshot = $themes[$theme_name]['Screenshot'];
    143         $stylesheet_dir = $themes[$theme_name]['Stylesheet Dir'];
    144         $template_dir = $themes[$theme_name]['Template Dir'];
    145         $parent_theme = $themes[$theme_name]['Parent Theme'];
    146         $theme_root = $themes[$theme_name]['Theme Root'];
    147         $theme_root_uri = $themes[$theme_name]['Theme Root URI'];
    148         $preview_link = esc_url( add_query_arg( array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'preview_iframe' => true, 'TB_iframe' => 'true' ), home_url( '/' ) ) );
    149         $preview_text = esc_attr( sprintf( __( 'Preview of &#8220;%s&#8221;' ), $title ) );
    150         $tags = $themes[$theme_name]['Tags'];
    151         $thickbox_class = 'thickbox thickbox-preview';
    152         $activate_link = wp_nonce_url( "themes.php?action=activate&amp;template=" . urlencode( $template ) . "&amp;stylesheet=" . urlencode( $stylesheet ), 'switch-theme_' . $template );
    153         $activate_text = esc_attr( sprintf( __( 'Activate &#8220;%s&#8221;' ), $title ) );
    154         $actions = array();
    155         $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="' . $activate_text . '">' . __( 'Activate' ) . '</a>';
    156         $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $theme_name ) ) . '">' . __( 'Preview' ) . '</a>';
    157         if ( ! is_multisite() && current_user_can( 'delete_themes' ) )
    158                 $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>';
    159         $actions = apply_filters( 'theme_action_links', $actions, $themes[$theme_name] );
    160 
    161         $actions = implode ( ' | ', $actions );
    162 ?>
    163                 <a href="<?php echo $preview_link; ?>" class="<?php echo $thickbox_class; ?> screenshot">
    164 <?php if ( $screenshot ) : ?>
    165                         <img src="<?php echo $theme_root_uri . '/' . $stylesheet . '/' . $screenshot; ?>" alt="" />
    166 <?php endif; ?>
    167                 </a>
    168 <h3><?php
    169         /* translators: 1: theme title, 2: theme version, 3: theme author */
    170         printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3>
    171 
    172 <span class='action-links'><?php echo $actions ?></span>
    173 <span class="separator hide-if-no-js">| </span><a href="#" class="theme-detail hide-if-no-js" tabindex='4'><?php _e('Details') ?></a>
    174 <div class="themedetaildiv hide-if-js">
    175 <p><?php echo $description; ?></p>
    176         <?php if ( current_user_can( 'edit_themes' ) && $parent_theme ) {
    177         /* translators: 1: theme title, 2:  template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>
    178         <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>
    179 <?php } else { ?>
    180         <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>
    181 <?php } ?>
    182 <?php if ( $tags ) : ?>
    183 <p><?php _e( 'Tags:' ); ?> <?php echo join( ', ', $tags ); ?></p>
    184 <?php endif; ?>
    185 <?php endif; // end if not empty theme_name ?>
    186 </div>
    187         <?php theme_update_available( $themes[$theme_name] ); ?>
    188         </div>
    189 <?php } // end foreach $theme_names
     124
     125                foreach ( $themes as $theme ) {
     126                        echo '<div class="available-theme">';
     127
     128                        $template = $theme->get_template();
     129                        $stylesheet = $theme->get_stylesheet();
     130
     131                        $title = $theme->display('Name');
     132                        $version = $theme->display('Version');
     133                        $author = $theme->display('Author');
     134 
     135                        $activate_link = wp_nonce_url( "themes.php?action=activate&amp;template=" . urlencode( $template ) . "&amp;stylesheet=" . urlencode( $stylesheet ), 'switch-theme_' . $template );
     136                        $preview_link = esc_url( add_query_arg(
     137                                array( 'preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'preview_iframe' => true, 'TB_iframe' => 'true' ),
     138                                home_url( '/' ) ) );
     139 
     140                        $actions = array();
     141                        $actions[] = '<a href="' . $activate_link . '" class="activatelink" title="'
     142                                . esc_attr( sprintf( __( 'Activate &#8220;%s&#8221;' ), $title ) ) . '">' . __( 'Activate' ) . '</a>';
     143                        $actions[] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="'
     144                                . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $title ) ) . '">' . __( 'Preview' ) . '</a>';
     145                        if ( ! is_multisite() && current_user_can( 'delete_themes' ) )
     146                                $actions[] = '<a class="submitdelete deletion" href="' . wp_nonce_url( "themes.php?action=delete&amp;template=$stylesheet", 'delete-theme_' . $stylesheet )
     147                                        . '" onclick="' . "return confirm( '" . esc_js( sprintf( __( "You are about to delete this theme '%s'\n  'Cancel' to stop, 'OK' to delete." ), $title ) )
     148                                        . "' );" . '">' . __( 'Delete' ) . '</a>';
     149 
     150                        $actions = apply_filters( 'theme_action_links', $actions, $theme );
     151 
     152                        $actions = implode ( ' | ', $actions );
     153                        ?>
     154                        <a href="<?php echo $preview_link; ?>" class="thickbox thickbox-preview screenshot">
     155                        <?php if ( $theme->get_screenshot() ) : ?>
     156                                <img src="<?php echo esc_url( $theme->get_screenshot( 'absolute' ) ); ?>" alt="" />
     157                        <?php endif; ?>
     158                        </a>
     159                        <h3><?php
     160                        /* translators: 1: theme title, 2: theme version, 3: theme author */
     161                        printf( __( '%1$s %2$s by %3$s' ), $title, $version, $author ) ; ?></h3>
     162 
     163                        <span class='action-links'><?php echo $actions ?></span>
     164                        <span class="separator hide-if-no-js">| </span><a href="#" class="theme-detail hide-if-no-js" tabindex='4'><?php _e('Details') ?></a>
     165                        <div class="themedetaildiv hide-if-js">
     166                        <p><?php echo $theme->display('Description'); ?></p>
     167                        <?php if ( current_user_can( 'edit_themes' ) && $theme->parent() ) :
     168                                /* translators: 1: theme title, 2:  template dir, 3: stylesheet_dir, 4: theme title, 5: parent_theme */ ?>
     169                                <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.' ),
     170                                        $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>
     171                        <?php else :
     172                                        /* translators: 1: theme title, 2:  template dir, 3: stylesheet_dir */ ?>
     173                                <p><?php printf( __( 'All of this theme&#8217;s files are located in <code>%2$s</code>.' ),
     174                                        $title, str_replace( WP_CONTENT_DIR, '', $theme->get_template_directory() ), str_replace( WP_CONTENT_DIR, '', $theme->get_stylesheet_directory() ) ); ?></p>
     175                        <?php endif; ?>
     176                        <?php
     177                        if ( $theme->get('Tags') )
     178                                printf( '<p>' . __( 'Tags: %s.' ) . '</p>', $theme->display('Tags') );
     179                        ?>
     180                        </div>
     181                        <?php theme_update_available( $theme ); ?>
     182                        </div>
     183                <?php
     184                }
    190185        }
    191186
     
    194189                if ( $this->features ) {
    195190                        foreach ( $this->features as $word ) {
    196                                 if ( ! in_array( $word, $theme['Tags'] ) )
     191                                if ( ! in_array( $word, $theme->get('Tags') ) )
    197192                                        return false;
    198193                        }
     
    202197                if ( $this->search ) {
    203198                        foreach ( $this->search as $word ) {
    204                                 if ( in_array( $word, $theme['Tags'] ) )
     199                                if ( in_array( $word, $theme->get('Tags') ) )
    205200                                        continue;
    206                         }
    207 
    208                         foreach ( array( 'Name', 'Title', 'Description', 'Author', 'Template', 'Stylesheet' ) as $header ) {
    209                                 if ( false !== stripos( $theme[ $header ], $word ) )
    210                                         continue 2;
    211                         }
    212 
    213                         return false;
     201
     202                                foreach ( array( 'Name', 'Description', 'Author', 'AuthorURI' ) as $header ) {
     203                                        // Don't mark up; Do translate.
     204                                        if ( false !== stripos( $theme->display( $header, false, true ), $word ) )
     205                                                continue 2;
     206                                }
     207
     208                                if ( false !== stripos( $theme->get_stylesheet(), $word ) )
     209                                        continue;
     210
     211                                if ( false !== stripos( $theme->get_template(), $word ) )
     212                                        continue;
     213 
     214                                return false;
     215                        }
    214216                }
    215217
  • trunk/wp-admin/includes/dashboard.php

    r19712 r20029  
    384384
    385385        echo "\n\t".'<div class="versions">';
    386         $ct = current_theme_info();
     386        $theme = wp_get_theme();
    387387
    388388        echo "\n\t<p>";
    389389
    390         if ( empty( $ct->stylesheet_dir ) ) {
     390        if ( $theme->errors() ) {
    391391                if ( ! is_multisite() || is_super_admin() )
    392392                        echo '<span class="error-message">' . __('ERROR: The themes directory is either empty or doesn&#8217;t exist. Please check your installation.') . '</span>';
     
    402402                $num = number_format_i18n( $num_widgets );
    403403
    404                 $switch_themes = $ct->title;
     404                $switch_themes = $theme->display('Name');
    405405                if ( current_user_can( 'switch_themes') )
    406406                        $switch_themes = '<a href="themes.php">' . $switch_themes . '</a>';
     
    412412        } else {
    413413                if ( current_user_can( 'switch_themes' ) )
    414                         printf( __('Theme <span class="b"><a href="themes.php">%1$s</a></span>'), $ct->title );
     414                        printf( __('Theme <span class="b"><a href="themes.php">%1$s</a></span>'), $theme->display('Name') );
    415415                else
    416                         printf( __('Theme <span class="b">%1$s</span>'), $ct->title );
     416                        printf( __('Theme <span class="b">%1$s</span>'), $theme->display('Name') );
    417417        }
    418418        echo '</p>';
     
    13141314                <h4><span class="icon16 icon-appearance"></span> <?php _e( 'Customize Your Site' ); ?></h4>
    13151315                <?php
    1316                 $ct = current_theme_info();
    1317                 if ( empty ( $ct->stylesheet_dir ) ) :
     1316                $theme = wp_get_theme();
     1317                if ( $theme->errors() ) :
    13181318                        echo '<p>';
    13191319                        printf( __( '<a href="%s">Install a theme</a> to get started customizing your site.' ), esc_url( admin_url( 'themes.php' ) ) );
     
    13211321                else:
    13221322                        $customize_links = array();
    1323                         if ( 'twentyeleven' == $ct->stylesheet )
     1323                        if ( 'twentyeleven' == $theme->get_stylesheet() )
    13241324                                $customize_links[] = sprintf( __( '<a href="%s">Choose light or dark</a>' ), esc_url( admin_url( 'themes.php?page=theme_options' ) ) );
    13251325
     
    13351335                        if ( ! empty( $customize_links ) ) {
    13361336                                echo '<p>';
    1337                                 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 );
     1337                                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' ) ) );
    13381338                                echo '</p>';
    13391339                        ?>
     
    13461346                        } else {
    13471347                                echo '<p>';
    1348                                 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' ) ) );
     1348                                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' ) ) );
    13491349                                echo '</p>';
    13501350                        }
  • trunk/wp-admin/includes/deprecated.php

    r19684 r20029  
    881881        WP_Screen::add_old_compat_help( $screen, $help );
    882882}
     883
     884/**
     885 * Get the allowed themes for the current blog.
     886 *
     887 * @since 3.0.0
     888 * @deprecated 3.4.0
     889 * @deprecated Use wp_get_themes()
     890 * @see wp_get_themes()
     891 *
     892 * @return array $themes Array of allowed themes.
     893 */
     894function get_allowed_themes() {
     895        _deprecated_function( __FUNCTION__, '3.4', "wp_get_themes( array( 'allowed' => true ) )" );
     896
     897        $themes = wp_get_themes( array( 'allowed' => true ) );
     898
     899        $wp_themes = array();
     900        foreach ( $themes as $theme ) {
     901                $wp_themes[ $theme->get('Name') ] = $theme;
     902        }
     903
     904        return $wp_themes;
     905}
     906
     907/**
     908 * {@internal Missing Short Description}}
     909 *
     910 * @since 1.5.0
     911 *
     912 * @return unknown
     913 */
     914function get_broken_themes() {
     915        _deprecated_function( __FUNCTION__, '3.4', "wp_get_themes( array( 'errors' => true )" );
     916
     917        $themes = wp_get_themes( array( 'errors' => true ) );
     918        $broken = array();
     919        foreach ( $themes as $theme ) {
     920                $broken[ $theme->get('Name') ] = array(
     921                        'Title' => $theme->get('Name'),
     922                        'Description' => $theme->errors()->get_error_message(),
     923                );
     924        }
     925        return $broken;
     926}
     927
     928/**
     929 * {@internal Missing Short Description}}
     930 *
     931 * @since 2.0.0
     932 *
     933 * @return unknown
     934 */
     935function current_theme_info() {
     936        _deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme()' );
     937
     938        return wp_get_theme();
     939}
  • trunk/wp-admin/includes/ms-deprecated.php

    r19712 r20029  
    6565        return is_network_only_plugin( $file );
    6666}
     67
     68function get_site_allowed_themes() {
     69        _deprecated_function( __FUNCTION__, '3.4', 'WP_Theme::get_allowed_on_network()' );
     70        return array_map( 'intval', WP_Theme::get_allowed_on_network() );
     71}
     72
     73function wpmu_get_blog_allowedthemes( $blog_id = 0 ) {
     74        _deprecated_function( __FUNCTION__, '3.4', 'WP_Theme::get_allowed_on_site()' );
     75        return array_map( 'intval', WP_Theme::get_allowed_on_site( $blog_id ) );
     76}
  • trunk/wp-admin/includes/ms.php

    r19712 r20029  
    170170}
    171171
    172 function wpmu_get_blog_allowedthemes( $blog_id = 0 ) {
    173         $themes = get_themes();
    174 
    175         if ( $blog_id != 0 )
    176                 switch_to_blog( $blog_id );
    177 
    178         $blog_allowed_themes = get_option( 'allowedthemes' );
    179         if ( !is_array( $blog_allowed_themes ) || empty( $blog_allowed_themes ) ) { // convert old allowed_themes to new allowedthemes
    180                 $blog_allowed_themes = get_option( 'allowed_themes' );
    181 
    182                 if ( is_array( $blog_allowed_themes ) ) {
    183                         foreach( (array) $themes as $key => $theme ) {
    184                                 $theme_key = esc_html( $theme['Stylesheet'] );
    185                                 if ( isset( $blog_allowed_themes[$key] ) == true ) {
    186                                         $blog_allowedthemes[$theme_key] = 1;
    187                                 }
    188                         }
    189                         $blog_allowed_themes = $blog_allowedthemes;
    190                         add_option( 'allowedthemes', $blog_allowed_themes );
    191                         delete_option( 'allowed_themes' );
    192                 }
    193         }
    194 
    195         if ( $blog_id != 0 )
    196                 restore_current_blog();
    197 
    198         return $blog_allowed_themes;
    199 }
    200 
    201172function update_option_new_admin_email( $old_value, $value ) {
    202173        $email = get_option( 'admin_email' );
     
    296267}
    297268add_action( 'admin_notices', 'new_user_email_admin_notice' );
    298 
    299 function get_site_allowed_themes() {
    300         $themes = get_themes();
    301         $allowed_themes = get_site_option( 'allowedthemes' );
    302         if ( !is_array( $allowed_themes ) || empty( $allowed_themes ) ) {
    303                 $allowed_themes = get_site_option( 'allowed_themes' ); // convert old allowed_themes format
    304                 if ( !is_array( $allowed_themes ) ) {
    305                         $allowed_themes = array();
    306                 } else {
    307                         foreach( (array) $themes as $key => $theme ) {
    308                                 $theme_key = esc_html( $theme['Stylesheet'] );
    309                                 if ( isset( $allowed_themes[ $key ] ) == true ) {
    310                                         $allowedthemes[ $theme_key ] = 1;
    311                                 }
    312                         }
    313                         $allowed_themes = $allowedthemes;
    314                 }
    315         }
    316         return $allowed_themes;
    317 }
    318269
    319270/**
  • trunk/wp-admin/includes/schema.php

    r20023 r20029  
    344344        $template = WP_DEFAULT_THEME;
    345345        // If default theme is a child theme, we need to get its template
    346         foreach ( (array) get_themes() as $theme ) {
    347                 if ( WP_DEFAULT_THEME == $theme['Stylesheet'] ) {
    348                         $template = $theme['Template'];
    349                         break;
    350                 }
    351         }
     346        $theme = wp_get_theme( $template );
     347        if ( ! $theme->errors() )
     348                $template = $theme->get_template();
    352349
    353350        $timezone_string = '';
  • trunk/wp-admin/includes/theme-install.php

    r19979 r20029  
    266266        }
    267267
    268         $themes = get_themes();
    269         foreach ( (array) $themes as $this_theme ) {
    270                 if ( is_array($this_theme) && $this_theme['Stylesheet'] == $api->slug ) {
    271                         if ( version_compare( $this_theme['Version'], $api->version, '=' ) ) {
     268        $theme = wp_get_theme( $api->slug );
     269        if ( is_a( $theme, 'WP_Theme' ) ) {
     270                switch ( version_compare( $theme->get('Version'), $api->version ) ) {
     271                        case 0; // equal
    272272                                $type = 'latest_installed';
    273                         } elseif ( version_compare( $this_theme['Version'], $api->version, '>' ) ) {
     273                        case 1: // installed theme > api version
    274274                                $type = 'newer_installed';
    275                                 $newer_version = $this_theme['Version'];
    276                         }
    277                         break;
     275                                $newer_version = $theme->get('Version');
    278276                }
    279277        }
  • trunk/wp-admin/includes/theme.php

    r20025 r20029  
    66 * @subpackage Administration
    77 */
    8 
    9 /**
    10  * {@internal Missing Short Description}}
    11  *
    12  * @since 2.0.0
    13  *
    14  * @return unknown
    15  */
    16 function current_theme_info() {
    17         $themes = get_themes();
    18         $current_theme = get_current_theme();
    19 
    20         if ( ! $themes ) {
    21                 $ct = new stdClass;
    22                 $ct->name = $current_theme;
    23                 return $ct;
    24         }
    25 
    26         if ( ! isset( $themes[$current_theme] ) ) {
    27                 delete_option( 'current_theme' );
    28                 $current_theme = get_current_theme();
    29         }
    30 
    31         $ct = new stdClass;
    32         $ct->name = $current_theme;
    33         $ct->title = $themes[$current_theme]['Title'];
    34         $ct->version = $themes[$current_theme]['Version'];
    35         $ct->parent_theme = $themes[$current_theme]['Parent Theme'];
    36         $ct->template_dir = $themes[$current_theme]['Template Dir'];
    37         $ct->stylesheet_dir = $themes[$current_theme]['Stylesheet Dir'];
    38         $ct->template = $themes[$current_theme]['Template'];
    39         $ct->stylesheet = $themes[$current_theme]['Stylesheet'];
    40         $ct->screenshot = $themes[$current_theme]['Screenshot'];
    41         $ct->description = $themes[$current_theme]['Description'];
    42         $ct->author = $themes[$current_theme]['Author'];
    43         $ct->tags = $themes[$current_theme]['Tags'];
    44         $ct->theme_root = $themes[$current_theme]['Theme Root'];
    45         $ct->theme_root_uri = $themes[$current_theme]['Theme Root URI'];
    46         return $ct;
    47 }
    488
    499/**
     
    11575
    11676/**
    117  * {@internal Missing Short Description}}
     77 * Get the Page Templates available in this theme
    11878 *
    11979 * @since 1.5.0
    12080 *
    121  * @return unknown
    122  */
    123 function get_broken_themes() {
    124         global $wp_broken_themes;
    125 
    126         get_themes();
    127         return $wp_broken_themes;
    128 }
    129 
    130 /**
    131  * Get the allowed themes for the current blog.
    132  *
    133  * @since 3.0.0
    134  *
    135  * @uses get_themes()
    136  * @uses current_theme_info()
    137  * @uses get_site_allowed_themes()
    138  * @uses wpmu_get_blog_allowedthemes
    139  *
    140  * @return array $themes Array of allowed themes.
    141  */
    142 function get_allowed_themes() {
    143         if ( !is_multisite() )
    144                 return get_themes();
    145 
    146         $themes = get_themes();
    147         $ct = current_theme_info();
    148         $allowed_themes = apply_filters("allowed_themes", get_site_allowed_themes() );
    149         if ( $allowed_themes == false )
    150                 $allowed_themes = array();
    151 
    152         $blog_allowed_themes = wpmu_get_blog_allowedthemes();
    153         if ( is_array( $blog_allowed_themes ) )
    154                 $allowed_themes = array_merge( $allowed_themes, $blog_allowed_themes );
    155 
    156         if ( isset( $allowed_themes[ esc_html( $ct->stylesheet ) ] ) == false )
    157                 $allowed_themes[ esc_html( $ct->stylesheet ) ] = true;
    158 
    159         reset( $themes );
    160         foreach ( $themes as $key => $theme ) {
    161                 if ( isset( $allowed_themes[ esc_html( $theme[ 'Stylesheet' ] ) ] ) == false )
    162                         unset( $themes[ $key ] );
    163         }
    164         reset( $themes );
    165 
    166         return $themes;
    167 }
    168 
    169 /**
    170  * Get the Page Templates available in this theme
    171  *
    172  * @since 1.5.0
    173  *
    17481 * @return array Key is the template name, value is the filename of the template
    17582 */
    17683function get_page_templates() {
    177         $themes = get_themes();
    178         $theme = get_current_theme();
    179         $templates = $themes[$theme]['Template Files'];
    180         $page_templates = array();
    181 
    182         if ( is_array( $templates ) ) {
    183                 $base = array( trailingslashit(get_template_directory()), trailingslashit(get_stylesheet_directory()) );
    184 
    185                 foreach ( $templates as $template ) {
    186                         $basename = str_replace($base, '', $template);
    187 
    188                         // don't allow template files in subdirectories
    189                         if ( false !== strpos($basename, '/') )
    190                                 continue;
    191 
    192                         if ( 'functions.php' == $basename )
    193                                 continue;
    194 
    195                         $template_data = implode( '', file( $template ));
    196 
    197                         $name = '';
    198                         if ( preg_match( '|Template Name:(.*)$|mi', $template_data, $name ) )
    199                                 $name = _cleanup_header_comment($name[1]);
    200 
    201                         if ( !empty( $name ) ) {
    202                                 $page_templates[trim( $name )] = $basename;
    203                         }
    204                 }
    205         }
    206 
    207         return $page_templates;
     84        return wp_get_theme()->get_page_templates();
    20885}
    20986
     
    241118                $themes_update = get_site_transient('update_themes');
    242119
    243         if ( is_object($theme) && isset($theme->stylesheet) )
    244                 $stylesheet = $theme->stylesheet;
    245         elseif ( is_array($theme) && isset($theme['Stylesheet']) )
    246                 $stylesheet = $theme['Stylesheet'];
    247         else
    248                 return false; //No valid info passed.
     120        if ( ! is_a( $theme, 'WP_Theme' ) )
     121                return;
     122
     123        $stylesheet = $theme->get_stylesheet();
    249124
    250125        if ( isset($themes_update->response[ $stylesheet ]) ) {
    251126                $update = $themes_update->response[ $stylesheet ];
    252                 $theme_name = is_object($theme) ? $theme->name : (is_array($theme) ? $theme['Name'] : '');
     127                $theme_name = $theme->get('Name');
    253128                $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.
    254129                $update_url = wp_nonce_url('update.php?action=upgrade-theme&amp;theme=' . urlencode($stylesheet), 'upgrade-theme_' . $stylesheet);
  • trunk/wp-admin/includes/update.php

    r19809 r20029  
    218218
    219219function get_theme_updates() {
    220         $themes = get_themes();
     220        $themes = wp_get_themes();
    221221        $current = get_site_transient('update_themes');
    222222        $update_themes = array();
    223223
    224         foreach ( $themes as $theme ) {
    225                 $theme = (object) $theme;
    226                 if ( isset($current->response[ $theme->Stylesheet ]) ) {
    227                         $update_themes[$theme->Stylesheet] = $theme;
    228                         $update_themes[$theme->Stylesheet]->update = $current->response[ $theme->Stylesheet ];
    229                 }
     224        foreach ( $current->response as $stylesheet => $data ) {
     225                $update_themes[ $stylesheet ] = wp_get_theme( $stylesheet );
     226                $update_themes[ $stylesheet ]->update = $data;
    230227        }
    231228
  • trunk/wp-admin/themes.php

    r19941 r20029  
    9797<?php endif; ?>
    9898</h2>
    99 
    100 <h3><?php _e('Current Theme'); ?></h3>
     99<?php $ct = wp_get_theme(); ?>
     100<h3><?php _e( 'Current Theme' ); ?></h3>
    101101<div id="current-theme">
    102 <?php if ( $ct->screenshot ) : ?>
    103 <img src="<?php echo $ct->theme_root_uri . '/' . $ct->stylesheet . '/' . $ct->screenshot; ?>" alt="<?php esc_attr_e('Current theme preview'); ?>" />
     102<?php if ( $ct->get_screenshot() ) : ?>
     103<img src="<?php echo $ct->get_screenshot( 'absolute' ); ?>" alt="<?php esc_attr_e( 'Current theme preview'); ?>" />
    104104<?php endif; ?>
    105105<h4><?php
    106106        /* translators: 1: theme title, 2: theme version, 3: theme author */
    107         printf(__('%1$s %2$s by %3$s'), $ct->title, $ct->version, $ct->author) ; ?></h4>
    108 <p class="theme-description"><?php echo $ct->description; ?></p>
     107        printf( __( '%1$s %2$s by %3$s' ), $ct->display('Name'), $ct->display('Version'), $ct->display('Author') ) ; ?></h4>
     108<p class="theme-description"><?php echo $ct->display('Description'); ?></p>
    109109<div class="theme-options">
    110110        <span><?php _e( 'Options:' )?></span>
     
    118118                                continue;
    119119                        // 0 = name, 1 = capability, 2 = file
    120                         if ( ( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file)) ) $class = ' class="current"';
    121 
     120                        if ( ( strcmp($self, $item[2]) == 0 && empty($parent_file)) || ($parent_file && ($item[2] == $parent_file)) )
     121                                $class = ' class="current"';
    122122                        if ( !empty($submenu[$item[2]]) ) {
    123123                                $submenu[$item[2]] = array_values($submenu[$item[2]]); // Re-index.
     
    138138        echo implode ( ' | ', $options );
    139139
    140         if ( $ct->tags ) : ?>
    141         <p><?php _e('Tags:'); ?> <?php echo join(', ', $ct->tags); ?></p>
     140        if ( $ct->get('Tags') ) : ?>
     141        <p><?php _e('Tags:'); ?> <?php echo $ct->display('Tags'); ?></p>
    142142        <?php endif; ?>
    143143</div>
     
    219219<?php
    220220// List broken themes, if any.
    221 $broken_themes = get_broken_themes();
    222 if ( current_user_can('edit_themes') && count( $broken_themes ) ) {
     221if ( current_user_can('edit_themes') && $broken_themes = wp_get_themes( array( 'errors' => true ) ) ) {
    223222?>
    224223
     
    232231        </tr>
    233232<?php
    234         $theme = '';
    235 
    236         $theme_names = array_keys($broken_themes);
    237         natcasesort($theme_names);
    238 
    239         foreach ($theme_names as $theme_name) {
    240                 $name = $broken_themes[$theme_name]['Title'];
    241                 $description = $broken_themes[$theme_name]['Description'];
    242 
    243                 $theme = ('class="alternate"' == $theme) ? '' : 'class="alternate"';
     233        $alt = '';
     234        foreach ( $broken_themes as $broken_theme ) {
     235                $alt = ('class="alternate"' == $alt) ? '' : 'class="alternate"';
    244236                echo "
    245                 <tr $theme>
    246                          <td>$name</td>
    247                          <td>$description</td>
     237                <tr $alt>
     238                         <td>" . $broken_theme->get('Name') ."</td>
     239                         <td>" . $broken_theme->errors()->get_error_message() . "</td>
    248240                </tr>";
    249241        }
  • trunk/wp-includes/class-wp-customize.php

    r19995 r20029  
    243243         */
    244244        public function current_theme( $current_theme ) {
    245                 $themes = get_themes();
    246 
    247                 if ( ! $themes )
    248                         return $current_theme;
    249 
    250                 foreach ( $themes as $theme ) {
    251                         if ( $theme['Stylesheet'] == $this->stylesheet && $theme['Template'] == $this->template )
    252                                 return $theme['Name'];
    253                 }
    254 
    255                 return $current_theme;
     245                return wp_get_theme( $this->stylesheet )->get('Name');
    256246        }
    257247
  • trunk/wp-includes/deprecated.php

    r20000 r20029  
    29082908        _deprecated_function( __FUNCTION__, 'error_log()' );
    29092909}
     2910
     2911/**
     2912 * Retrieve list of themes with theme data in theme directory.
     2913 *
     2914 * The theme is broken, if it doesn't have a parent theme and is missing either
     2915 * style.css and, or index.php. If the theme has a parent theme then it is
     2916 * broken, if it is missing style.css; index.php is optional.
     2917 *
     2918 * @since 1.5.0
     2919 * @global array $wp_themes Stores the working themes.
     2920 *
     2921 * @return array Theme list with theme data.
     2922 */
     2923function get_themes() {
     2924        _deprecated_function( __FUNCTION__, '3.4', 'wp_get_themes()' );
     2925
     2926        global $wp_themes;
     2927        if ( isset( $wp_themes ) )
     2928                return $wp_themes;
     2929
     2930        $themes = wp_get_themes();
     2931        $wp_themes = array();
     2932
     2933        foreach ( $themes as $theme ) {
     2934                $wp_themes[ $theme->get('Name') ] = $theme;
     2935        }
     2936
     2937        return $wp_themes;
     2938}
     2939
     2940/**
     2941 * Retrieve theme data.
     2942 *
     2943 * @since 1.5.0
     2944 *
     2945 * @param string $theme Theme name.
     2946 * @return array|null Null, if theme name does not exist. Theme data, if exists.
     2947 */
     2948function get_theme( $theme ) {
     2949        _deprecated_function( __FUNCTION__, '3.4', 'wp_get_theme($stylesheet)' );
     2950
     2951        $themes = get_themes();
     2952        if ( is_array( $themes ) && array_key_exists( $theme, $themes ) )
     2953                return $themes[$theme];
     2954        return null;
     2955}
  • trunk/wp-includes/theme.php

    r20021 r20029  
    66 * @subpackage Theme
    77 */
     8
     9/**
     10 * Returns an array of WP_Theme objects based on the arguments.
     11 *
     12 * Despite advances over get_themes(), this function is still quite expensive, and grows
     13 * linearly with additional themes. Stick to wp_get_theme() if possible.
     14 *
     15 * @since 3.4.0
     16 *
     17 * @param array $args Arguments. Currently 'errors' (defaults to false), 'allowed'
     18 *      (true, false; null for either; defaults to null; only applies to multisite), and 'blog_id'
     19 *      (defaults to current blog; used to find allowed themes; only applies to multisite).
     20 * @return Array of WP_Theme objects.
     21 */
     22function wp_get_themes( $args = array() ) {
     23        global $wp_theme_directories;
     24
     25        $defaults = array( 'errors' => false, 'allowed' => null, 'blog_id' => 0 );
     26        $args = wp_parse_args( $args, $defaults );
     27
     28        static $_themes;
     29        if ( ! isset( $_themes ) ) {
     30                $_themes = array();
     31                $theme_data = search_theme_directories();
     32                // Make sure the current theme wins out, in case search_theme_directories() picks the wrong
     33                // one in the case of a conflict. (Normally, last registered theme root wins.)
     34                $current_theme = get_stylesheet();
     35                $current_theme_root = get_raw_theme_root( $current_theme );
     36                if ( ! in_array( $current_theme_root, $wp_theme_directories ) )
     37                        $current_theme_root = WP_CONTENT_DIR . $current_theme_root;
     38                foreach ( (array) $theme_data as $theme_slug => $data ) {
     39                        if ( $current_theme == $theme_slug && $current_theme_root != $data['theme_root'] )
     40                                $_themes[ $theme_slug ] = new WP_Theme( $theme_slug, $current_theme_root );
     41                        else
     42                                $_themes[ $theme_slug ] = new WP_Theme( $theme_slug, $data['theme_root'] );
     43                }
     44        }
     45
     46        $themes = $_themes;
     47        if ( empty( $themes ) )
     48                return $themes;
     49
     50        if ( null !== $args['errors'] ) {
     51                foreach ( $themes as $theme_slug => $theme ) {
     52                        if ( $theme->errors() != $args['errors'] )
     53                                unset( $themes[ $theme_slug ] );
     54                }
     55        }
     56
     57        if ( is_multisite() && null !== $args['allowed'] ) {
     58                if ( $allowed = $args['allowed'] ) {
     59                        if ( 'network' == $allowed )
     60                                $themes = array_intersect_key( $themes, WP_Theme::get_allowed_on_network( $args['blog_id'] ) );
     61                        elseif ( 'site' == $allowed )
     62                                $themes = array_intersect_key( $themes, WP_Theme::get_allowed_on_site( $args['blog_id'] ) );
     63                        else
     64                                $themes = array_intersect_key( $themes, WP_Theme::get_allowed( $args['blog_id'] ) );
     65                } else {
     66                        $themes = array_diff_key( $themes, WP_Theme::get_allowed( $args['blog_id'] ) );
     67                }
     68        }
     69
     70        return $themes;
     71}
     72
     73/**
     74 * Gets a WP_Theme object for a theme.
     75 *
     76 * @since 3.4.0
     77 *
     78 * @param string $stylesheet Directory name for the theme. Optional. Defaults to current theme.
     79 * @param string $theme_root Absolute path of the theme root to look in. Optional. If not specified, get_raw_theme_root()
     80 *      is used to calculate the theme root for the $stylesheet provided (or current theme).
     81 * @return WP_Theme
     82 */
     83function wp_get_theme( $stylesheet = null, $theme_root = null ) {
     84        global $wp_theme_directories;
     85
     86        if ( empty( $stylesheet ) )
     87                $stylesheet = get_stylesheet();
     88
     89        if ( empty( $theme_root ) ) {
     90                $theme_root = get_raw_theme_root( $stylesheet );
     91                if ( ! in_array( $theme_root, $wp_theme_directories ) )
     92                        $theme_root = WP_CONTENT_DIR . $theme_root;
     93        }
     94
     95        return new WP_Theme( $stylesheet, $theme_root );
     96}
    897
    998/**
     
    248337
    249338/**
    250  * Retrieve list of themes with theme data in theme directory.
    251  *
    252  * The theme is broken, if it doesn't have a parent theme and is missing either
    253  * style.css and, or index.php. If the theme has a parent theme then it is
    254  * broken, if it is missing style.css; index.php is optional. The broken theme
    255  * list is saved in the {@link $wp_broken_themes} global, which is displayed on
    256  * the theme list in the administration panels.
    257  *
    258  * @since 1.5.0
    259  * @global array $wp_broken_themes Stores the broken themes.
    260  * @global array $wp_themes Stores the working themes.
    261  *
    262  * @return array Theme list with theme data.
    263  */
    264 function get_themes() {
    265         global $wp_themes, $wp_broken_themes;
    266 
    267         if ( isset($wp_themes) )
    268                 return $wp_themes;
    269 
    270         if ( !$theme_files = search_theme_directories() )
    271                 return false;
    272 
    273         asort( $theme_files );
    274 
    275         $wp_themes = array();
    276 
    277         foreach ( (array) $theme_files as $theme_file ) {
    278                 $theme_root = $theme_file['theme_root'];
    279                 $theme_file = $theme_file['theme_file'];
    280 
    281                 if ( !is_readable("$theme_root/$theme_file") ) {
    282                         $wp_broken_themes[$theme_file] = array('Name' => $theme_file, 'Title' => $theme_file, 'Description' => __('File not readable.'));
    283                         continue;
    284                 }
    285 
    286                 $theme_data = get_theme_data("$theme_root/$theme_file");
    287 
    288                 $name        = $theme_data['Name'];
    289                 $title       = $theme_data['Title'];
    290                 $description = wptexturize($theme_data['Description']);
    291                 $version     = $theme_data['Version'];
    292                 $author      = $theme_data['Author'];
    293                 $template    = $theme_data['Template'];
    294                 $stylesheet  = dirname($theme_file);
    295 
    296                 $screenshot = false;
    297                 foreach ( array('png', 'gif', 'jpg', 'jpeg') as $ext ) {
    298                         if (file_exists("$theme_root/$stylesheet/screenshot.$ext")) {
    299                                 $screenshot = "screenshot.$ext";
    300                                 break;
    301                         }
    302                 }
    303 
    304                 if ( empty($name) ) {
    305                         $name = dirname($theme_file);
    306                         $title = $name;
    307                 }
    308 
    309                 $parent_template = $template;
    310 
    311                 if ( empty($template) ) {
    312                         if ( file_exists("$theme_root/$stylesheet/index.php") )
    313                                 $template = $stylesheet;
    314                         else
    315                                 continue;
    316                 }
    317 
    318                 $template = trim( $template );
    319 
    320                 if ( !file_exists("$theme_root/$template/index.php") ) {
    321                         $parent_dir = dirname(dirname($theme_file));
    322                         if ( file_exists("$theme_root/$parent_dir/$template/index.php") ) {
    323                                 $template = "$parent_dir/$template";
    324                                 $template_directory = "$theme_root/$template";
    325                         } else {
    326                                 /**
    327                                  * The parent theme doesn't exist in the current theme's folder or sub folder
    328                                  * so lets use the theme root for the parent template.
    329                                  */
    330                                 if ( isset($theme_files[$template]) && file_exists( $theme_files[$template]['theme_root'] . "/$template/index.php" ) ) {
    331                                         $template_directory = $theme_files[$template]['theme_root'] . "/$template";
    332                                 } else {
    333                                         if ( empty( $parent_template) )
    334                                                 $wp_broken_themes[$name] = array('Name' => $name, 'Title' => $title, 'Description' => __('Template is missing.'), 'error' => 'no_template');
    335                                         else
    336                                                 $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 );
    337                                         continue;
    338                                 }
    339 
    340                         }
    341                 } else {
    342                         $template_directory = trim( $theme_root . '/' . $template );
    343                 }
    344 
    345                 $stylesheet_files = array();
    346                 $template_files = array();
    347 
    348                 $stylesheet_dir = @ dir("$theme_root/$stylesheet");
    349                 if ( $stylesheet_dir ) {
    350                         while ( ($file = $stylesheet_dir->read()) !== false ) {
    351                                 if ( !preg_match('|^\.+$|', $file) ) {
    352                                         if ( preg_match('|\.css$|', $file) )
    353                                                 $stylesheet_files[] = "$theme_root/$stylesheet/$file";
    354                                         elseif ( preg_match('|\.php$|', $file) )
    355                                                 $template_files[] = "$theme_root/$stylesheet/$file";
    356                                 }
    357                         }
    358                         @ $stylesheet_dir->close();
    359                 }
    360 
    361                 $template_dir = @ dir("$template_directory");
    362                 if ( $template_dir ) {
    363                         while ( ($file = $template_dir->read()) !== false ) {
    364                                 if ( preg_match('|^\.+$|', $file) )
    365                                         continue;
    366                                 if ( preg_match('|\.php$|', $file) ) {
    367                                         $template_files[] = "$template_directory/$file";
    368                                 } elseif ( is_dir("$template_directory/$file") ) {
    369                                         $template_subdir = @ dir("$template_directory/$file");
    370                                         if ( !$template_subdir )
    371                                                 continue;
    372                                         while ( ($subfile = $template_subdir->read()) !== false ) {
    373                                                 if ( preg_match('|^\.+$|', $subfile) )
    374                                                         continue;
    375                                                 if ( preg_match('|\.php$|', $subfile) )
    376                                                         $template_files[] = "$template_directory/$file/$subfile";
    377                                         }
    378                                         @ $template_subdir->close();
    379                                 }
    380                         }
    381                         @ $template_dir->close();
    382                 }
    383 
    384                 //Make unique and remove duplicates when stylesheet and template are the same i.e. most themes
    385                 $template_files = array_unique($template_files);
    386                 $stylesheet_files = array_unique($stylesheet_files);
    387 
    388                 $template_dir = $template_directory;
    389                 $stylesheet_dir = $theme_root . '/' . $stylesheet;
    390 
    391                 if ( empty($template_dir) )
    392                         $template_dir = '/';
    393                 if ( empty($stylesheet_dir) )
    394                         $stylesheet_dir = '/';
    395 
    396                 // Check for theme name collision. This occurs if a theme is copied to
    397                 // a new theme directory and the theme header is not updated. Whichever
    398                 // theme is first keeps the name. Subsequent themes get a suffix applied.
    399                 // Default themes themes always trump their pretenders.
    400                 if ( isset($wp_themes[$name]) ) {
    401                         $trump_cards = array(
    402                                 'classic'      => 'WordPress Classic',
    403                                 'default'      => 'WordPress Default',
    404                                 'twentyten'    => 'Twenty Ten',
    405                                 'twentyeleven' => 'Twenty Eleven',
    406                                 'twentytwelve' => 'Twenty Twelve',
    407                         );
    408                         if ( isset( $trump_cards[ $stylesheet ] ) && $name == $trump_cards[ $stylesheet ] ) {
    409                                 // If another theme has claimed to be one of our default themes, move
    410                                 // them aside.
    411                                 $suffix = $wp_themes[$name]['Stylesheet'];
    412                                 $new_name = "$name/$suffix";
    413                                 $wp_themes[$new_name] = $wp_themes[$name];
    414                                 $wp_themes[$new_name]['Name'] = $new_name;
    415                         } else {
    416                                 $name = "$name/$stylesheet";
    417                         }
    418                 }
    419 
    420                 $wp_themes[$name] = array(
    421                         'Name' => $name,
    422                         'Title' => $title,
    423                         'Description' => $description,
    424                         'Author' => $author,
    425                         'Author Name' => $theme_data['AuthorName'],
    426                         'Author URI' => $theme_data['AuthorURI'],
    427                         'Version' => $version,
    428                         'Template' => $template,
    429                         'Stylesheet' => $stylesheet,
    430                         'Template Files' => $template_files,
    431                         'Stylesheet Files' => $stylesheet_files,
    432                         'Template Dir' => $template_dir,
    433                         'Stylesheet Dir' => $stylesheet_dir,
    434                         'Status' => $theme_data['Status'],
    435                         'Screenshot' => $screenshot,
    436                         'Tags' => $theme_data['Tags'],
    437                         'Theme Root' => $theme_root,
    438                         'Theme Root URI' => str_replace( WP_CONTENT_DIR, content_url(), $theme_root ),
    439                 );
    440         }
    441 
    442         unset($theme_files);
    443 
    444         /* Resolve theme dependencies. */
    445         $theme_names = array_keys( $wp_themes );
    446         foreach ( (array) $theme_names as $theme_name ) {
    447                 $wp_themes[$theme_name]['Parent Theme'] = '';
    448                 if ( $wp_themes[$theme_name]['Stylesheet'] != $wp_themes[$theme_name]['Template'] ) {
    449                         foreach ( (array) $theme_names as $parent_theme_name ) {
    450                                 if ( ($wp_themes[$parent_theme_name]['Stylesheet'] == $wp_themes[$parent_theme_name]['Template']) && ($wp_themes[$parent_theme_name]['Template'] == $wp_themes[$theme_name]['Template']) ) {
    451                                         $wp_themes[$theme_name]['Parent Theme'] = $wp_themes[$parent_theme_name]['Name'];
    452                                         break;
    453                                 }
    454                         }
    455                 }
    456         }
    457 
    458         return $wp_themes;
    459 }
    460 
    461 /**
    462339 * Retrieve theme roots.
    463340 *
     
    481358
    482359/**
    483  * Retrieve theme data.
    484  *
    485  * @since 1.5.0
    486  *
    487  * @param string $theme Theme name.
    488  * @return array|null Null, if theme name does not exist. Theme data, if exists.
    489  */
    490 function get_theme($theme) {
    491         $themes = get_themes();
    492 
    493         if ( is_array( $themes ) && array_key_exists( $theme, $themes ) )
    494                 return $themes[$theme];
    495 
    496         return null;
    497 }
    498 
    499 /**
    500360 * Retrieve current theme display name.
    501361 *
     
    509369 */
    510370function get_current_theme() {
    511         if ( $theme = get_option('current_theme') )
     371        if ( $theme = get_option( 'current_theme' ) )
    512372                return $theme;
    513373
    514         $themes = get_themes();
    515         $current_theme = 'Twenty Eleven';
    516 
    517         if ( $themes ) {
    518                 $theme_names = array_keys( $themes );
    519                 $current_template = get_option( 'template' );
    520                 $current_stylesheet = get_option( 'stylesheet' );
    521 
    522                 foreach ( (array) $theme_names as $theme_name ) {
    523                         if ( $themes[$theme_name]['Stylesheet'] == $current_stylesheet &&
    524                                         $themes[$theme_name]['Template'] == $current_template ) {
    525                                 $current_theme = $themes[$theme_name]['Name'];
    526                                 break;
    527                         }
    528                 }
    529         }
    530 
    531         update_option('current_theme', $current_theme);
    532 
    533         return $current_theme;
     374        return wp_get_theme()->get('Name');
    534375}
    535376
  • trunk/wp-includes/update.php

    r20000 r20029  
    236236                return false;
    237237
    238         if ( !function_exists( 'get_themes' ) )
    239                 require_once( ABSPATH . 'wp-includes/theme.php' );
    240 
    241         $installed_themes = get_themes( );
     238        $installed_themes = wp_get_themes();
    242239        $last_update = get_site_transient( 'update_themes' );
    243240        if ( ! is_object($last_update) )
     
    246243        $themes = array();
    247244        $checked = array();
    248         $exclude_fields = array('Template Files', 'Stylesheet Files', 'Status', 'Theme Root', 'Theme Root URI', 'Template Dir', 'Stylesheet Dir', 'Description', 'Tags', 'Screenshot');
    249245
    250246        // Put slug of current theme into request.
    251247        $themes['current_theme'] = get_option( 'stylesheet' );
    252248
    253         foreach ( (array) $installed_themes as $theme_title => $theme ) {
    254                 $themes[$theme['Stylesheet']] = array();
    255                 $checked[$theme['Stylesheet']] = $theme['Version'];
    256 
    257                 $themes[$theme['Stylesheet']]['Name'] = $theme['Name'];
    258                 $themes[$theme['Stylesheet']]['Version'] = $theme['Version'];
    259 
    260                 foreach ( (array) $theme as $key => $value ) {
    261                         if ( !in_array($key, $exclude_fields) )
    262                                 $themes[$theme['Stylesheet']][$key] = $value;
    263                 }
     249        foreach ( $installed_themes as $theme ) {
     250                $checked[ $theme->get_stylesheet() ] = $theme->get('Version');
     251
     252                $themes[ $theme->get_stylesheet() ] = array(
     253                        'Name'       => $theme->get('Name'),
     254                        'Title'      => $theme->get('Name'),
     255                        'Version'    => $theme->get('Version'),
     256                        'Author'     => $theme->get('Author'),
     257                        'Author URI' => $theme->get('AuthorURI'),
     258                        'Template'   => $theme->get_template(),
     259                        'Stylesheet' => $theme->get_stylesheet(),
     260                );
    264261        }
    265262
  • trunk/wp-settings.php

    r20002 r20029  
    113113require( ABSPATH . WPINC . '/query.php' );
    114114require( ABSPATH . WPINC . '/theme.php' );
     115require( ABSPATH . WPINC . '/class-wp-theme.php' );
    115116require( ABSPATH . WPINC . '/template.php' );
    116117require( ABSPATH . WPINC . '/user.php' );
Note: See TracChangeset for help on using the changeset viewer.