Make WordPress Core


Ignore:
Timestamp:
10/10/2017 05:33:57 AM (7 years ago)
Author:
pento
Message:

File Editor: Add support for more than one sub-directory level.

The theme and plugin editors now list all files in the selected theme or plugin, recursing through subdirectories as necessary.

Props WraithKenny, schlessera, chsxf, MikeHansenMe, Daedalon, valendesigns, westonruter, pento.
Fixes #6531.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/includes/file.php

    r41805 r41806  
    121121 *
    122122 * @since 2.6.0
     123 * @since 4.9.0 Added the `$exclusions` parameter.
    123124 *
    124125 * @param string $folder Optional. Full path to folder. Default empty.
    125126 * @param int    $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
     127 * @param array  $exclusions Optional. List of folders and files to skip.
    126128 * @return bool|array False on failure, Else array of files
    127129 */
    128 function list_files( $folder = '', $levels = 100 ) {
    129     if ( empty($folder) )
     130function list_files( $folder = '', $levels = 100, $exclusions = array() ) {
     131    if ( empty( $folder ) ) {
    130132        return false;
    131 
    132     if ( ! $levels )
     133    }
     134
     135    $folder = trailingslashit( $folder );
     136
     137    if ( ! $levels ) {
    133138        return false;
     139    }
    134140
    135141    $files = array();
    136     if ( $dir = @opendir( $folder ) ) {
    137         while (($file = readdir( $dir ) ) !== false ) {
    138             if ( in_array($file, array('.', '..') ) )
     142
     143    $dir = @opendir( $folder );
     144    if ( $dir ) {
     145        while ( ( $file = readdir( $dir ) ) !== false ) {
     146            // Skip current and parent folder links.
     147            if ( in_array( $file, array( '.', '..' ), true ) ) {
    139148                continue;
    140             if ( is_dir( $folder . '/' . $file ) ) {
    141                 $files2 = list_files( $folder . '/' . $file, $levels - 1);
    142                 if ( $files2 )
     149            }
     150
     151            // Skip hidden and excluded files.
     152            if ( '.' === $file[0] || in_array( $file, $exclusions, true ) ) {
     153                continue;
     154            }
     155
     156            if ( is_dir( $folder . $file ) ) {
     157                $files2 = list_files( $folder . $file, $levels - 1 );
     158                if ( $files2 ) {
    143159                    $files = array_merge($files, $files2 );
    144                 else
    145                     $files[] = $folder . '/' . $file . '/';
     160                } else {
     161                    $files[] = $folder . $file . '/';
     162                }
    146163            } else {
    147                 $files[] = $folder . '/' . $file;
     164                $files[] = $folder . $file;
    148165            }
    149166        }
    150167    }
    151168    @closedir( $dir );
     169
    152170    return $files;
    153171}
Note: See TracChangeset for help on using the changeset viewer.