プラグインを使わずに、wp_head()の不要コードを消す方法

プラグインを使わずに、wp_head()の出力する不要なコードを削除して整理する

wp_head()によって出力される、<head></head>タグ内を整理する。

wp_head()で挿入されるタグについては、/wp-includes/default-filters.phpファイルで、wp_headと検索することで調べる事が出来ます。
今後新しいタグが増えた場合も、上記の方法で対応可能です。

デフォルトのソース

wp_head()が出力するデフォルトの<head></head>タグの表示です。

<head>
<meta charset="UTF-8">
〜〜〜 省略 〜〜〜
<link rel='dns-prefetch' href='//s.w.org' />
<link rel="alternate" type="application/rss+xml" title="WPQW » フィード" href="https://wpqw.jp/feed/" />
<link rel="alternate" type="application/rss+xml" title="WPQW » コメントフィード" href="https://wpqw.jp/comments/feed/" />
<script type="text/javascript">
	window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/12.0.0-1\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/12.0.0-1\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/wpqw.jp\/wp\/wp-includes\/js\/wp-emoji-release.min.js"}};
	!function(a,b,c){function d(a,b){var c=String.fromCharCode;l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,a),0,0);var d=k.toDataURL();l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,b),0,0);var e=k.toDataURL();return d===e}function e(a){var b;if(!l||!l.fillText)return!1;switch(l.textBaseline="top",l.font="600 32px Arial",a){case"flag":return!(b=d([55356,56826,55356,56819],[55356,56826,8203,55356,56819]))&&(b=d([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]),!b);case"emoji":return b=d([55357,56424,55356,57342,8205,55358,56605,8205,55357,56424,55356,57340],[55357,56424,55356,57342,8203,55358,56605,8203,55357,56424,55356,57340]),!b}return!1}function f(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var g,h,i,j,k=b.createElement("canvas"),l=k.getContext&&k.getContext("2d");for(j=Array("flag","emoji"),c.supports={everything:!0,everythingExceptFlag:!0},i=0;i<j.length;i++)c.supports[j[i]]=e(j[i]),c.supports.everything=c.supports.everything&&c.supports[j[i]],"flag"!==j[i]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[j[i]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(h=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",h,!1),a.addEventListener("load",h,!1)):(a.attachEvent("onload",h),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),g=c.source||{},g.concatemoji?f(g.concatemoji):g.wpemoji&&g.twemoji&&(f(g.twemoji),f(g.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
	display: inline !important;
	border: none !important;
	box-shadow: none !important;
	height: 1em !important;
	width: 1em !important;
	margin: 0 .07em !important;
	vertical-align: -0.1em !important;
	background: none !important;
	padding: 0 !important;
}
</style>
〜〜〜 省略 〜〜〜
<link rel='https://api.w.org/' href='https://wpqw.jp/wp-json/' />
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://wpqw.jp/wp/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://wpqw.jp/wp/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress 5.2.2" />
〜〜〜 ↓記事ページの場合 〜〜〜
<link rel="canonical" href="https://wpqw.jp/wordpress/post2/" />
<link rel='shortlink' href='https://wpqw.jp/?p=2' />
<link rel="alternate" type="application/json+oembed" href="https://wpqw.jp/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwpqw.jp%2Fwordpress%2post2%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://wpqw.jp/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwpqw.jp%2Fwordpress%2Fpost2%2F&format=xml" />
</head>

DNS プリフェッチ

<link rel='dns-prefetch' href='//s.w.org' />

WordPress4.6から挿入されるようになりました。
外部ドメインの名前解決を事前に行い、表示速度を上げます。
外部リンクやSNSボタンなどを設置している場合に有効です。

ただし、httpsに対しては効果がないようです。
ほとんどのサイトがhttps化している現在では、あまり意味が無いと思われるので、headから削除しても問題ないでしょう。

functions.phpに下記のコードを書くことで消すことができます。
環境によって複数のdns-prefetchが登録されてる場合、全て削除します。

function remove_dns_prefetch( $hints, $relation_type ) {
	if ( 'dns-prefetch' === $relation_type ) {
		return array_diff( wp_dependencies_unique_hosts(), $hints );
	}
	return $hints;
}
add_filter( 'wp_resource_hints', 'remove_dns_prefetch', 10, 2 );

フィード関係

<link rel="alternate" type="application/rss+xml" title="WPQW » フィード" href="https://wpqw.jp/feed/" />
<link rel="alternate" type="application/rss+xml" title="WPQW » コメントフィード" href="https://wpqw.jp/comments/feed/" />

見ているページによって他のフィードも表示されます。
フィードの種類は7種類。

  1. サイトフィード
  2. サイト全体のコメントフィード
  3. 記事単位のコメントフィード
  4. カテゴリーフィード
  5. タグフィード
  6. 作成者フィード
  7. 検索結果フィード

3〜7は、functions.phpに下記のコードを書くことで消す事ができます。

remove_action( 'wp_head', 'feed_links_extra', 3 );

テーマチェックプラグインで、automatic-feed-linksは必須とされているため、1と2を消すにはfunctions.phpから、下記のコードを探して消す必要があります。

add_theme_support( 'automatic-feed-links' );

絵文字

<script type="text/javascript">
	window._wpemojiSettings = {"baseUrl":"https:\/\/s.w.org\/images\/core\/emoji\/12.0.0-1\/72x72\/","ext":".png","svgUrl":"https:\/\/s.w.org\/images\/core\/emoji\/12.0.0-1\/svg\/","svgExt":".svg","source":{"concatemoji":"https:\/\/wpqw.jp\/wp\/wp-includes\/js\/wp-emoji-release.min.js"}};
	!function(a,b,c){function d(a,b){var c=String.fromCharCode;l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,a),0,0);var d=k.toDataURL();l.clearRect(0,0,k.width,k.height),l.fillText(c.apply(this,b),0,0);var e=k.toDataURL();return d===e}function e(a){var b;if(!l||!l.fillText)return!1;switch(l.textBaseline="top",l.font="600 32px Arial",a){case"flag":return!(b=d([55356,56826,55356,56819],[55356,56826,8203,55356,56819]))&&(b=d([55356,57332,56128,56423,56128,56418,56128,56421,56128,56430,56128,56423,56128,56447],[55356,57332,8203,56128,56423,8203,56128,56418,8203,56128,56421,8203,56128,56430,8203,56128,56423,8203,56128,56447]),!b);case"emoji":return b=d([55357,56424,55356,57342,8205,55358,56605,8205,55357,56424,55356,57340],[55357,56424,55356,57342,8203,55358,56605,8203,55357,56424,55356,57340]),!b}return!1}function f(a){var c=b.createElement("script");c.src=a,c.defer=c.type="text/javascript",b.getElementsByTagName("head")[0].appendChild(c)}var g,h,i,j,k=b.createElement("canvas"),l=k.getContext&&k.getContext("2d");for(j=Array("flag","emoji"),c.supports={everything:!0,everythingExceptFlag:!0},i=0;i<j.length;i++)c.supports[j[i]]=e(j[i]),c.supports.everything=c.supports.everything&&c.supports[j[i]],"flag"!==j[i]&&(c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&c.supports[j[i]]);c.supports.everythingExceptFlag=c.supports.everythingExceptFlag&&!c.supports.flag,c.DOMReady=!1,c.readyCallback=function(){c.DOMReady=!0},c.supports.everything||(h=function(){c.readyCallback()},b.addEventListener?(b.addEventListener("DOMContentLoaded",h,!1),a.addEventListener("load",h,!1)):(a.attachEvent("onload",h),b.attachEvent("onreadystatechange",function(){"complete"===b.readyState&&c.readyCallback()})),g=c.source||{},g.concatemoji?f(g.concatemoji):g.wpemoji&&g.twemoji&&(f(g.twemoji),f(g.wpemoji)))}(window,document,window._wpemojiSettings);
