すっかり放置してた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つ
- $profileuserを$profile_userに直す
- $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でも問題ない。
当方は改造して使っています
あくまで自己責任でご使用ください。
コメント