WordPress.org

Make WordPress Core

Ticket #20103: search_theme_directories.diff

File search_theme_directories.diff, 4.3 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 ) {
     
    587586
    588587                /* We don't want to replace all forward slashes, see Trac #4541 */
    589588                if ( '/' != WP_CONTENT_DIR )
    590                         $theme_loc = str_replace(WP_CONTENT_DIR, '', $theme_root);
     589                        $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);
    594 
    595                 if ( !$themes_dir )
     592                $dirs = @ scandir( $theme_root );
     593                if ( ! $dirs )
    596594                        return false;
    597 
    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;
    602 
    603                                 $stylish_dir = @opendir($theme_root . '/' . $theme_dir);
    604                                 $found_stylesheet = false;
    605 
    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                                         }
     595                foreach ( $dirs as $dir ) {
     596                        if ( is_dir( $theme_root . '/' . $dir ) && ( $dir[0] == '.' || $dir == 'CVS' ) )
     597                                continue;
     598                        if ( file_exists( $theme_root . '/' . $dir . '/style.css' ) ) {
     599                                // wp-content/themes/a-single-theme
     600                                // wp-content/themes is $theme_root, a-single-theme is $dir
     601                                $found_themes[ $dir ] = array(
     602                                        'theme_file' => $dir . '/style.css',
     603                                        'theme_root' => $theme_root,
     604                                );
     605                        } else {
     606                                $found_theme = false;
     607                                // wp-content/themes/a-folder-of-themes/*
     608                                // wp-content/themes is $theme_root, a-folder-of-themes is $dir, then themes are $sub_dirs
     609                                $sub_dirs = @ scandir( $theme_root . '/' . $dir );
     610                                if ( ! $sub_dirs )
     611                                        false;
     612                                foreach ( $sub_dirs as $sub_dir ) {
     613                                        if ( is_dir( $theme_root . '/' . $dir . '/' . $sub_dir ) && ( $sub_dir[0] == '.' || $sub_dir == 'CVS' ) )
     614                                                continue;
     615                                        if ( ! file_exists( $theme_root . '/' . $dir . '/' . $sub_dir . '/style.css' ) )
     616                                                continue;
     617                                        $found_themes[ $dir . '/' . $sub_dir ] = array(
     618                                                'theme_file' => $dir . '/' . $sub_dir . '/style.css',
     619                                                'theme_root' => $theme_root,
     620                                        );
     621                                        $found_theme = true;
    612622                                }
    613                                 @closedir($stylish_dir);
    614 
    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 );
    619 
    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.'));
     623                                // Never mind the above, it's just a theme missing a style.css.
     624                                if ( ! $found_theme ) {
     625                                        $wp_broken_themes[ $dir ] = array(
     626                                                'Name' => $dir,
     627                                                'Title' => $dir,
     628                                                'Description' => __( 'Stylesheet is missing.' ),
     629                                        );
    643630                                }
    644631                        }
    645632                }
    646                 @closedir( $themes_dir );
    647633        }
    648         return $theme_files;
     634
     635        return $found_themes;
    649636}
    650637
    651638/**