Mstudio
← ブログ一覧へ

PHP 7.4→8.4で出たエラー5つ、実際に2日で直した方法

著者: マサシ読了時間: 10分
PHP 7.4→8.4で出たエラー5つ、実際に2日で直した方法

こんにちは、マサシです。

PHPを7.4から上げたら、サイトに「重大なエラー」と出た。
あるいは、ページの上に英語の警告が並んだ。
そんな状態で、このページにたどり着いた方も多いと思います。

2026年10月のPHPの脆弱性のあと、私は7.4のまま止まっていたWordPressのサイトを3つ、8.3と8.4へ上げました。
3つとも、テーマのファイルを直してから切り替えています。

出てきたエラーは、3サイト合わせて5種類でした。
この記事では、その5つの直し方と、上げる前に見つける方法をまとめます。

今のPHPのバージョンがまだ分からない方は、先に WordPressのPHPのバージョンの確かめ方 を見てください。

結論:上げる前に、今の7.4のままログを数えれば、ほぼ分かります

PHP 8で出るエラーのほとんどは、7.4の時点で「注意(Notice)」や「非推奨(Deprecated)」として、すでに出ています。
本番のサーバーは、この注意を画面に出さない設定のことが多いです。
だから、何年も気づかれないまま動いています。

PHP 8.0で、この注意の多くが「警告(Warning)」に上がりました。
一部の関数は削除されて、そこでサイトが止まります。

つまり、上げる前に7.4のままログを取れば、上げたあとに何が起きるかを先に知れます。

PHP 7.4から8.4で、実際に出たエラー5つ

3つのサイトで実際に直した書き方は、次の5種類です。
エラー文は、PHP 8.4で出る文面です。

エラー文(PHP 8.4)何が起きているか直し方
Fatal error: Uncaught Error: Call to undefined function create_function()PHP 8で削除された関数を使っている無名関数 function () { … } に置き換える
エラーは出ない(初期化だけ動かない)クラス名と同じ名前の関数を、初期化に使っている関数名を __construct に変える
Warning: Undefined variable $theme_version中身を入れていない変数を使っている使う前に $theme_version = null; を入れる
Warning: Undefined array key "image"決まっていない配列のキーを読んでいる$term_meta['image'] ?? '' にする
Warning: Attempt to read property "cat_name" on null取れなかった値(null)から読んでいる$current_cat ? $current_cat->cat_name : '' にする

1つ目だけが、サイトを止めます。
WordPressでは「このサイトで重大なエラーが発生しました」という表示になります。

ほかの3つの警告は、サイトは動きます。
ただ、サーバーの設定によっては、ページの一番上に英語の警告がそのまま出ます。

