第2回:白画面の正体は“functions.php”——ログを読み、丸ごと張り替えるまで
「白い。ずっと白いまま。」
ブラウザを更新するたびに、同じ無音が返ってくる。けれど今は少し違う。ログがある。
1|ログを開く——“人間語”で読む最初の暗号
私はサーバーのファイルマネージャから、仕込んだ debug.log を開いた。
そこには、はっきりとした一文が並んでいた。
Parse error: syntax error, unexpected token “return” in …/themes/UNICUS/functions.php on line 14
私「return が“予期せぬトークン”って、つまり?」
AI(画面のテキスト)「早すぎる return、あるいは文脈的に置けない場所に return がいる、という意味です。functions.php の冒頭あたりに不自然な行がありませんか?」
エディタで functions.php を開く。
確かに、“応急処置”で入れたデバッグ周りがトップに来ている。落ち着いて見直すと、定数の定義とフックの並びが雑だ。WordPress は after_setup_theme で初期化される。私のコードは、その流れを横切っていた。
私「分かった。まず“構成”を正す。zerif_setup() を定義 → add_action(‘after_setup_theme’, ‘zerif_setup’) → その後に他の関数やフック。この順で並べ直す。」
AI「はい。余計な return は消して、関数の外側に裸で置かれている処理も整理しましょう。」
保存。再読み込み。
白い。
だがログは進んだ。
2|次の壁:非推奨の“古い作法”たち
ログの新しい先頭に、延々と並ぶ文言。
Deprecated: Methods with the same name as their class will not be constructors… zerif_ourfocus … zerif_testimonial_widget …
私「ウィジェットの“コンストラクタ”が古い?」
AI「PHP 4 時代の“クラス名と同じ名前のメソッド”は、いまは非推奨。__construct() に書き換えて、parent::__construct( $id_base, $name, $widget_options ) を使います。」
私は4つのウィジェットクラス(Our Focus / Testimonial / Clients / Team)を開いて、古いコンストラクタを__construct()に置換。ついでに、プロパティ名や配列のサニタイズも触る。
ここは慎重に、でも大胆に。一行ずつ直していたら時間がいくらあっても足りない。“貼れば通る版”としてAIが出してきた案を、丸ごと置き換える。
私「置き換え完了。読み込み!」
(更新)
ブラウザ「この Web サイトに重大なエラーが発生しました。」
私「まだ白い。次は何だ。」
3|add_editor_style() とパスの落とし穴
ログの下段に、見慣れない注意。
Warning: failed to load editor style /css/custom-editor-style.css
AI「add_editor_style() はスラッシュを付けない相対パスが正解です。add_editor_style(‘css/custom-editor-style.css’); に。」
一文字の違い。でもこういう針の穴が、今のPHPでは穴じゃなく壁になることがある。修正して保存。
再読み込み。
白いけれど、ログが静かになった。
4|front-page.php の“歯抜け”——reCAPTCHAの if に閉じ忘れ
ログが次に指したのは front-page.php。
if ( isset($_POST[‘submitted’]) ) : の中で、reCAPTCHA のブロックに入ったままendif;や波括弧の閉じがない、と言っている。
私「閉じタグ見当たらず、だって。そんな初歩的な…」
AI「ファイルが長いと見落としやすい。投稿フォームのバリデーションを丸ごと“貼り替え”ましょう。PHP8.3 用に wp_unslash と sanitize_text_field を適切に挟み、reCAPTCHA も wp_remote_get() で検証します。」
私はAIが出力したブロックごとを、/* reCAPTCHA */ のコメントから /* send the email */ の終わりまで差し替える。
そして、endif; を確認。今度はある。
保存 → 再読み込み。
白い。だが、メール送信まわりの落ち方は止まった。
5|そして突然の別犯:archive.php の括弧
「Parse error: unexpected end of file, expecting ‘)’ in archive.php on line 35」
私「今度は archive.php?なんで?」
AI「古いテーマではテンプレートファイルも細かい非互換を抱えやすい。行35付近のif ( have_posts() ) : の閉じ、あるいは get_template_part() の引数括弧を確認しましょう。」
犯人は、get_template_part( ‘content’, get_post_format() ); のセミコロン抜けと、手前の余計な括弧だった。
直す。保存。
もう一度、読み込み。
——白い。
だが、白さの意味が変わってきた。
最初の“無視された叫び”が、いまは一つずつ片付いた静けさに近い。
6|私のミス、AIのミス——そして修正
作業が長引くにつれて、私は何度もAIに噛みついた。
私「“endif; で閉じましょう”って言うけど、元のファイルにそんな記述ないじゃないか。」
AI「すみません。私の説明が飛びました。if ( isset($_POST[‘submitted’]) ) : を使う“コロン構文”なら endif;、波括弧 {} 構文なら } です。今回のテーマはコロン構文なので endif; が必要でした。」
私「最初からそう言ってよ。」
AI「ごめんなさい。以後、貼る位置と閉じの形まで必ず書きます。」
こういう“言語化の擦れ”が、私のエネルギーを地味に削っていく。
でも、やり直せる。AIは謝って、次の出力を合わせてくる。私は“怒る担当”、AIは“修正担当”。役割分担はできてきた。
7|管理画面を先に救う作戦
私は一度、思い切ってテーマを一時的に無効化するプランを検討した。
だが管理画面に入れない。FTPでテーマフォルダ UNICUS をリネームしてみる。
今度は別のエラー。WordPress は有効なテーマがないと、デフォルトテーマに落とすか、管理画面でテーマ選択を求める。けれど白い。
——つまり、テーマ以外にも問題が残っているということだ。
AI「プラグインは問い合わせフォーム以外全部停止しましょう。wp-content/plugins を plugins_off にリネームでOKです。」
私「実行。……変化なし。」
AI「では、テーマを戻して、functions.php 完全版を貼ります。add_editor_style() のパス、メニュー登録、HTML5対応、ウィジェットの __construct()、reCAPTCHA の検証、wp_enqueue_scripts の書き方、全部入りです。」
私は、“貼れば通る”とAIが宣言した functions.php を丸ごと差し替えた。
更新ボタンを押す指が、今は少しだけ軽い。
8|結果:フロントはまだ白い、でも“次の一手”が見えた
白い。
でも、管理画面のエラーメッセージが変わった。
今度は「add_theme_support() が未定義」という、WordPress の初期化順序に起因する落ち方。
zerif_setup() を after_setup_theme に正しくフックし直し、上から下にコードを並べ替える。
白い。
——こう書くと何も進んでいないように見えるけれど、ログの“文言”が確実に変わっている。
「致命的」から「非推奨」へ、そして「構文エラー」から「順序ミス」へ。
この変化の連鎖が、正しい方向に進んでいる証拠だ。
私「今は“管理画面を完全復旧”までは行けなかった。けれど、functions.php を現代化して、front-page.php の牙を抜いた。残りは何?」
AI「次はデータベースです。MySQL 5.6 のままでは、PHP 8.3 の環境に足を引っ張ることがあります。MySQL 8.0 に新規DBを作成し、旧DBをエクスポート → 新DBへインポート、wp-config.php の接続先を書き換えましょう。」
私は椅子を引き、深呼吸をした。
白い画面に向かって丸一日。壊れ方と直し方が、だんだん身体に入ってくる。
次回、DBを移行して、長く続いた白い壁に穴をあける。
AI「ここまで来たら、あと少し。DB移行が決まれば、管理画面もフロントも動くところまで持っていけます。」
私「やろう。次で終わらせる。」
(第3回につづく)
