完全解説!WordPressのフックとは?アクションフックとフィルターフックの仕組みと使い方

投稿日:2024年04月19日(金) 更新日:2024年11月30日(土)
完全解説!WordPressのフックとは?アクションフックとフィルターフックの仕組みと使い方|UMENOKI|すぐに仕事で使えるIT技術情報メディア

みなさんこんにちは!エンジニアの高澤です!

今回はWordPressのアクションフックとフィルターフックの仕組みと使い方について解説していきたいと思います。

フックはWordPressのカスタマイズ構築をするエンジニアにとってはほぼほぼ扱うことになるWordPressで非常に重要な独自の仕組みになります。

逆にいうとこのフックを扱えることによってWordPressで出来ることの幅が一気に広がり、高度なテーマ開発やプラグイン開発ができるようになります。

そのため、フックはWordPressエンジニアにとって必須のスキルといっても過言ではありません。

当記事ではそんなフックについて徹底的に解説し、当記事を読めばお仕事などでお役立てできる構成で執筆しております。

よろしければぜひご活用いただけましたら幸いです。

フックとは

フックとは、WordPress自体の一連の処理(処理フロー)の特定のタイミングや処理に独自のカスタマイズを追加する仕組みのことをいいます。

フックには以下の2種類があります。

  • アクションフック
  • フィルターフック

例えば、WordPressにはテンプレートタグで記事タイトルを表示するget_the_title()関数や記事の本文を表示するget_the_content()関数などがあるかと思いますが、フックを使えば表示されたテキストを加工して表示をアレンジしたりすることができます。

また他にも、記事の編集管理画面で保存ボタンをクリックしたときや、管理画面からテーマを変更したりしたときになどに独自の何かしたらの処理を実行したりする場合にもフックという仕組みが大活躍します。

つまりフックはWordPressを多方面からカスタマイズする場合に必要に必須の技術といえます。

フックの使いどころとは?

フックは、WordPressの柔軟性と拡張性を高めるための非常に重要な仕組みであり、開発者がWordPressをより強力にカスタマイズするための基本的なツールです。

そんなフックの使いどころについて確認しておきたいと思います。

基本的に以下の場合にフックを使用します。

  • プラグインを開発するとき
  • 高度なテーマを開発するとき
  • 管理画面をカスタマイズするとき

上記対応を行う場合にフックは必須になります。

どれだけフックがWordPress構築に不可欠かお分かりいただけましたでしょうか?

フックの仕組み

フックはWordPressの処理フローのさまざまなタイミングに独自の処理を引っ掛けて(フックして)WordPressの挙動を変更しカスタマイズするための仕組みです。

それではなぜこのような仕組みが実現できるのでしょうか?

それは、WordPressコア全体の処理のソースコードの至る所にフックを実行できる関数が設置されているからです。

その関数とは以下の内容になります。

do_action()アクションフックを実行するための関数です。
特定のタイミングで別の処理を実行したい場合に使います。「何かを起こすためのトリガー」のような役割を持ちます。
apply_filters()フィルターフックを実行するための関数です。
既存のデータを加工・変更したい場合に使います。「データを通過させてカスタマイズするフィルター」のような役割を持ちます。

これらの関数は、WordPressのソースコードの至る所に存在し、アクションやフィルターを実行するために使用されます。例えば、以下のような場面で使用されます。

  • テーマが読み込まれる直前や直後
  • 投稿が保存される直前や直後
  • ページが表示される直前や直後
  • ウィジェットが更新される直前や直後

これらの関数によって、開発者はWordPressの動作を細かく制御し、カスタマイズすることができます。

それぞれもう少し詳しく解説いたします。

do_action()について

do_action()は、アクションフックを実行するための関数です。アクションフックとは、特定のタイミングで別の処理を追加するための仕組みを指します。この関数を使うことで、テーマやプラグインの開発者は、指定された場所に独自のコードを挿入することができます。

