WordPress.org

Make WordPress Core

Ticket #20103: 20103.diff

File 20103.diff, 4.1 KB (added by nacin, 6 years ago)
  • wp-includes/theme.php

     
    578578        if ( empty( $wp_theme_directories ) )
    579579                return false;
    580580
    581         $theme_files = array();
    582         $wp_broken_themes = array();
     581        $found_themes = $wp_broken_themes = array();
    583582
    584583        /* Loop the registered theme directories and extract all themes */
    585584        foreach ( (array) $wp_theme_directories as $theme_root ) {
     
    590589                        $theme_loc = str_replace(WP_CONTENT_DIR, '', $theme_root);
    591590
    592591                /* Files in the root of the current theme directory and one subdir down */
    593                 $themes_dir = @ opendir($theme_root);
     592                $themes_directory = @ scandir( $theme_root );
    594593
    595                 if ( !$themes_dir )
     594                if ( ! $themes_directory )
    596595                        return false;
    597596
    598                 while ( ($theme_dir = readdir($themes_dir)) !== false ) {
    599                         if ( is_dir($theme_root . '/' . $theme_dir) && is_readable($theme_root . '/' . $theme_dir) ) {
    600                                 if ( $theme_dir[0] == '.' || $theme_dir == 'CVS' )
    601                                         continue;
     597                $found_theme = false;
     598                foreach ( $themes_directory as $theme_dir ) {
     599                        if ( is_dir( $theme_root . '/' . $theme_dir ) && ( $theme_dir[0] == '.' || $theme_dir == 'CVS' ) )
     600                                continue;
     601                        if ( ! file_exists( $theme_root . '/' . $theme_dir . '/style.css' ) )
     602                                continue;
     603                        $found_themes[ $theme_dir ] = array(
     604                                'theme_file' => $theme_dir . '/style.css',
     605                                'theme_root' => $theme_root,
     606                        );
     607                        $found_theme = true;
     608                }
    602609
    603                                 $stylish_dir = @opendir($theme_root . '/' . $theme_dir);
    604                                 $found_stylesheet = false;
     610                if ( ! $found_theme ) {
     611                        $sub_theme_dir = $theme_dir;
     612                        $sub_theme_root = $theme_root . '/' . $sub_theme_dir;
     613                        $themes_directory = @ scandir( $sub_theme_root );
    605614
    606                                 while ( ($theme_file = readdir($stylish_dir)) !== false ) {
    607                                         if ( $theme_file == 'style.css' ) {
    608                                                 $theme_files[$theme_dir] = array( 'theme_file' => $theme_dir . '/' . $theme_file, 'theme_root' => $theme_root );
    609                                                 $found_stylesheet = true;
    610                                                 break;
    611                                         }
    612                                 }
    613                                 @closedir($stylish_dir);
     615                        if ( ! $themes_directory )
     616                                return false;
    614617
    615                                 if ( !$found_stylesheet ) { // look for themes in that dir
    616                                         $subdir = "$theme_root/$theme_dir";
    617                                         $subdir_name = $theme_dir;
    618                                         $theme_subdirs = @opendir( $subdir );
     618                        $found_theme = false;
     619                        foreach ( $themes_directory as $theme_dir ) {
     620                                if ( is_dir( $sub_theme_root . '/' . $theme_dir ) && ( $theme_dir[0] == '.' || $theme_dir == 'CVS' ) )
     621                                        continue;
     622                                if ( ! file_exists( $sub_theme_root . '/' . $theme_dir . '/style.css' ) )
     623                                        continue;
     624                                $found_themes[ $sub_theme_dir . '/' . $theme_dir ] = array(
     625                                        'theme_file' => $sub_theme_dir . '/' . $theme_dir . '/style.css',
     626                                        'theme_root' => $theme_root,
     627                                );
     628                                $found_theme = true;
     629                        }
    619630
    620                                         $found_subdir_themes = false;
    621                                         while ( ($theme_subdir = readdir($theme_subdirs)) !== false ) {
    622                                                 if ( is_dir( $subdir . '/' . $theme_subdir) && is_readable($subdir . '/' . $theme_subdir) ) {
    623                                                         if ( $theme_subdir[0] == '.' || $theme_subdir == 'CVS' )
    624                                                                 continue;
    625 
    626                                                         $stylish_dir = @opendir($subdir . '/' . $theme_subdir);
    627                                                         $found_stylesheet = false;
    628 
    629                                                         while ( ($theme_file = readdir($stylish_dir)) !== false ) {
    630                                                                 if ( $theme_file == 'style.css' ) {
    631                                                                         $theme_files["$theme_dir/$theme_subdir"] = array( 'theme_file' => $subdir_name . '/' . $theme_subdir . '/' . $theme_file, 'theme_root' => $theme_root );
    632                                                                         $found_stylesheet = true;
    633                                                                         $found_subdir_themes = true;
    634                                                                         break;
    635                                                                 }
    636                                                         }
    637                                                         @closedir($stylish_dir);
    638                                                 }
    639                                         }
    640                                         @closedir($theme_subdirs);
    641                                         if ( !$found_subdir_themes )
    642                                                 $wp_broken_themes[$theme_dir] = array('Name' => $theme_dir, 'Title' => $theme_dir, 'Description' => __('Stylesheet is missing.'));
    643                                 }
     631                        if ( ! $found_theme ) {
     632                                $wp_broken_themes[ $sub_theme_dir ] = array(
     633                                        'Name' => $sub_theme_dir,
     634                                        'Title' => $theme_dir,
     635                                        'Description' => __( 'Stylesheet is missing.' ),
     636                                );
    644637                        }
    645638                }
    646                 @closedir( $themes_dir );
    647639        }
    648         return $theme_files;
     640
     641        return $found_themes;
    649642}
    650643
    651644/**