WordPress の header をキレイに整える荒技
WordPress で テーマを Simplicity1.4.4 にバージョンアップしたら、
一部の Javascript が動作しないという現象が発生した。
header 内の Javascript の読み込み順序が変わって、
JQuery の読み込みが後回しになってるのが原因だった。
だが、これを機に、
以前からやろうと思っていた、
WordPress の header をキレイに整える荒技
を使うことにした。
とどのつまり、
Wordpress では、テーマやプラグインが、それぞれに
meta、link、javascript のタグをバラバラに読み込むので、
これを、キレイに整えようというわけだ。
この技を使う場合の注意点
- この技は、Wordpress テーマの大半で使えるが、使えないテーマもあるかもしれません。
- ハッキリ言って「荒技」に相当するものなので、
もし、やる場合は自己責任でお願いします。 - この技を使っても、HTMLソースの見た目が見やすくなるというだけで、
それ以外の利点は全くありません。 - おいらが WordPress をいじってる間に、
ふと思いついただけのテクニックなので突っ込み不要。
実際にやってみる
functions.php に以下を追加するだけです。
add_action( 'template_redirect', 'get_header_thk', 99 );
function get_header_thk() {
if( is_feed() ) { return; }
ob_start();
get_header();
$head = ob_get_contents();
ob_end_clean();
// link の記述を一カ所にまとめる
preg_match_all( "/<link [^>]+?>/s", $head, $rel_array );
$head = preg_replace( "/<link [^>]+?>/s", "", $head );
foreach( array_unique( $rel_array[0] ) as $rel ) {
$head = str_replace( "</head>", $rel . "\n</head>", $head );
}
// style の記述を一カ所にまとめる
preg_match_all( "/<style.+?<\/style>/s", $head, $style_array );
$head = preg_replace( "/<style .+?<\/style>/s", "", $head );
foreach( array_unique( $style_array[0] ) as $style ) {
$head = str_replace( "</head>", $style . "\n</head>", $head );
}
// script を一カ所にまとめる
preg_match_all( "/<script.+?<\/script>/s", $head, $script_array );
$head = preg_replace( "/<script .+?<\/script>/s", "", $head );
foreach( array_unique( $script_array[0] ) as $key => $script ) {
// jquery を優先して先に表示させる
if( stristr( $script, "jquery" ) ) {
$head = str_replace( "</head>", $script . "\n</head>", $head );
unset( $script_array[0][$key] );
}
}
foreach( array_unique( $script_array[0] ) as $script ) {
$head = str_replace( "</head>", $script . "\n</head>", $head );
}
// 連続改行やタブ等を削除
$head = str_replace( "'", '"', $head );
$head = str_replace( array("\r\n","\r"), "\n", $head );
$head = str_replace( "\t", "", $head );
$head = preg_replace( "/<!-- .+? -->/", "", $head );
$head = preg_replace( "/\n\s+</", "\n<", $head );
$head = preg_replace( "/>\s+\n/", ">\n", $head );
$head = preg_replace( "/\n+/", "\n", $head );
echo $head;
}
2015/01/26 追記: ちょこっと修正。style も一カ所にまとめるようにしました
2015/01/27 追記: 重大なバグ修正。
Feed でもヘッダー出力するバグがあったので、4行目に Feed の場合は何もしない処理を追加
特に肝になる部分は、1行目と、6行目から9行目。
本来なら、get_header は、header.php を呼ぶだけなので、
add_filter 等を使っても、いじれないのだが、
それを、ob_get_contents で、無理矢理かすめ取ってしまうこと。
結果
上記のコードを function.php に追加すると
どーなるかと言うと
例えば ↓ このような HEADER であれば
<html lang="ja">
<head>
<title>タイトル</title>
<meta name="description" content="サイトの説明" />
<link rel="stylesheet" href="aaa.css">
<meta name="viewport" content="maximum-scale=1, user-scalable=yes" />
<link rel="stylesheet" href="bbb.css" />
<script type="text/javascript" src="./111.js"></script>
<link rel="alternate" type="application/rss+xml" title="Feed" href="https://thk.kanzae.net/feed/" />
<link rel='stylesheet' href='./ccc.css' type='text/css' media='all' />
<link rel='stylesheet' href='./ddd.css' type='text/css' media='all' />
<script type='text/javascript' src='./jquery.js'></script>
<script type='text/javascript' src='./jquery-migrate.min.js'></script>
<script type='text/javascript' src='./222.js'></script>
</head>
↓ こんな感じに、HTML ソースが見やすくなります。
上との違いは
- link、javascript などのタグが一塊になった
- 余計な連続改行やタブ・行頭空白・行末空白も削除
- クォートをダブルクォートに統一
そんだけです (・ω・`)
<html lang="ja">
<head>
<title>タイトル</title>
<meta name="description" content="サイトの説明" />
<meta name="viewport" content="maximum-scale=1, user-scalable=yes" />
<link rel="stylesheet" href="aaa.css" />
<link rel="stylesheet" href="bbb.css" />
<link rel="alternate" type="application/rss+xml" title="Feed" href="https://thk.kanzae.net/feed/" />
<link rel="stylesheet" href="./ccc.css" type="text/css" media="all" />
<link rel="stylesheet" href="./ddd.css" type="text/css" media="all" />
<script type="text/javascript" src="./jquery.js"></script>
<script type="text/javascript" src="./jquery-migrate.min.js"></script>
<script type="text/javascript" src="./111.js"></script>
<script type="text/javascript" src="./222.js"></script>
</head>
実はいろんな用途に使える
PHP が分かるなら
str_replace や preg_replace でヘッダー内の文字列を置換したり
この技を使うと、実はいろんなことができたりします。
まぁ、Wordpress の場合、
add_filter や add_action で、大抵のことは出来ますが、
こんな荒技も使ってみました。
ディスカッション
コメント一覧
便利だなーと思って使わせていただいたのですが、なぜかscriptだけ(facebookボタンのSDKとアナリティクスコード)が/headの上にコピーされてしまい2重表示になりました。
テーマはSTINGER8です。こちらのブログはsimplicityのようでしたのでやっぱり相性でしょうか。残念です。
念のための報告コメントとさせていただきました。
Lognote さん。
なぜかというより、この記事の技は、header.php 内に書かれている script を head タグ内の一箇所にまとめる技なので、
自分で facebook の script を header.php に追加すれば当然そうなります。
通常、facebook 等の script 類はレンダリングの邪魔にならないよう footer.php に書きます。
お返事ありがとうございます。
そうなんですか! フッターに!
公式では「<body>開始タグの直後に」と書かれているのでいつもそう書いていました……
Facebookより気になるのはアナリティクスコードなのですがこれもフッターに書くものですか?
Lognote さん。
インラインのスクリプトは、基本的に<body></body>内ならどこでもいいですが、
まぁ、ほとんどの場合は footer に書きます。
外部ファイルの読み込み、つまり
<script src="~"></script>
↑ このような書き方のものは、
<head></head> 内もしくは、</body> 直前。
インラインのスクリプト、つまり
<script>
~
</script>
↑ このような書き方のものは、
DOM 操作が必要なものは </body> 直前、
DOM 操作が不要なものは <body> より下のHTMLのどこかに書きます。
Analytics は、DOM 操作不要ですが、ほとんどの場合は、footer に書くのが普通です。
どうしても、「<body> 直下に書きたい」というのであれば、
記事内の functions.php に追加するコードの
26行目、27行目
を
にすれば良いかと思います。