WordPressが吐き出すHTMLのheadタグ内を整理統合することでクライアント側の処理を最適化し表示の高速化を図る人気のプラグイン「Head Cleaner」ですが、現バージョン(1.4.2.12)に於いてheader.php等で外部CDNのJavaScriptやCSSを読み込むため以下のような記述をしていると…
wp_enqueue_style('font-awesome', '//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css');
wp_enqueue_script('jquery','//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js');
それぞれフルパスで「DNSプリフェッチ」(dns-prefetch)を出力してしまう模様。
<link rel="dns-prefetch" href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css">
<link rel="dns-prefetch" href="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js">
別にエラーにはならないけれど、DNSプリフェッチのhref部はドメインだけで構わないのでドメインより後ろを取り除きつつ重複を除去するようhead-cleaner.phpを一部修正。
list($css_tag, $inline_css) = $this->_parse_stylesheet_tag($dom->find("link[rel*='stylesheet']"), $dom->find("style"), $other_domain);
list($script_tag, $inline_js, $foot_js) = $this->_parse_script_tag($dom->find("script"), $other_domain);
$noscript_tag = $this->_dom_to_html($dom->find("noscript"));
$object_tag = $this->_dom_to_html($dom->find("object"));
$object_tag .= $this->_rdf_convert($dom->find("rdf:RDF"));
// 追加ここから ↓↓↓↓↓↓↓↓↓↓
$other_domain = array_map(function($domain) {
return preg_replace('/(\/\/[^\/]+)\/?.*$/i', '$1', $domain);
}, $other_domain);
$other_domain = array_values(array_unique($other_domain));
// 追加ここまで ↑↑↑↑↑↑↑↑↑↑
if ( $this->options['dns-prefetch'] && count($other_domain) > 0 ) {
$dns_prefetch = '';
foreach ( $other_domain as $domain ) {
$dns_prefetch .= sprintf('<link rel="dns-prefetch" href="%s" />' . "\n", $domain);
}
$link_tag = $dns_prefetch . $link_tag;
}
685行目あたりに上記のようなロジックを追加すれば問題を回避出来ます。