WordPress用プラグイン「Head Cleaner」のDNSプリフェッチ出力不具合を回避

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行目あたりに上記のようなロジックを追加すれば問題を回避出来ます。

    この記事へのコメント

    メールアドレスが公開されることはありません。

    頂戴したコメントは管理者に承認されるまで表示されません。