WordPressのテーマ開発やカスタマイズする時によく見かけるのが「add_action」という記述です。これは特定のタイミングで任意のPHPを実行できるWordPressの関数になります。

当記事では、アクションフックの仕組みとadd_action()の使い方について解説していきます。

WordPressのアクションフックとは?

アクションフックは「特定のタイミングで任意の処理を実行できる仕組み」のことを指します。

    WordPressでは、URLにアクセスしてからWebページが表示されるまでに様々なプログラムが適切な順番で実行されます。この一連の処理の中にいくつかの「トリガー」が用意されており、このトリガーを一般的に「フック」と呼んでいます。

    フックは、WordPressの中で定義されており、それぞれ固有の名称が付けられています。以下は、一部のフックの名称と実行されるタイミングになります。

    after_setup_theme テーマのfunctions.phpが読み込まれた直後
    init プラグインの初期化に利用。ユーザー情報は認証済み
    template_redirect テンプレートファイルを読み込む前
    wp_head wp_head()が呼び出されるタイミング

    これらはほんの一部で、WordPressには様々なフックが用意されています。その他のフックが気になる方は以下をご覧ください。

    アクションフックの基本的な使い方

    アクションフックを利用する際は、WordPress関数の「add_action()」を使います。

    add_action( $hook_name, $callback, $priority, $accepted_args );

    「add_action()」は、指定したフックで任意のコールバック関数を実行できる関数になります。

    基本的には、第一引数に「フックの名前」、第二引数に「実行したい関数名」を指定してfunctions.phpに記入します。

    // 基本的な使い方
    add_action( 'フックの名前', '実行したい関数名' );
    
    // 例)フック「wp_head」で関数「my_function()」を実行したい場合
    add_action( 'wp_head', 'my_function' );

    それでは、実際に具体的な使い方をみていきましょう。

    • 基本的な使い方
    • コールバック関数の実行順序を変更
    • コールバック関数の引数について
    • フックに登録済みの関数を削除する

    基本的な使い方

    まずは、アクションフックを利用してテーマのスタイルシートを読み込んでみましょう。

    WordPressには、CSSやJavaScriptの読み込みに最適なタイミングで実行されるフック「wp_enqueue_scripts」が存在します。こちらを利用してCSSを読み込みます。

    // テーマのスタイルシートを読み込む
    add_action( 'wp_enqueue_scripts', 'my_enqueue_style' );
    function my_enqueue_style(){
      wp_enqueue_style( 'my-style', get_template_directory_uri() . '/style.css' );
    }

    これはテーマのスタイルシートを読み込む関数(my_enqueue_style)を「wp_enqueue_scripts」のタイミングで実行しています。これが基本的な使い方になります。

    なお、「add_action()」の第二引数には、無名関数も利用できます。

    // テーマのスタイルシートを読み込む(無名関数を利用した場合)
    add_action( 'wp_enqueue_scripts', function(){
      wp_enqueue_style( 'my-style', get_template_directory_uri() . '/style.css' );
    } );

    CSSの読み込みについての具体的な解説は以下をご覧ください。

    コールバック関数の実行順序を変更

    「add_action()」の第三引数には、コールバック関数を実行する優先度を数値で指定できます。この数値が小さいものから優先的に実行される仕組みです。

    例えば「wp_head」に3つの関数をフックした場合、読み込まれた順番に実行されますが、

    // 同じフックで複数の関数を実行する
    add_action( 'wp_head', 'my_function_a' );
    add_action( 'wp_head', 'my_function_b' );
    add_action( 'wp_head', 'my_function_c' );
    
    // 実行される順番
    1:my_function_a()
    2:my_function_b()
    3:my_function_c()

    第三引数に優先度(数値)を指定すると、指定した数値の小さい順に実行されるようになります。

    // 同じフックで複数の関数を実行する
    add_action( 'wp_head', 'my_function_a', 20 );
    add_action( 'wp_head', 'my_function_b', 30 );
    add_action( 'wp_head', 'my_function_c', 10 );
    
    // 実行される順番
    1:my_function_c()
    2:my_function_a()
    3:my_function_b()

    これにより、実行順序をよりコントールしやすくなるので非常に便利です。なお、第三引数を省略した場合は優先度が「10」になります。

    コールバック関数の引数について

    「add_action()」で実行されるコールバック関数の引数は、利用するフックによって異なります。フックで使える引数が気になる方は、WordPress Developer Resourcesのフック一覧から検索して調べましょう。

    なお、引数を2つ以上利用する場合、第四引数を指定しなければいけない点にご注意ください。

    第四引数には、受け入れる引数の数を記入するのですが、この数が合っていないとエラーが発生します。第四引数の初期値は「1」のため、2つ以上の引数を利用する場合は、引数の数を必ず記入するようにしましょう。

    例えば、投稿を保存した時に実行されるフック「save_post」では、最大3つまで引数を利用できます。3つとも利用する場合は、第四引数に「3」と記入します。

    // 引数を3つ利用する場合は第四引数が必要
    add_action( 'save_post', function( $post_id, $post, $update ){
      // 実行する内容
    }, 10, 3 );

    フックに登録済みの関数を削除する

    ここまで紹介したのは、フックに関数を登録して実行する方法です。この登録した関数は「remove_action()」を利用することで削除できます。

    remove_action( $hook_name, $callback, $priority );

    使い方はシンプルで、第一引数に「フックの名前」第二引数に「登録した関数名」を指定するだけです。

    remove_action( 'フックの名前', '登録済みの関数名' );
    
    // 例)フック「wp_head」に登録済みの関数「my_function()」を削除したい場合
    remove_action( 'wp_head', 'my_function' );

    こちらを利用すれば、WordPressで既に登録されている関数を削除して再登録することも可能です。

    アクションフックのポイントを自分で作る

    冒頭で「フック」は予めWordPressで定義されていると解説しました。実は「wp_head」のようなフックは自分で好きな名称で作成することができます。

    このポイントを作るために利用する関数が「do_action()」になります。

    do_action( $hook_name, $arg );

    第一引数に「フック名」、第二引数以降に「コールバック関数に渡したい引数」を指定して利用します。

    // my_hookという名称のフックポイントを作成
    do_action( 'my_hook', $args1, $args2, $args3 );
    
    // my_hookを利用する場合
    add_action( 'my_hook', function( $args1, $args2, $args3 ){
      // 実行したい内容をここ
    } );

    do_action()を書く場所については、どのPHPファイルでも構いません。自分が実行したいタイミングがあれば、その場所に記入してみてください。

    まとめ

    今回は、アクションフックの基本的な仕組みと使い方についてご紹介しました。結局のところ、アクションフックは「do_action()」が書かれた箇所に「add_action()」で処理を加えるという構図で出来上がっています。

    ここが理解できれば、WordPressのカスタマイズが非常に楽になります。以下は、アクションフックを使ったカスタマイズになりますので、ぜひ参考にしてください。