WordPress.org

Make WordPress Core

Ticket #6531: 6531.4.diff

File 6531.4.diff, 7.6 KB (added by valendesigns, 3 years ago)
  • src/wp-admin/includes/plugin.php

    diff --git src/wp-admin/includes/plugin.php src/wp-admin/includes/plugin.php
    index a357779..f4958a3 100644
    function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup 
    182182 * @param string $plugin Plugin ID
    183183 * @return array List of files relative to the plugin root.
    184184 */
    185 function get_plugin_files($plugin) {
     185function get_plugin_files( $plugin ) {
    186186        $plugin_file = WP_PLUGIN_DIR . '/' . $plugin;
    187         $dir = dirname($plugin_file);
    188         $plugin_files = array($plugin);
    189         if ( is_dir($dir) && $dir != WP_PLUGIN_DIR ) {
    190                 $plugins_dir = @ opendir( $dir );
     187        $dir =  WP_PLUGIN_DIR . '/' . current( explode( '/', $plugin, 2 ) );
     188        $plugin_files = array( $plugin );
     189        if ( is_dir( $dir ) && $dir != WP_PLUGIN_DIR ) {
     190                $plugins_dir = @opendir( $dir );
    191191                if ( $plugins_dir ) {
    192                         while (($file = readdir( $plugins_dir ) ) !== false ) {
    193                                 if ( substr($file, 0, 1) == '.' )
     192                        $plugin_basedir = plugin_basename( $dir );
     193                        while ( ( $file = readdir( $plugins_dir ) ) !== false ) {
     194                                if ( substr( $file, 0, 1 ) == '.' ) {
    194195                                        continue;
     196                                }
    195197                                if ( is_dir( $dir . '/' . $file ) ) {
    196                                         $plugins_subdir = @ opendir( $dir . '/' . $file );
    197                                         if ( $plugins_subdir ) {
    198                                                 while (($subfile = readdir( $plugins_subdir ) ) !== false ) {
    199                                                         if ( substr($subfile, 0, 1) == '.' )
    200                                                                 continue;
    201                                                         $plugin_files[] = plugin_basename("$dir/$file/$subfile");
    202                                                 }
    203                                                 @closedir( $plugins_subdir );
    204                                         }
     198                                        $subfiles = _get_plugin_sub_files( $dir . '/' . $file );
     199                                        $plugin_files = array_merge( $plugin_files, $subfiles );
    205200                                } else {
    206                                         if ( plugin_basename("$dir/$file") != $plugin )
    207                                                 $plugin_files[] = plugin_basename("$dir/$file");
     201                                        if ( "$plugin_basedir/$file" != $plugin )
     202                                                $plugin_files[] = "$plugin_basedir/$file";
    208203                                }
    209204                        }
    210205                        @closedir( $plugins_dir );
    211206                }
    212207        }
     208        return $plugin_files;
     209}
    213210
     211/**
     212 * Returns a recursive list of a plugin's sub files.
     213 *
     214 * @since 4.2.0
     215 * @access private
     216 *
     217 * @param string $subdir Sub directory path.
     218 * @return array List of files relative to the sub directoy root.
     219 */
     220function _get_plugin_sub_files( $subdir ) {
     221        $plugins_subdir = @opendir( $subdir );
     222        if ( $plugins_subdir ) {
     223                $plugin_basedir = plugin_basename( $subdir );
     224                $plugin_files = array();
     225                while ( ( $subfile = readdir( $plugins_subdir ) ) !== false ) {
     226                        if ( substr( $subfile, 0, 1 ) == '.' ) {
     227                                continue;
     228                        }
     229                        if ( is_dir( $subdir  . '/' . $subfile ) ) {
     230                                $subfiles = _get_plugin_sub_files( $subdir . '/' . $subfile );
     231                                $plugin_files = array_merge( $plugin_files, $subfiles );
     232                        } else {
     233                                $plugin_files[] = "$plugin_basedir/$subfile";   
     234                        }
     235                }
     236                @closedir( $plugins_subdir );
     237        }
    214238        return $plugin_files;
    215239}
    216240
  • src/wp-admin/plugin-editor.php

    diff --git src/wp-admin/plugin-editor.php src/wp-admin/plugin-editor.php
    index 1c24295..1abe221 100644
    default: 
    199199<?php
    200200        foreach ( $plugins as $plugin_key => $a_plugin ) {
    201201                $plugin_name = $a_plugin['Name'];
    202                 if ( $plugin_key == $plugin )
    203                         $selected = " selected='selected'";
    204                 else
    205                         $selected = '';
    206                 $plugin_name = esc_attr($plugin_name);
    207                 $plugin_key = esc_attr($plugin_key);
     202                $plugin_parts = explode( '/', $plugin );
     203                $plugin_key_parts = explode( '/', $plugin_key );
     204                $selected = $plugin_key_parts[0] == $plugin_parts[0] ? " selected='selected'" : '';
     205                $plugin_name = esc_attr( $plugin_name );
     206                $plugin_key = esc_attr( $plugin_key );
    208207                echo "\n\t<option value=\"$plugin_key\" $selected>$plugin_name</option>";
    209208        }
    210209?>
    default: 
    220219
    221220        <ul>
    222221<?php
    223 foreach ( $plugin_files as $plugin_file ) :
     222foreach ( $plugin_files as $key => $plugin_file ) :
    224223        // Get the extension of the file
    225         if ( preg_match('/\.([^.]+)$/', $plugin_file, $matches) ) {
     224        if ( preg_match( '/\.([^.]+)$/', $plugin_file, $matches ) ) {
    226225                $ext = strtolower($matches[1]);
    227226                // If extension is not in the acceptable list, skip it
    228                 if ( !in_array( $ext, $editable_extensions ) )
     227                if ( ! in_array( $ext, $editable_extensions ) ) {
    229228                        continue;
     229                }
    230230        } else {
    231231                // No extension found
    232232                continue;
    233233        }
     234
     235        // Don't show the file twice.
     236        if ( $key > 0 && $plugin_file == $file ) {
     237                continue;
     238        }
     239
     240        $file_parts = explode( '/', $plugin_file );
     241        $relative_file = str_replace( $file_parts[0] . '/', '', $plugin_file );
     242        $file_description = get_file_description( WP_PLUGIN_DIR . '/' . $plugin_file );
     243
     244        if ( $file_description != $plugin_file ) {
     245                $file_description .= '<br /><span class="nonessential">(' . $relative_file . ')</span>';
     246        }
     247        if ( $plugin_file == $file ) {
     248                $file_description = '<span class="highlight">' . $file_description . '</span>';
     249        }
    234250?>
    235                 <li<?php echo $file == $plugin_file ? ' class="highlight"' : ''; ?>><a href="plugin-editor.php?file=<?php echo urlencode( $plugin_file ) ?>&amp;plugin=<?php echo urlencode( $plugin ) ?>"><?php echo $plugin_file ?></a></li>
     251                <li><a href="plugin-editor.php?file=<?php echo urlencode( $plugin_file ) ?>&amp;plugin=<?php echo urlencode( $plugin ) ?>"><?php echo $file_description ?></a></li>
    236252<?php endforeach; ?>
    237253        </ul>
    238254</div>
  • src/wp-admin/theme-editor.php

    diff --git src/wp-admin/theme-editor.php src/wp-admin/theme-editor.php
    index d0ecee4..fd4cea5 100644
    if ( $allowed_files ) : 
    174174        endif;
    175175
    176176        foreach ( $allowed_files as $filename => $absolute_filename ) :
    177                 if ( 'style.css' == $filename )
     177                if ( 'style.css' == $filename ) {
    178178                        echo "\t</ul>\n\t<h3>" . _x( 'Styles', 'Theme stylesheets in theme editor' ) . "</h3>\n\t<ul>\n";
     179                }
     180
     181                $relative_file = explode( $theme->offsetGet( 'Template' ) . '/', $absolute_filename );
     182                $relative_file = ! empty( $relative_file[1] ) ? $relative_file[1] : basename( $filename );
    179183
    180184                $file_description = get_file_description( $absolute_filename );
    181                 if ( $file_description != basename( $filename ) )
    182                         $file_description .= '<br /><span class="nonessential">(' . $filename . ')</span>';
    183185
    184                 if ( $absolute_filename == $file )
     186                if ( $file_description != $relative_file ) {
     187                        $file_description .= '<br /><span class="nonessential">(' . $relative_file . ')</span>';
     188                }
     189                if ( $absolute_filename == $file ) {
    185190                        $file_description = '<span class="highlight">' . $file_description . '</span>';
     191                }
    186192?>
    187193                <li><a href="theme-editor.php?file=<?php echo urlencode( $filename ) ?>&amp;theme=<?php echo urlencode( $stylesheet ) ?>"><?php echo $file_description; ?></a></li>
    188194<?php
  • tests/phpunit/tests/admin/includesPlugin.php

    diff --git tests/phpunit/tests/admin/includesPlugin.php tests/phpunit/tests/admin/includesPlugin.php
    index 15afaef..931ad82 100644
    class Tests_Admin_includesPlugin extends WP_UnitTestCase { 
    9292                $name = 'hello.php';
    9393                $this->assertEquals( array( $name ), get_plugin_files( $name ) );
    9494        }
     95       
     96        /**
     97         * @covers ::get_plugin_files
     98         *
     99         * @ticket 6531
     100         */
     101        public function test_get_plugin_files_beyond_two_levels_deep() {
     102                mkdir( WP_PLUGIN_DIR . '/foo' );
     103                mkdir( WP_PLUGIN_DIR . '/foo/bar' );
     104                mkdir( WP_PLUGIN_DIR . '/foo/bar/baz' );
     105               
     106                $this->_create_plugin( '<?php\n//Foo', 'foo.php', WP_PLUGIN_DIR . '/foo' );
     107                $this->_create_plugin( '<?php\n//Baz', 'baz.php', WP_PLUGIN_DIR . '/foo/bar/baz' );
     108                $this->assertEquals( Array ( 'foo/foo.php', 'foo/bar/baz/baz.php' ), get_plugin_files( 'foo/foo.php' ) );
     109               
     110                // Clean up.
     111                unlink( WP_PLUGIN_DIR . '/foo/foo.php' );
     112                unlink( WP_PLUGIN_DIR . '/foo/bar/baz/baz.php' );
     113                rmdir( WP_PLUGIN_DIR . '/foo/bar/baz' );
     114                rmdir( WP_PLUGIN_DIR . '/foo/bar' );
     115                rmdir( WP_PLUGIN_DIR . '/foo' );
     116        }
    95117
    96118        /**
    97119         * @covers ::get_mu_plugins