たとえば、「ページヘッダーを表示する直前に、何か追加の処理を実行したい」といった場合、do_action()を使うことで、その処理を簡単に差し込むことが可能です。WordPressでは、do_action()を使って「ここでこの処理をしてください」というトリガーを設定し、それに対する具体的な動作を別途登録します。

例として、do_action('custom_header')を記述すると、これに紐づけられた関数が実行されます。開発者がadd_action('custom_header', 'header_customization')を登録しておけば、header_customization()関数内の処理が実行される仕組みです。

トリガーする側(アクションを実行する場所)

do_action('custom_header');

フックを登録する側(アクションを追加する関数)

function header_customization() {
    echo '<h1>カスタマイズされたヘッダーが表示されます!</h1>';
}
add_action('custom_header', 'header_customization');

apply_filters()について

apply_filters()は、フィルターフックを実行するための関数です。フィルターフックは、特定のデータに対して加工や変更を加えるために使用されます。この関数を使うと、既存のデータを動的にカスタマイズしたり、追加の処理を加えたりすることが可能です。

たとえば、「表示されるテキストに一部変更を加えたい」といった場合に、この関数を利用します。apply_filters()を記述することで、指定されたフィルター名に紐づけられた処理が実行され、その結果を返します。

例として、apply_filters('header_text', 'デフォルトの見出し')と記述すると、他の開発者がadd_filter('header_text', 'customize_header_text')で登録した関数customize_header_text()が実行され、カスタマイズされた見出しが返される仕組みです。

フィルターを適用する側(データを変更する場所)

$header_text = apply_filters('header_text', 'デフォルトの見出し');

フィルターを登録する側(データを加工する関数)

function customize_header_text($text) {
    return $text . '(カスタマイズされたテキスト)';
}
add_filter('header_text', 'customize_header_text');

上記customize_header_text()関数の引数「$text」にはapply_filters('header_text', 'デフォルトの見出し')で指定された第2引数の「デフォルトの見出し」が代入されます。

その「$text」を加工するイメージです。

フックの使い方

フックにはアクションフックとフィルターフックという2種類のフックがあります。

簡単にいうとアクションフックは「処理の追加」、フィルターフックは「データや処理を加工」の役割があります。

そのため、WordPressのフックを使う方法はアクションフックとフィルターフックで異なります。

またフックのコードはいずれも以下のように記述場所が決まっております。

  • テーマ開発の場合:functions.php
  • プラグイン開発の場合:構成するPHPファイル

それではそれぞれの使い方を解説していきます。

アクションフックの使い方

アクションフックを追加するには、add_action()関数を使用します。

この関数には、引数にアクション名(例:save_postなど)と、実行する関数の2つの引数を指定します。

例えば、WordPressの投稿が保存された後に特定の処理を実行したい場合は次のように書きます。

<?php
function my_custom_function($post_id) {
    // ここに特定の処理を記述
}
add_action('save_post', 'my_custom_function');

上記コードは、プラグイン開発であればプラグインファイルを構成するPHPファイルの任意の箇所に記述し、テーマ開発であればfunctions.phpに記述して実装します。

フィルターフックの使い方

フィルターフックを追加するには、add_filter()関数を使用します。

この関数には、引数にアクション名(例:save_postなど)と、実行する関数の2つの引数を指定します。

例えば、WordPressの投稿のタイトルを表示する前に特定の文字列を追加したい場合、次のように書きます。

<?php
function my_custom_filter($title) {
    $new_title = $title . ' - 追加された文字列';
    return $new_title;
}
add_filter('the_title', 'my_custom_filter');

注意点としては、add_filter()関数では必ずreturn文で加工したデータを返さなければいけないので、return文を忘れないようにしてください。

return文が必ず必要なので、忘れないようにしてください。

上記コードも、プラグイン開発であればプラグインファイルを構成するPHPファイルの任意の箇所に記述し、テーマ開発であればfunctions.phpに記述して実装します。

アクションフックとは

アクションフックとは、特定のイベントが発生した際に、指定されたアクションを実行するためのフックです。

