スクリプトファイルのバージョンパラメータを変更する

スクリプトファイルのバージョンパラメータを変更する - WordPressのバージョン番号で大丈夫?

説明

Java Scriptやスタイルシートの指定を直接head要素内に記述せず、wp_enqueue_scriptsフィルターなどを使って指定する場合、WordPressのバージョン番号が付与されている。このバージョン番号は、妥当なんだろうか。

テーマにおいてJava Scriptやスタイルシートを指定する場合、テーマ内のfunctions.phpなどに次のような内容を記述する。

function my_enqueue_scripts() {
	wp_enqueue_style( 'mytheme-style', '/css/common.css' );
	wp_enqueue_script( 'mytheme-script', '/js/common.js' );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_scripts' );

実際に出力されるHTMLは次の通り。

<link rel='stylesheet' id='toshokan-style-css' href='http://localhost/css/common.css?ver=4.1' type='text/css' media='all' />
<script type='text/javascript' src='http://localhost/js/common.js?ver=4.1'></script>

href属性値はwp_enqueue_style関数のパラメータで指定したURLの後にverパラメータが追加されていることがわかる。これはwp_enqueue_style関数(およびwp_enqueue_script関数)の第4パラメータを省略した場合の動作であり、第4パラメータには任意の文字列を指定できる。

標準のverパラメータの内容が妥当なのかと思った理由は、これがWordPressのバージョンであることだ。仮にWordPress本体のアップデートが遅れた場合、そのことを外部に知らせてしまうことになる。name属性がgeneratorのmeta要素を出力していないのであれば、標準のまま使用することは避けたほうがいい。

ファイルの更新日時に変更する

WordPressのバージョン番号の代わりとしてまず思いついたのが、そのファイルの更新日時。ブラウザのキャッシュ対策としてもこれなら有効だろう。ソースコードは次のような感じになる。

function my_enqueue_scripts() {
	wp_enqueue_style( 'mytheme-style', '/css/common.css', array(), script_datetime( '/css/common.css' ) );
	wp_enqueue_script( 'mytheme-script', '/js/common.js', array(), script_datetime( '/js/common.js' ) );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_scripts' );

function script_datetime( $path ) {
	return date( "Ymd-His", @filemtime( ABSPATH.ltrim( $path, '/' ) )+3600*9 );
}

script_datetime関数では、スクリプトのフルパス名からそのファイルの更新日時を取得し、年月日時分秒の文字列を生成している。なおWordPress内部のタイムゾーンがUTCになっているため、日本(JST)の時差分の秒数を取得したファイルの秒数に加算している。

この変更により、common.cssの出力内容は次のように変わる。

<link rel='stylesheet' id='toshokan-style-css' href='http://localhost/css/common.css?ver=20150210_154321' type='text/css' media='all' />
ファイルのバージョン番号に変更する

ファイルの更新日時を公開したくない場合には、Java Scriptやスタイルシートの冒頭部分にバージョン番号のコメントを入れ、そのバージョン番号を利用することもできる。ファイルに追加する最低限の内容は次の通り。

/*
Version: 1.0.0
*/

このコメントとして追加したバージョン情報はget_file_data関数で取得できる。この対応を行ったソースコードは次のような感じになる(バージョン情報を取得できない場合は'0.0.0'を出力)。

function my_enqueue_scripts() {
	wp_enqueue_style( 'mytheme-style', '/css/common.css', array(), 'c'.file_version( '/css/common.css' ) );
	wp_enqueue_script( 'mytheme-script', '/js/common.js', array(), 'j'.file_version( '/js/common.js' ) );
}
add_action( 'wp_enqueue_scripts', 'my_enqueue_scripts' );

function file_version( $path ) {
	$headers = get_file_data( ABSPATH.ltrim( $path, '/' ), array( 'Version' => 'Version' ) );
	return empty( $headers['Version'] )? '0.0.0': $headers['Version'];
}

この変更により、common.jsの出力内容は次のように変わる。

<script type='text/javascript' src='http://localhost/js/common.js?ver=j1.0.0'></script>

なおファイルのパージョン番号の場合、WordPressのバージョン番号と勘違いされてしまうため、この例では、とりあえず'c'や'j'を付与している。

最後に、掲載したソースコードはWordPressがサイトのドキュメントルートディレクトリに配置している場合の記述になるため、別のディレクトリに配置している場合はABSPATH当たりを適宜工夫してほしい(ファイルが存在しない場合のエラー処理も忘れずに)。

関連

お勧めコンテンツ

the_weekday(2012年1月16日 登録)

void the_weekday( )
投稿日の曜日を表示する。

wp_image_matches_ratio(2016年8月17日 登録)

bool wp_image_matches_ratio( int $source_width, int $source_height, int $target_width, int $target_height )
2つの幅と高さが同じアスペクト比か調べる。

add_media_page(2011年5月30日 登録)

mixed add_media_page( string $page_title, string $menu_title, mixed string $capability, string $menu_slug [ , mixed $function = '' ] )
メディアメニューにサブメニューを登録する。

wp_set_object_terms(2013年1月25日 登録)

mixed wp_set_object_terms( int $object_id, mixed $terms, mixed $taxonomy [ , bool $append = false ] )
投稿情報などにタクソノミーを設定する。

is_allowed_http_origin(2014年10月29日 登録)

bool is_allowed_http_origin( [ string $origin = null ] )
リクエスト元のオリジンが有効か調べる。

最終更新日時 : 2015-02-10 16:22