WordPress6以降でExec PHP使うと『Uncaught Error: Call to a member function has_cap() on null』

すっかり放置してたExecPHP、WordPress Ver6以降からエラー出ていた

数年ぶりにログインした当サイト。
改造プラグイン公開ページのコメントに、バグ報告が上がっていた。
それもまる2年以上前…ごめんなさい。

そこで直そうと一念発起した。

ちなみにこのバグ、他の古いプラグインでも起こり得ます。
その状態と原因などの情報を共有しておきますね。

状態と原因、そして対応するまで

ここは思い出なので、すぐに解決したいならココは飛ばして次へどうぞ

バグ報告の再現が、なかなか出来ない

⇩まず報告はコチラ


直そうにも、久々のログインだし、全然出てこない出てこない。
出てこないから、直しようがなかったのだけど、『管理画面』→『ユーザー』で再現ができました!
やったね

Fatal error:  Uncaught Error: Call to a member function has_cap() on null in /htdocs/wp-content/plugins/exec-php/includes/exec-php/includes/user_ui.php:44
Stack trace:
#0 /htdocs/wp-includes/class-wp-hook.php(324): ExecPhp_UserUi->action_user_profile(Object(WP_User))
#1 /htdocs/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters(NULL, Array)
#2 /htdocs/wp-includes/plugin.php(517): WP_Hook->do_action(Array)
#3 /htdocs/wp-admin/user-edit.php(876): do_action('show_user_profi...', Object(WP_User))
#4 /htdocs/wp-admin/profile.php(18): require_once('/htdocs....')
#5 /htdocs/wp-admin/network/profile.php(13): require('/htdocs....')
#6 {main}
  thrown in 44

原因を知った後だから言うんだけど
ぶっちゃけこの一文⇩が大事で、他はどうでもよかった。

Fatal error:  Uncaught Error: Call to a member function has_cap() on null

コレは他のプラグインでも起こり得る問題だったのだ。

あれ?$profileuserって、なくない?

『Call to a member function has_cap() on null』って
関数に「NULL入れるなよ」って意味だと思いこんでいたのだけど、
コレ「classに関数ない…ていうか、class作ってなくない?」みたいな意味でしてん。

試しに中身確認してみたところ、globalで呼び出しておきながら、空でしたのよ。
ていうかglobal対象の存在なくてもglobal宣言で変数作れるんだね

で、その元がない存在なのに、内部では当然のように使ってる。
当然のように使っているのに、ないなんてあり得る?

ここで探し方悪くて、1日使ってしまったのだけど
なんと…WordPress 6.0から$profileuserが無くなっていたのだ!


ありがとう知らない人。
すごく感謝してますホント!

直したいけど、いじる量を増やしたくない

直すのに、思いつくのは主に2つ

  1. $profileuserを$profile_userに直す
  2. $profileuserを使わない方法に書き換える

だが、現状、ソースを完全に把握している訳では無いし、把握する時間もない。
※やるべきことを放置しているので、マジで時間がない。
だからいつも通り、理解はそこそこに突貫で直すしか無い。
そもそもWordPress自体、プラグイン作るレベルの最低限しか理解してない。
そんな状態で修正箇所を増やすなど、バグを増やしかねない行為。アブネー。

そして、この変数、正確に変わったタイミングが怪しいらしい。
ソースの様子をみて$profileuserか$profile_userを判断しなくてはならない。

「よし!最低限で直そう!」

対応方法

『global $profileuser;』中身を書き換えちゃえばいいのである。

というわけで、手っ取り早く直すには、
/wp-content/plugins/wp-exec-php-master/includes/user_ui.php
に⇩のHighlight部分を追加。

		global $profileuser;
		global $wp_version;
		if(!isset($GLOBALS['profileuser'])){
			$profileuser = $GLOBALS['profile_user'];
		}

おわかり、いただけるだろうか。
$profileuserがないときだけ、$profile_userで上書きしちゃってるのだ。
チェックと取得だけだからね。
コレでWordPressがV5でも問題ない。

当方は改造して使っています

あくまで自己責任でご使用ください。

コメント

タイトルとURLをコピーしました