Opened 11 years ago
Closed 11 years ago
#32519 closed defect (bug) (invalid)
Enqueueing styles with directory separator
| Reported by: |
|
Owned by: | |
|---|---|---|---|
| Milestone: | Priority: | normal | |
| Severity: | normal | Version: | 4.2 |
| Component: | Script Loader | Keywords: | |
| Focuses: | Cc: |
Description
Before running a specific task all my assets are within a directory called "tmp". To get the right directory for enqueuing styles I'm using the following function:
function asset_path($dir = '') {
$path = '/';
if(locate_template('tmp')) {
$path .= 'tmp/';
}
$path .= 'assets' . '/';
$path .= $dir . '/';
return $path;
}
So wp_enqueue_style('vendor', get_template_directory_uri() . asset_path('vendor') . 'vendor.css') works fine. If I change the asset_path function to
if( ! defined('DS') ? define('DS', DIRECTORY_SEPARATOR) : null);
function asset_path($dir = '') {
$path = DS;
if(locate_template('tmp')) {
$path .= 'tmp' . DS;
}
$path .= 'assets' . DS;
$path .= $dir . DS;
return $path;
}
it doesn't work anymore, since it seems that WordPress replaces the "\" (currently working on Windows OS) with "". So my request looks like ...wp-content/themes/boilerplatetmpassetsvendorvendor.css?ver=4.1.4 .
I didn't find anything related to this behaviour, hence I'm assuming it's a bug.
Another strange behaviour is that if I use the hardcoded directory separators and try to find out if the target exists with
if(locate_template(get_template_directory_uri() . asset_path('vendor') . 'vendor.css'))
// ...
}
wp_enqueue_style('vendor', get_template_directory_uri() . asset_path('vendor') . 'vendor.css');
the condition fails - but enqueuing succeeds.
Thanks for reporting this issue! :)
wp_enqueue_*takes a URL rather than a path, and\is not a valid character in URLs (but can be encoded as%5C). These enqueued URLs are then passed through URL sanitisation (esc_url), which strips invalid characters.You can pass your paths through
wp_normalize_pathto convert backslashes to forward slashes, however keep in mind that you typically don't want to bother withDIRECTORY_SEPARATORanyway. Windows can handle forward slashes as directory (folder) separators anyway, so it helps to simplify your code a bit.