前編の続きとなります。いきなりこのページに来た方は、まずは前編をお読みください。
こんなやり方も – PHP側でHTMLを書き換える
Gruntでやると
ブラウザのキャッシュクリア対策のために「ファイル名にMD5フィンガープリントを付与すること」をGoogleが推奨していました。
これをタスクランナーであるGruntで行うと以下のような複数のタスクを実行する必要があり、設定など行うのにそれなりの労力を必要としました。
- ファイルの更新の監視(grunt-contrib-watch)
- 古いファイルの削除(grunt-contrib-clean)
- ファイル名にMD5を付与したファイル生成(grunt-md5)
- 生成したファイルのファイル名取得(Node.jsのfsモジュール)
- HTML側の書き換え(grunt-text-replace)
PHPでファイル名を取得する処理を書く
「ファイル名にMD5を付与したファイル生成」はGruntにやらせるとして、HTML側の書き換えをPHPでやらせてもよいのではないかと思い試したやり方を紹介したいと思います。
まずGruntでも同じよう処理を行いましたが、対象のファイルのあるディレクトリにアクセスして、ファイル一覧を取得し、正規表現でファイル名を取得するクラスを作ります。
WordPressのfunction.phpで読み込み、処理実行
上記のファイルを適当な場所において、WordPressのfunction.phpで読み込み、処理を実行させるようにします。
HTML側の変更
HTML側でcssファイルとjsファイルを読み込んでいる部分を以下のように変更します。
これで、assetsディレクトリにMD5を付与したファイルを置くと、HTML側で自動的にファイルを読み込んでくれるようになります。ただし、PHPの処理に更新日時の新しいファイルを読み込むといった処理を入れいていないので、古いファイルは手動で削除する必要があります。
おまけ – query string(クエリ文字列)を使う
ブラウザのキャッシュをクリアするための他の方法としてquery string(クエリ文字列)を使う方法があったりします。こちらの場合、ファイル名を変更する必要がなく、HTML側のソースにクエリ文字列を挿入するだけで済みます。
query string(クエリ文字列)を付与した例
- /wp-content/themes/blog/css/app.css?ver=20150222003015
- /wp-content/themes/blog/js/app.js?ver=20150222003015
ただし、注意が必要でURLに「?」が含まれていると、proxyにキャッシュされなくなってしまうようです。
そういった理由で、Googleもフィンガープリントを付与することを推奨しているんだと思いますが、念のため「おまけ」として対応方法を書いておきます。
Gruntでクエリ文字列を付与する
こちらについてはGruntで簡単に設定できます。前編で紹介したファイル内のテキストを書き換えるGruntプラグイン「grunt-text-replace」を使います。詳細は「前編」をご確認ください。
Gruntfile.jsの書き方は以下の通りです。
Gruntのテンプレート関数「grunt.template.today」を使ってファイルの更新した日時を取得して(<%= grunt.template.today('yyyymmddhhmmss') %>を挿入)、動的にを書き換えるようにしています。
HTML側は最初だけ置換できるように、query string(クエリー文字列)をつけた状態に書き換えておきます。
これでquery stringを使って、ブラウザのキャッシュをクリアさせることができるようになります。
いろいろやった挙句…
最後に、いろいろ説明してきましたが、実はWordPressの「autoptimize」というプラグインを使うと、何も考えずに圧縮、結合のみならず最適化はMD5のファイル名付与までやってくれます。
コメント