PHPの公式の移行ガイドにも、この変更が書かれています(https://www.php.net/manual/ja/migration80.incompatible.php)。
create_function() は削除、クラス名と同じ名前の関数はコンストラクタとして扱われなくなり、未定義の変数や配列のキーは注意から警告に上がりました。

同じコードを7.4と8.4で動かして比べた

5つの書き方だけを入れた短いコードを用意して、手元でPHP 7.4.33と8.4.27の両方で動かしました。

同じコードをPHP 7.4.33と8.4.27で動かした結果。7.4は注意が出るだけで最後まで動き、8.4は警告が3つ出たあと create_function で止まる

左の7.4は、注意が5つ出るだけで「最後まで動きました」まで進みます。
右の8.4は、警告が3つ出たあと、create_function() の行で Fatal error になります。

もう1つ、見てほしいところがあります。
左には「初期化しました」の行が出ています。
右の8.4の出力で、同じ行を探してみてください。
(2026年10月24日に、同じファイルをPHP 7.4.33と8.4.27のそれぞれで実行した出力です)

いちばん気づきにくいのは、エラーが出ない1つ

クラス名と同じ名前の関数を初期化に使う書き方は、PHP 4のころの古い書き方です。
PHP 8では、この関数が呼ばれなくなります。

困るのは、エラーも警告も出ないことです。
止まりもしないので、画面だけ見ていると気づけません。

実際のサイトでは、古いテーマのウィジェット(サイドバーの部品)が、この書き方をしていました。
ウィジェットを作る処理が動かないので、表示されるはずのものが出なくなります。

テーマの中で、次のような書き方を探してください。

class Contact_Info_Widget extends WP_Widget {
    function Contact_Info_Widget() {   // ← クラス名と同じ名前

この関数名を __construct に変えれば、PHP 8でも呼ばれます。
中で $this->WP_Widget(…) と書いている場合は、parent::__construct(…) に変えます。

切り替える前に、7.4のままログを数える手順

ログを取るのは、本番ではなくサイトのコピーでやります。
WordPressの公式の説明でも、デバッグの設定は公開中のサイトでは使わず、試験用の環境で使うようにと書かれています(https://developer.wordpress.org/advanced-administration/debug/debug-wordpress/)。

コピーの wp-config.php に、次の3行を書きます。
/* That's all, stop editing! */ の行より上に置きます。

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

この設定で、エラーは画面に出ずに wp-content/debug.log へたまります。

PHPは7.4のまま、トップページ・主なページ・お問い合わせ・管理画面を一通り開きます。
開いたら、ログの中の注意を数えます。

grep -cE "Deprecated|Notice" wp-content/debug.log
grep -oE "PHP (Deprecated|Notice): +[^:;]+" wp-content/debug.log | sort | uniq -c

さっきの5つの書き方で試すと、こうなります。

PHP 7.4.33のログで注意を数えると5件で、8.4で問題になる5つがすべて出ている。右は直したあとのコードを8.4.27で動かした結果で、警告が出ずに初期化も最後まで動いている

左の7.4のログに出た5件は、8.4で問題になった5つとそのまま重なっています。
右は、上の表のとおりに直したコードを8.4で動かした結果です。
警告は消えて、「初期化しました」も出ています。

ログに Deprecated か Notice があれば、そのファイルと行番号が、切り替える前に直す場所です。
ログがきれいなときも、切り替えたあとに同じページを開いて確かめます。

持ち帰り用チェックリスト

切り替えの前と後で、上から順に使ってください。

  • サイトのバックアップを取った(ファイルとデータベースの両方)
  • サイトのコピーを作り、PHPは今の版のまま、WP_DEBUG_LOG でログを取った
  • ログの Deprecated と Notice を数え、出たファイルと行番号を控えた
  • create_function を無名関数に置き換えた
  • クラス名と同じ名前の関数を __construct に変えた
  • 中身の決まっていない変数・配列のキー・null から読むところに、空の値を用意した
  • コピーでPHPを上げ、主なページ・お問い合わせ・管理画面を開いて、警告が出ないことを確かめた
  • 本番を切り替えたあと、同じページをもう一度開いて確かめた
  • コピーの WP_DEBUG を false に戻し、debug.log を消した

最後の1つは忘れやすいところです。
wp-content/debug.log は、URLを打てば外から読めてしまうことがあります。

やめたこと:「画面にエラーが出なければ大丈夫」と思うのを、やめました

以前の私は、PHPを上げたあとにトップページを開いて、エラーが出ていなければ大丈夫だと思っていました。

でも、さっきのコンストラクタのように、エラーを出さずに動かなくなる書き方があります。
警告も、ページの上に出る設定のサーバーもあれば、ログにしか残らないサーバーもあります。

なので今は、切り替えの前と後で、同じページを全部開いて見比べています。
多いサイトでは、112ページを切り替えの前と後で比べました。

画面を目で見るだけでなく、ページの中に「Warning」や「Fatal error」の文字が入っていないかを、機械でも確かめています。

サーバーで8.4が選べないとき

レンタルサーバーによっては、管理画面で選べるPHPの版が限られています。
実際に、8.3までしか選べないサーバーがありました。

その場合は、選べる中で、修正版が出ている版を選びます。
2026年10月の脆弱性では、PHPの公式が修正版を出したのは8.2.35・8.3.36・8.4.27・8.5.12です(https://www.php.net/)。
脆弱性の中身と、今日やる確認は PHPの重大な脆弱性、WordPressで5分でできる3つの確認 にまとめています。

8.3は、PHPの公式の予定では、重大なセキュリティの修正が2027年12月末まで続きます(https://www.php.net/supported-versions.php)。
それまでに、8.4以降へもう一度上げる必要があります。

切り替えて真っ白になったら、まず元の版に戻す

サーバーの管理画面で、PHPを元の版に選び直してください。
多くのレンタルサーバーでは、選び直すだけで戻ります。

戻して表示が直れば、原因はテーマかプラグインのPHPの書き方です。
そのうえで、上の手順でログを取って、直す場所を探します。

プラグインのエラーなら、自分でファイルを直す前に、プラグインの更新を確かめてください。
プラグインのファイルを直しても、次の更新で元に戻ります。

テーマを直した場合も、テーマを新しい版に入れ替えると、直した場所が消えることがあります。
直したファイルと行を控えておくと、入れ替えたあとに見直せます。

自分でやるのが不安なときは

PHPやNext.jsの切り替えを、まるごと頼みたい方へ。

PHPの修正版への切り替え(1サイト9,800円・税込)と、Next.js・Node.jsの修正版への更新をお引き受けしています。

見積もりが高くて止まっている方、PHP 7.4など古い版のまま上げられずにいる方に向いています。

URLを送ってもらえれば、当てはまるかどうかと目安の金額を、作業の前にお伝えします。

確認は無料です。

脆弱性対応(PHPの切り替え・Next.jsの更新)

なにか引っかかっていることがあれば。

サイトまわりのことなら、だいたい答えられます。

WordPressのPHPバージョンアップで出るエラー5つ【7.4→8.4】 | Mstudio