mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-08-11 12:20:22 +00:00
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. git-svn-id: https://develop.svn.wordpress.org/trunk@41806 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -120,35 +120,53 @@ function get_home_path() {
|
||||
* The depth of the recursiveness can be controlled by the $levels param.
|
||||
*
|
||||
* @since 2.6.0
|
||||
* @since 4.9.0 Added the `$exclusions` parameter.
|
||||
*
|
||||
* @param string $folder Optional. Full path to folder. Default empty.
|
||||
* @param int $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit).
|
||||
* @param array $exclusions Optional. List of folders and files to skip.
|
||||
* @return bool|array False on failure, Else array of files
|
||||
*/
|
||||
function list_files( $folder = '', $levels = 100 ) {
|
||||
if ( empty($folder) )
|
||||
function list_files( $folder = '', $levels = 100, $exclusions = array() ) {
|
||||
if ( empty( $folder ) ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( ! $levels )
|
||||
$folder = trailingslashit( $folder );
|
||||
|
||||
if ( ! $levels ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$files = array();
|
||||
if ( $dir = @opendir( $folder ) ) {
|
||||
while (($file = readdir( $dir ) ) !== false ) {
|
||||
if ( in_array($file, array('.', '..') ) )
|
||||
|
||||
$dir = @opendir( $folder );
|
||||
if ( $dir ) {
|
||||
while ( ( $file = readdir( $dir ) ) !== false ) {
|
||||
// Skip current and parent folder links.
|
||||
if ( in_array( $file, array( '.', '..' ), true ) ) {
|
||||
continue;
|
||||
if ( is_dir( $folder . '/' . $file ) ) {
|
||||
$files2 = list_files( $folder . '/' . $file, $levels - 1);
|
||||
if ( $files2 )
|
||||
}
|
||||
|
||||
// Skip hidden and excluded files.
|
||||
if ( '.' === $file[0] || in_array( $file, $exclusions, true ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( is_dir( $folder . $file ) ) {
|
||||
$files2 = list_files( $folder . $file, $levels - 1 );
|
||||
if ( $files2 ) {
|
||||
$files = array_merge($files, $files2 );
|
||||
else
|
||||
$files[] = $folder . '/' . $file . '/';
|
||||
} else {
|
||||
$files[] = $folder . $file . '/';
|
||||
}
|
||||
} else {
|
||||
$files[] = $folder . '/' . $file;
|
||||
$files[] = $folder . $file;
|
||||
}
|
||||
}
|
||||
}
|
||||
@closedir( $dir );
|
||||
|
||||
return $files;
|
||||
}
|
||||
|
||||
|
||||
@@ -190,35 +190,43 @@ function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup
|
||||
* @param string $plugin Path to the main plugin file from plugins directory.
|
||||
* @return array List of files relative to the plugin root.
|
||||
*/
|
||||
function get_plugin_files($plugin) {
|
||||
function get_plugin_files( $plugin ) {
|
||||
$plugin_file = WP_PLUGIN_DIR . '/' . $plugin;
|
||||
$dir = dirname($plugin_file);
|
||||
$plugin_files = array($plugin);
|
||||
if ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) {
|
||||
$plugins_dir = @ opendir( $dir );
|
||||
if ( $plugins_dir ) {
|
||||
while (($file = readdir( $plugins_dir ) ) !== false ) {
|
||||
if ( substr($file, 0, 1) == '.' )
|
||||
continue;
|
||||
if ( is_dir( $dir . '/' . $file ) ) {
|
||||
$plugins_subdir = @ opendir( $dir . '/' . $file );
|
||||
if ( $plugins_subdir ) {
|
||||
while (($subfile = readdir( $plugins_subdir ) ) !== false ) {
|
||||
if ( substr($subfile, 0, 1) == '.' )
|
||||
continue;
|
||||
$plugin_files[] = plugin_basename("$dir/$file/$subfile");
|
||||
}
|
||||
@closedir( $plugins_subdir );
|
||||
}
|
||||
} else {
|
||||
if ( plugin_basename("$dir/$file") != $plugin )
|
||||
$plugin_files[] = plugin_basename("$dir/$file");
|
||||
}
|
||||
}
|
||||
@closedir( $plugins_dir );
|
||||
}
|
||||
$dir = dirname( $plugin_file );
|
||||
|
||||
$data = get_plugin_data( $plugin_file );
|
||||
$label = isset( $data['Version'] )
|
||||
? sanitize_key( 'files_' . $plugin . '-' . $data['Version'] )
|
||||
: sanitize_key( 'files_' . $plugin );
|
||||
$transient_key = substr( $label, 0, 29 ) . md5( $label );
|
||||
|
||||
$plugin_files = get_transient( $transient_key );
|
||||
if ( false !== $plugin_files ) {
|
||||
return $plugin_files;
|
||||
}
|
||||
|
||||
$plugin_files = array( plugin_basename( $plugin_file ) );
|
||||
|
||||
if ( is_dir( $dir ) && WP_PLUGIN_DIR !== $dir ) {
|
||||
|
||||
/**
|
||||
* Filters the array of excluded directories and files while scanning the folder.
|
||||
*
|
||||
* @since 4.9.0
|
||||
*
|
||||
* @param array $exclusions Array of excluded directories and files.
|
||||
*/
|
||||
$exclusions = (array) apply_filters( 'plugin_files_exclusions', array( 'CVS', 'node_modules', 'vendor', 'bower_components' ) );
|
||||
|
||||
$list_files = list_files( $dir, 100, $exclusions );
|
||||
$list_files = array_map( 'plugin_basename', $list_files );
|
||||
|
||||
$plugin_files = array_merge( $plugin_files, $list_files );
|
||||
$plugin_files = array_values( array_unique( $plugin_files ) );
|
||||
}
|
||||
|
||||
set_transient( $transient_key, $plugin_files, HOUR_IN_SECONDS );
|
||||
|
||||
return $plugin_files;
|
||||
}
|
||||
|
||||
|
||||
@@ -75,16 +75,16 @@ $file_types = wp_get_theme_file_editable_extensions( $theme );
|
||||
foreach ( $file_types as $type ) {
|
||||
switch ( $type ) {
|
||||
case 'php':
|
||||
$allowed_files += $theme->get_files( 'php', 1 );
|
||||
$allowed_files += $theme->get_files( 'php', -1 );
|
||||
$has_templates = ! empty( $allowed_files );
|
||||
break;
|
||||
case 'css':
|
||||
$style_files = $theme->get_files( 'css' );
|
||||
$style_files = $theme->get_files( 'css', -1 );
|
||||
$allowed_files['style.css'] = $style_files['style.css'];
|
||||
$allowed_files += $style_files;
|
||||
break;
|
||||
default:
|
||||
$allowed_files += $theme->get_files( $type );
|
||||
$allowed_files += $theme->get_files( $type, -1 );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user