WordPress 5.7 で導入された Robots API で meta robots 関連の出力が改善された話 & 新しいフックの使い方

WordPress 5.7 で導入された Robots API で meta robots 関連の出力が改善された話 & 新しいフックの使い方

2021年10月26日

既に WordPress 5.8.1 までリリース済みですが、国内ブログでこのネタを扱っている記事がまだあんまりなく、意外と気づいてない人も多いようなので触れておきます。

WordPress 5.7 から、wp_head() から出力されるメタタグの仕様が結構変わりました。
その中でも個人的に嬉しかった2点を紹介します。

新 Robots API の個人的に嬉しい点 その1.
自動で max-image-preview:large が入るようになった!

特に重要なのが、デフォルトで

<meta name='robots' content='max-image-preview:large' />

が出力されるようになったことです。
※設定 > 表示設定 で、「検索エンジンがサイトをインデックスしないようにする」にチェックが入っている場合は ‘noindex, nofollow’ になります

meta robots といえば、いままでは index/noindex, follow/nofollow くらいしか使ってこなかった人が多いのではないでしょうか。
max-image-preview は、Google検索結果に大サイズの画像サムネイルを表示させる、という指定のための属性値です。詳細は下記参考サイトをぜひ参考にしてください。

max-image-previewは入れておいて損のない属性値ですが、特に何もしなくてもWordPressが自動で入れてくれるようになったのはありがたいですね。

参考サイト

Robots meta タグ、data-nosnippet、X-Robots-Tag の設定 | Google 検索セントラル  |  ドキュメント  |  Google for Developers

検索結果での表示を調整できる meta robots(robots メタタグ)、…
developers.google.com

Google、検索結果のスニペットを制御するための新しいrobots metaタグとHTML属性を導入

検索結果に表示されるスニペットをより細かく制御する仕組みを提供することを Goo…
www.suzukikenichi.com

新 Robots API の個人的に嬉しい点 その2.
サイト内検索結果がnoindexになった!

WordPressのサイト内検索結果ページに

<meta name='robots' content='noindex, follow' />

が出力されるようになりました。

これまでは、WordPressのサイト内検索結果ページはnoindexではなかったため、検索結果ページを狙ったスパム行為というものがしばしば見られました。

WordPressでは、特にカスタマイズをしていない場合、サイト上に検索フォームを設置している・いないにかかわらず、設置サイトのURLに ‘?s=検索ワード’ というパラメータをつければ、サイト内検索結果が表示されます。
たとえば、このブログであれば

https://mypacecreator.net/?s=WordPress

にアクセスすることで、ウィジェットにあるブログ内検索フォームに「WordPress」と入力して送信したのと同じ結果が得られます。
これを悪用して、WordPressを利用しているドメインの末尾に ‘?s=スパムワード’ を付与したURLへのアクセスを発生させたりしてGoogleにインデックスさせるというスパム行為です。

下記は、知人が登録しているGoogleアラートに、管理しているサイトのスパムワードでの検索結果ページがひっかかったという報告をもらったときのスクリーンショット画像です。

サイト自体が改竄されたとかいうものではないので、このURLにアクセスしても「お探しのキーワードの記事はありません」という表示が出るだけなのですが、なんか気持ち悪いですよね。
ですので、サイトの要件にはよりますが、is_search の条件でnoindex を出力させるようなカスタマイズを加えることが多かったのですが、それが不要になりました。

補足

Google Analytics の行動 > サイトコンテンツ にもこのスパムワードでのアクセス履歴は残ってしまうのですが、これはnoindexでは防げません…。まじこういうスパム滅びるべし…。

新 Robots API で追加されたフックの具体的な使い方

以前、自作したプラグインではwp_headフックを使って直接メタタグを出力させていました。
たとえば、「日付アーカイブページ」をnoindexにしたい場合だと

