【WordPress】「call_user_func_array」エラーが出たときの対処法

【WordPress】「call_user_func_array」エラーが出たときの対処法 WordPress

WordPressで次のような call_user_func_array エラーが出ることがあります。これは、add_action() / add_filter()登録されたコールバック関数をWordPressが呼び出そうとしたが、その関数が見つからない(存在しない・無効)ときに発生します。

エラーメッセージ例
Warning: call_user_func_array() expects parameter 1 to be a valid callback,
function 'custom_filter_hoge' not found or invalid function name
in /wp-includes/class-wp-hook.php on line 308
まず読み取ること

  • 関数名'custom_filter_hoge'(この関数が問題)
  • WordPressがフック実行時に、その名前の関数を呼べなかった
  • つまり「登録はされているのに、関数の実体が無い」状態
スポンサーリンク

原因1:関数が存在しない(タイプミス・未定義)

最も基本的な原因は、フックに登録した関数が定義されていないことです。関数名のスペルミスや、関数を書き忘れているケースです。

NG:登録した関数が未定義
add_action('init', 'custom_filter_hoge'); // この関数がどこにも無い → エラー

対処は、関数を正しく定義するか、スペルミスを直すことです。

OK:関数を定義する
add_action('init', 'custom_filter_hoge');

function custom_filter_hoge() {
  // 行いたい処理
}

まずは関数名でプロジェクト全体を検索し、定義(function custom_filter_hoge)が存在するかを確認しましょう。テーマ・プラグイン・functions.php のいずれにも無ければ、未定義が原因です。

原因2:プラグイン削除・関数リネーム後の「孤立フック」(最多)

実務でよくあるのが、関数を定義していたプラグインを無効化・削除した、または関数名を変更(リネーム)したのに、add_action / add_filter登録だけが残っているケースです。呼び出し先の関数が消えているため、このエラーになります。

対処:登録(フック)側を直す
残ってしまった add_action('init', 'custom_filter_hoge'); の行を削除するか、リネームした新しい関数名に書き換えます。別プラグインから登録されている場合は remove_action() / remove_filter() で解除することもできます。フックの仕組みはフィルターフックとは?も参考になります。

「関数が存在するときだけ登録する」ようにしておくと、この種のエラーを未然に防げますfunction_exists() でガードします。

予防:function_exists でガードする
if (function_exists('custom_filter_hoge')) {
  add_action('init', 'custom_filter_hoge');
}

原因3:クラスのメソッドを指定するときの形式ミス

コールバックがクラスのメソッドの場合、関数名の文字列ではなくarray($object, 'メソッド名') の形式で渡す必要があります。これを文字列で書くとコールバックとして無効になり、同じエラーが出ます。

クラスメソッドをコールバックに指定する
$obj = new My_Class();

// OK:オブジェクトとメソッド名を配列で渡す
add_action('init', array($obj, 'my_method'));

// 静的メソッドの場合
add_action('init', array('My_Class', 'my_static_method'));

原因が特定できないときはWP_DEBUGで調べる

どのフックが問題か分からない場合は、wp-config.phpWP_DEBUG を有効にすると、エラーの詳細(ファイル名・行番号)が表示され、原因を絞り込みやすくなります。

wp-config.php:デバッグを有効にする
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);  // wp-content/debug.log に記録
define('WP_DEBUG_DISPLAY', false); // 画面には出さずログに記録
本番環境では画面表示をオフに
本番サイトでは WP_DEBUG_DISPLAYfalse にして、エラーを画面ではなくログ(wp-content/debug.log)に出すようにしましょう。原因のプラグインを切り分けるには、プラグインを1つずつ無効化して再現するか確認します。画面が真っ白で操作できない場合は画面が真っ白(ホワイトスクリーン)になったときの対処法、「重大なエラー」表示は「重大なエラーが発生しました」の原因と解決方法も参照してください。

関連する対処法

よくある質問(FAQ)

Qこのエラーの直接の原因は何ですか?
Aadd_action() / add_filter() に登録した関数が存在しない、または呼び出し可能でないことです。関数名のスペルミス、関数を定義していたプラグインの無効化・削除、クラスメソッドの指定形式の誤り(array($obj, 'method'))、functions.php の構文エラーなどが原因になります。
Qどのプラグイン・関数が原因か特定するには?
Aエラーメッセージの関数名と、WP_DEBUG を有効にして表示されるファイル名・行番号を手がかりにします。プラグインを1つずつ無効化して再現する/しないを確認すると、原因のプラグインを絞り込めます。
QWordPressやプラグインの更新後に出るようになりました。
AAPIの変更で関数のシグネチャ(引数)が変わった、または関数が削除されたのに古いコードが参照している場合に起こります。プラグイン・テーマを最新版に更新するか、該当する functions.php のフックを新しい仕様に合わせて修正してください。

まとめ

このエラーは「登録したフックの関数が見つからない」というサインです。次の順で確認しましょう。

  • 関数名で全体を検索し、定義があるか確認(スペルミス・未定義)
  • 孤立フックを疑う:プラグイン削除・リネーム後に残った登録を削除/修正
  • クラスメソッドarray($obj, 'method') 形式で指定
  • 予防function_exists() でガードしてから登録
  • 切り分けWP_DEBUG + プラグインの個別無効化