【解決済】WordPressでPHP8.3へ更新時のエラー「create_function()」と「Undefined variable」の対処法

こんな悩みを解決できます

PHPのバージョンを上げたらサイトが真っ白になった…

エラーログに「create_function()」と出て意味が分からない

PHP8.3にしたいけど、エラーが怖くて踏み出せない

WordPressサイトの表示速度やセキュリティのために、PHPのバージョンアップは欠かせません。
しかし、いざバージョンを上げてみたら「サイトが真っ白に…」なんて経験はありませんか?

読者さん
読者さん

まさにそれです!PHP7.4から8.3にしたらエラーが出てしまいました…。

エラーメッセージが表示されると、焦ってしまいますよね。でも大丈夫です。エラーの原因を一つひとつ特定し、正しく対処すれば必ず解決できます。

この記事では、実際にPHP7.4からPHP8.3へのアップデートで発生したエラーを例に、具体的な原因と誰でもできる修正方法を詳しく解説します。

この記事でわかること
  • PHP8.3で発生する「create_function()」エラーの解決策
  • PHP8.3で表示される「Undefined variable」警告の対処法
  • PHPアップデートの必要性とメリット
  • エラー解決の具体的な手順

PHP8.3で発生した致命的エラー「create_function()」

ロベルト
ロベルト

まず、どのようなエラーメッセージが表示されたか教えていただけますか?

はい、以下のような「Fatal error(致命的なエラー)」が表示されました。

Fatal error: Uncaught Error: Call to undefined function create_function() in /path/to/wp-content/themes/your-theme/functions.php:256

原因:PHP8.0で削除された古い関数

このエラーの直接的な原因は、メッセージにある `create_function()` という関数です。

この `create_function()` は、実はPHP 7.2.0の時点ですでに「非推奨(もうすぐ使われなくなる古い書き方)」とされていました。そして、PHP 8.0でついに完全に「削除」されたのです。

そのため、PHP7.4ではギリギリ動作していましたが、PHP8.3にアップデートしたことで「そんな関数は存在しません」というエラーになってしまった、というわけです。

解決策:無名関数(クロージャ)への書き換え

解決方法は非常にシンプルです。エラーが出ているテーマの `functions.php` ファイルを開き、古い `create_function()` の記述を、現在の主流である「無名関数(クロージャ)」に書き換えるだけです。

▼修正前のコード(functions.php:256)

/*パスワードを入れた状態でログイン⇒パスワードをリセットできるので、それをログインできませんでしたにする*/
add_filter( 'login_errors', create_function('$a', "return 'エラー: ログインできませんでした';") );

▼修正後のコード

/*パスワードを入れた状態でログイン⇒パスワードをリセットできるので、それをログインできませんでしたにする*/
add_filter( 'login_errors', function($a) {
    return 'エラー: ログインできませんでした';
} );
ロベルト
ロベルト

たったこれだけの修正で、致命的なエラーは解消されます。

メモ

ちなみに、このコードの役割は「ログインに失敗した時のエラーメッセージを隠蔽し、セキュリティを向上させる」ためのものです。具体的なエラー内容(IDが違うのか、パスワードが違うのか)を攻撃者に知らせないようにする、という地味ながら重要な役割を担っています。

もう一つの警告「Undefined variable」

先ほどの致命的なエラーを修正すると、サイトは表示されるようになりました。しかし、今度はトップページに以下のような「Warning(警告)」が表示されることがあります。

Warning: Undefined variable $cat_ID in /path/to/wp-content/themes/your-theme/home.php on line 271
読者さん
読者さん

これも出ました!サイトは見えるけど、気になります…。

原因:未定義の変数の使用

この警告は、「`$cat_ID` という変数が、中身が空のまま(定義されていない状態)で使われようとしていますよ」というPHPからのお知らせです。

PHP7.4以前はこうした記述に寛容で、警告が出ないこともありましたが、PHP8.x系ではより厳格にチェックされるようになったため、警告として表示されるようになりました。サイトの表示を崩すものではありませんが、コードの品質としては修正すべき点です。

解決策:不要なコードブロックの削除

警告が出ている `home.php` のコードを確認すると、新着記事を取得するクエリの中で、この未定義の変数が使われていました。

▼修正前のコード(home.php:271付近)

'tax_query' => array(
	'relation' => 'OR',
	array(
		'taxonomy' => 'category',
		'field'	=> 'term_id',
		'terms'	=> $cat_ID, // ←ココが問題!
	),
	array(
		'taxonomy' => 'member_cat',
		'field'	=> 'slug',
		'terms'	=> 'private',
	),
	array(
		'taxonomy' => 'category',
		'field'	=> 'slug',
		'terms'	=> 'news',
	),
),

このコードを見ると、すでに `news` というカテゴリの記事を取得する条件が別に指定されています。そのため、`$cat_ID` を使っている部分はそもそも不要な記述である可能性が高いです。

そこで、この不要なコードブロックを丸ごと削除します。

▼修正後のコード

'tax_query' => array(
	'relation' => 'OR',
	// array( ← このブロックを削除
	// 	'taxonomy' => 'category',
	// 	'field'	=> 'term_id',
	// 	'terms'	=> $cat_ID,
	// ), ← ここまで削除
	array(
		'taxonomy' => 'member_cat',
		'field'	=> 'slug',
		'terms'	=> 'private',
	),
	array(
		'taxonomy' => 'category',
		'field'	=> 'slug',
		'terms'	=> 'news',
	),
),

この修正により、警告メッセージはきれいに消え、コードもスッキリしました。

そもそも、なぜPHPのアップデートは必要なの?

読者さん
読者さん

エラーが出るなら、古いPHPのままでもいいのでは…?

ロベルト
ロベルト

それはとても危険です!PHPのアップデートには大きなメリットがあります。

PHPを最新にする3つのメリット
  1. セキュリティの向上(最重要)
    古いPHPには脆弱性が見つかっても修正パッチが提供されません。サイト乗っ取りなどのリスクを避けるため、アップデートは必須です。
  2. パフォーマンスの向上
    新しいPHPは処理速度が大幅に向上しています。サイトの表示が速くなることは、SEOにも訪問者の満足度にも繋がります。
  3. 互換性の維持
    WordPress本体やプラグインは、新しいPHPに合わせて開発されます。古いPHPを使い続けると、最新の機能が使えなくなる可能性があります。
ここに注意

特に、今回例に挙げたPHP7.4は、2022年11月28日に公式のセキュリティサポートが完全に終了しています。使い続けることは非常に危険です。

まとめ

今回は、WordPressサイトをPHP7.4から8.3へアップデートした際に発生した2つのエラーについて、原因と解決策を解説しました。

今回のポイント
  • 「create_function()」エラーは、PHP8.0で削除された関数が原因。無名関数に書き換えて対応する。
  • 「Undefined variable」警告は、中身が空の変数が使われているのが原因。不要なコードなら削除する。
  • PHPのアップデートは、エラーのリスク以上にセキュリティとパフォーマンスのメリットが大きい。

PHPのバージョンアップでエラーが出ると焦りますが、メッセージをよく読めば原因は必ず特定できます。この記事を参考に、安全にサイトを最新の状態に保ちましょう。

ロベルト
ロベルト

アップデート前には、必ずサイトのバックアップを取ることを忘れないでくださいね。