WordPress の robots.txt に p タグや br タグが入るときの直し方:robots_txt フィルターで消す

概要説明

WordPress が自動で作る robots.txt に p タグや br タグが混ざると、検索エンジンが正しく読めないおそれがあります。原因の探し方と、robots_txt フィルターでタグを消す functions.php のコード(作業環境で確かめた結果つき)。

WordPress は、サイトに robots.txt のファイルがないとき、https://(サイトの URL)/robots.txt を開いたときに中身を自動で作って返します。

ところが、テーマやプラグインの組み合わせによっては、その中身に本文用のタグ(<p> や <br />)が混ざることがあります。

崩れた robots.txt
<p>User-agent: *<br />
Disallow: /wp-admin/<br />
Allow: /wp-admin/admin-ajax.php</p>

本来は、次のようにタグのない文字だけです。

正しい robots.txt
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php

robots.txt は、検索エンジンのロボットに「どこを見てよいか」を伝えるファイルです。タグが混ざると、行の頭に <p> が付いて、決まりが正しく読まれないおそれがあります。

ブラウザで robots.txt を開いて、右クリックの「ページのソースを表示」で、タグが混ざっていないかを確かめます。

サイトのいちばん上のフォルダに robots.txt のファイルを置いているときは、サーバーがそのファイルをそのまま返すので、WordPress は中身を作りません。この記事は、ファイルを置かずに WordPress に作らせているときの話です。

原因を探す

WordPress そのものは、robots.txt にタグを入れません。タグが混ざるのは、たいてい次のどちらかです。

原因 どういうことか
robots.txt を書き換えるプラグイン・テーマ robots_txt というフィルターで中身を足すときに、本文用の整形(自動で p を付ける処理)を通してしまう
出力をまるごと書き換える処理 ページの出力全体に手を入れる処理が、robots.txt にも効いてしまう

プラグインを 1 つずつ止めて、どれで直るかを見るのが確実です。すぐに直したいときや、原因のプラグインを止められないときは、次のコードでタグを消します。

テーマの functions.php(子テーマがあれば子テーマ)に足します。

functions.php
/**
 * robots.txt に混ざった p・br のタグを消す
 * PHP_INT_MAX:ほかのプラグイン(SEO のプラグインなど)が中身を作り直したあと、いちばん最後に動かす
 */
add_filter( 'robots_txt', function ( $output ) {
	$output = str_replace( array( '<p>', '</p>', '<br />', '<br>' ), '', $output );
	return trim( $output ) . "\n";
}, PHP_INT_MAX );
書き方 役目
robots_txt のフィルター WordPress が robots.txt を返す直前の中身を受け取って、書き換える
優先度 PHP_INT_MAX いちばん最後に動かす。SEO のプラグインなどが中身を作り直したあとでも、タグを消せる
str_replace <p>・</p>・<br /> だけを消す。決まりの文字はそのまま

前はこの記事で、URL に robots.txt が入っているときに出力をまるごと書き換える方法を紹介していました。robots_txt のフィルターなら、robots.txt の中身だけに効くので、ほかのページに影響しません。

確かめた結果

作業環境(WordPress 7.1・All in One SEO あり)で、わざとタグを入れて試しました。

試したこと robots.txt
robots_txt のフィルターで、本文用の整形(wpautop)をわざと通す 行の頭に <p>、行の終わりに <br /> が付いた
上のコードを足す タグが消えて、元の文字だけに戻った

試しに入れた処理は、確かめたあと消しました。

参考(WordPress の公式の説明)

関連機能

  1. 対応手順解説「サイトに重大なエラーがありました」

  2. WordPress 予約投稿の失敗を解決 Scheduled Post Trigger

  3. Notice: ob_end_flush(): failed to delete and flush buffer. No buffer to delete or flush inの対応

サイドバー

よく使うカスタマイズ

最近の記事

Profile

PAGE TOP