※当ブログではアフィリエイト広告を利用しています。
GoogleではjQueryなどの広く使われているライブラリをホストする「Google Hosted Libraries」というサービスを提供しています。
サービスを利用することでメリットがたくさんあるのですが、万が一Googleのサービスからファイルを読み込めなかったときに自サイトのjQueryを読み込む処理(フォールバック)をWordPressで実装しようとしたときに試行錯誤したので、採用した方法とその理由をメモします。
Google Hosted Librariesについて
Googleが提供するCDN(コンテンツデリバリネットワーク)から、jQueryやPrototypeなど広く使われているライブラリのファイルを自サイトで利用できます。例としてjQueryは以下のようなコードで読み込むことができます。
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
Google Hosted Librariesを利用するメリット
主に以下のようなメリットがあります。
- 自サイトに置いてあるファイルを読み込むよりも通信速度が早い
- 他サイトで同じ種類・バージョンのファイルを既に読み込んでいる場合、再度ファイルをダウンロードしなくともブラウザキャッシュからの利用が期待できる
- 同一ホストへのブラウザの同時接続数制限を緩和し、ファイルの並列ダウンロード数を増やせる
参考:Google Hosted Library – Webを速くするためにGoogleがやっていること Make the Web Faster 03 –
Google Hosted Librariesを利用するデメリット
逆に以下のようなデメリットも存在します。
- 万が一サービスが落ちていたらファイルが読み込めない(Googleより自サイトが落ちる可能性のほうが高いですが・・)
- インターネットに接続できる状況でないとファイルが読み込めない
WordPressでのGoogle Hosted LibrariesのjQuery利用方法
WordPressでGoogle Hosted LibrariesのjQueryを読み込むにはfunctions.php
に以下の処理を加える必要があります。
wp_deregister_script
であらかじめ登録されているjQueryを解除wp_register_script
でGoogle CDNのjQueryを登録wp_enqueue_script
で登録し直したjQueryをスクリプト読み込みキューに加える
またヘッダー部分でスクリプトを読み込むとページのレンダリング速度に多少影響が出ることから、当サイトではフッター部分でスクリプトファイルを読み込むようにしています。functions.php
の詳細なコードは後述します。
フォールバックについて
Google Hosted Librariesからファイルが読み込めなかった場合に自サイトのファイルを読み込む処理(フォールバック)を加えておくのが好ましいようです。
例えばjQueryを読み込むときは、Googleからのスクリプトファイル読み込みコードの直後に下記2行目のようなフォールバック処理を追加します。
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <script>window.jQuery || document.write('<script src="./js/jquery-1.9.1.min.js"><\/script>');
参考:jQueryをCDNで読み込む(フォールバックについても)
WordPressでのjQuery読み込みフォールバック方法と問題点
フォールバック処理はGoogle CDNからのjQuery読み込み処理の直後に記述するのが好ましいですが、前述のフォールバック処理はインラインJavaScript(HTMLに直接記述)となっています。
しかしWordPressではwp_enqueue_script
でのスクリプト読み込みの直後の行にインラインJavaScriptを記述する方法が見当たりませんでした。
テーマのheader.php
またはfooter.php
に直接インラインJavaScriptを記述する方法も考えましたが、もしjQueryに依存するスクリプトファイルをプラグイン等によって読み込んだ場合、以下の条件が重なるとプラグインが正しく動作しないことがあります。
- CDNからのスクリプト読み込みに失敗
- フォールバックでの自サイトからのjQueryよりも先にプラグイン等のスクリプトが実行される
採用した方法と理由
下記の参考サイトで紹介されている方法を自サイト用に改変し、WordPressで使用しているテーマのfunctions.php
に以下のコードを追加しました。
//管理画面以外であれば自身で指定したjQueryを読み込む if(!is_admin()){ function load_external_jQuery() { wp_deregister_script( 'jquery' ); //あらかじめ登録されているjQueryを登録解除する $url = 'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'; //チェックするGoogle CNDのURL $test_url = @fopen($url,'r'); //Google CDNが利用可能かチェックする if( $test_url !== false ) { //Google CDNが利用可能であればGoogle Hosted LibrariesのjQueryを登録する wp_register_script('jquery', '//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', array(), NULL , true); } else{ //Google CDNが利用不可であればローカルのjQueryを登録する $local_url = get_template_directory_uri() . "/js/jquery-1.9.1.min.js"; wp_register_script('jquery', $local_url, array(), NULL , true); } wp_enqueue_script('jquery'); //登録し直したjQueryを読み込む } add_action('wp_enqueue_scripts', 'load_external_jQuery'); }
参考:Load jQuery from Google AJAX Libraries API in WordPress with “fallback script” -Stack Overflow
上記コードを加えることでWordPressフッター部分に以下の動作を加えることができます。
- Google CDNからjQueryが読み込める場合はそのまま読み込む
- Google CDNからjQueryが読み込めない場合は自サイトに設置したjQueryを読み込む
上記コードを採用した理由は以下の通りです。
- Google CDNと自サイト両方が落ちていない限り確実にフッター部分でjQueryスクリプトを読み込むことができる
- jQueryに依存しているプラグインの利用に影響がない
- PHPで処理するためインラインJavaScriptでのフォールバック処理が必要ない
おわりに
GoogleのCDNが利用不能となる可能性は考える必要がないくらい低いとは思いますが、万が一のことが気になってしまったので今回のような処理を加えてみました。
WordPressの作法と実現したいことを両立させるにはまだまだ勉強が足りないと感じました。