auto-versioning.php
5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
<?php
if ( !class_exists('AutoVersioning') ) {
/**
* This class enables automatic versioning of CSS/JS by adding file modification time to the URLs.
* @see http://stackoverflow.com/questions/118884/
*/
class AutoVersioning {
private static $version_in_filename = false;
/**
* An auto-versioning wrapper for wp_register_s*() and wp_enqueue_s*() dependency APIs.
*
* @static
* @param string $wp_api_function The name of the WP dependency API to call.
* @param string $handle Script or stylesheet handle.
* @param string $src Script or stylesheet URL.
* @param array $deps Dependencies.
* @param bool|string $last_param Either $media (for wp_register_style) or $in_footer (for wp_register_script).
* @param bool $add_ver_to_filename TRUE = add version to filename, FALSE = add it to the query string.
*/
public static function add_dependency($wp_api_function, $handle, $src, $deps, $last_param, $add_ver_to_filename = false ) {
list($src, $version) = self::auto_version($src, $add_ver_to_filename);
call_user_func($wp_api_function, $handle, $src, $deps, $version, $last_param);
}
/**
* Automatically version a script or style sheet URL based on file modification time.
*
* Returns auto-versioned $src and $ver values suitable for use with WordPress dependency APIs like
* wp_register_script() and wp_register_style().
*
* @static
* @param string $url
* @param bool $add_ver_to_filename
* @return array array($url, $version)
*/
private static function auto_version($url, $add_ver_to_filename = false) {
$version = false;
$filename = self::guess_filename_from_url($url);
if ( ($filename !== null) && is_file($filename) ) {
$mtime = filemtime($filename);
if ( $add_ver_to_filename ) {
$url = preg_replace('@\.([^./\?]+)(\?.*)?$@', '.' . $mtime . '.$1', $url);
$version = null;
} else {
$version = $mtime;
}
}
return array($url, $version);
}
private static function guess_filename_from_url($url) {
static $url_mappings = null;
if ( $url_mappings === null ) {
$url_mappings = array(
plugins_url() => WP_PLUGIN_DIR,
plugins_url('', WPMU_PLUGIN_DIR . '/dummy') => WPMU_PLUGIN_DIR,
get_stylesheet_directory_uri() => get_stylesheet_directory(),
get_template_directory_uri() => get_template_directory(),
content_url() => WP_CONTENT_DIR,
site_url('/' . WPINC) => ABSPATH . WPINC,
);
}
$filename = null;
foreach($url_mappings as $root_url => $directory) {
if ( strpos($url, $root_url) === 0 ) {
$filename = $directory . '/' . substr($url, strlen($root_url));
//Get rid of the query string, if any.
list($filename, ) = explode('?', $filename, 2);
break;
}
}
return $filename;
}
/**
* Apply automatic versioning to all scripts and style sheets added using WP dependency APIs.
*
* If you set $add_ver_to_filename to TRUE, make sure to also add the following code to your
* .htaccess file or your site may break:
*
* <IfModule mod_rewrite.c>
* RewriteEngine On
* RewriteRule ^(.*)\.[\d]{10}\.(css|js)$ $1.$2 [L]
* </IfModule>
*
* @static
* @param bool $add_ver_to_filename
*/
public static function apply_to_all_dependencies($add_ver_to_filename = false) {
self::$version_in_filename = $add_ver_to_filename;
foreach(array('script_loader_src', 'style_loader_src') as $hook) {
add_filter($hook, __CLASS__ . '::_filter_dependency_src', 10, 1);
}
}
public static function _filter_dependency_src($src) {
//Only add version info to CSS/JS files that don't already have it in the file name.
if ( preg_match('@(?<!\.\d{10})\.(css|js)(\?|$)@i', $src) ) {
list($src, $version) = self::auto_version($src, self::$version_in_filename);
if ( !empty($version) ) {
$src = add_query_arg('ver', $version, $src);
}
}
return $src;
}
}
} // End of class exists check
if ( !function_exists('wp_register_auto_versioned_script') ) {
function wp_register_auto_versioned_script($handle, $src, $deps = array(), $in_footer = false, $add_ver_to_filename = false) {
AutoVersioning::add_dependency('wp_register_script', $handle, $src, $deps, $in_footer, $add_ver_to_filename);
}
}
if ( !function_exists('wp_register_auto_versioned_style') ) {
function wp_register_auto_versioned_style( $handle, $src, $deps = array(), $media = 'all', $add_ver_to_filename = false) {
AutoVersioning::add_dependency('wp_register_style', $handle, $src, $deps, $media, $add_ver_to_filename);
}
}
if ( !function_exists('wp_enqueue_auto_versioned_script') ) {
function wp_enqueue_auto_versioned_script( $handle, $src, $deps = array(), $in_footer = false, $add_ver_to_filename = false ) {
AutoVersioning::add_dependency('wp_enqueue_script', $handle, $src, $deps, $in_footer, $add_ver_to_filename);
}
}
if ( !function_exists('wp_enqueue_auto_versioned_style') ) {
function wp_enqueue_auto_versioned_style( $handle, $src, $deps = array(), $media = 'all', $add_ver_to_filename = false ) {
AutoVersioning::add_dependency('wp_enqueue_style', $handle, $src, $deps, $media, $add_ver_to_filename);
}
}