wp_head()の自動出力を制御する(削除する)

wp_headはアクションフックとして利用するのには便利なものなのでwp_head自体をまるまる削除するのは勿体ないです。しかし自動的にデフォルトで出力される内容が厄介です。SEO的にかなり気をつかってくれていてデフォルトのデータ自体にもかなり有用なものがあるのですが、スタイルシートに至ってはデザインをかなり崩してしまうものも含まれています。ここではwp_head()関数を中心にWPのメタデータを部分的に削除する方法を説明します。
wp_head自体はHTMLのmetaデータを自動的に出力してくれる関数で、アクションフックをひっかける際にはとても有用です。例えば、アーカイブページだけにmetaデータを追加したいとか、逆にトップページのみ何かを削除したいとか追加したいとか、そういう場合にはかなり便利です。自力でそういうコントロールもできるんでしょうけど、wp_headをまるまる削除するのは勿体ないです。内容をざっとあげると、

  • ログイン時に表示される上部バーのCSS
  • jQueryライブラリーの読み込み
  • 外部から記事投稿する際のURI
  • 使っているWordpressのバージョン
  • よくわからない無駄なスタイルシート

などなどです。
実際のwp_head()の内容は、自分が入れたプラグインなどの内容も含めてかなりたくさんの情報を含んでいます。JSで何らかのエフェクトを使うようなプラグインはこのwp_headを使っているのが殆どです。なのでwp_head自体は残しておきたい。

このhead情報の制御は、wp-includes/default-filters.phpの190行目辺りにある部分で行われています。
add_action( 'wp_head', 'wp_enqueue_scripts', 1 );
add_action( 'wp_head', 'feed_links', 2 );
add_action( 'wp_head', 'feed_links_extra', 3 );
add_action( 'wp_head', 'rsd_link' );
add_action( 'wp_head', 'wlwmanifest_link' );
add_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
add_action( 'wp_head', 'locale_stylesheet' );
add_action( 'publish_future_post', 'check_and_publish_future_post', 10, 1 );
add_action( 'wp_head', 'noindex', 1 );
add_action( 'wp_head', 'wp_print_styles', 8 );
add_action( 'wp_head', 'wp_print_head_scripts', 9 );
add_action( 'wp_head', 'wp_generator' );
add_action( 'wp_head', 'rel_canonical' );
add_action( 'wp_footer', 'wp_print_footer_scripts', 20 );
add_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0 );
add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
add_action( 'wp_print_footer_scripts', '_wp_footer_scripts' );
add_action( 'init', 'check_theme_switched', 99 );
add_action( 'after_switch_theme', '_wp_sidebars_changed' );

という風になっているので、
新しいmetaデータを追加する場合は、functionで定義したものをアクションフックに加えます。
add_action('wp_head', 'example_func');
削除する場合は、removeで指定のアクションを取り除きます。例ではリモート投稿用のURI定義を削除しています。
remove_action('wp_head', 'wlwmanifest_link');

CSS(スタイルシート)を削除する

フォーラムでも話題になっていましたが、バージョンによってはwp_headが勝手にCSSを吐き出します。これはログイン時に上部の管理バーを表示するのと関係があるみたいで、ログアウトするとCSS自体も消えます。常時そのCSSを無効にしておくようなコードが記述できないか探していたのですが、_admin_bar_bump_cbをリムーブしても効果なしでした。フォーラムにもあるように管理画面の左メニューから「ユーザー」→「あなたのプロフィール」から個人設定の項目で、「サイトを見るときにツールバーを表示する」のチェックボックスを外しておけば自動的に挿入される変なCSSは消えます。

デフォルトのwp_head()の内容

<link rel='stylesheet' id='admin-bar-css' href='http://www.omnioo.com/record/wp-includes/css/admin-bar.min.css?ver=3.5' type='text/css' media='all' />
<script type='text/javascript' src='http://www.omnioo.com/record/wp-includes/js/jquery/jquery.js?ver=1.8.3'></script>
<link rel="EditURI" type="application/rsd+xml" title="RSD" href="http://www.omnioo.com/record/xmlrpc.php?rsd" />
<link rel="wlwmanifest" type="application/wlwmanifest+xml" href="http://www.omnioo.com/record/wp-includes/wlwmanifest.xml" />
<meta name="generator" content="WordPress 3.5" />
<style type="text/css">.recentcomments a{display:inline !important;padding:0 !important;margin:0 !important;}</style>
<style type="text/css" media="print">#wpadminbar { display:none; }</style>
<style type="text/css" media="screen">
html { margin-top: 28px !important; }
* html body { margin-top: 28px !important; }
</style>
<style type="text/css">.broken_link, a.broken_link {
text-decoration: line-through;
}</style>