例えば、記事が公開されたとき、テーマが変更されたとき、ウィジェットが更新されたときなど、様々なアクションにフックを設定することができます。

アクションフックは、開発者が独自で実装した特定のコード(関数)が実行されるタイミングを指定するのに使われます。

add_action()関数

add_action()関数は、WordPressのアクションフックを追加(登録)するための関数です。

アクションフックは、特定のイベントが発生した際に、それに関連する独自の処理を実行するための仕組みです。

add_action()関数は以下の構文になります。

<?php
add_action( $hook, $function_to_add, $priority = 10, $accepted_args = 1 );

ここで各引数の説明をします。

引数名説明初期値
$hookstringアクションフックの名前を指定します。イベントが発生した際に実行されるコールバック関数を指定します。なし
$function_to_addcallable指定されたアクションフックに対して実行されるコールバック関数を指定します。なし
$priorityintコールバック関数の優先順位を指定します。同じアクションに複数のコールバック関数が登録されている場合、優先順位に従って順次実行されます。10
$accepted_argsintコールバック関数が受け取る引数の数を指定します。1

第1引数はフックの名前で、処理を追加するフックの名前を指定します。

第2引数はフックさせて実際に処理を行う関数を指定します。

do_action()関数

do_action()関数は、WordPressのアクションフックを手動で実行するための関数です。

指定されたアクションフックに登録された全てのコールバック関数を実行します。

do_action()関数は以下のような構文を持ちます。

<?php
do_action( $tag, $arg );

ここで各引数の説明をします。

引数名説明
$tag実行するアクションフックの名前を指定します。
$argオプションの引数で、アクションフックに渡すデータを指定します。この引数は必須ではありません。

特定のアクションフックを手動で実行して特定の処理を実行したい場合、次のように書きます。

<?php
do_action( 'my_custom_action' );

上記のコードは、my_custom_actionというアクションフックが以下のコードのようにadd_action()関数によって追加(登録)されている場合、それに関連する全てのコールバック関数が実行されます。

<?php
// テーマの functions.php ファイルやプラグインのファイルに以下のコードを追加します

// my_custom_action が発生した際に実行されるコールバック関数
function my_custom_function() {
    // ここに特定の処理を記述します
}
// my_custom_action アクションフックを登録する
add_action( 'my_custom_action', 'my_custom_function' );

また、do_action()関数は必要に応じて以下のコードのように引数を指定してアクションフックにデータを渡すこともできます。

<?php
// アクションフックの登録
add_action( 'my_custom_action', 'my_custom_function_with_args', 10, 2 );

// アクションフックが発生した際に実行されるコールバック関数
function my_custom_function_with_args( $arg1, $arg2 ) {
    // 渡されたデータを使って何らかの処理を行う
    echo '引数1: ' . $arg1 . '<br>';
    echo '引数2: ' . $arg2 . '<br>';
}

// アクションフックを呼び出す際、引数を指定して実行する
do_action( 'my_custom_action', 'データ1', 'データ2' );

上記コードの例では、my_custom_action アクションフックに対して、独自に定義したmy_custom_function_with_args()関数を登録しています。

この関数は2つの引数を受け取り、それぞれの引数の値を表示します。

最後に do_action()関数で my_custom_actionアクションフックを呼び出す際に、2つの引数を指定しています。

これにより、コールバック関数である独自に定義したmy_custom_function_with_args()関数にデータを渡すことができます。

このdo_action()関数は、通常テーマの functions.phpファイルやプラグインのファイル内のPHPで使用されます。これにより、アクションフックを手動で実行することができます。

フィルターフックとは

フィルターフックとは、特定のデータや値を変更する際に使用されるフックです。

フィルターフックは、特定のデータが表示される前に、そのデータを変更するフィルター関数を実行します。

これにより、例えば投稿の本文やタイトル、コメントの内容などを変更したり、特定のデータに対してフィルター処理を施したりすることができます。

