HTMLコードをMinify化(圧縮)してWordPressを高速化する方法
WordPress[※]で作成したサイトやブログのHTML[※]コードをMinify[※](圧縮)し、表示速度を高速します。具体的には、削除しても表示に問題のない文字列やスペースを、正規表現[※]を使用して、置き換え・削除を行います。
また、Minifyすることでソースコードの解読が難しくなりHTMLコードの盗用も防止できます。
WordPress Foundationによって開発されたオープンソース ブログプラットフォーム。プログラム言語がわからなくても管理画面からサイトやブログの作成が可能。
Webサイトのコンテンツを作成するために使用される言語でマークアップ言語の1つ。
ソースコードを圧縮して容量を軽量化すること。ここでの圧縮とは、動作に影響がでない改行やインデント、コメントなどの削除を行うこと。
1つの文字列で、複数の文字列を表現する方法。(例:0[789]0-\d{4}-\d{4} → すべての日本の携帯電話番号にマッチ)
目次
HTMLMinify手順
WordPressにインストールした子テーマに「header.php」と「footer.php」が存在しない場合は、親テーマから子テーマに「header.php」と「footer.php」をコピーしてください。存在する場合はコピーせずに次にお進みください。
(画像は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");
?>
The PHP Groupによって開発されたプログラミング言語。主にWebサイト制作に使用され、サーバー側で処理される。
メリット:サーバー側で処理するためユーザー側の設定が必要ない(ユーザー環境に左右されにくい)。また、ユーザーはプログラム処理後のコード(HTML)しか見ることができないためPHPコードの盗用も防止にもなる。
デメリット:サーバーで処理されるのでサイト表示後の処理はできない(JSなどブラウザなどで処理するプログラム言語ならば可能)。
フッターコードの編集
「footer.php」をWordPressのテーマファイルエディタなどで開き、下記のPHPコードを最下部に貼り付けてください。
(画像はCocoonの子テーマに張り付けた場合)
<?php ob_end_flush();?>
サイトの確認
テーマやプラグインなどの開発環境によっては、デザインが崩れるなどの不具合が生じる場合があります。不具合が生じた場合は、追記したコードを削除してください。サイトのデザイン、ソースコードを確認して問題なければ完了です。
HTMLMinify解説
WordPressテーマの「header.php」と「footer.php」に追記したPHPコード解説していきます。
ヘッダー追記コード解説
<?php
function html_minify($buffer) { ← ユーザー定義関数「html_minify」、変数「$buffer」にバッファ内容を代入
例:「\s」と「¥s」は同じ
$replace1 = array( ← 関数「preg_replace」で使用する置換え用文字列を変数「$replace1」のキーと値に代入する
‘/\s+</’ => ‘<‘, ← 配列キー:「/\s+</」、配列値:「<」
‘/>\s+/’ => ‘>’, ← 配列キー:「/>\s+/」、配列値:「>」
‘/(\s){2,}/’ => ‘\1’, ← 配列キー:「/(\s){2,}/」、配列値:「\1」
‘/<!–\s?[^\[].*?[^\]]\s?–>/s’ => ” ← 配列キー:「/<!–\s?[^\[].*?[^\]]\s?–>/s」、配列値:「」
);
$pattern = ‘/<(?:pre|textarea)(?: [^>]+)?>(.+?)<\/(?:pre|textarea)>/is’; ← 関数「preg_match_all」のマッチング処理用パターンを変数「$pattern」に代入する
if(preg_match_all($pattern, $buffer, $matches, PREG_SET_ORDER)) { ← 関数「preg_match_all」でマッチした場合は下記の処理を実行する
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”, ‘
’, $match[1]); ← 関数「preg_match_all」でマッチした文字列の改行を文字参照の改行「
」に置換えたものを配列「$replace2」に代入する(キーには「$key」を指定)
}
}
$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」に代入する
}
return $buffer; ← 呼び出し元に変数「$buffer」の値を返す
}
ob_start(“html_minify”); ← 出力のバッファリングをオンにして、引数にユーザー定義関数「html_minify」を指定する
?>
フッター追記コード解説
<?php
ob_end_flush(); ← 出力用バッファを送信し、出力のバッファリングをオフにする
?>
使用したPHP構文の解説
今回、コード内で使用したWordPressやPHPの構文を簡単に説明します。詳細な説明は「PHP公式」から確認してください。
【ジャンプ】 ▼array ▼array_keys ▼array_values ▼foreach ▼function ▼if ▼ob_end_flush ▼ob_start ▼preg_match_all ▼preg_replace ▼str_replace
- 書き方は他にも様々な書き方がある
- 最後のカンマは省略可能
- キーを省略した場合は0から始まる数字(添字)がキーに指定される
$aaa = array('bbb','ccc','ddd');
echo $aaa[0];
bbb
- 「特定の値」を指定すると指定した値のキーがすべて返される
- 「特定の値」を省略するとすべてのキーが返される
- 「特定の値」を指定して「型の比較」にtrueを指定すると、データ型を含めたキーを返す
- 「型の比較」のデフォルトはfalseでデータ型を含まないキーを返す
$aaa = array('bbb' => 'ccc', 'ddd' => 'eee');
var_dump(array_keys($aaa));
array(2) {
[0] => string(3) "bbb"
[1] => string(3) "ddd"
}
$aaa = array('bbb' => 'ccc', 'ddd' => 'eee');
var_dump(array_values($aaa));
array(2) {
[0]=>
string(3) "ccc"
[1]=>
string(3) "eee"
}
処理内容
}
- キーの処理も行いたい場合は「値代入用変数」を「キー代入用変数 => 値代入用変数」に置き換える
$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
処理内容
}
- 実引数には仮引数に渡したいデータを指定する
- 「return」で返し値(戻り値)を指定できる
- 仮引数代入用変数に任意の変数を指定すると、呼び出し時に指定した実引数が代入される
- 関数名を指定しない場合は「無名関数」または「クロージャ」と呼び、頻繁に呼び出さない関数の場合などに利用でき、変数などに代入できる
function aaa($bbb){
$ccc = $bbb . '4';
return $ccc
}
echo aaa(123);
1234
条件1に一致した場合の処理
} elseif(条件2) {
条件に一致せず、条件2に一致した場合の処理
} else {
すべての条件に一致しなかった場合の処理
}
- 上の条件から順番に判定される
- 条件に一致した場合は処理を実行した後、ifから抜ける
- ifの書き方は他にも様々存在する
- 新たな条件を追加したい場合は「elseif(条件)」を指定する
- 条件がすべて一致しなかった場合の処理を追加する場合は「else」を指定する
if (1==2) {
$aaa = 'b';
} else {
$aaa = 'c';
}
echo $aaa;
c
ob_start(); // バッファをオンにして以降を非表示
echo 'abc';
echo 'def';
echo 'ghi';
ob_end_flush();
abcdefghi
- 「コールバック関数」を指定することで出力バッファが送信されたタイミングでバッファがコールバック関数に渡される
- 「チェックサイズ」を指定したバイト数を超えるたびにバッファが送信される
- 「チェックサイズ」のデフォルトは「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
- マッチすれば「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"
}
}
- 「置換前」と「置換後」の正規表現は配列(複数)でも可能
- 「リミット」は置換を行う最大回数を指定できる
- 「リミット」のデフォルトは「-1」(制限なし)
- 「回数代入用変数」に変数を指定すると置換えた回数が返される
- 「preg」は「Perl compatible regular expression」(パール互換正規表現)の略で、「preg」を「ピーレグ」と読む場合もある
- 文字列で置換える場合は「str_replace」を使用する
$aaa = preg_replace('/d.f/','abc',abcdef);
echo $aaa;
abcabc
- 「置換前」と「置換後」の文字列は配列(複数)でも可能
- 「リミット」で置換を行う最大回数を指定できる
- 「リミット」のデフォルトは「-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
⇒ 改行1つ以上にマッチ
⇒ 空白文字1文字以上にマッチ
⇒ 任意の3文字にマッチ
⇒ aから始まってdで終わる文字列に最長マッチ(aとdの間には文字列などが含まれていなくてもよい)
⇒ aから始まってdで終わる文字列に最短マッチ(aとdの間には文字列などが含まれていなくてもよい)
⇒ aから始まってdで終わる文字列に最長マッチ(aとdの間には1文字以上含まれている必要あり)
⇒ aから始まってdで終わる文字列に最短マッチ(aとdの間には1文字以上含まれている必要あり)
⇒ 「」か「a」にマッチ
⇒ aの後のbが3文字以上、5文字以下の文字列にマッチ
ab{3,}
⇒ aの後のbが3文字以上の文字列にマッチ
ab{,3}
⇒ aの後のbが3文字以下の文字列にマッチ
⇒ 「abab」にマッチ(参照可能)
⇒ 「abab」にマッチ(参照不可能)
⇒ グループ化された2番目のマッチ結果「cd」を参照できる
⇒「a」または「b」以外にマッチ
⇒ 「abc」または「def」にマッチ
⇒文字列の「+」にマッチ
修飾子
⇒「abc」や「AbC」など、大文字と小文字の組み合わせすべてにマッチ
⇒「abc」や
「a
c」
など、aとcの間に文字列や改行が含まれている場合にマッチ
まとめ
HTMLMinifyを適用すると、コードの容量が減りサイトの高速化が期待されますが、JS[※]やCSS[※]のMinifyに比べ、HTMLは効果が薄いといわれています。そのため、少しでも不具合が起こる場合は適用しないことをオススメします。
ただし、サイトの高速化は小さなことの積み重ねが大事なので、不具合が起こらない場合や開発環境にあわせてコードを修正できる知識がある方は、高速化効果は0ではないので検討する価値はあると思います。
Brendan Eich氏によって設計されたプログラミング言語。WebサイトやWebアプリなど様々なプログラムに使用でき、クライアント側(ブラウザなど)で処理される。
メリット:クライアント側で処理するためサイト表示後の処理が可能。
デメリット:クライアント側で処理されるためユーザの環境によっては動かない(JSオフ設定など)。
Webサイトのスタイル(デザイン)を指示するための言語の一つ。