WordPress doesn’t fully support adding plugins by using symbolic links in the wp-content/plugins
folder. This is because plugins_url()
which is often used for enqueuing plugin CSS and Javascript files uses plugin_basename()
which in turn relies on WP_PLUGIN_DIR
constant for extracting the plugin’s basename. However, the path to a symlinked plugin doesn’t include WP_PLUGIN_DIR
and therefore it fails at this replacement:
$file = preg_replace('#^' . preg_quote($plugin_dir, '#') . '/|^' . preg_quote($mu_plugin_dir, '#') . '/#','',$file); // get relative path from plugins dir
The solution is to use the following plugins_url
filter:
// Allow symlinking this plugin add_filter( 'plugins_url', 'your_plugin_symlink_fix', 10, 3 ); function your_plugin_symlink_fix( $url, $path, $plugin ) { // Do it only for this plugin if ( strstr( $plugin, basename(__FILE__) ) ) return str_replace( dirname(__FILE__), '/' . basename( dirname( $plugin ) ), $url ); return $url; }
or replace all instances of plugins_url( '/js/plugin.js', __FILE__ )
with something like:
WP_PLUGIN_URL . '/' . basename( __DIR__ ) . '/js/plugin.js'
Awesome! It works!
I only wish it could somehow fix all my require() calls (and somehow know which of those were dealing with symlinks)
Also, I just wanted to note that this doesn’t completely resolve the issue, since any calls to
plugin_basename()
won’t be run through the filter. See http://core.trac.wordpress.org/ticket/16953