add_filter()関数

add_filter()関数は、WordPressのフィルターフックを追加するための関数です。

フィルターフックは、特定のデータや値を変更するための仕組みで、指定されたフックポイントでフィルター関数が適用されます。

また、アクションフックのadd_action()関数との違いとして、add_filter()関数では必ずreturn文で加工したデータを返します。

return文が必ず必要なので、忘れないようにしてください。

add_filter()関数は以下の構文になります。

<?php
add_filter( $hook, $function_to_add, $priority = 10, $accepted_args = 1 );

ここで各引数の説明をします。

引数名説明初期値
$hookstringフィルターフックの名前を指定します。フィルターを適用するタイミングや場所を示します。なし
$function_to_addcallable指定されたフィルターフックに対して実行されるフィルター関数を指定します。この関数は、フィルターが適用されるデータを受け取り、変更したデータを返します。なし
$priorityintフィルター関数の優先順位を指定します。同じフィルターフックに複数のフィルター関数が登録されている場合、優先順位に従って順次実行されます。10
$accepted_argsintフィルター関数が受け取る引数の数を指定します。1

第1引数はフックの名前で、処理を追加するフックの名前を指定します。

第2引数はフックさせて実際に処理を行う関数を指定します。

apply_filters()関数

apply_filters()関数は、WordPressのフィルターフックを実行するための関数です。

指定されたフィルターフックに登録された全てのフィルター関数を実行し、データを加工・変更するために使用されます。

apply_filters() 関数は以下のような構文を持ちます。

<?php
apply_filters( $tag, $value, $var, ... );

ここで各引数の説明をします。

引数名説明
$tag実行するフィルターフックの名前を指定します。
$valueフィルター関数(add_filter関数)に渡されるデータを指定します。
$var, …オプションの引数で、フィルター関数に追加のデータを渡す場合に使用します。この引数は必須ではありません。

例えば、特定のフィルターフックを実行してデータを変更したい場合、次のように書きます。

<?php
$new_value = apply_filters( 'my_custom_filter', $original_value );

上記コードでは、my_custom_filterというフィルターフックに以下のコードのように登録された全てのフィルター関数が $original_value という値に適用され、変更された新しい値が $new_value に代入されます。

<?php
// フィルター関数1
function my_custom_filter_function1( $value ) {
    // データを変更する処理を記述
    $new_value = $value . ' - 追加された文字列';
    return $new_value;
}
// フィルターフックの登録
add_filter( 'my_custom_filter', 'my_custom_filter_function1' );

// フィルター関数2
function my_custom_filter_function2( $value ) {
    // データを変更する処理を記述
    $new_value = strtoupper( $value );
    return $new_value;
}
// フィルターフックの登録
add_filter( 'my_custom_filter', 'my_custom_filter_function2' );

上記コードでは、my_custom_filterというフィルターフックに対して、2つのフィルター関数が登録されています。

my_custom_filter_function1()関数では、渡された値に文字列を追加して新しい値を返し、my_custom_filter_function2()関数では、渡された値を大文字に変換して新しい値を返します。

これらのフィルター関数は、apply_filters()関数が呼ばれた際に実行され、それぞれの関数が適用されてデータが変更されます。

apply_filters()関数は、通常、テーマの functions.php ファイルやプラグインのファイル内のPHPで使用されます。これにより、フィルターフックを実行してデータを変更することができます。

ちなみに念の為説明しておきますが、上記サンプルコードのapply_filters()関数の第2引数の$original_valueは元のデータで、add_filter()関数の第2引数の$valueはその元のデータを受け取るための引数です。

フックの使用例

フックを使う場面はさまざまであり、テーマ開発やプラグイン開発ではもちろん、WordPress本体のコアの処理のカスタマイズといったように、フックを利用する機会は非常に多いです。

ここでは具体的にフックの使用例について解説いたします。

