テーマファイルだけで WordPress を圧縮・高速化する

WordPressのロゴ。

ob_start('ob_gzhandler');関数をテーマファイル内で実行することで、 データを gzip で圧縮した状態で転送することができます。 ユーザに転送するデータ量が小さくなるので、ページ表示速度の高速化に繋がります。

ここでは、ob_start('ob_gzhandler'); の使い方について解説します。

サーバ環境などによっては、ob_start('ob_gzhandler'); 関数による高速化が設定できないことがあります。

注意点

あらかじめ注意点と目的について解説しておきます。

プラグインを使わない意味・目的

WordPress を高速化するためのプラグインはいくつかあります。 多くがキャッシュを利用するプラグインで、非常に高速です。

しかしながら、サーバによってはキャッシュを利用できなかったり、高速化の設定ができなかったりします。 またキャッシュ(一時的なデータ)のために要領が肥大化しますし、不具合による脆弱性も確認されています。 したがって、WordPress に限らず、技術レベルが高くないユーザが利用するには不便なことがあります。

そこで、ob_start('ob_gzhandler');関数 のようなプラグインを用いない方法が有効です。 テーマファイル内で完結し、不具合が生じた場合にも深刻な影響がでません。

高速化プラグインとの衝突の恐れ

ob_start('ob_gzhandler'); 関数が実行する処理と、 導入済みの高速化のためのプラグインが実行する処理が重複する可能性があります。 処理が重複するとき、予期せぬ不具合を引き起こす可能性があります。

高速化のためのプラグインが導入されるとき、ob_start('ob_gzhandler'); 関数による更なる高速化は期待できないでしょう。

不具合によるリスクの方が恐ろしいので、高速化プラグインを導入する、導入しているようなシチュエーションでは、 ob_start('ob_gzhandler'); 関数を使わないでください。

header.php で圧縮する

実際のところ、ここで紹介する方法は公式に推奨されている方法ですが、少しだけ手法を変更しています。 公式に従った方法でなくても、十分な効果が得られるためです。これについては後に解説します。

Output Compression - WordPress.org WordPress の最適化/出力の圧縮 - Codex 日本語版

HTML タグの開始を出力するファイルを編集します。多くのテーマでは header.php ファイルでしょう。 そのファイルの先頭で ob_start('ob_gzhandler'); 関数を実行します。

<?php ob_start('ob_gzhandler'); ?>
<!DOCTYPE html>
<html lang="ja">
…

ob_start('ob_gzhandler'); 関数の挿入箇所

これで設定は終わりです。作業自体は 5 秒で済みますね。コピーして貼り付けて保存するだけです。 設定が完了したら gzip による圧縮が有効になったかどうかを確認します。

圧縮の確認

GIDNetwork のツールを使うと、 対象の URL からダウンロードされるデータが gzip で圧縮されているかどうかが分かります。 また、圧縮前後のデータ量も確認することができます。

A simple online web page compression / deflate / gzip test tool - GIDNetwork

日本語ドメインの場合には Punycode 変換を行って、アルファベットで構成された URL に変換しておく必要があります。

GID Network のキャプチャ画像。

GIDNetwork の画面

都合上画面を加工していますが、概ねこの画像の通りになります。 URL を入力し、Check で確認します。

gzip による圧縮に成功しているとき、Web page compressed? の項目が Yes になります。 一方で失敗しているとき、No になります。

残りの項目は圧縮についての情報を表示しています。 gzip による圧縮がいかに有効であるかは数値を見れば一目瞭然でしょう。 70% 以上圧縮されています。

ページによって圧縮率はまちまちですが、少なくとも 20% 以上圧縮されるのであれば、高速のために技術としては十分でしょう。

WordPress 公式の推奨

WordPress 公式では、 gzip による圧縮の恩恵を最大にするため、WordPress 本体の index.php で ob_start('ob_gzhandler'); 関数を実行するように推奨しています。 しかしながら、本体の index.php は、WordPress 本体の更新によって上書きされてしまいます。

本体の更新の度に、設定をやり直すことは手間がかかります。 また本体を更新はセキュリティのために絶対に行われるべきです。

ここに示した通り、テーマファイル内で圧縮を実行しても十分な結果が得られますから、 公式の通りに、本体の index.php で圧縮を実行する必要もないでしょう。

もしも更なる高速化が必要であるなら、高速化のためのプラグインを導入したほうが良いです。

圧縮できていない場合

もしも 圧縮が確認できない時は ob_end_flush(); 関数を実行します。

HTML の終了タグを出力するファイルを編集します。多くのテーマでは footer.php ファイルでしょう。 そのファイルの末尾で ob_end_flush(); 関数を実行します。

…
</body>
</html>
<?php ob_end_flush(); ?>

ob_end_flush(); 関数の挿入箇所