WordPress.org

Make WordPress Core

Ticket #16953: 16953.alternative.diff

File 16953.alternative.diff, 2.7 KB (added by mitchoyoshitaka, 21 months ago)

Alternative approach, which caches symlink targets and replaces them

  • wp-includes/plugin.php

     
    569569        $plugin_dir = preg_replace('|/+|','/', $plugin_dir); // remove any duplicate slash 
    570570        $mu_plugin_dir = str_replace('\\','/',WPMU_PLUGIN_DIR); // sanitize for Win32 installs 
    571571        $mu_plugin_dir = preg_replace('|/+|','/', $mu_plugin_dir); // remove any duplicate slash 
     572         
     573        static $plugin_links_replaces; 
     574        $plugin_links_replaces = plugin_links_replaces(); 
     575        $file = preg_replace( array_keys($plugin_links_replaces), array_values($plugin_links_replaces), $file); 
     576         
    572577        $file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#','',$file); // get relative path from plugins dir 
    573578        $file = trim($file, '/'); 
    574579        return $file; 
    575580} 
    576581 
     582function plugin_links( $plugin_root = WP_PLUGIN_DIR ) { 
     583        $links = array(); 
     584 
     585        $plugins_dir = @ opendir( $plugin_root ); 
     586        while (($file = readdir( $plugins_dir ) ) !== false ) { 
     587                if ( substr($file, 0, 1) == '.' ) 
     588                        continue; 
     589                         
     590                if ( is_link( $plugin_root.'/'.$file ) ) { 
     591                        $links[$file] = untrailingslashit(readlink( $plugin_root.'/'.$file )); 
     592                } 
     593        } 
     594        @closedir( $plugins_dir ); 
     595         
     596        return $links; 
     597} 
     598 
     599function plugin_links_replaces( $plugin_root = WP_PLUGIN_DIR ) { 
     600        $links = array(); 
     601        $plugin_links = plugin_links( $plugin_root ); 
     602        foreach ( $plugin_links as $file => $target ) 
     603                $links['#^' . preg_quote($target, '#') . '(/|$)#'] = $file . '$1'; 
     604        return $links; 
     605} 
     606 
    577607/** 
    578608 * Gets the filesystem directory path (with trailing slash) for the plugin __FILE__ passed in 
    579609 * @package WordPress 
  • wp-admin/includes/plugin.php

     
    245245                $plugin_root .= $plugin_folder; 
    246246 
    247247        // Files in wp-content/plugins directory 
    248         $plugins_dir = @ opendir( $plugin_root); 
     248        $plugins_dir = @ opendir( $plugin_root ); 
    249249        $plugin_files = array(); 
    250250        if ( $plugins_dir ) { 
    251251                while (($file = readdir( $plugins_dir ) ) !== false ) { 
    252252                        if ( substr($file, 0, 1) == '.' ) 
    253253                                continue; 
    254                         if ( is_dir( $plugin_root.'/'.$file ) ) { 
    255                                 $plugins_subdir = @ opendir( $plugin_root.'/'.$file ); 
     254                                 
     255                        $full_file_path = $plugin_root.'/'.$file; 
     256                        if ( is_link( $full_file_path ) ) 
     257                                $full_file_path = readlink( $full_file_path ); 
     258                                 
     259                        if ( is_dir( $full_file_path ) ) { 
     260                                $plugins_subdir = @ opendir( $full_file_path ); 
    256261                                if ( $plugins_subdir ) { 
    257262                                        while (($subfile = readdir( $plugins_subdir ) ) !== false ) { 
    258263                                                if ( substr($subfile, 0, 1) == '.' )