</script>
<style type="text/css">
img.wp-smiley,
img.emoji {
	display: inline !important;
	border: none !important;
	box-shadow: none !important;
	height: 1em !important;
	width: 1em !important;
	margin: 0 .07em !important;
	vertical-align: -0.1em !important;
	background: none !important;
	padding: 0 !important;
}
</style>

WordPress4.2から絵文字が使えるようになりました。
それに伴って、これらのcssとJavascriptが出力されるようになりました。

上記のコードだけで1.5kbほどあり、業務利用の場合など絵文字を使わない場合は、消してしまっても問題ありません。

絵文字関連コードを消すには、functions.phpに下記のコードを書くことで消すことができます。

function remove_emoji() {
	remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
	remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
	remove_action( 'wp_print_styles', 'print_emoji_styles' );
	remove_action( 'admin_print_styles', 'print_emoji_styles' );
	remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
	remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
	remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
}
add_action( 'init', 'remove_emoji' );

REST API

<link rel='https://api.w.org/' href='https://wpqw.jp/wp-json/' />

WordPress4.4から実装されたREST APIを呼び出すためのコードになります。
REST APIについては、別で記事が書けるぐらいの量になるので、今回は細かい説明は割愛します。
便利だけどリスクもあると覚えておいてください。

