WordPress:robotsメタタグをプラグインなしで制御する

WordPress:robotsメタタグをプラグインなしで制御する

テーマをゼロから作ってみる(9)です。

プラグインを使わずに robotsメタタグをページにより制御して出力します。

01wp_robots フィルターフック

5.7 以降では wp_robots フィルターフックを使って robots メタタグの出力を制御できます。

このフィルターフックは、robots メタタグとして出力したいディレクティブを連想配列のキーとしてその値とともに渡せば head タグ内に出力してくれます。もちろん、値はディレクティブ名に妥当な文字列、またはブール値でなくてはいけません。

たとえばカテゴリーページを noindex にする場合は、

function custom_meta_robots( array $robots ) {
    if ( is_category() ) {
        $robots['noindex'] = true;
        $robots['max-image-preview'] = false;
    }
    return $robots;
}
add_filter( 'wp_robots', 'custom_meta_robots' );

こんな感じです。

02デフォルトの robots メタタグ

デフォルトで出力される robots メタタグを調べてみました。連想配列がデフォルトで持っている値です。

検索ページ以外では次の値を持っています。

array(1) {
  ["max-image-preview"]=>
  string(5) "large"
}

検索ページは、

array(3) {
  ["noindex"]=>
  bool(true)
  ["follow"]=>
  bool(true)
  ["max-image-preview"]=>
  string(5) "large"
}

となっています。

03カテゴリーページ、記事一覧ページを noindex にする

SEO関連の記事を読みますとカテゴリーページをどうするかにはいろいろ考え方があるようですので結局は自分で判断するしかないということです。現在作成しているテーマのカテゴリーは五十音順の映画一覧ですので noindex にすることにします。上に書いたコードそのままです。

で、ちょっと驚いたことがあります。

固定ページを is_home() で検出?

現在作成中のテーマでは、次の画像のようにホームページ(フロントページ)と投稿ページ(ブログページ、記事一覧ページ)に固定ページを指定しています。

この場合、投稿ページを検出するためには is_home() を使わないと検出できません。is_page() は false になります。ドキュメントにちゃんと書いてありました(笑)。

ユーザーがある固定ページをホームページとして定義し、別の固定ページでブログを表示するということもあります。この場合ブログページがホームページではないにも関わらず is_home() 関数で true を返します。

条件分岐タグ

WordPress の条件分岐はややこしいですね。

ということで、現在の robots メタタグ指定は functions.php に次のように書いています。

function custom_meta_robots( array $robots ) {
    if ( is_category() || is_home() ) {
        $robots['noindex']           = true;
        $robots['max-image-preview'] = false;
    }
    return $robots;
}
add_filter( 'wp_robots', 'custom_meta_robots' );

検索ページのデフォルト値には max-image-preview:large が指定されていましたが、false にしておいたほうがいいかもしれません。noindex ですから関係ないか…。