[WordPress] なぜ修正されない? PHP Warning: A non-numeric value encountered in Date.php on line 694

2018/05/23WordPress

PHP7.xの環境でWordpressを使うと、“PHP Warning: A non-numeric value encountered in Date.php on line 694” という警告メッセージがでる。

PHP5.xと7.xの非互換により発生しているもので、下記のパッチを当てれば解決する。解決するんだけど、この問題、いつまでたっても修正されない。Wordpressをアップデートするたびに発生して、そのたびに編集しないといけない。面倒くさいし、操作ミスの危険性もある。

なぜ修正されないのだろうか?


--- wp-includes/SimplePie/Parse/Date.php	2018-05-21 14:42:07.177968280 +0900
+++ wp-includes/SimplePie/Parse/Date.php	2018-05-22 14:40:11.747416680 +0900
@@ -691,7 +691,7 @@
 			}
 
 			// Convert the number of seconds to an integer, taking decimals into account
-			$second = round($match[6] + $match[7] / pow(10, strlen($match[7])));
+			$second = round((int)$match[6] + (int)$match[7] / pow(10, strlen($match[7])));
 
 			return gmmktime($match[4], $match[5], $second, $match[2], $match[3], $match[1]) - $timezone;
 		}

目次

SimplePieは2016年7月にfix済み

WordPressのこのエラー部分は、SimplePieというライブラリ由来です。上流であるSimplePieでは、この問題は2016年7月7日に修正されています。現在の最新版は2017年11月12日のバージョン1.5.1です。

Date.php はISO8601形式の時刻をパースしていて、“2017-03-24T13:35:22.33+00:00” のように1秒未満の端数が指定されたときには、$match[7]にその端数が入ります。エラーが発生するのはRSSの時刻として “2017-03-24T13:35:22+00:00” のような端数のない文字列が与えられた時に、$match[7]が空になるのが原因です。

Just ran into this, here’s an example date string, and the $match value which triggers the warning:
2017-03-24T13:35:22+00:00

Array ( [0] => 2017-03-24T13:35:22+00:00 [1] => 2017 [2] => 03 [3] => 24 [4] => 13 [5] => 35 [6] => 22 [7] => [8] => [9] => + [10] => 00 [11] => 00 )


しかしWordpressと共に配布されているSimplePieはバージョン1.3.1で、2012年10月31日のものです。5年以上前のバージョンを使っていて、この部分は修正されていません。毎回バージョンアップのたびにパッチを当てて修正する必要があります。これはひどい。


WordPress公式でも問題はわかっているはず

WordPress公式サイトでも何回もこの問題は報告されています。

こちらの記事では「これはSimplePie側の問題だ」との回答に「上流ではすでに治っている」というツッコミが入っています。

As SimplePie is an external library, we generally don’t modify them directly.
(中略)
This had already been fixed in SimplePie, however the version included in WordPress is 1.3.1 from 2012 so it’s missing a lot of updates. Current version is 1.5.1 This particular issue was fixed in 1.4.3

#42684 (This is driving me crazy. SimplePie bug with simple fix: Warning: A non-numeric value encountered in \wordpress\wp-includes\SimplePie\Parse\Date.php on line 694) – WordPress Trac


こちらの記事ではSimplePie 1.5はPHP7.0に対応しておらず、非互換があると書かれています。いや、それはそうかもしらんけど、それ言ったら1.3.1だってPHP7.0非対応なのでは……

SimplePie 1.5 has been released. It still does not support PHP 7.0, which is what I believe WP suggests. It seems apt to deprecate or make private fetch_feed() entirely and let the plugins manage the use cases and forward-facing support role for end users.


SimplePie-NG が開発中で、そちらは PHP7.2以降に対応するらしいのですが、Don’t use this yetとのこと。


問題は多数報告されているのに治らない

SimplePie関連では他にも数多くの問題が報告されていて、その中にはSimplePie本家では修正されているものも多く、労力が無駄遣いされています。しかも、問題自体は修正されないので、やはりアップデートのたびにパッチを当てる必要があります。なにそれ?


今回の問題は、Warningがでる問題だからまだいいけど、セキュリティホールだったら目も当てられません。いやー、ひどいもんだ。どうしたらいいんだろ、これ。

当面の対処はアップデートで当てるパッチのスクリプト書いて半自動化するぐらい。Wordpress本体で対応して欲しいものです。

追記

コメント欄にて Fix – SimplePie Errors(https://github.com/michaeluno/_fix-simplepie-errors) により対応可能と教えていただきました。ありがとうございます。

短いプラグインですので、直接 functions.php に書いてもいいかもしれません。

さらに追記

WordPress 5.2 で修正されるとのこと。4.9系はどうなるんだろ?

WordPress

Posted by ず@沖縄