ワードプレスでcreate_function()を自作してUncaught Error: Call to undefined function create_function()エラーを解消する方法について解説いたします。

Uncaught Error: Call to undefined function create_function()を解決する方法

Call to undefined function create_function()エラーはPHP8以上におきまして、create_functionという関数が削除されてしまった事によって出るエラーです。古いプラグインやテーマを使用している場合、PHP8以上にサーバーの設定を変えることで比較的よく出てくるエラーです。

下記のコードはcreate_functionで、$aという変数を受け取って、それを2回繰り返して返す という処理関数を作っている例です

$newfunc = create_function('$a', 'return $a.$a;');
echo $newfunc("Hello world!");

このコードはPHP8以上でcreate_functionが削除されていますので下記のようなエラーが出ます。

Fatal error: Uncaught Error: Call to undefined function create_function() in ***\create_functiontest.php on line 4

このようなエラーを修正する最も一般的な方法は無名関数に書き換えることになります。しかしこの方法はわかりにくくある程度のプログラミング知識を必要とします。

$newfunc = function($a) {
    return $a . $a;
};
echo $newfunc("Hello world!");

create_function()を丸ごと作り直す

下記のコードはcreate_functionという関数が無い場合に、eval関数を使って疑似的にcreate_function関数を自前で作ったものを使用するように出来るコードです。

<?php
if(! function_exists('create_function')){
	function create_function($args, $code) {
		$funcName = 'create_function_' . uniqid();
		eval("function ".$funcName."(".$args.") {".$code.";}");
		return $funcName;
	}
}

このコードをコピペしていただき、テキストエディタでcreate_function_fix.phpという名称で保存していただき、FTP
ソフトウェアでwp-contentフォルダの中にmu-pluginsというフォルダを作っていただき、その中にアップロードしていただくと、一括でcreate_functionエラーを修正できるかと存じます。

ワードプレスのmu-pluginsフォルダにあるphpプログラムは、プラグインやテーマが読み込まれる前に実行されますのでそこに疑似create_function関数を自作することで、以後実行されるすべてのcreate_function関数がエラーを引き起こさなくなる形です

※ただこの方法は、場当たり的な方法ではありますので、セキュリティーホール(※)を作る可能性もございます。可能であれば代替えのプラグインを使用したり、ひとつづつcreate_function関数を無名関数に修正いただくことをお勧めいたします。

どのような場合に疑似create_functionがセキュリティーホールを作る?
例えば、元create_function関数にPOSTやGET等の外部通信で変更可能な値が受け渡しされている場合、どんな関数もサーバー上で作ってしまえるようになる可能性があります(例えば正規ファイルを書き換える等)。このようなセキュリティホールが疑似create_function関数を作ったことによって再現されてしまう可能性があります。

WordPress ワードプレスのバグ修正やサイトの復旧のご相談・ご依頼はWPドクターまでお気軽にお送りください