Home WordPress WP高速化 HTMLコードをMinify化(圧縮)してWordPressを高速化する方法

HTMLコードをMinify化(圧縮)してWordPressを高速化する方法

HTML Minifyの画像

 WordPress[※]で作成したサイトやブログのHTML[※]コードをMinify[※](圧縮)し、表示速度を高速します。具体的には、削除しても表示に問題のない文字列やスペースを、正規表現[※]を使用して、置き換え・削除を行います。
 また、Minifyすることでソースコードの解読が難しくなりHTMLコードの盗用も防止できます。

WordPressワードプレス
WordPress Foundationワードプレス ファウンデイションによって開発されたオープンソース ブログプラットフォーム。プログラム言語がわからなくても管理画面からサイトやブログの作成が可能。
HyperText Markup Languageハイパーテキスト マークアップ ランゲージ (HTMLエイチティーエムエル)
Webサイトのコンテンツを作成するために使用される言語でマークアップ言語の1つ。
Minifyミニファイ
ソースコードを圧縮して容量を軽量化すること。ここでの圧縮とは、動作に影響がでない改行やインデント、コメントなどの削除を行うこと。
正規表現
1つの文字列で、複数の文字列を表現する方法。(例:0[789]0-\d{4}-\d{4} → すべての日本の携帯電話番号にマッチ)

目次

HTMLMinify手順

 WordPressにインストールした子テーマに「headerヘッダー.php」と「footerフッター.php」が存在しない場合は、親テーマから子テーマに「header.php」と「footer.php」をコピーしてください。存在する場合はコピーせずに次にお進みください。
(画像はCocoon[※]の親テーマから子テーマにコピーした場合)

Cocoonの親テーマから子テーマにコピペの画像
Cocoonコクーン
検索エンジン対策・高速化・モバイルフレンドリーに最適化した無料テーマ。
子テーマにファイルを上書きするとカスタマイズしたデザインが初期化されるので、足りないファイルのみコピーしてください。

ヘッダーコードの編集

 「header.php」をWordPressのテーマファイルエディタなどで開き、下記のPHP[※]コードを最上部に貼り付けてください
(画像はCocoonの子テーマに張り付けた場合)

