2026年10月22日、当社はPHPの重大な脆弱性「PHP2Shell」の解説記事を公開しました。公開直後から「PHPを8に上げてほしい」「ついでにWordPressとプラグインも最新にしてほしい」というご依頼が殺到しました。とはいえ、「PHPを上げたらサイトが壊れないか」と不安に感じる方も多いと思います。
まず結果をお伝えすると、PHP 7系のサイトをそのまま8系に切り替えたところ、14件中2件でサイト全体が真っ白になり、8件では画面に警告文が出ました。主な原因はWordPress本体ではなく、テーマに同梱された古いライブラリや更新の順番にありました。この記事では、当社が2026年10月22日・23日に対応した14サイト(8組のお客様)の事例から、起きた問題と、それを防ぐために行ったことを紹介します。
PHP 8にバージョンアップすると何が起きる?
対応したサイトの本番環境はPHP 7.2〜7.4で、WordPressのバージョンも5.1(2019年)〜7.1.3とさまざまでした。使われていたテーマは、2018〜2021年に作られた購入テーマや自作テーマが中心です。全件について本番の複製を手元に用意し、PHP 8.4で動作を確認しました。その結果が次の表です。
| 起きたこと | 件数 | 主な原因 |
|---|---|---|
| 致命的エラー(真っ白・特定の操作で停止) | 14件中3件 | テーマ同梱の古いライブラリ、型の厳格化 |
| 画面に警告文が出る | 14件中8件 | PHP 8で「注意」が「警告」に格上げ |
| WordPressの更新で壊れる | 3件 | 2019年前後の古いプラグイン |
| テーマを最新にすると見た目が変わる | 4件 | テーマ側の既定値の変更 |
「PHPを上げるだけ」と考えていても、実際にはテーマ・プラグイン・WordPress本体の3つが関わってきます。それぞれを順に見ていきましょう。
真っ白になる原因は「テーマに同梱された古いライブラリ」
サイトが真っ白になった2件と、特定の操作で停止した1件では、それぞれ次の原因が見つかりました。
- テーマに同梱された設定画面のライブラリ「Redux」の2016年版に、PHP 8で禁止された書き方が使われていた
- ThemeForestの購入テーマ(2019年版)に同梱されたRedux、Envatoのインストーラー、WPBakery 5.5の3つに、それぞれPHP 8で止まる書き方があった
- 物件検索のあるサイトで、価格欄に入った「ー」などの文字を数値の整形関数に渡していた(PHP 8では止まる)。管理者で検索したときだけ非公開物件が混ざり、問題が発生
注目したいのは、テーマ本体より、そこに含まれるRedux・Envato・WPBakeryなどの部品のほうが古いという点です。テーマを最新版にすれば直る場合が多い一方で、購入テーマでは購入コードが必要になるほか、カスタマイズが消えたり見た目が変わったりするため、すぐに更新できないこともよくあります。今回は、停止の原因となる箇所だけを最小限に修正し(1ファイル1行〜3ファイル)、テーマを更新するかどうかは別途判断することにしました。
3件目には、未ログインの画面では問題がなく、管理者でログインして検索したときだけ止まるという特徴がありました。訪問者の目線で確認するだけでは、こうした問題を見落とします。
画面に警告文が出る:PHP 8で「注意」が「警告」に
PHP 8では、「存在しない配列の要素」や「定義していない変数」を使った場合の扱いが、Notice(注意)からWarning(警告)へ引き上げられました。サーバーの設定でエラー表示が有効(display_errors が On)だと、訪問者が見る画面に英語の警告文がそのまま表示されます。
今回、特に多く見られたのは次の2つのパターンでした。
- アイキャッチ画像を設定していないページで、画像の情報を取得しようとして警告(4サイト。1サイトでは12ファイルに同じ書き方)
- カテゴリーを設定していない投稿で、カテゴリー名を取得しようとして警告(1サイトで88記事)
いずれも、制作当時は「必ず設定される」という前提で書かれたコードです。運用が続くなかで例外に当たるページが増え、その問題がPHP 8で表面化しました。
更新の「順番」を間違えると詰まる
PHPとプラグインには、それぞれ「この版以上でないと動かない」という条件があります。今回、大きく影響したのは次の3つでした。
- Contact Form 7の最新版(2026年10月時点の6.2.3)にはPHP 8.3以上が必要。PHP 7.4のままだと更新の候補に表示されない
- WordPress 7.1.3にはPHP 7.4以上が必要。WordPress 5.1+PHP 7.2のサイトでは「PHP 7.4 → WordPress更新 → PHP 8.4」の2段階で上げた
- Custom Post Type Permalinks 3.5、post-type-switcher 4.1にはPHP 8.0以上が必要
このため、基本となるのは「PHPを上げてからプラグインを更新する」という順番です。ただし、WordPress本体が古すぎる場合には、「PHPを少し上げる → 本体を更新 → PHPを目標まで上げる」と、行き来しながら進める必要があります。
一方、PHPに関係なく、WordPress本体の更新だけで壊れたプラグインもありました。Jetpack 7.4(2019年)はWordPress 7系との組み合わせで致命的エラーとなり、NextGEN Gallery 3.41ではWordPress 6.9以降でギャラリーの画像が0枚になりました。また、Astra 3.7とElementor 4を組み合わせた環境では、管理画面のウィジェット画面を開けなくなりました。NextGEN Galleryの件は、本番のページキャッシュが古いページを表示していたため、誰にも気づかれていませんでした。
テーマを最新にすると見た目が変わる
「ついでにテーマも最新に」と更新すると、見た目が変わることがあります。今回確認できた変化は、次のとおりです。
| テーマ | 変わったところ | 対応 |
|---|---|---|
| Astra 3 → 4 | 本文の行間の既定が狭まり(1.857 → 1.65em)、大きな見出しで行が重なった | カスタマイザーと追加CSSで補正 |
| Cocoon 2.8 → 2.9 | 空のサイドバーが列ごと消え、本文が全幅に。記事が1件だけのカテゴリーでは関連記事が消える | ご依頼者の判断でテーマ更新を見送り |
| TCD「SKIN」1.7 → 2.2 | フッターの文字にも本文と同じ装飾が適用され、フッターの高さが2倍に | 追加CSS 4行で元に戻した |
| OceanWP 3 → 4 | ブログ・検索ページの既定のスタイルに少し変化 | 1ページ構成のサイトのため影響なし |
テーマを更新するかどうかは、ご依頼者(または施主)に判断していただく必要があります。当社では、変化する箇所を2〜3点に絞り、更新前後の画面を並べて説明しました。
当社のPHPバージョンアップの手順
14件すべてで、いきなり本番のPHPを切り替えて様子を見るのではなく、次の手順に沿って作業しました。
- 本番のバックアップを書き出す(All-in-One WP Migration。メディアは除外)
- 目標のPHP(8.4)で空のサイトを手元の環境に作り、復元する
- 復元する前に、メール送信と予約処理(WP-Cron)を止める
- 公開ページのURLを全件取り出し、自動で巡回して警告と致命的エラーを集計する(未ログインと管理者ログインの両方)
- テーマを修正 → プラグイン・WordPress本体を更新 → 再度巡回 → 更新前後の画面を比較
- 本番用の手順書(順番・戻し方・確認すること)と、修正したファイルだけをまとめてお渡しする
- 本番への反映後、画面を閲覧して確認する
巡回したURLの数は、1サイトあたり9〜2,908件でした。飲食店のサイトでは、2,800件を超えるメニューの品目ページをすべて確認しています。手作業で数ページを開くだけでは、アイキャッチが未設定の1ページや、カテゴリーが未設定の1記事を見つけることはできません。
作業中に見つかった「もともとの不具合」
検証を進めるなかでは、PHPとは関係のない、以前からの問題が見つかることも多くありました。
- カテゴリーページで致命的エラーが起きていたものの、メニューから辿れず、誰も気づいていなかった
- 本番のエラー表示が有効で、訪問者にもエラー文が見えていた(2サイト)
- バックアップ用のプラグインが2〜3個同時に動作し、サーバーには8GBのバックアップが溜まっていた
- 2023年にサービスを終了したAddThisが有効のまま/使っていないテーマが7つ入っている
これらは売り込みにつなげるのではなく、「気づいた点」として事実のみを報告しています。
ここまでのまとめ
PHP 7系から8系へバージョンアップする際は、古いテーマ・同梱ライブラリ・プラグインが原因となり、サイトが真っ白になったり警告文が出たりすることがあります。こうした問題を防ぐには、本番の複製で事前に試し、PHP・本体・プラグインを更新する順番を決めておくことが大切です。さらに、未ログインと管理者の両方で全ページを確認する必要があります。
なお、PHP 7.4〜8.1の公式サポートはすでに終了しています。2026年10月に公開されたPHPの重大な脆弱性「PHP2Shell」についても、8.1以前の公式修正版は出ていません(詳しくはPHP2Shellの解説記事をご覧ください)。「動いているから上げない」という判断は、今後さらに危険になります。
ここからは、制作・保守を担当する技術者向けに解説します。
技術者向け:よくあった修正パターン
未初期化のオブジェクト・型の厳格化(致命的エラー)
Redux 3.6系でErrorになったのは、未初期化の変数へプロパティを代入している箇所でした。is_object()で確認する1行を追加するだけで、停止しなくなります。Envatoのインストーラーでは、子クラスのメソッドの引数が親クラスと一致せず、PHP 8で致命的エラーになります。また、WPBakery 5.5にある三項演算子の入れ子には、PHP 8では括弧が必要です。
PHP 8では、数値の整形関数 number_format() に数値でない文字列を渡すとTypeErrorになります。今回は、数値以外の場合に空文字を返す関数で包み、10箇所を置き換えました。
|
1 2 3 4 5 6 |
function edel_number_format( $value, $decimals = 0 ) { if ( ! is_numeric( $value ) ) { return ''; } return number_format( (float) $value, $decimals ); } |
警告(Warning)が出る書き方
- wp_get_attachment_image_src() は、アイキャッチがなければ false を返す。結果の[0]を参照する前に確認する
- get_the_category() の結果が空なのに、そのまま[0]を参照している
- $_GET や $_SESSION の未定義キーを、存在を確かめずに参照している
- define() の第3引数(大文字小文字を区別しない定数)はPHP 8で警告になる。2016年を最後に更新が止まったアクセス解析プラグインで発生
- 文字列内で使う “${var}” 構文は、PHP 8.2で非推奨(Deprecated)
- マジックメソッド __wakeup() が private の場合は警告になる(WPBakery 5.5)
|
1 2 |
$src = wp_get_attachment_image_src( get_post_thumbnail_id(), 'large' ); $url = $src ? $src[0] : ''; |
検証で気をつけたこと
- 手元の環境に復元すると、WP Mail SMTPやMailPoet、BackWPupの通知が本番の設定で動く。復元前に、wp_mail を止めるmu-pluginと DISABLE_WP_CRON を入れておく。MailPoetは wp_mail を使わずに送信するため、送信方式を「Linux cron」に変更して止める
- WP Fastest CacheやLiteSpeed Cacheは手元でも動作し、古いHTMLを返す。巡回時はキャッシュを避けるクエリを付け、本番反映後には必ずキャッシュを削除する
- 修正行の後ろに // でコメントを書くと、同じ行の後続コードまでコメントになってParse errorが発生する。/* */ を使う
- 「追加CSS」で補正するときは、既存の内容を読み出したうえで末尾に加える。上書きによって既存のCSSを消してしまい、更新前のバックアップから戻したことがある
- WordPress 5.1の本体更新が「cURL error 60: SSL certificate problem」で失敗した。原因は、同梱の証明書リスト wp-includes/certificates/ca-bundle.crt が2019年のままだったこと。最新の ca-bundle.crt で1ファイル上書きすれば更新できる
手元に復元したときのメール誤送信を、must-useプラグイン(mu-plugin)で止める方法は、All-in-One WP Migration等の復元で起きるメール誤送信を防ぐ最も安全な方法で詳しく解説しています。
よくある質問
Q. WordPressとプラグインを最新にしておけば、PHP 8にしても大丈夫ですか?
多くの場合は動作します。ただ、今回の事例では、テーマに同梱された古いライブラリや自作テーマのコードによって停止するケースがありました。WordPressとプラグインを最新にしていても、テーマ側の問題は残ります。
Q. PHPは8.いくつにすればいいですか?
今回の移行では8.4を目標にしています。PHP2Shellの修正版(8.3.36、8.4.27など)以降であることに加え、Contact Form 7の最新版には8.3以上が必要なため、8.3以上をおすすめします。
Q. うまくいかなかったら元に戻せますか?
多くのレンタルサーバーでは、管理画面でPHPのバージョンを元に戻せます。ただし、PHPを上げてからプラグインやWordPress本体も更新した場合、元のPHPでは動かないことがあります。更新前のバックアップを用意し、戻す順番もあらかじめ決めておくことが大切です。
PHPのバージョンアップが不安な方へ:影響を無料で確認します
「PHPが7.4のままだと分かったけれど、バージョンを上げてサイトが壊れないか心配」「古いテーマを使っていて、更新してよいか分からない」とお困りの方は、当社へご相談ください。現在のPHPのバージョンと、バージョンを上げた際に影響が出そうな箇所を無料で確認します。手元での検証や修正が必要な場合には、作業を始める前にお見積りをご提示します。
ログイン情報をお預かりする前でも、URLとご利用中のサーバー会社をお知らせいただければ、どのように確認を進めるかご案内できます。
▶ PHPバージョンアップの無料確認を申し込む(お問い合わせ)
PHPやWordPressの更新は、今後も定期的に必要になります。当社の保守サポート(月額3,800円から)では、更新前の確認や作業をお任せいただけます。
更新履歴
- 2026年10月23日:公開(2026年10月22日・23日に当社が対応した14サイトの事例をもとに作成)