投稿データを保存して公開したら管理者にメールを送信する

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
function send_admin_email_on_post_publish( $post_id ) {
    // 投稿が公開されたときの処理

    // 投稿情報を取得
    $post = get_post( $post_id );
    
    // 投稿の投稿タイプを確認
    if ( $post->post_type !== 'post' ) {
        return; // 投稿タイプが「post」でない場合は処理を終了
    }

    // 管理者のメールアドレスを取得
    $admin_email = get_option( 'admin_email' );

    // メールの件名
    $subject = '新しい投稿が公開されました: ' . $post->post_title;

    // メール本文
    $message = '新しい投稿が公開されました。' . "\n\n";
    $message .= 'タイトル: ' . $post->post_title . "\n";
    $message .= 'URL: ' . get_permalink( $post_id ) . "\n";

    // 管理者にメールを送信
    wp_mail( $admin_email, $subject, $message );
}
// 投稿が保存されて公開されたタイミングで管理者にメールを送信する
add_action( 'publish_post', 'send_admin_email_on_post_publish' );

上記コードでは、publish_postというアクションフックを使用して、新しい投稿が公開されたタイミングで独自に定義したsend_admin_email_on_post_publish()関数を実行します。

この関数内では、投稿の情報を取得し、管理者のメールアドレスを取得してから、wp_mail() 関数を使用して管理者にメールを送信します。

body_class()関数で出力されるクラス属性に任意のクラスを追加

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// body_class フィルターフックの使用例
function my_custom_body_class( $classes ) {
    // ログインしているユーザーに特定のクラスを追加する
    if ( is_user_logged_in() ) {
        $classes[] = 'custom-logged-in';
    }

    // 特定のページテンプレートに特定のクラスを追加する
    if ( is_page_template( 'custom-template.php' ) ) {
        $classes[] = 'custom-template';
    }

    // 投稿タイプが「post」の場合に特定のクラスを追加する
    if ( is_single() && get_post_type() === 'post' ) {
        $classes[] = 'custom-single-post';
    }

    return $classes;
}
add_filter( 'body_class', 'my_custom_body_class' );

上記コードでは、body_classというフィルターフックを使用して、HTMLのbodyタグに記述しているbody_class()関数によって出力されるクラスの内容に任意のクラスを追加する処理を実行します。

記事データをゴミ箱に入れたときに何か処理したい場合

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
function my_trash_post($postObj) {
      $postID = $postObj->ID;
}
add_action('publish_to_trash', 'my_trash_post');
add_action('draft_to_trash',   ' my_trash_post');
add_action('future_to_trash',  'my_trash_post');

上記が投稿編集画面で記事データをゴミ箱に入れた時のフックです。

上記コードは、WordPressの投稿がゴミ箱に移動される際に特定のアクションが実行されるようにするためのフックを追加しています。

これらのアクションが実行されると、指定された独自のmy_trash_post()関数が呼び出されます。

以下がそれぞれのフックの説明になります。

publish_to_trash投稿が公開からゴミ箱に移動されるときに実行されます。
draft_to_trash下書きがゴミ箱に移動されるときに実行されます。
future_to_trash未来の予約投稿がゴミ箱に移動されるときに実行されます。

通常は、この関数内で特定の処理を行うために投稿の情報を利用します。例えば、投稿がゴミ箱に移動されたときに通知を送信したり、ログを記録したりすることが考えられます。

記事データを完全に削除する直前で何か処理したい場合

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// 投稿が削除される直前に実行される処理
function my_before_delete_post_action($post_id) {
    // 削除される投稿の情報を取得
    $deleting_post = get_post($post_id);

    // 削除される投稿の情報をログに記録する
    error_log('Deleting post ID: ' . $deleting_post->ID);
    error_log('Deleting post title: ' . $deleting_post->post_title);

    // 他のカスタム処理を追加することができます
}

// before_delete_post アクションに関数をフックする
add_action('before_delete_post', 'my_before_delete_post_action');

上記コードは、WordPressの投稿が削除される前に特定の処理を実行するためのフックを追加しています。

以下がフックの説明になります。