<?php
function html_minify($buffer) {
    $replace1 = array(
        '/\s+</' => '<',
        '/>\s+/' => '>',
        '/(\s){2,}/' => '\1',
        '/<!--\s?[^\[].*?[^\]]\s?-->/s' => ''
    );
    $pattern =<strong> </strong>'/<(?:pre|textarea)(?: [^>]+)?>(.+?)<\/(?:pre|textarea)>/is';
    if(preg_match_all($pattern, $buffer, $matches, PREG_SET_ORDER)) {
        foreach($matches as $match) {
            $key = preg_replace(array_keys($replace1), array_values($replace1), $match[1]);
            $replace2[$key] = str_replace("\n", '
', $match[1]);
        }
    }
    $buffer = preg_replace(array_keys($replace1), array_values($replace1), $buffer);
    if(!empty($replace2)) {
        $buffer = str_replace(array_keys($replace2), array_values($replace2), $buffer);
    }
    return $buffer;
}
ob_start("html_minify");
?>
CocoonヘッダーにMinifyコードコピペの画像
PHPピーエイチピー
The PHP Groupザ ピーエイチピー グループによって開発されたプログラミング言語。主にWebサイト制作に使用され、サーバー側で処理される。
メリット:サーバー側で処理するためユーザー側の設定が必要ない(ユーザー環境に左右されにくい)。また、ユーザーはプログラム処理後のコード(HTML)しか見ることができないためPHPコードの盗用も防止にもなる。
デメリット:サーバーで処理されるのでサイト表示後の処理はできない(JSなどブラウザなどで処理するプログラム言語ならば可能)

フッターコードの編集

 「footer.php」をWordPressのテーマファイルエディタなどで開き、下記のPHPコードを最下部に貼り付けてください
(画像はCocoonの子テーマに張り付けた場合)

<?php ob_end_flush();?>
CocoonフッターにMinifyコードコピペの画像
「ob_end_flush()」は省略しても動作はしますが、マニュアル通りフッターに記述しています。

サイトの確認

 テーマやプラグインなどの開発環境によっては、デザインが崩れるなどの不具合が生じる場合があります。不具合が生じた場合は、追記したコードを削除してください。サイトのデザイン、ソースコードを確認して問題なければ完了です

HTMLMinify解説

 WordPressテーマの「header.php」と「footer.php」に追記したPHPコード解説していきます

ヘッダー追記コード解説

<?php
function html_minify($buffer) { ← ユーザー定義関数「html_minify」、変数「$buffer」にバッファ内容を代入

HTML Minify PHPコード1解説の画像
「\」(バックスラッシュ)と「¥」(円マーク)は同様の機能をもつ
例:「\s」と「¥s」は同じ

$replace1 = array( ← 関数「preg_replace」で使用する置換え用文字列を変数「$replace1」のキーと値に代入する
    ‘/\s+</’ => ‘<‘, ← 配列キー:「/\s+</」、配列値:「<」
    ‘/>\s+/’ => ‘>’, ← 配列キー:「/>\s+/」、配列値:「>」
    ‘/(\s){2,}/’ => ‘\1’, ← 配列キー:「/(\s){2,}/」、配列値:「\1」
    ‘/<!–\s?[^\[].*?[^\]]\s?–>/s’ => ” ← 配列キー:「/<!–\s?[^\[].*?[^\]]\s?–>/s」、配列値:「」
);

HTML Minify PHPコード2解説の画像
キーに記述されている文字列は「正規表現」と呼ばれ、使用している正規表現の詳細は後述する
キーに記述されている「/」(スラッシュ)を「デリミタ」と呼び、囲まれた範囲が正規表現の対象となる。また、区切り文字などもデリミタと呼ぶ(デリミタは別の記号でもよい)
文字列は「’」または「”」で囲む必要がある

$pattern = ‘/<(?:pre|textarea)(?: [^>]+)?>(.+?)<\/(?:pre|textarea)>/is’; ← 関数「preg_match_all」のマッチング処理用パターンを変数「$pattern」に代入する
if(preg_match_all($pattern, $buffer, $matches, PREG_SET_ORDER)) { ← 関数「preg_match_all」でマッチした場合は下記の処理を実行する

HTML Minify PHPコード3解説の画像

    foreach($matches as $match) { ← 関数「preg_match_all」でマッチしたすべての文字列に下記の処理を順番実行する
        $key = preg_replace(array_keys($replace1), array_values($replace1), $match[1]); ← 関数「preg_match_all」でマッチした文字列を「$replace1」で設定した置換え処理を行ったものを変数「$key」に代入する
        $replace2[$key] = str_replace(“\n”, ‘&#xA;’, $match[1]); ← 関数「preg_match_all」でマッチした文字列の改行を文字参照の改行「&#xA;」に置換えたものを配列「$replace2」に代入する(キーには「$key」を指定)
    }
}

HTML Minify PHPコード4解説の画像
HTMLの改行は「<br>」で記述するが、「pre」や「textarea」タグで囲まれている場合は「通常の改行」で記述する

$buffer = preg_replace(array_keys($replace1), array_values($replace1), $buffer); ← 変数「$buffer」を「$replace1」で設定した置換え処理を行ったものを変数「$buffer」に代入する
if(!empty($replace2)) { ← 配列「$replace2」が空でなければ下記の処理を実行する
    $buffer = str_replace(array_keys($replace2), array_values($replace2), $buffer); ← 変数「$buffer」を「$replace2」で設定した置換え処理を行ったものを変数「$buffer」に代入する
}

HTML Minify PHPコード5解説の画像

return $buffer; ← 呼び出し元に変数「$buffer」の値を返す
}
ob_start(“html_minify”); ← 出力のバッファリングをオンにして、引数にユーザー定義関数「html_minify」を指定する
?>

HTML Minify PHPコード6解説の画像

フッター追記コード解説

<?php
ob_end_flush(); ← 出力用バッファを送信し、出力のバッファリングをオフにする
?>

HTML Minify PHPコード7解説の画像

使用したPHP構文の解説

 今回、コード内で使用したWordPressやPHPの構文を簡単に説明します。詳細な説明は「PHP公式」から確認してください。

【ジャンプ】 ▼array  ▼array_keys  ▼array_values  ▼foreach  ▼function  ▼if  ▼ob_end_flush  ▼ob_start  ▼preg_match_all  ▼preg_replace  ▼str_replace 

arrayアレイ
配列を作成する方法の一つです。
【書き方】
配列名 = array(キー1 => 値1, キー2 => 値2, …)
【呼び出し方】
配列名[キー名]
【備考】
  • 書き方は他にも様々な書き方がある
  • 最後のカンマは省略可能
  • キーを省略した場合は0から始まる数字(添字)がキーに指定される
【任意のファイルに記載】

$aaa = array('bbb','ccc','ddd');

echo $aaa[0];

【実行結果】

bbb

array_keysアレイ キーズ
配列のすべての「キー」だけを取り出します。取り出した「キー」には新たに添字が振られます。
【書き方】
array_keys(配列,特定の値,型の比較)
【備考】
  • 「特定の値」を指定すると指定した値のキーがすべて返される
  • 「特定の値」を省略するとすべてのキーが返される
  • 「特定の値」を指定して「型の比較」にtrueを指定すると、データ型を含めたキーを返す
  • 「型の比較」のデフォルトはfalseでデータ型を含まないキーを返す
【任意のファイルに記載】

$aaa = array('bbb' => 'ccc', 'ddd' => 'eee');

var_dump(array_keys($aaa));

【実行結果】

array(2) {
  [0] => string(3) "bbb"
  [1] => string(3) "ddd"
}

array_valuesアレイ バリューズ
配列のすべての「値」だけを取り出します。取り出した「値」には新たに添字が振りなおされます。
【書き方】
array_values(配列)
【任意のファイルに記載】

$aaa = array('bbb' => 'ccc', 'ddd' => 'eee');

var_dump(array_values($aaa));

【実行結果】

array(2) {
  [0]=>
  string(3) "ccc"
  [1]=>
  string(3) "eee"
}

foreachフォーイーチ
配列に含まれる値やキーを順番に処理することができ、配列にある値の数だけ繰返し処理されます。
【書き方】
foreach(配列 as 値代入用変数){
  処理内容
}
【備考】
  • キーの処理も行いたい場合は「値代入用変数」を「キー代入用変数 => 値代入用変数」に置き換える
【任意のファイルに記載】

$aaa = array('1', '2', '3');

foreach ($aaa as $bbb => $ccc) {
  echo $bbb . ' + ' . $ccc . ' = ' . $bbb + $ccc . '<br>';
}

【実行結果】

0 + 1 = 1
1 + 2 = 3
2 + 3 = 5

functionファンクション
独自の関数を作成することができます。
【書き方】
function 任意の関数名(仮引数代入用変数){
 処理内容
}
【呼び出し方】
関数名(実引数)
【備考】
  • 実引数には仮引数に渡したいデータを指定する
  • returnリターン」で返し値(戻り値)を指定できる
  • 仮引数代入用変数に任意の変数を指定すると、呼び出し時に指定した実引数が代入される
  • 関数名を指定しない場合は「無名関数」または「クロージャ」と呼び、頻繁に呼び出さない関数の場合などに利用でき、変数などに代入できる
【任意のファイルに記載】

function aaa($bbb){
  $ccc = $bbb . '4';
  return $ccc
}

echo aaa(123);

【実行結果】

1234

ifイフ
条件によって処理を分岐できます。
【書き方】
if(条件1){
  条件1に一致した場合の処理
} elseif(条件2) {
  条件に一致せず、条件2に一致した場合の処理
} else {
  すべての条件に一致しなかった場合の処理
}
【備考】
  • 上の条件から順番に判定される
  • 条件に一致した場合は処理を実行した後、ifから抜ける
  • ifの書き方は他にも様々存在する
  • 新たな条件を追加したい場合は「elseifエルスイフ(条件)」を指定する
  • 条件がすべて一致しなかった場合の処理を追加する場合は「elseエルス」を指定する
【任意のファイルに記載】

if (1==2) {
  $aaa = 'b';
} else {
  $aaa = 'c';
}

echo $aaa;

【実行結果】

c

ob_end_flushオービー エンド フラッシュ
バッファリング[※]をオフにして、バッファ[※]の内容を送信(フラッシュ)する。また、バッファの内容もクリアする。
【書き方】
ob_end_flush();
【任意のファイルに記載】

ob_start(); // バッファをオンにして以降を非表示
echo 'abc';
echo 'def';
echo 'ghi';
ob_end_flush();

【実行結果】

abcdefghi

ob_startオービー スタート
バッファリング[※]をオンにして、「ob_start」以降を表示せずにバッファ[※]に保存します。
【書き方】
ob_start(コールバック関数,チェックサイズ,フラグ);
【備考】
  • 「コールバック関数」を指定することで出力バッファが送信されたタイミングでバッファがコールバック関数に渡される
  • 「チェックサイズ」を指定したバイト数を超えるたびにバッファが送信される
  • 「チェックサイズ」のデフォルトは「0」でサイズを無視する
  • 「フラグ」を指定すると使用できるバッファ操作関数を設定できる
  • 「フラグ」のデフォルトは「PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE」で送信や削除などすべての関数が使用できる
【任意のファイルに記載】

ob_start();
echo 'abc';
echo 'def';
echo 'ghi';
$aaa = ob_get_contents(); // バッファの内容を取得
ob_end_clean(); // バッファリングをオフにしてバッファの内容をクリア

echo $aaa;

【実行結果】

abcdefghi

preg_match_allプレグ・マッチ・オール
正規表現を使った検索を行い、すべてのマッチ結果の配列を返す。1つ目のマッチ結果だけが必要ない場合は「preg_match」を使用する。
【書き方】
preg_match_all(検索ワード,検索対象,検索結果代入用変数,フラグ,オフセット)
【呼び出し方】
検索結果代入用変数方文
【備考】
  • マッチすれば「1」、マッチしなければ「0」、エラーがおきれば「false」を返す
  • 「検索ワード」には正規表現を使用できる
  • 「検索対象」には「文字列」や「変数」を指定する
  • 「検索結果代入用変数」を省略した場合は「1」「0」「false」のみ返される、変数を指定した場合は検索結果が配列で代入される
  • 「検索結果代入用変数」に変数を指定している場合で、「フラグ」を指定した場合、返される配列の並び順などを変更できる
  • 「フラグ」のデフォルト値は「PREG_PATTERN_ORDER」で、キー「0」がキャプチャ全体で、キー「1」がキャプチャのマッチ箇所の並び順の配列が返される
  • 「オフセット」は検索の開始位置をバイト単位で指定できる
  • 「オフセット」を省略した場合は先頭から検索する
【任意のファイルに記載】

if(preg_match_all('/a(.+?)c/','abcdea1c',$aaa)) {
  var_dump($aaa);
}

【実行結果】

array(2) {
  [0] =>
  array(2) {
    [0]=>
    string(3) "abc"
    [1]=>
    string(3) "a1c"
  }
  [1]=>
    array(2) {
    [0]=>
    string(1) "b"
    [1]=>
    string(1) "1"
  }
}

preg_replaceプレグ・リプレイス
正規表現を使った置換ができる。
【書き方】
preg_replace(置換前,置換後,置換対象,リミット,回数代入用変数)
【備考】
  • 「置換前」と「置換後」の正規表現は配列(複数)でも可能
  • 「リミット」は置換を行う最大回数を指定できる
  • 「リミット」のデフォルトは「-1」(制限なし)
  • 「回数代入用変数」に変数を指定すると置換えた回数が返される
  • 「preg」は「Perl compatible regular expressionパール・コンパティブル・レギュラー・エクスプレッション(パール互換正規表現)の略で、「preg」を「ピーレグ」と読む場合もある
  • 文字列で置換える場合は「str_replace」を使用する
【任意のファイルに記載】

$aaa = preg_replace('/d.f/','abc',abcdef);

echo $aaa;

【実行結果】

abcabc

str_replaceストラ・リプレイス
文字列を置換できる。
【書き方】
str_replace(置換前,置換後,置換対象,リミット,回数代入用変数)
【備考】
  • 「置換前」と「置換後」の文字列は配列(複数)でも可能
  • 「リミット」で置換を行う最大回数を指定できる
  • 「リミット」のデフォルトは「-1」(制限なし)
  • 「回数代入用変数」に変数を指定すると置換えた回数が返される
  • 「str」は「stringストリング(文字列)の略で「str」を「エスティーアール」や「ストリング」と読むこともある
  • 正規表現で置換える場合は「preg_replace」を使用する
【任意のファイルに記載】

$aaa = str_replace('abc','def',abcdef);

echo $aaa;

【実行結果】

defdef

データ型
「数値型」「文字列型」など、さまざまな型があり正しく指定しないと同じ値でも違う意味となる。
(PHPでは自動で型変換が行われるので文字列型が数値型に変換される場合があります)
[JS例]数値型:1 + 1 → 2
[JS例]文字列型:'1' + '1' → 11
バッファリング
専用の記憶領域に一時的にデータを保存し様々な処理を行うこと。
バッファ
一時的にデータを保存するための記憶領域。

使用した正規表現の解説

 今回、コード内で使用した正規表現と修飾子を簡単に説明します(説明に出てくる「…」は任意の文字列や任意の正規表現を表しています)(装飾子の説明に出てくるデミリタは「/」で説明しています)

正規表現

【ジャンプ】 ▼\n  ▼\s  ▼.  ▼*  ▼*?  ▼+  ▼+?  ▼?  ▼…{…,…}  ▼(…)  ▼(?:…)  ▼\1 \2 \3 …  ▼[^…]  ▼…|…  ▼\  ▼/…/i  ▼/…/s 

\n
改行(LF)にマッチ。
\n+
⇒ 改行1つ以上にマッチ
\s
次の空白文字にマッチ、半角スペース、タブ、改ページ、復帰(CR)、改行(LF)。大文字にすると否定となるので注意。
\s+
⇒ 空白文字1文字以上にマッチ
.
任意の1文字にマッチ。改行以外に対応。
...
⇒ 任意の3文字にマッチ
*
文字列や正規表現の0回以上の繰り返しに最長マッチ。最短マッチにする場合は後ろに?をつける。
a.*d
⇒ aから始まってdで終わる文字列に最長マッチ(aとdの間には文字列などが含まれていなくてもよい)
*?
文字列や正規表現の0回以上の繰り返しに最短マッチ。最長マッチにする場合は後ろに?をつけない。
a.*?d
⇒ aから始まってdで終わる文字列に最短マッチ(aとdの間には文字列などが含まれていなくてもよい)
+
文字列や正規表現の1回以上の繰り返しに最長マッチ。最短マッチにする場合は後ろに?をつける。
a.+d
⇒ aから始まってdで終わる文字列に最長マッチ(aとdの間には1文字以上含まれている必要あり)
+?
文字列や正規表現の1回以上の繰り返しに最短マッチ。最長マッチにする場合は後ろに?をつけない。
a.+?d
⇒ aから始まってdで終わる文字列に最短マッチ(aとdの間には1文字以上含まれている必要あり)
?
0回または1回の文字列や正規表現にマッチ。
a?
⇒ 「」か「a」にマッチ
…{…,…}
指定した回数の範囲での繰り返しにマッチ。
ab{3,5}
⇒ aの後のbが3文字以上、5文字以下の文字列にマッチ
ab{3,}
⇒ aの後のbが3文字以上の文字列にマッチ
ab{,3}
⇒ aの後のbが3文字以下の文字列にマッチ
(…)
()で囲まれたパターンをグループ化。マッチ後、参照できる。
(ab){2}
⇒ 「abab」にマッチ(参照可能)
(?:…)
(?:)で囲まれたパターンをグループ化。マッチ後、参照できない。
(?:ab){2}
⇒ 「abab」にマッチ(参照不可能)
\1 \2 \3 …
グループ化された、…番目のマッチ結果を参照。
グループ化された「ab」と「cd」と「ef」にマッチ後「\2」で参照
⇒ グループ化された2番目のマッチ結果「cd」を参照できる
[^…]
[^]で囲まれた任意の1文字以外にマッチ。複数文字指定可能。
[^ab]
⇒「a」または「b」以外にマッチ
…|…
|で区切られたパターンのいずれかにマッチ。
abc|def
⇒ 「abc」または「def」にマッチ
\
正規表現に使用される記号の前に\をつけると文字列として扱える。
\+
⇒文字列の「+」にマッチ
最長マッチと最短マッチ(後ろに?をつける)ではマッチ結果が異なるので注意してください。例として「abbbcabbbc」のような文字列があった場合、最長マッチの正規表現例が「a.*c」だったとすると「abbbcabbbc」にマッチします。最短マッチの正規表現例が「a.*?c」だったとすると「abbbc」にマッチします。

修飾子

/…/i
デミリタに修飾子iをつけることで、マッチング結果にアルファベットの大文字と小文字を区別しない。
/abc/i
⇒「abc」や「AbC」など、大文字と小文字の組み合わせすべてにマッチ
/…/s
デミリタに修飾子sをつけることで、正規表現の「.」(ドット)に 改行も含める。
/a.c/s
⇒「abc」や
「a
c」
など、aとcの間に文字列や改行が含まれている場合にマッチ

まとめ

 HTMLMinifyを適用すると、コードの容量が減りサイトの高速化が期待されますが、JS[※]やCSS[※]のMinifyに比べ、HTMLは効果が薄いといわれています。そのため、少しでも不具合が起こる場合は適用しないことをオススメします。
 ただし、サイトの高速化は小さなことの積み重ねが大事なので、不具合が起こらない場合や開発環境にあわせてコードを修正できる知識がある方は、高速化効果は0ではないので検討する価値はあると思います。

JavaScriptジャバスクリプト (JSジェーエス)
Brendan Eichブレンダン・アイク氏によって設計されたプログラミング言語。WebサイトやWebアプリなど様々なプログラムに使用でき、クライアント側(ブラウザなど)で処理される。
メリット:クライアント側で処理するためサイト表示後の処理が可能。
デメリット:クライアント側で処理されるためユーザの環境によっては動かない(JSオフ設定など)
Cascading Style Sheetsカスケーディング スタイル シート (CSSシーエスエス)
Webサイトのスタイル(デザイン)を指示するための言語の一つ。