完全に止めるには、functions.phpに下記のコードを書くことで完全に消す事ができます。

remove_action( 'wp_head', 'rest_output_link_wp_head' );

しかし、一部の機能やプラグインで使いたい場合もありますよね?
oEmbedやJetpackなどなど・・・
そんな時に、安全に無効化する方法が紹介されていたので、こちらのブログをご覧ください。

ブログを参考に少し変更して普段使ってるコードがこちら

function deny_restapi_except_plugins( $result, $wp_rest_server, $request ) {
	$namespaces = $request->get_route();
	// oembed
	if( strpos( $namespaces, 'oembed/' ) === 1 ) {
		return $result;
	}
	// Jetpack
	if( strpos( $namespaces, 'jetpack/' ) === 1 ) {
		return $result;
	}
	// BlockEditor
	if ( current_user_can( 'edit_posts' ) ) {
		return $result;
	}
	return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'deny_restapi_except_plugins', 10, 3 );

EditURIとwlwmanifest

<link rel="EditURI" type="application/rsd+xml" title="RSD" href="https://wpqw.jp/wp/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="https://wpqw.jp/wp/wp-includes/wlwmanifest.xml" />

ローカルアプリのブログ投稿ツールを利用して、更新する場合に必要なコードです。

functions.phpに下記のコードを書くことで消すことができます。
必ず管理画面にログインして更新する場合は、削除してしまっても大丈夫です。

remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );

前後の記事への誘導

<link rel='prev' title='前の記事タイトル' href='https://wpqw.jp/wordpress/post1/' />
<link rel='next' title='次の記事タイトル' href='https://wpqw.jp/wordpress/post3/' />

記事ページで表示されます。
標準状態では、改ページを行なっているエントリーでも、表示している記事のページ数ではなく前後の記事へのリンクとなり、SEO的に微妙かもしれません。

remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' );

WordPressのバージョン表示

<meta name="generator" content="WordPress 5.2.2" />

generatorは、本来どんなソフトでページを作ったのかを表示するのですが、WordPressの場合は詳細なバージョン情報まで表示され、セキュリティ上表示しない方がいいという意見が多いです。

消したい方は、functions.phpに下記のコードを書くことで消す事ができます。

remove_action( 'wp_head', 'wp_generator' );

canonical

<link rel="canonical" href="https://wpqw.jp/wordpress/post2/" />

