タグアーカイブ Parse error

PHP Parse Error unexpected クエスチョンでWordPressが真っ白になる原因と直し方

PHP Parse Error unexpected クエスチョンでWordPressが真っ白になる原因と直し方

「PHP Parse error: syntax error, unexpected ‘?’」が error_log に記録され、WordPress の管理画面を含むサイト全体が真っ白になる症状は、実行環境の PHP バージョンが古すぎて、WordPress コアファイルが記述する構文を解釈できないことが原因だ。とくに wp-includes/compat-utf8.php の 47 行目でエラーになるケースでは、PHP 5.x 系で動作している可能性が高い。サーバーの PHP を 7.4 以上(WordPress 7.0 の動作要件には 8.0 以上が推奨)に切り替えれば、このエラーは即座に解消する。

なぜ compat-utf8.php で unexpected ‘?’ が発生するのか

なぜ compat-utf8.php で unexpected ‘?’ が発生するのか

WordPress のコアファイル compat-utf8.php は、マルチバイト文字列を安全に扱うための互換関数群を収めている。中では null 合体演算子(??)やシンプルな三項演算子が使われる場面があり、これらは PHP 7.0 以降で導入された構文だ。もしサーバーが PHP 5.6 以前のバージョンで動作していると、「?’」の部分で構文エラーが発生し「unexpected ‘?’」というメッセージを吐く。つまり PHP バージョン不足が根本原因になる。

エラーの「expecting variable (T_VARIABLE)」は、処理系が疑問符を見て、本来そこに変数が来るはずの三項演算子の前半部分と誤解したことを示す。古い PHP は「??」を認識できずに文法的に未知のトークンとしてパースエラーを起こす。WordPress 7.0 が標準で要求する PHP バージョンはさらに高く、8.0 以降を推奨するケースも多い。

Before PHP 5.6 で実行
compat-utf8.php で「unexpected ‘?’」
サイト全体が真っ白
After PHP 8.0 に切り替え
エラー消滅、サイトが正常に表示
エラー状態  復旧後

上図のように PHP バージョンが低いとコアファイルの構文エラーで画面が真っ白になり、適切なバージョンにすると何も修正しなくてもその場で直る。

PHP バージョンを確認してサーバーで変更する手順

PHP バージョンを確認してサーバーで変更する手順

最初にサーバーが現在どの PHP バージョンで動いているかを調べ、続いて管理画面からバージョンを切り替える。操作性はレンタルサーバーによって異なるが、多くの場合 cPanel か独自コントロールパネルに PHP セレクターが用意されている。

STEP 1 phpinfo() ファイルで現在の PHP バージョンを調べる
STEP 2 サーバー管理画面の「PHP バージョン選択」で PHP 7.4 以上に切り替える
STEP 3 サイトを再読み込みしてエラーが消えたことを確認する

phpinfo() で現在の PHP バージョンを調べる

サーバーの公開ディレクトリに info.php などのファイルを作り、内容を <?php phpinfo(); ?> にしてブラウザで開く。表示されるページの最上部に「PHP Version」として現在のマイナーバージョンまで確認できる。この値が 5.6 や 7.0 であれば、まさにこの構文エラーを引き起こす原因になっている。

コントロールパネルで PHP バージョンを変更する

cPanel の場合は「Select PHP Version」または「マルチPHP マネージャー」といった項目からドロップダウンで選択し、その場で切り替えが可能だ。PHP 7.4 や 8.0 が用意されていないときは、ホスティング会社のサポートに「PHP のバージョンアップグレードをお願いします」と連絡して対応を依頼する。

WordPress が推奨する動作環境は年々上がっている。WordPress 7.0 であれば PHP 8.0 以降を選択するほうが安全で、プラグインの互換性も考慮してなるべく新しい安定バージョン(8.1 や 8.2)を選ぶとよい。

変更後にサイトが復旧したかどうか確認する

PHP バージョンを切り替えたら、キャッシュが残らないようシークレットウィンドウで管理画面とトップページを開く。真っ白だった画面が正常に表示されれば解決だ。もし引き続きエラーが出る場合は、次節のチェックポイントを試す。

PHP をアップグレードしても直らないときの確認ポイント

PHP をアップグレードしても直らないときの確認ポイント

PHP バージョンが適切でも compat-utf8.php で同じエラーが出るなら、コアファイルの破損や、別の場所から読み込まれた古い互換コードが原因の可能性が残る。

コアファイルを再アップロードして整合性を確かめる

wp-admin と wp-includes ディレクトリ、およびルートのファイルを公式アーカイブからダウンロードし、FTP で上書きする。このとき wp-content は触らない。アップロード後もエラーが出るなら、WP-CLI が使える環境では「wp core verify-checksums」コマンドでファイルの改ざんや破損を検出できる。

wp-content 内のカスタムコードを調査する

まれに mu-plugins(Must Use プラグイン)やテーマの functions.php に記述された互換用のオーバーライドが、古い PHP 構文を含んでいるケースがある。wp-content/mu-plugins を一時的に空にし、子テーマを標準テーマに切り替えてアクセスしてみる。これでエラーが消えたら、該当ファイル内の記述を新しい書き方に書き換える必要がある。

サーバーの .htaccess や php.ini を確認する

特定のディレクトリだけ古い PHP ハンドラが割り当てられている場合、.htaccess に AddHandler や SetHandler で別バージョンが指定されていることがある。推測されるハンドラ名があればコメントアウトして様子を見る。また、php.ini に意図しない設定でバージョン互換モードが指定されていないかも確認する。

よくある質問

エラーメッセージの unexpected ‘?’ と expecting variable は何を意味しているのか

PHP がソースコードを解析する際に、予期しない「?」を見つけて構文エラーを起こしたという意味だ。古い PHP では null 合体演算子(??)が文法として認識されず、単独の疑問符として解釈され「ここには変数が来るべきだ」と報告される。PHP 5.6 以下でしか発生しない典型的なエラーパターンである。

WordPress 7.0 にアップグレードしたらこのエラーが出るのはなぜか

WordPress 7.0 のコアが新たに PHP 7.4 や 8.0 の構文を使い始めたためだ。以前のバージョンでは問題なく動いていても、最新のコアに置き換えた途端に PHP のバージョン要件が上がり、サーバー側が追いついていないと構文エラーが発生する。

レンタルサーバーで PHP バージョンが変更できない場合の対処法は

低スペックの格安プランや古い共用サーバーでは PHP セレクターが提供されていないこともある。その場合はホスティング会社のサポートへ「PHP のバージョンを 7.4 以上に変更してほしい」と申請する。対応してもらえなければ、別のサーバーへの移転も検討する必要がある。

compat-utf8.php 以外のファイルで同じ構文エラーが出た場合も同じ対処でいいのか

はい。ファイル名が異なっていても、unexpected ‘?’ という構文エラーは PHP バージョン不足が原因である可能性が極めて高い。ただ、プラグインやテーマが原因の場合もあるため、エラーが wp-content 配下のファイルで出るならそのプラグインを無効化するか、開発元に PHP バージョン要件を問い合わせるのが早い。

この記事のポイント

  • 画面真っ白と unexpected ‘?’ 構文エラーは PHP 5.x 系で発生しやすい
  • まず phpinfo() で現在の PHP バージョンを調べ、7.4 以上に切り替える
  • サーバー管理画面の PHP セレクターかサポート依頼でバージョンを上げる
  • 切り替え後も直らなければコアファイルの再アップロードと mu-plugins の調査を
  • WordPress 7.0 なら PHP 8.0 以降の利用が推奨される