WordPress RSS Feedエラー問題

Search Consoleの「クロール」メニューからサイトマップの追加を行おうと思って、sitemap.xmlとfeedを登録しようとしまいた。sitemap.xmlは問題なく登録できたのですが、WordPressのfeedが以下のようなエラーを出力しました。

Search Console Feed Error

どうやら日付の書式が間違っているという指摘のようで、該当する行を確認したところ以下の記述が書かれていました。

<lastBuildDate>水, 11 1月 2017 05:51:58 +0000</lastBuildDate>

あれ?そもそも日付のフォーマットもだが、「+0000」になっている。管理画面の設定→一般設定のタイムゾーンの設定は「東京」になっているのに……ちなみにタイムゾーンの設定を「東京」から「UTC+9(日本標準時)」に変更しても結果は同じでした。以前はエラーが出ていなかったはずだけど…と思い調査開始。

WordPressフィード配信

あらためて、CodexのWordPressフィード配信を読んでみると、こういう記述がありました。

RSS フィードの時刻と日付の形式
WordPress は RSS Specification に準拠します。したがって、時刻と日付の形式についてもサイトで設定されたブログの時刻や日付ではなく、RFC822 Specification の時刻と日付の形式を使用します。例: Sun, 06 Sep 2009 16:10:34 +0000
注意: フィードの時刻や日付の形式はローカライズしないでください。現行の RSS Specification は RFC822 Specification を参照し、RFC822 Specification はデフォルトして英語を規定しています。すなわちロケールに応じた時刻や日付の変換は RSS クライアント側に責任があると解釈できます。

なるほど、ローカライズはしないほうがよいのか。では、タイムゾーンはそのままで良いとして、問題の日付フォーマットのエラーを解決しよう。

解決方法

WordPress.orgのサポートフォーラムで解決策が既に出ていました。すばらしい。

[解決済] 4.7にバージョンアップ後RSSの日付が日本語になる

実際にlastBuildDateを出力しているところを見ると以下のようにコードが書かれています。

<lastBuildDate><?php
	$date = get_lastpostmodified( 'GMT' );
	echo $date ? mysql2date( 'D, d M Y H:i:s +0000', $date ) : date( 'D, d M Y H:i:s +0000' );
?></lastBuildDate>

どうやらmysql2date()関数内で、date_i18n()関数によりローカライズされてしまっているのが原因の模様。get_lastpostmodifiedフィルターにfalseを渡すことで解決するようです。

add_filter( 'get_lastpostmodified', '__return_false' );

ご丁寧にキャッシュを無効にする方法まで載っています。素晴らしいの一言。サポートフォーラムで対応されているかたは優しさでできているに違いない。

function do_not_cache_feeds( $feed ) {
	$feed->enable_cache( false );
}
add_action( 'wp_feed_options', 'do_not_cache_feeds' );

function.phpに指示通りのコードを記述してfeed更新。で・き・て・る!(^o^)
あっさり解決してしまった。エラーが出ず正常にサイトマップが追加されていることが確認できました。

Search Console Feed Success

どうやらバージョン4.7で発生したバグのようで、4.7.1で直した旨のチケットが出ているようです。
4.7.1がリリースされたあとに今回実装したコードを外してみて試してみよう。