WordPress.org

Make WordPress Core

Ticket #6531: 6531.10.a.diff

File 6531.10.a.diff, 8.2 KB (added by WraithKenny, 4 months ago)

alternative

  • src/wp-admin/includes/file.php

     
    123123 * 
    124124 * @param string $folder Optional. Full path to folder. Default empty. 
    125125 * @param int    $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit). 
     126 * @param array  $exclusions Optional. List of folders to skip. 
    126127 * @return bool|array False on failure, Else array of files 
    127128 */ 
    128 function list_files( $folder = '', $levels = 100 ) { 
    129         if ( empty($folder) ) 
     129function list_files( $folder = '', $levels = 100, $exclusions = array() ) { 
     130        if ( empty( $folder ) ) { 
    130131                return false; 
     132        } 
    131133 
    132         if ( ! $levels ) 
     134        if ( ! $levels ) { 
    133135                return false; 
     136        } 
    134137 
    135138        $files = array(); 
    136         if ( $dir = @opendir( $folder ) ) { 
    137                 while (($file = readdir( $dir ) ) !== false ) { 
    138                         if ( in_array($file, array('.', '..') ) ) 
     139        $dir = @opendir( $folder ); 
     140        if ( $dir ) { 
     141                while ( ( $file = readdir( $dir ) ) !== false ) { 
     142                        if ( in_array( $file, array( '.', '..' ) ) ) { 
    139143                                continue; 
     144                        } 
     145 
     146                        if ( '.' === $file[0] || in_array( $file, $exclusions, true ) ) { 
     147                                continue; 
     148                        } 
     149 
    140150                        if ( is_dir( $folder . '/' . $file ) ) { 
    141                                 $files2 = list_files( $folder . '/' . $file, $levels - 1); 
    142                                 if ( $files2 ) 
     151                                $files2 = list_files( $folder . '/' . $file, $levels - 1 ); 
     152                                if ( $files2 ) { 
    143153                                        $files = array_merge($files, $files2 ); 
    144                                 else 
     154                                } else { 
    145155                                        $files[] = $folder . '/' . $file . '/'; 
     156                                } 
    146157                        } else { 
    147158                                $files[] = $folder . '/' . $file; 
    148159                        } 
  • src/wp-admin/includes/plugin.php

     
    190190 * @param string $plugin Path to the main plugin file from plugins directory. 
    191191 * @return array List of files relative to the plugin root. 
    192192 */ 
    193 function get_plugin_files($plugin) { 
     193function get_plugin_files( $plugin ) { 
    194194        $plugin_file = WP_PLUGIN_DIR . '/' . $plugin; 
    195         $dir = dirname($plugin_file); 
    196         $plugin_files = array($plugin); 
    197         if ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) { 
    198                 $plugins_dir = @ opendir( $dir ); 
    199                 if ( $plugins_dir ) { 
    200                         while (($file = readdir( $plugins_dir ) ) !== false ) { 
    201                                 if ( substr($file, 0, 1) == '.' ) 
    202                                         continue; 
    203                                 if ( is_dir( $dir . '/' . $file ) ) { 
    204                                         $plugins_subdir = @ opendir( $dir . '/' . $file ); 
    205                                         if ( $plugins_subdir ) { 
    206                                                 while (($subfile = readdir( $plugins_subdir ) ) !== false ) { 
    207                                                         if ( substr($subfile, 0, 1) == '.' ) 
    208                                                                 continue; 
    209                                                         $plugin_files[] = plugin_basename("$dir/$file/$subfile"); 
    210                                                 } 
    211                                                 @closedir( $plugins_subdir ); 
    212                                         } 
    213                                 } else { 
    214                                         if ( plugin_basename("$dir/$file") != $plugin ) 
    215                                                 $plugin_files[] = plugin_basename("$dir/$file"); 
    216                                 } 
    217                         } 
    218                         @closedir( $plugins_dir ); 
    219                 } 
     195        $dir = dirname( $plugin_file ); 
     196 
     197        $data = get_plugin_data( $plugin_file ); 
     198        $label = isset( $data['Version'] ) ? sanitize_key( 'files_' . $plugin . '-' . $data['Version'] ) : sanitize_key( 'files_' . $plugin ); 
     199 
     200        $plugin_files = get_transient( $label ); 
     201        if ( false !== $plugin_files ) { 
     202                return $plugin_files; 
    220203        } 
    221204 
     205        $plugin_files = array( $plugin ); 
     206        if ( is_dir( $dir ) && WP_PLUGIN_DIR !== $dir ) { 
     207 
     208                /** 
     209                 * Filters the array of excluded directories and files while scanning the folder. 
     210                 * 
     211                 * @since 4.9 
     212                 * 
     213                 * @param array $exclusions Array of excluded directories and files. 
     214                 */ 
     215                $exclusions = (array) apply_filters( 'list_files_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) ); 
     216 
     217                $list_files = list_files( $dir, 100, $exclusions ); 
     218                $list_files = array_map( 'plugin_basename', $list_files ); 
     219 
     220                $plugin_files += $list_files; 
     221                $plugin_files = array_unique( $plugin_files ); 
     222        } 
     223 
     224        set_transient( $label, $plugin_files, HOUR_IN_SECONDS ); 
     225 
    222226        return $plugin_files; 
    223227} 
    224228 
  • src/wp-admin/theme-editor.php

     
    7575foreach ( $file_types as $type ) { 
    7676        switch ( $type ) { 
    7777                case 'php': 
    78                         $allowed_files += $theme->get_files( 'php', 1 ); 
     78                        $allowed_files += $theme->get_files( 'php', -1 ); 
    7979                        $has_templates = ! empty( $allowed_files ); 
    8080                        break; 
    8181                case 'css': 
    82                         $style_files = $theme->get_files( 'css' ); 
     82                        $style_files = $theme->get_files( 'css', -1 ); 
    8383                        $allowed_files['style.css'] = $style_files['style.css']; 
    8484                        $allowed_files += $style_files; 
    8585                        break; 
    8686                default: 
    87                         $allowed_files += $theme->get_files( $type ); 
     87                        $allowed_files += $theme->get_files( $type, -1 ); 
    8888                        break; 
    8989        } 
    9090} 
  • src/wp-includes/class-wp-theme.php

     
    981981         * @param int $depth Optional. How deep to search for files. Defaults to a flat scan (0 depth). -1 depth is infinite. 
    982982         * @param bool $search_parent Optional. Whether to return parent files. Defaults to false. 
    983983         * @return array Array of files, keyed by the path to the file relative to the theme's directory, with the values 
    984          *                   being absolute paths. 
     984         *               being absolute paths. 
    985985         */ 
    986986        public function get_files( $type = null, $depth = 0, $search_parent = false ) { 
    987                 $files = (array) self::scandir( $this->get_stylesheet_directory(), $type, $depth ); 
     987                // get and cache all theme files to start with. 
     988                $label = sanitize_key( 'files_' . $this->cache_hash . '-' . $this->get( 'Version' ) ); 
    988989 
    989                 if ( $search_parent && $this->parent() ) 
    990                         $files += (array) self::scandir( $this->get_template_directory(), $type, $depth ); 
     990                $all_files = get_transient( $label ); 
     991                if ( false === $all_files ) { 
     992                        $all_files = (array) self::scandir( $this->get_stylesheet_directory(), null, -1 ); 
    991993 
     994                        if ( $search_parent && $this->parent() ) { 
     995                                $all_files += (array) self::scandir( $this->get_template_directory(), null, -1 ); 
     996                        } 
     997 
     998                        set_transient( $label, $all_files, HOUR_IN_SECONDS ); 
     999                } 
     1000 
     1001                // Filter $all_files by $type & $depth. 
     1002                $files = array(); 
     1003                if ( $type ) { 
     1004                        $type = (array) $type; 
     1005                        $_extensions = implode( '|', $type ); 
     1006                } 
     1007                foreach ( $all_files as $key => $file ) { 
     1008                        if ( $depth >= 0 && substr_count( $key, '/' ) > $depth ) { 
     1009                                continue; // Filter by depth. 
     1010                        } 
     1011                        if ( ! $type || preg_match( '~\.(' . $_extensions . ')$~', $file ) ) { // Filter by type. 
     1012                                $files[ $key ] = $file; 
     1013                        } 
     1014                } 
     1015 
    9921016                return $files; 
    9931017        } 
    9941018 
     
    11071131         *                     with `$relative_path`, with the values being absolute paths. False otherwise. 
    11081132         */ 
    11091133        private static function scandir( $path, $extensions = null, $depth = 0, $relative_path = '' ) { 
    1110                 if ( ! is_dir( $path ) ) 
     1134                if ( ! is_dir( $path ) ) { 
    11111135                        return false; 
     1136                } 
    11121137 
    11131138                if ( $extensions ) { 
    11141139                        $extensions = (array) $extensions; 
     
    11161141                } 
    11171142 
    11181143                $relative_path = trailingslashit( $relative_path ); 
    1119                 if ( '/' == $relative_path ) 
     1144                if ( '/' == $relative_path ) { 
    11201145                        $relative_path = ''; 
     1146                } 
    11211147 
    11221148                $results = scandir( $path ); 
    11231149                $files = array(); 
     
    11251151                /** 
    11261152                 * Filters the array of excluded directories and files while scanning theme folder. 
    11271153                 * 
    1128                  * @since 4.7.4 
     1154                 * @since 4.7.4 
    11291155                 * 
    11301156                 * @param array $exclusions Array of excluded directories and files. 
    11311157                 */ 
    1132                 $exclusions = (array) apply_filters( 'theme_scandir_exclusions', array( 'CVS', 'node_modules' ) ); 
     1158                $exclusions = (array) apply_filters( 'theme_scandir_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) ); 
    11331159 
    11341160                foreach ( $results as $result ) { 
    11351161                        if ( '.' == $result[0] || in_array( $result, $exclusions, true ) ) { 
     
    11361162                                continue; 
    11371163                        } 
    11381164                        if ( is_dir( $path . '/' . $result ) ) { 
    1139                                 if ( ! $depth ) 
     1165                                if ( ! $depth ) { 
    11401166                                        continue; 
     1167                                } 
    11411168                                $found = self::scandir( $path . '/' . $result, $extensions, $depth - 1 , $relative_path . $result ); 
    11421169                                $files = array_merge_recursive( $files, $found ); 
    11431170                        } elseif ( ! $extensions || preg_match( '~\.(' . $_extensions . ')$~', $result ) ) {