いざ、PHP 8.5.12へ――壊れた3つと、捨てた29個

戦国風のアイキャッチ。夜の戦場で、兜とエプロンの殿が軍配を振り、AI軍師のロボが山城を指さす。城の旗は金色に変わり、手前には脱ぎ捨てられた古い鎧。「第七話 いざ、PHP 8.5.12へ」の文字

霜月七日、夜。総大将、ついに采配を振る。
「PHPを、最新へ」。
城は崩れなかった。崩れたのは、門の脇に立っていた見張り小屋が三つ。
そして翌朝、殿は古い鎧を脱ぎ捨てた。

※ 時代劇風の語りは演出です。この回の作業は、実際に公開中のサイトへの本番作業です。PHPの切り替えも、本番で行いました。

PHP 7.4.33から8.5.12へ。切り替えは一瞬だった

第六話で出城(サブドメイン)を片づけ、本丸(このサイト)は自作テーマのWATABOKORIに移っていました。残る大仕事は、PHPそのものを新しくすることです。

このサイトはXserverで動いています。PHPのバージョンはサーバーパネルから「ドメインごと」に選ぶ仕組みで、サブドメインも同じ設定を共有します。つまり、本丸を切り替えると、出城も一緒に切り替わります。

切り替える前に、殿はAI軍師(くーちゃん)に二つの方針を伝えました。

  • 出城は、止まっても進める。出城は手間をかけて守るほどの城ではない。止まったら、あとで直す
  • プラグインは、更新せずにそのまま切り替える。先に全部を最新にすると、何が原因で壊れたのか分からなくなる。壊れたものだけ直す

2026年11月7日の夜、PHP 7.4.33から8.5.12へ。サーバーパネルで選んで保存するだけなので、切り替え自体は一瞬です。

古い象の札から金色の象の札へ、レバーを倒す戦国風の操作盤のイラスト
図1:PHPの切り替えのイメージ(イラスト)。実際の管理画面ではありません

ちなみに、WordPressの公式資料では、今使っているWordPress 7.1はPHP 8.5に「完全対応」と書かれています。2026年5月に「ベータ対応」という表記がなくなり、PHP 8.5も正式な対応バージョンとして扱われるようになりました。問題が起きるとすれば、WordPress本体ではなく、テーマやプラグインのほうです。

壊れたのは3つ。どれも「設定画面」だった

切り替えたあと、AI軍師が管理画面のページを片っ端から開いて確かめました。公開中の記事やトップページは、何事もなかったように表示されています。

止まっていたのは、プラグインの設定画面が3つでした。開くと「重大なエラー」(PHPが止まるFatalエラー)が出ます。

  • XML Sitemap Generator for Google(サイトマップを作るプラグイン)→ 最新版に更新したら直った
  • Pz-LinkCard(リンクをカード表示にするプラグイン)→ 最新版に更新したら直った(このあと、使っていないので削除)
  • Login Alert(ログインを通知するプラグイン)→ 更新版がない。削除して、同じ役目のプラグインを自作した

「更新せずに切り替える」方針にしておいたおかげで、壊れたのがどれかはすぐに分かりました。表の画面ではなく設定画面だけが壊れていたので、読者から見える被害はありませんでした。

自作したログイン通知は、ログインがあると管理者にメールを送り、「いつもと違う環境」からのログインなら件名に【新しい環境】と付ける、という小さなものです。ただし、通知メールが本当に届くかは、この原稿を書いた時点ではまだ確かめていません(未確認)。

使っていないプラグインを、29個捨てた

ついでに、殿はもう一つ決めました。

「もう記事はAIに書かせる。俺が直接文字を打つことは、ほとんどない。使ってないものは全部消していい」

入力を助けるプラグイン(エディターの拡張、定型文の挿入など)は、AIが書く今の運用では出番がありません。画像の処理や旧テーマ専用の道具も、もう使っていません。3回に分けて、合わせて29個のプラグインを削除しました。

ただし、残したものもあります。広告のいたずらクリック対策(AdSenseを停止させる目的で広告を連打する人への備え)、画像の自動縮小、キャッシュ、サイトマップです。残ったプラグインは、すべて最新版に更新しました。

気づきにくい落とし穴:「記号の形」が変わった

プラグインを止めるたびに、AI軍師は全記事・全固定ページの表示を「止める前」と「止めた後」で比べていました。そこで、ひとつだけ差が見つかります。

