WordPress.org

Make WordPress Core

Ticket #6531: 6531.3.diff

File 6531.3.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..d999bc6 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 = $relative_file[1]; 
    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