Uncaught Error: Call to undefined function get_user_attribute()
で困っている方向けの情報です。以下の様なエラーでWordpressのJetPackの管理ページなどが使えなくなります。
[Mon Dec 05 10:05:51.204342 2016] [php7:error] [pid 1928] [client XX.XX.XX.XX:58566] PHP Fatal error: Uncaught Error: Call to undefined function get_user_attribute() in /path/to/wp/wp-content/plugins/jetpack/modules/after-the-deadline.php:34
「”get_user_attribute”は自分のWordpressサイトには定義されていないのでエラーになる」とバグレポートしたのですが、環境の問題ということでクローズされてしまいました。
find . -type f -exec grep -ni get_user_attribute {} \;
しても定義が見つからないのですが。。。
対策は簡単です。エラーが起きているafter-the-deadline.phpの14行目あたりにあるif文を無効にすると動作します。
13 14 if ( false && defined( 'IS_WPCOM' ) && IS_WPCOM ) { 15 // This wpcom-specific code should eventually be moved elsewhere. 16 17 function AtD_http_post_timeout_action() { 18 return 5; 19 }
この例では14行目のif文の条件にfalseを足しています。
これ以外には困っていないのでこのまま使っていますが、defined( ‘IS_WPCOM’ ) && IS_WPCOM とチェックしている箇所は結構あります。問題の関数はWP 2.1から追加された関数のようですが、今は見当たりません。レガシーコードの残骸(?)なのかも知れません。
JetPackがアップデートされると毎回修正しなければならないので多少面倒です。
後で少し調べたところ、どうもこの不具合の原因はopcacheにあるようです。ソースコードからは問題のif条件がTRUEには成り得ない(IS_WPCOM定数は定義されていない)です。opcodeがおかしくなっていたことが原因の様ですが、WordPressのアップデートかPHPのアップデートのどちらかが原因で再現しなくなりました。どうも動作がおかしい、という場合にはopcache無効化を試す、は基本確認事項ですが今回のようなケースでもopcacheを無効化して試すことは必要なようです。