WordPress.org

Make WordPress Core

Ticket #16953: 16953.alternative.diff

File 16953.alternative.diff, 2.7 KB (added by mitchoyoshitaka, 6 years 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) == '.' )