本文の中の記号の形が、変わっていたのです。まっすぐな引用符(")が丸い引用符(“ ”)に、ハイフン(-)がダッシュ(–)に置き換わっていました。WordPressには、記号を自動で「きれいな形」に変える機能(wptexturize)があります。これまでは、消したプラグインのどれかが、こっそりこの機能を止めていたようです。

見た目の小さな違いですが、コードの例を載せている記事では、記号が変わるとそのままコピーして使えなくなります。自作の互換プラグインに「記号の自動変換を止める」1行を足して、元の表示に戻しました。最終的に、記事と固定ページ108件すべてで、変更前と同じ表示になったことを確かめています。

古い鎧(AFFINGER)を脱ぐ

このサイトは長いあいだ、有料テーマのAFFINGERで作られていました。見た目はよく、機能も多い。けれど今回の乱で、殿はこう決めます。

「もうアフィンガー依存から抜け出したい。PHPが新しくなったとき、すぐに対応できるようにしたい」

有料テーマは、作者が更新してくれるのを待つしかありません。自分で直せないものが土台にあると、PHPを上げるたびに同じ不安を抱えることになります。

そこでAI軍師は、AFFINGERの販売ページを読み、このサイトで実際に使っていた機能を洗い出しました。必要なものだけを、自作のプラグインとして作り直しています。

脱ぎ捨てられた古い鎧を背に、軽装の殿とAI軍師ロボが新しい山城へ駆けていくイラスト
図2:古い鎧(有料テーマ)を脱いで、新しい城へ向かうイメージ(イラスト)
  • 目次:見出しから自動で作る。タイトルは「気になるところだけ読む」
  • 記事の装飾:囲み枠、チェックリスト、ボタン、ステップ、よくある質問、吹き出しなど
  • 旧記事の表示:AFFINGERの書き方(ショートコード)で書いた昔の記事が、テーマを外しても崩れないようにする互換プラグイン
  • PHPの版ごとの検査:自作のテーマとプラグインが、PHP 7.4から8.5までのどの版でも動くかを、本番に触らずにPCの中で確かめる道具

最後の「検査の道具」が、今回いちばん大事な成果かもしれません。次にPHP 8.6が出たときも、この道具に新しい版を足して流せば、どこを直せばいいかが本番に触る前に分かります。自作のテーマとプラグインは、PHP 7.4から8.5まで、すべての版で合格しました。

そしてAFFINGER本体と、その子テーマを削除しました。消したのは殿です。

翌朝の後始末と、うまくいかなかったこと

11月8日の朝は、後始末から始めました。

  • エラーを画面に出さない設定にした:PHPのエラーが読者の画面に表示されないよう、サーバーの設定(display_errors)をOffに
  • データベースのバックアップを取った:記事や設定が入ったデータベースを丸ごとダウンロードして保存
  • ファイル全体のバックアップは、失敗した:画像などを含めた全ファイルのZIPは約3.4GBあり、ブラウザでのダウンロードが最後まで終わらなかった。今回は、サーバー側の自動バックアップ(7日分)に頼ることにした

3つ目は、正直に書いておきます。「大きな作業の前に、手元にバックアップを持っておく」という基本が、ファイル側は守れていません。ファイル全体の取り方(サイズを分けて取る、サーバー上で圧縮してから取るなど)は、次の課題です。

まだ刀は納めない。1週間の見張り

PHPは最新になりました。それでも、この乱はまだ終わっていません。最後の工程は「切り替え後1週間の見張り」です。普段は開かない画面、たまにしか動かない処理、週に一度だけ走る予約処理。そういう場所のエラーは、切り替えた直後には出てきません。

見張りは11月14日まで続けます。その結果が出たら、この連載の第一章は本当の終わりを迎えます。

この回の記録

  • 作業日:2026年11月7日(夜にPHPを切り替え)〜11月8日(午前に後始末)
  • 環境:本番(実際に公開中のサイトへの変更あり)。PHPの切り替え、テーマの削除は殿が実行
  • PHP:7.4.33 → 8.5.12(Xserverのドメイン単位の設定。サブドメインも同時に切り替わる)。WordPressは7.1.4
  • 切り替え直後に止まった設定画面:3つ(XML Sitemap Generator for Google、Pz-LinkCard=更新で解決、Login Alert=削除して自作に置き換え)。公開中のページに被害なし
  • 削除したプラグイン:29個。残したプラグインはすべて最新版へ更新
  • 表示の比較:記事・固定ページ108件で、変更前と同じ表示を確認(記号の自動変換の差を1件見つけて修正)
  • 自作のテーマ・プラグイン:PHP 7.4〜8.5のすべての版で検査に合格
  • 進捗:12工程のうち 11/12(M11 PHP 8.5.12への本番切り替え)。残りはM12 切り替え後1週間の見張り(11月14日まで)
  • 未確認:自作ログイン通知のメールが届くか/ファイル全体のバックアップ(失敗、サーバーの自動バックアップに依存)
  • 進捗率は「工程の数」で数えたもので、作業量や難しさは重みづけしていません
  • 原稿の執筆時点:2026年11月8日

次回予告

新しい城に移り、古い鎧も脱いだ。残るは、静かな1週間の見張りだけ。何も起きなければ、それがいちばんの戦果になる。だが、城というものは、見張りの最中に限って何かが起きる。

――最終話は、見張りの結果が出たあとに公開します。


連載「AI時代・PHPの乱」