PHPのバージョンを5系から7系に変更したらWordPressのページが500エラーになった

ズバリ、結論から言うと今回の原因は『Exec-PHP』で解決方法あります。

PHPをバージョンアップしたら500エラーが出る

WordPressで公開しているサイトのレンタルサーバーのPHPを7.系にするとエラーになりました。現時点でレンタルサーバーはMixhostを使っており、コントロールパネルでPHP5.6からPHP7.0→7.1→7.2→7.3と順に設定を変えてみました。バージョン7系はどれもWordpressの公開ページにアクセスすると以下のような画面になってしまいました。

サイトに重大なエラーがありました。詳細については、サイトの管理者のメール受信ボックスを確認してください。
WordPressでのデバッグをさらに詳しく見る。

PHP7系のバージョンによっては以下のエラーページが表示されました。

サイトに重大なエラーがありました。
WordPressでのデバッグをさらに詳しく見る。

放置していたこの問題を本気で対処することに

以前からこの問題はあったのですが面倒くさくて原因を探らず、ずっとPHP5.6のまま使っていました。WordPressのバージョンアップとかで『そのうち自然に解消するだろう』と思っていましたが、まったく解消の気配がなく、WordPressのダッシュボードにも『PHPの更新が必要です』と注意表示が出ていたので、『そろそろ本腰入れて対処するか』と解決方法を探ることにしました。

プラグイン『PHP Compatibility Checker』で互換性を調べてみる

テーマがPHP7に対応していないのかな?とインストール済みのプラグインとテーマのPHPの互換性を調べてくれるプラグイン『PHP Compatibility Checker』で、スキャンしてみました。すると現在使用している『Basic』というテーマで以下の警告が出ました。

21 | WARNING | Function create_function() is deprecated since PHP 7.2; Use an anonymous function instead
21 | 警告| 関数create_function()はPHP 7.2以降廃止されました。 代わりに匿名関数を使用してください

テーマを更新してして、PHP7.0→7.1→7.2→7.3と各バージョンを試しましたが、結局状況は変わりませんでした。テーマ以外に別に問題があるのかな?と今度はプラグインを疑いました。

エラーの原因はプラグイン『Exec-PHP』だった

以下のメールがサーバーから届いていました。

WordPress 5.2から、サイトでプラグインやテーマが致命的なエラーを発生させた場合にそれを検知してこの自動メールでお知らせする機能が追加されました。

今回の場合、WordPress がプラグイン Exec-PHP でエラーを捉えました。

