Jetpackプラグインには、サイト上の画像をCDN配信してくれる機能(Photon)があります。
この機能を利用することで、サイト転送量の大部分を占める画像ファイルの配信を、CDN(コンテンツ配信ネットワーク)に任せることによって、サイト負担を減らすことができます。
加えて、Googleに合わせた画像圧縮を行ってくれるので、PageSpeed Insightsといったような高速化チェックツールに最適化した画像を配信してくれます(※画像は多少劣化する)。
目次
Photonの問題点
ただ、残念なことにPhotonは投稿内容の画像がすべてCDN配信されてしまうため、サイトの設定状態によっては、ちゃんと表示されないということもあります。
僕が運営しているサイトでも、「プラグインの機能との兼ね合いにより、外部リンク画像をPhotonでCDNを配信すると画像が表示されない」という不具合が出てしまいました。
なので、「外部リンク画像の場合はPhoton(CDN)を使用しない」という設定をする必要が出てきました。
ただ、JetpackのPhoton機能には、細かな設定項目はありません。そうなってくるとコードでカスタマイズするしかありません。
なので、「JetpackのCDN配信に割り込めるフックはないものか」と探してみたら、そのものズバリの良いものがありました。
というわけで以下では「画像URLによってJetpackのCDN配信を切り分けるWordpressカスタマイズ方法」を自分用のメモがてら紹介です。
JetpackのCDNをURLによって制御するサンプルコード
というわけで、以下がサンプルコードです。これをテーマ(子テーマ)のfunctions.phpに貼り付けて、条件を指定すれば利用できます。
add_filter('photon_validate_image_url', 'photon_validate_image_url_custom', 10, 3); function photon_validate_image_url_custom($can_use_photon, $url, $parsed_url){ //$can_use_photon引数のデフォルトは必ずtrue //$urlは画像のURL //$parsed_urlはパース毎に分けたURLの部品(今回のサンプルコードでは使用していない) //画像URLが外部URLの場合CDN配信しない if( strpos($url, home_url()) === false ) { $can_use_photon = false; } /////////////////////////////////////// // その他の条件例 /////////////////////////////////////// // //画像URLが内部URLの場合CDN配信しない // if( strpos($url, home_url()) !== false ) { // $can_use_photon = false; // } // //画像がJPEGのときCDN配信しない // if( preg_match('{\.jpe?g$}im', $url) ) { // $can_use_photon = false; // } // //画像がPNGのときCDN配信しない // if( preg_match('{\.png$}im', $url) ) { // $can_use_photon = false; // } // //画像がGIFのときCDN配信しない // if( preg_match('{\.gif$}im', $url) ) { // $can_use_photon = false; // } return $can_use_photon; }
今回使用したフックはphoton_validate_image_urlです。
ソースコード部分はGitHubで見ることができます。
まとめ
今回のカスタマイズは、以下のような人には向いているかと思います。
- Photonが特定の「画像URL条件」によって正常動作しないことがある
- 画像形式によってPhotonを利用するかどうか制御したい
- 自サーバー以外の画像はPhotonを利用したくない
これ以外にも、今回紹介したphoton_validate_image_urlフックを利用することによって、結構表示条件を細かく制御出来るかと思います。