before_delete_post投稿が削除される直前に実行されます。

上記コードでは、before_delete_postアクションに独自のmy_before_delete_post_action()関数をフックしています。

my_before_delete_post_action()関数内では、削除される投稿の情報を取得し、ログに記録する例を示しています。他のカスタム処理を追加することも可能です。

独自のmy_before_delete_post_action()関数の中には、削除される投稿のID($post_id)が渡されます。

この ID を使用して、削除される投稿の情報を取得し、必要に応じて特定の処理を行うことができます

使用例としては、削除される投稿に関連するメタデータやファイルを削除する、他のデータベースのレコードを更新する、などの操作が考えられます。

記事データを完全に削除する直後で何か処理したい場合

以下のコードをfunctions.phpにコピー&ペーストしてください。

<?php
// 投稿が削除された後に実行される処理
function my_delete_post_action($post_id) {
    // 削除された投稿の情報を取得
    $deleted_post = get_post($post_id);

    // 削除された投稿の情報をログに記録する
    error_log('Deleted post ID: ' . $deleted_post->ID);
    error_log('Deleted post title: ' . $deleted_post->post_title);

    // 他のカスタム処理を追加することができます
}

// delete_post アクションに関数をフックする
add_action('delete_post', 'my_delete_post_action');

上記は、投稿が削除された後に実行されます。

上記コードでは、delete_postアクションに独自のmy_delete_post_action()関数をフックしています。

以下がフックの説明になります。

delete_post投稿が削除された後に実行されるアクションです。このアクションが実行されると、投稿が削除された後の処理を行うことができます。

my_delete_post_action()関数内では、削除された投稿の情報を取得し、ログに記録する例を示しています。他のカスタム処理を追加することも可能です。

WordPressカスタマイズで使えるフック一覧

最後に、WordPressカスタマイズで使えるフックの一覧を解説したいと思います。

詳しくは以下の記事で解説しておりますので、よろしければチェックしていただけますと幸いです。

https://ume-noki.com/wordpress-hook-sheet

上記記事では、実務に役立つWordPressのフックを厳選して解説し、プラグインやテーマ開発に役立つチートシートとしての機能を意識して構成して執筆しております。

初心者の方々には、どのようなフックが存在し、何が可能なのかをイメージしやすくしており、また、上級者の方々には、即座に参考にできる便利なツールとなるかと思っております。

ぜひお仕事で繰り返しご活用いただけますと幸いです。

まとめ

WordPressのフックとは?アクションフックとフィルターフックの仕組みと使い方についての解説は以上になります。

フックという仕組みはWordPressエンジニアにとっては高度なテーマ開発やプラグイン開発などで非常に重宝される重要な技術といっても過言ではありません。

当記事ではフックについて一通り解説しており、当記事一つでお仕事で問題なく使えるレベルまで落とし込んで解説しておりますので、フックについて知りたい初心者エンジニアの方から、学び直したい上級エンジニアの方まで、多くの方に読んでいただけるように執筆いたしました。

よろしければぜひお仕事などにお役立ていただけましたら幸いです。

執筆者

UMENOKI編集部 高澤 翔汰

歴5年目(2024年8月以降から5年目です)のエンジニアです!
CMSでのサイト構築とWebデザイン制作を兼任して5年目になります。
自作のiOSアプリ(iPhoneアプリ)やWordPressプラグインを開発することもあり、まだまだ現在進行形で勉強中です!

お気軽に皆さんのご要望をお聞かせください!

どんなに些細なことでも構いません!よろしければ記事や当サイトへの「こんな記事があったら仕事とかで役に立つな〜」や「こうだったらもっと役に立つのに!」といったようなご要望等をお気軽にお聞かせください!今後のサービス改善にお役立てさせていただきます!

例1)Reactの技術記事を書いてほしい!
例2)WordPressの使い方とかを初心者向けに解説してほしい!...など

送信と同時にプライバシーポリシーに同意したものとします。
サンタさん