function mypace_custom_meta_robots() {
    if ( is_date() ) {
        echo '<meta name="robots" content="noindex" />';
    }

add_action( 'wp_head', 'mypace_custom_meta_robots' );

という感じです。
しかし、今後は ‘wp_robots’ というフィルターフックを使って

function mypace_custom_meta_robots( array $robots ) {
    if ( is_date()  ) {
        $robots['noindex']           = true;
        $robots['max-image-preview'] = false;
    }
    return $robots;
}

add_filter( 'wp_robots', 'mypace_custom_meta_robots' );

という感じで書き換えることになったようです。
$robots という変数の中に配列で複数の属性値が格納されており、それぞれ値をどうするかを指定します。
上記の例だと、noindex はtrueなので出力、max-image-preview はfalseなので出力しない、といった具合です。

max-image-preview のように指定できる値がいくつかあるようなものは、その値を指定できます。
例えばmax-image-preview の値をlargeじゃなくてstandardにしたい場合は

function mypace_custom_meta_robots( array $robots ) {
    $robots['max-image-preview'] = 'standard';
    return $robots;
}

add_filter( 'wp_robots', 'mypace_custom_meta_robots' );

という具合です。
また、unset で設定されている属性を外すこともできるようです。

例えば以下のように指定すると

function mypace_custom_meta_robots( array $robots ) {
    unset( $robots['max-image-preview'] );
    $robots['max-snippet'] = '100';
    return $robots;
}

add_filter( 'wp_robots', 'mypace_custom_meta_robots' );

max-image-preview の出力が外れ、代わりにmax-snippetの出力が追加され、以下のようになります。

<meta name='robots' content='max-snippet:100' />

なお、max-image-preview: large の出力を外すだけであれば、wp_robots_max_image_preview_largeフックをremoveするだけでもOKなので、以下の1行で済みます。

remove_filter( 'wp_robots', 'wp_robots_max_image_preview_large' );

また、検索結果ページをnoindexにするための処理も専用のフックがあります。
なので、「検索結果ページをnoindexにしたくない」という場合だと

function mypace_custom_meta_robots( array $robots ) {
    if ( is_search()  ) {
        $robots['noindex'] = false;
    }
    return $robots;
}

add_filter( 'wp_robots', 'mypace_custom_meta_robots' );

としてもいいのですが、

remove_filter( 'wp_robots', 'wp_robots_noindex_search' );

の1行で済ませてもOKです。

※なお、前者だと noindex, follow のうちnoindexだけを外しているので

<meta name='robots' content='follow, max-image-preview:large' />

となりますが、後者だと

<meta name='robots' content='max-image-preview:large' />

となります。
記述がない時はfollowの扱いになるのでどちらも意味は同じですが、念のため。

このあたりの処理については、 wp-includes/robots-template.php という 5.7 で新規追加されたファイルにまとまっています。
上記で紹介したもの以外も含めて

  • wp_robots()
  • wp_robots_noindex()
  • wp_robots_noindex_embeds()
  • wp_robots_noindex_search()
  • wp_robots_no_robots()
  • wp_robots_sensitive_page()
  • wp_robots_max_image_preview_large()

の、計7つの関数が定義されています。200行程度の、他のファイルに比べればそこまで難しくないコードだったので、PHPでメタタグのカスタマイズを試みたいと考えている人は見ておくと良いと思います。

参考サイト

Robots API and max-image-preview directive in WordPress 5.7 – Make WordPress Core

WordPress 5.7 introduces a filter-based …
make.wordpress.org

追記 : 以前公開したプラグインどうしよう…

2015年に作成した、 mypace Custom Meta Robots というWordPress公式ディレクトリ登録プラグインがあります。

mypace Custom Meta Robots – WordPress プラグイン | WordPress.org 日本語

このプラグインを有効化すると、個別記事ページ(投稿、固定ページ、カスタム投稿タイ…
ja.wordpress.org

投稿・固定ページにnoindex や nofollow を出力したいという要望で作成したのですが、新しい Robots API に対応していないので、WordPress 5.7 以降でこのプラグインを使うと WordPress コアが出力するものとプラグインが出力するもの、meta robots が2つ出力されてしまうという問題があります。

なので改修が必須なのですが、単純にコントリビュートの時間が取れないことと、index/follow以外の属性値への対応をどうするかの方針が未定なことで、棚上げになっています。
もし、こうしたらいいんじゃないかというアイデアをお持ちの方や、ちょっくらコード書いてみるか、という方がいらっしゃいましたら、以下GitHubリポジトリにてお待ちしております。

WordPress 5.7 で導入された Robots API にあわせて改修 · Issue #3 · mypacecreator/mypace-custom-meta-robots · GitHub

現在、wp_headフックで直接echoしているので、wp_robotsフックを…
github.com