add_action の引数が受け取れない|accepted_args と Too few arguments

結論

フックに登録するときの 第4引数 $accepted_args(既定値は 1) が、コールバックに渡される引数の数を決めます。2つ目以降の引数を使いたいなら、使う数を指定します。

add_action( 'save_post', 'my_save', 10, 3 ); // $post_id, $post, $update

省略すると、コールバックには第1引数しか渡されません。引数が2つ以上必須のコールバックでは ArgumentCountError(Too few arguments)になります。引数にデフォルト値があれば、エラーにならずデフォルト値が使われるため、気付きにくい不具合になります。

原因・仕組み

add_action() と add_filter() は同じ仕組みで、登録時の $accepted_args を記録します。フックが実行されると、WordPress は渡された引数のうち先頭からその数だけをコールバックに渡します。公式リファレンスにも、引数の数はフックを実行している do_action() / apply_filters() のソースで確認する、と書かれています。

多く指定してもエラーにはなりません。渡す引数が足りなければ、ある分だけが渡されます。

手順(サンプルコード)

1. 2つ以上受け取るフィルター

// 悪い例:accepted_args を省略
add_filter( 'demo_f', function ( $value, $post_id ) {
    return "$value/$post_id";
} );
// → apply_filters( 'demo_f', 'v', 5 ) で ArgumentCountError

// 良い例
add_filter( 'demo_g', function ( $value, $post_id ) {
    return "$value/$post_id";
}, 10, 2 );

2. コアのフックの引数を調べて指定する

add_action( 'save_post', function ( $post_id, $post, $update ) {
    if ( wp_is_post_revision( $post_id ) ) {
        return;
    }
    // $update が false なら新規作成
}, 10, 3 );

the_title のように、コアが apply_filters( 'the_title', $title, $post_id ) と2つ渡すフックは、10, 2 と書けば投稿IDも受け取れます。

3. 引数の数を確認する

add_action( 'demo_a', function () { echo 'argc=' . func_num_args(); }, 10, 3 );
do_action( 'demo_a', 1, 2, 3 );

動作確認(検証環境と結果)

WordPress 7.1.2(ja)、PHP 8.2.12 の CLI 環境で実行しました。

  • 省略した2引数のコールバック:ArgumentCountError: Too few arguments to function {closure}(), 1 passed in ...class-wp-hook.php ... and exactly 2 expected。
  • 10, 2 を指定:string(3) "v/5"。
  • 10, 3 で3つ渡した:argc=3。
  • 実際の引数より大きい 10, 5 を指定し、デフォルト値付き引数のコールバック:string(9) "v/default"(エラーにならない)。
  • save_post を 10, 3 で登録して wp_insert_post を実行:$post はオブジェクト、$update=false。
  • the_title を 10, 2 で登録:T#100(投稿IDを受け取れた)。

検証で作成した下書き投稿は削除済みです。ログは testsadd-action-accepted-args-too-few-arguments.md にあります。

add_action の引数が受け取れないときの注意点

  • フィルターで変更できるのは第1引数($value)だけです。他の引数は文脈の情報で、書き換えても元に戻りません(公式リファレンスの記載)。
  • 引数の数は、コアのバージョンで増えることがあります。リファレンスで最新を確認します。
  • クラスメソッドでも同じです。add_action( 'save_post', array( $this, 'save' ), 10, 3 ) のように指定します。

add_action の引数が受け取れないときによくあるミス

  • save_post で $post を使うのに、第4引数を指定しない。
  • accepted_args を実際より少なく書き、後ろの引数が NULL や未定義になる。
  • フックの引数の順番を、記憶で書いて間違える。
  • remove_action で、accepted_args まで一致させようとする(削除に必要なのは優先度までです。remove_action() の使い方|説明・引数・注意点参照)。

add_action の引数が受け取れないときのチェックリスト

  • フックの引数の数と順番を公式リファレンスで確認したか
  • コールバックの引数の数と第4引数が一致しているか
  • 投稿保存系は、リビジョンや自動保存への対策をしたか
  • クラスメソッドでも同じ指定をしているか
  • エラーログで ArgumentCountError が出ていないか

add_action の引数が受け取れないときのFAQ(よくある質問)

Q. 引数が多すぎる指定でも動きますか?
A. 動きます。渡された分だけが渡されます。ただし意図が伝わらないため、必要な数にします。

Q. 引数が0個のコールバックは?
A. 既定(1)のままでも動きます。PHP のユーザー定義関数は、余分に渡された引数を無視するためです。accepted_args に 0 を指定すると、引数なしで呼ばれます(検証環境で func_num_args() が 0 になることを確認)。

Q. 引数の数をプログラムで調べられますか?
A. func_num_args() で、コールバック内で確認できます。

筆者の見解(add_action の引数が受け取れない)

「フックの引数はコアのソースの do_action 行で確認する」というのが、いちばん確実だと考えます。ドキュメントを読むときも、第4引数を先に決めてからコールバックを書くと、型や順番の間違いにも気付きやすいと思います。

PR エックスサーバー

WordPressを、速く・止まらずに運営したい方へ

サーバー選びを間違えると、表示が遅い・サイトが止まるリスクがあります

こんなお悩みはありませんか?

  • どのレンタルサーバーを選べばよいか分からない
  • 表示が遅い・サイトが落ちるのが心配
  • WordPressの設定やセキュリティに自信がない

サーバーは、あとから乗り換えると、データの移行やドメインの設定に手間がかかります。表示が遅い、突然止まるといったトラブルは、訪問者が離れる原因にもなります。最初に、稼働率の保証や実績を確認して選ぶのが安全です。

エックスサーバーなら、WordPressの運営に強いレンタルサーバーを、迷わず選べます。国内でWordPressを利用して運用されているサイトの集計(Dataprovider.com調べ、2025年6月)で、国内シェアNo.1と公式サイトに記載されています。

No.1WordPressサイトの国内シェア(Dataprovider.com調べ・2025年6月)
99.99%以上サーバー月間稼働率を保証
99%以上WordPressへの攻撃を未然に防ぐ(2024年9月15日〜11月15日の当社調べ)

選ばれるポイント

  • WordPressサイトの国内シェアNo.1。実績で選びたいときの安心材料(Dataprovider.com調べ、2025年6月)
  • サイトが止まりにくい。月間稼働率99.99%以上を保証し、下回ると月額費用の一部を返金
  • 攻撃に強い。WordPressを狙った攻撃の99%以上を未然に防ぐ機能(2024年9月15日〜11月15日の当社調べ)
  • ドメイン代を節約できる。独自ドメインが永久無料(対象ドメイン・契約期間などの条件あり)
  • テーマ選びも安心。人気テーマ「Cocoon」の開発・提供元が運営
  • 10日間の無料お試しで、契約前に操作や表示の速さを確かめられる

10日間の無料お試しで、契約前に試せます

公式サイトを見る

10日間無料でお試し

広告(アフィリエイト)を含みます。特長は2026年11月8日時点の公式サイトの記載で、数値・順位は各調査・調べの時点のものです。料金・条件は公式サイトでご確認ください。

add_action の引数が受け取れないときの関連項目

出典(一次情報)

PR当サイトはアフィリエイト広告を利用しています。掲載内容は広告主から依頼・指示を受けたものではなく、筆者の調査・体験にもとづきます。
タイトルとURLをコピーしました