URLの正規化を行なっており、基本的に消す必要はないですが、SEO関連プラグインに同様の機能が備わって場合もあるため、プラグインとの兼ね合いで削除した方がいい場合もあります。

削除する場合、functions.phpに下記のコードを書くことで削除できます。

remove_action( 'wp_head', 'rel_canonical' );

shortlink

<link rel='shortlink' href='https://wpqw.jp/?p=2' />

WordPress4.4までは、投稿画面に[短縮URLを取得]ボタンが表示されていましたが、4.5以降では表示されなくなりました。

head内にある必要が無いので消しても大丈夫です。

remove_action( 'wp_head', 'wp_shortlink_wp_head' );

SNSシェアボタンなどで、短縮URLを利用したい場合はhead内から消していても下記のコードでURLを取得できます。

<?php wp_get_shortlink(); ?> 

oEmbed

<link rel="alternate" type="application/json+oembed" href="https://wpqw.jp/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwpqw.jp%2Fwordpress%2Fpost2%2F" />
<link rel="alternate" type="text/xml+oembed" href="https://wpqw.jp/wp-json/oembed/1.0/embed?url=https%3A%2F%2Fwpqw.jp%2Fwordpress%2Fpost2%2F&format=xml" />

WordPress4.4から追加された機能で、通称ブログカードと呼ばれるものです。
外部サイトの情報をカード型で自サイトへ埋め込む事ができる機能です。

不要な場合は、functions.phpに下記のコードを書くことで無効にできます。
同時に、自サイトの記事を外部サイトに埋め込むことも出来なくなります。

remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
remove_action( 'wp_head', 'wp_oembed_add_host_js' );

まとめ

ここまでを引っくるめて、私が普段使っているのがこちら

/* ----------------------------------------------------------------------
HEAD Clean
---------------------------------------------------------------------- */
function remove_dns_prefetch( $hints, $relation_type ) {
	if ( 'dns-prefetch' === $relation_type ) {
		return array_diff( wp_dependencies_unique_hosts(), $hints );
	}
	return $hints;
}
add_filter( 'wp_resource_hints', 'remove_dns_prefetch', 10, 2 );

remove_action( 'wp_head', 'feed_links_extra', 3 );

/* STOP EMOJI */
function remove_emoji() {
	remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
	remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
	remove_action( 'wp_print_styles', 'print_emoji_styles' );
	remove_action( 'admin_print_styles', 'print_emoji_styles' );
	remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
	remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
	remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
}
add_action( 'init', 'remove_emoji' );

/* REST API */
function deny_restapi_except_plugins( $result, $wp_rest_server, $request ){
	$namespaces = $request->get_route();
	// oembed
	if( strpos( $namespaces, 'oembed/' ) === 1 ) {
		return $result;
	}
	// Jetpack
	if( strpos( $namespaces, 'jetpack/' ) === 1 ) {
		return $result;
	}
	// BlockEditor
	if ( current_user_can( 'edit_posts' ) ) {
		return $result;
	}
	return new WP_Error( 'rest_disabled', __( 'The REST API on this site has been disabled.' ), array( 'status' => rest_authorization_required_code() ) );
}
add_filter( 'rest_pre_dispatch', 'deny_restapi_except_plugins', 10, 3 );

remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head' );
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_head', 'rel_canonical' );
remove_action( 'wp_head', 'wp_shortlink_wp_head' );
// remove_action( 'wp_head', 'wp_oembed_add_discovery_links' );
// remove_action( 'wp_head', 'wp_oembed_add_host_js' );

プラグインの紹介

ここまで紹介した内容を、Head Cleanerプラグインを使う事で簡単にできます。

CSSとJavascript

同じくhead内に表示される、CSSとJavascriptについては近日中に書きます。

将来的に挿入タグが増えた場合

今後新しいタグが増えた場合も、この方法で対応可能です。
wp_head()で挿入されるタグについては、/wp-includes/default-filters.phpファイルで、wp_headと検索することで調べる事が出来ます。