Uncaught Error: Call to undefined function get_user_attribute()

(Last Updated On: 2018年8月14日)

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を無効化して試すことは必要なようです。

投稿者: yohgaki