【WordPress】インデントと空行を強引に削除する

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【WordPress】インデントと空行を強引に削除する

2021-12-17 | ,

WordPressが出力するHTMLのインデントと空行を強引に削除したい!

SEO的には全く無意味だと思われ。自己満足のやつです。

概要

WordPressが出力するHTMLのインデントと空行を強引に文字置換で削除してしまいます。
WordPress本体やプラグインからHTMLが出力されますが、インデントのされ方がまちまちです。タブだったり、スペースが2つだったり4つだったり、そもそもそれぞれインデントの階層レベルがめちゃくちゃだったり。
それならいっそインデントなど要らぬ!という方向けのやり方です。ほぼほぼ消えます。(ほんの一部残ります)
ついでにタグの間にある空行も削除します。(巻き添え)

私のテスト環境、本番環境では特に問題は起きてませんが、自己責任でご使用ください。

環境

  • WordPress 5.8.2
  • PHP 7.4.26

手順書

WordPressのテーマフォルダの中のfunction.phpに下記を追加する。

add_action('template_redirect', function () {
    ob_start(function ($buf) {
        $buf = str_replace("\t",'',$buf);
        $buf = preg_replace("/(\r\n|\r)/","\n",$buf);
        $buf = preg_replace("/>\n[ \r\n]*</",">\n<",$buf);
        return $buf;
    });
});

アクションフックの中で出力されるHTMLを処理してる。

解説

何をしてるか簡単に解説します。

タブを削除する

$buf = str_replace("\t",'',$buf);

タブによるインデントを削除してます。
preタグの中のタブも消しちゃうので環境によってはこれはダメかもしれない。

改行コードを\nに統一する

$buf = preg_replace("/(\r\n|\r)/","\n",$buf);

このあとの処理をしやすくするために改行コードを\nに統一する。\n以外でも/r\r\nに統一しても良い。

タグの間にある空行を削除する

$buf = preg_replace("/>\n[ \r\n]*</",">\n<",$buf);

行末のタグ、改行とタグの間の半角スペースを削除してる。また、改行が連続してる場合は1つの改行にまとめてる。

これには副作用があって、例えばpreタグやcodeタグの中でHTMLのサンプルコードなどを載せていると、この条件に合う本来は消したくないインデントも消えてしまう。この副作用が起きやすい言語でパッと思いつくのはHTMLやHTMLが混ざってくるPHPなんだけど他でも<を行頭、>を行末で使う言語で発生する恐れあり。

課題

  • scriptタグやstyleタグの中の空行が残る。
  • タグの属性間で改行後のインデントが残る。
  • preタグやcodeタグの中の消したくないインデントが消えてしまう可能性がある。(前述の副作用)

あんまりやりすぎると

まとめ(感想文)

こじつけ気味ですが、不要なインデントと空行を消すことのメリット・デメリットを挙げてみる。

メリット

  • 下手にめちゃくちゃなインデントされるよりは見た目がキレイ。(諸説あり)
  • 文字数が減ってるのでデータ通信による負荷は微減。本当に減。

デメリット

  • 文字列操作の処理の分、サーバーの負荷が増加する。

うん!改めて上記を書き出してみて、これは自己満足であることを再確認。

WordPressが出力するHTMLのインデントや空行が気になる方はやってみても良いかもね!