まずはじめに、ご自分のサイト (https://sample.com) を開き、目に見える問題がないか確認してください。次に、エラーが発生したページ (https://sample.com/wp/wp-admin/index.php) を開き、同様に問題がないか確認してください。

この問題をさらに調査するにはサーバーホストに連絡してみてください。

もしサイトが壊れていてダッシュボードに正常に接続できない場合、WordPress には特別な『リカバリーモード』があります。これによりダッシュボードに安全にログインし、さらに調査をすることができます。

https://sample.com/wp/wp-login.php?action=enter_recovery_mode&rm_token=L**M0yRRK1L*yzS5*Qj*Gw&rm_key=iwaXrgB*RNDhO**tnm*Iwi

サイトを安全に保つため、このリンクは 1日 で有効期限が切れます。ですが、心配なく。有効期限後にこのエラーが再度発生すれば新しいリンクをお送りします。

この問題を解決しようとする際、以下の情報を聞かれるかもしれません。
WordPress バーション5.3.2
現在のテーマ: Basic (バージョン 1.3.10)
現在のプラグイン: Exec-PHP (バージョン 4.9)
PHP バージョン7.3.11

エラー詳細
===============
エラータイプ E_PARSE が /home/abcdefg/public_html/sample.com/wp/wp-content/plugins/exec-php/exec-php.php ファイルの 22 行目で発生しました。 エラーメッセージ: syntax error, unexpected 'new' (T_NEW)

WordPressのテーマや記事内でPHPのコードを使用できるようにするプラグイン『Exec-PHP』がPHP7系に対応していませんでした。これに関する検索をしてみたら、プラグインが『PHP7に対応していない』とか『危険』『セキュリティ上問題あり』とかのページがぼろぼろ出てきました。

問題ありのプラグインでもその場しのぎで使う

Exec-PHP』を無効にすればPHP7.3にしてもWordPressのページは表示されるようにはなるけど、レイアウトが崩れました。PHPでレイアウトに関連したコードをインクルードしていたので当然ですね。『Exec-PHP』を入れることで投稿内にPHPを書いて実行できる環境になってしまうのでセキュリティ上、危険らしいのですが、対策としてコードをプラグイン化したり、ショートコードの自作とかすぐにできないので、『何とかこの場を凌げないかな?』と調べていたら『Exec-PHP』を改造・修正する方法を見つけました。

『Exec-PHP』のファイルを修正する方法

Exec-PHP』のPlugin内のファイルにあるソース=&がエラーの原因でした。=&から&を削除して=に修正することで、エラーを解消できました。

"=&"があるファイル

/wp-content/plugins/exec-php内にある以下の10ファイルが修正の対象です。Dreamweaverで対象のファイルを開くと、=&がある行はエラーがあることを示す赤色で行番号が表示されていました。

修正対象ファイル

各ファイルの修正箇所

admin.phpの修正部分

40行目
$this->m_cache =& $cache;
     ↓
$this->m_cache = $cache;
53行目
$this->m_common_script =& new 
     ↓
$this->m_common_script = new 
56-57行目
$this->m_write_ui =& new ExecPhp_WriteUi($this->m_cache, $this->m_common_script);
$this->m_user_ui =& new ExecPhp_UserUi($this->m_cache);
     ↓
$this->m_write_ui = new ExecPhp_WriteUi($this->m_cache, $this->m_common_script);
$this->m_user_ui = new ExecPhp_UserUi($this->m_cache);
63-64行目
$this->m_style =& new ExecPhp_Style();
$this->m_config_ui =& new ExecPhp_ConfigUi($this->m_cache, $this->m_common_script);
     ↓
$this->m_style = new ExecPhp_Style();
$this->m_config_ui = new ExecPhp_ConfigUi($this->m_cache, $this->m_common_script);
79行目
$this->m_admin_script =& new ExecPhp_Script(ExecPhp_ID_SCRIPT_ADMIN,
				ExecPhp_ID_L10N_ADMIN, $this->m_admin_l10n, '/js/admin.js', array('sack'));
     ↓
$this->m_admin_script = new ExecPhp_Script(ExecPhp_ID_SCRIPT_ADMIN,
				ExecPhp_ID_L10N_ADMIN, $this->m_admin_l10n, '/js/admin.js', array('sack'));

ajax.phpの修正部分

23行目
$this->m_cache =& $cache;
     ↓
$this->m_cache = $cache;
56行目
$option =& $this->m_cache->get_option();
     ↓
$option = $this->m_cache->get_option();
64行目
$user =& new WP_User($i->user_id);
     ↓
$user = new WP_User($i->user_id);

cache.phpの修正部分

22行目
$this->m_option =& new ExecPhp_Option();
     ↓
$this->m_option = new ExecPhp_Option();
39行目
$this->m_usermetas[$user_id] =& new ExecPhp_UserMeta($user_id);
     ↓
$this->m_usermetas[$user_id] = new ExecPhp_UserMeta($user_id);

config_ui.phpの修正部分

32-33行目
$this->m_cache =& $cache;
$this->m_script =& $script;
     ↓
$this->m_cache = $cache;
$this->m_script = $script;
35行目
$option =& $this->m_cache->get_option();
     ↓
$option = $this->m_cache->get_option();
69行目
$option =& $this->m_cache->get_option();
     ↓
$option = $this->m_cache->get_option();
78行目
$option =& $this->m_cache->get_option();
     ↓
$option = $this->m_cache->get_option();
145行目
$option =& $this->m_cache->get_option();
     ↓
$option = $this->m_cache->get_option();

exec-php.phpの修正部分

22行目
$GLOBALS['g_execphp_manager'] =& new ExecPhp_Manager();
     ↓
$GLOBALS['g_execphp_manager'] = new ExecPhp_Manager();

manager.phpの修正部分

36,37,38,39行目
$cache =& new ExecPhp_Cache();
$this->m_ajax =& new ExecPhp_Ajax($cache);
$this->m_runtime =& new ExecPhp_Runtime($cache);
$this->m_admin =& new ExecPHP_Admin($cache);
     ↓
$cache = new ExecPhp_Cache();
$this->m_ajax = new ExecPhp_Ajax($cache);
$this->m_runtime = new ExecPhp_Runtime($cache);
$this->m_admin = new ExecPHP_Admin($cache);

runtime.phpの修正部分

23行目
$this->m_cache =& $cache;
     ↓
$this->m_cache = $cache;
68行目
$option =& $this->m_cache->get_option();
     ↓
$option = $this->m_cache->get_option();

script.phpの修正部分

22行目
$this->m_id =& $id;
     ↓
$this->m_id = $id;

user_ui.phpの修正部分

25行目
$this->m_cache =& $cache;
     ↓
$this->m_cache = $cache;
43行目
$usermeta =& $this->m_cache->get_usermeta($profileuser->ID);
     ↓
$usermeta = $this->m_cache->get_usermeta($profileuser->ID);
74行目
$usermeta =& $this->m_cache->get_usermeta($user_id);
     ↓
$usermeta = $this->m_cache->get_usermeta($user_id);

write_ui.phpの修正部分

28-29行目
$this->m_cache =& $cache;
$this->m_script =& $script;
     ↓
$this->m_cache = $cache;
$this->m_script = $script;
74行目
$usermeta =& $this->m_cache->get_usermeta($current_user->ID);
     ↓
$usermeta = $this->m_cache->get_usermeta($current_user->ID);
107行目
$option =& $this->m_cache->get_option();
     ↓
$option = $this->m_cache->get_option();

修正ファイルをアップロードしたら正常に表示された

上記10ファイルのソースを修正してサーバーにPUTしたところ、PHP7.3にしてもエラーは出ず、正常にページが表示されました。

参考ページ

Link

404 Not Found | 兎飼道 Racing Team

https://usado.jp/spdsk/2019/03/22/post-5117/

Link

[wirdpress]php7.1でエラーが発生「Exec-Php」を修正 | テクニカルノート

https://accelboon.com/tn/wirdpressphp7-1%E3%81%A7%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%80%8Cexec-php%E3%80%8D%E3%82%92%E4%BF%AE%E6%AD%A3/

Link

Just A Moment...

https://help.mixhost.jp/hc/ja/articles/115003742472-WordPress%E3%81%A7500%E3%82%A8%E3%83%A9%E3%83%BC%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88-%E7%A9%BA%E7%99%BD%E3%81%AE%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%8C%E8%A1%A8%E7%A4%BA%E3%81%95%E3%82%8C%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E6%B3%95

Exec-PHPに代わるプラグイン候補

Exec-PHP』のページでは『このプラグインは2018年12月14日に閉鎖されたため、ダウンロードできません。理由:セキュリティの問題。』と出ていたので、別のプラグインに乗り換えることも検討が必要です。またゆっくり代替のプラグインを探していいのが見つかったら乗り換えたいと思います。

WordPressの『PHP関連』のプラグイン検索結果ページ

Link

“Php” の検索結果 | Wordpress.org 日本語

https://ja.wordpress.org/plugins/search/PHP/

PAGETOP