MENU

【WordPress基礎講座】フックとは?

目次

はじめに

WordPressでウェブサイトやブログを作っていると、「もう少しここを変えたい」「この機能を追加したい」と思うことがありませんか?

そんなとき力を発揮するのが「フック」です。フックはWordPressの魅力的な機能の一つで、プログラミングの初心者でも使えるツールです。

この記事では、WordPressのフックとは何か、なぜ便利なのか、そして簡単な使い方を解説します。

僕よしおは、無料メルマガをやっております!(WordPressのTipsや僕が開催するライブ講座のご案内などを発信)

よろしければぜひお気軽に登録してください!
(特にライブ講座は大好評なので、ぜひ登録してご参加ください!🙌)

>> 無料メルマガの登録はこちら(メアド入力のみ)

フックとは何か?

フックとは簡単に言うと、WordPressの動作の特定の瞬間に「割り込む」ための仕組みです。例えるなら、川の流れの中に「釣り針(フック)」を垂らして、特定のタイミングで何かを「引っかける」ようなものです。

WordPressでは、記事を保存するとき、コメントが投稿されるとき、ページが表示されるときなど、さまざまなタイミングでフックが用意されています。これらのフックを利用することで、WordPressの標準機能を変更したり拡張したりできます。

フックの種類

WordPressのフックは主に2種類あります:

  1. アクションフック (Action Hooks)
    • 「何かが起きたとき」に実行される
    • 例:記事が公開されたとき、ユーザーがログインしたとき
  2. フィルターフック (Filter Hooks)
    • データを「変更する」ために使われる
    • 例:投稿タイトルを表示する前に変更する、コメントの内容をフィルタリングする

アクションフックの基本

アクションフックは「何かが起きたときに追加の処理を行う」ためのフックです。使い方は以下の通りです:

add_action('フック名', '実行する関数名', 優先度, 引数の数);

具体的な例を見てみましょう:

// functions.php に追加
function display_custom_message() {
    echo '<div class="custom-message">この投稿は役に立ちましたか?</div>';
}
add_action('the_content', 'display_custom_message');

この例では、投稿コンテンツの後に「この投稿は役に立ちましたか?」というメッセージを表示します。the_contentはWordPressが提供する代表的なアクションフックの一つで、投稿内容が表示された後に実行されます。

さらに簡単な例を見てみましょう:

// functions.php に追加
function add_hello_world() {
    echo '<p>Hello World!</p>';
}
add_action('wp_footer', 'add_hello_world');

この例では、ページのフッター部分に「Hello World!」というテキストが追加されます。

wp_footerは主にテーマのfooter.phpファイル内でwp_footer()関数によって呼び出されるアクションフックです。通常は</body>タグの直前に配置され、JavaScriptの読み込みやアナリティクスコードの追加など、フッター部分に何かを追加したいときに便利です。

フィルターフックの基本

フィルターフックは「データを変更する」ためのフックです。使い方は以下の通りです:

add_filter('フック名', '実行する関数名', 優先度, 引数の数);

具体的な例を見てみましょう:

// functions.php に追加
function add_thank_you_to_title($title) {
    return $title . ' - ありがとう!';
}
add_filter('the_title', 'add_thank_you_to_title');

この例では、すべての投稿タイトルの後ろに「- ありがとう!」が追加されます。the_titleはWordPressが提供するフィルターフックの一つで、タイトルが表示される前に実行されます。

実践的な例:ログイン後のリダイレクト

ユーザーがログインした後、ダッシュボードではなく特定のページにリダイレクトさせたい場合を考えてみましょう:

// functions.php に追加
function my_login_redirect($redirect_to, $request, $user) {
    // 管理者は通常のダッシュボードへ
    if (isset($user->roles) && is_array($user->roles)) {
        if (in_array('administrator', $user->roles)) {
            return $redirect_to;
        } else {
            // 一般ユーザーはホームページへ
            return home_url();
        }
    }
    return $redirect_to;
}
add_filter('login_redirect', 'my_login_redirect', 10, 3);

この例では、管理者以外のユーザーがログインした後、ホームページにリダイレクトされます。

(参考)詳細な解説

この例は、WordPress でユーザーがログインした後のリダイレクト先を変更するコードです。それぞれの部分を詳しく解説します。

関数の定義と引数

function my_login_redirect($redirect_to, $request, $user) {

この関数は3つの引数を受け取ります:

  • $redirect_to – WordPress が最初に設定したリダイレクト先のURL
  • $request – ユーザーがリダイレクトされようとしていたURL(通常はログインフォームの「redirect_to」パラメータ)
  • $user – ログインしたユーザーのWP_Userオブジェクト

ユーザー権限の確認

if (isset($user->roles) && is_array($user->roles)) {

これは、ユーザーオブジェクトに roles プロパティが存在し、かつそれが配列であることを確認しています。ログインに失敗した場合や、ユーザーオブジェクトが正しく生成されなかった場合に備えたエラーチェックです。

管理者かどうかの判定

if (in_array('administrator', $user->roles)) {<br>    return $redirect_to;<br>}

ユーザーの役割(roles)配列に「administrator」が含まれているかチェックし、管理者の場合は元々予定されていたリダイレクト先(通常は管理画面のダッシュボード)にリダイレクトします。

一般ユーザーのリダイレクト先

else {
    // 一般ユーザーはホームページへ
    return home_url();
}

管理者以外のユーザー(購読者、投稿者、編集者など)は、サイトのホームページにリダイレクトします。home_url() 関数はサイトのトップページのURLを返します。

フォールバック

return $redirect_to;

ユーザーオブジェクトが正しく取得できなかった場合(ログイン処理中など)は、デフォルトのリダイレクト先を返します。

フィルターへの登録

add_filter('login_redirect', 'my_login_redirect', 10, 3);

この行で、作成した関数を login_redirect フィルターに登録しています。

  • login_redirect – フック名(WordPressがログイン後のリダイレクト先をフィルタリングするためのフック)
  • my_login_redirect – 実行する関数名
  • 10 – 優先度(デフォルト値、複数の関数が同じフックに登録されている場合の実行順序)
  • 3 – 関数が受け取る引数の数(この関数は3つの引数を使うため、3を指定)

動作の流れ

  1. ユーザーがログインする
  2. WordPress は通常、管理画面やリクエストされたページにリダイレクトしようとする
  3. その前に login_redirect フィルターが呼び出される
  4. 登録した my_login_redirect 関数が実行される
  5. ユーザーが管理者なら元のリダイレクト先へ、それ以外なら指定したホームページへリダイレクトされる

このコードは、一般ユーザーには管理画面へのアクセスを制限し、代わりに特定のページ(この場合はホームページ)に誘導する場合などに便利です。例えば、メンバーシップサイトやオンラインコースサイトなどで、一般ユーザーをダッシュボードではなく会員専用コンテンツページに直接誘導したい場合に活用できます。

よく使われるフック

WordPressには多くのフックがありますが、特によく使われるものをいくつか紹介します:

アクションフック

  • wp_enqueue_scripts – スタイルシートやJavaScriptを読み込むとき
  • init – WordPressの初期化時
  • admin_init – 管理画面の初期化時
  • save_post – 投稿が保存されるとき
  • wp_footer – フッターが表示されるとき

フィルターフック

  • the_content – 投稿の本文
  • the_title – 投稿のタイトル
  • the_excerpt – 投稿の抜粋文
  • excerpt_length – 抜粋の長さ

フックを見つける方法

既存のフックを見つけるには、次の方法があります:

  1. WordPress Codex
    1. Action Hooks Reference(アクションフック一覧)
    2. Filter Hooks Reference(フィルターフック一覧)
  2. プラグインの利用 – 「Simply Show Hooks」などのプラグインで、ページ上のフックを可視化

フックと関数の引数について

フックを使う際に混乱しやすいのが「引数」の扱い方です。ここでは引数について詳しく解説します。

引数に関する2つの視点

フックの引数は2つの視点から考える必要があります:

  • フック関数を登録するときの引数

add_action('フック名', '実行する関数名', 優先度, 引数の数);
add_filter('フック名', '実行する関数名', 優先度, 引数の数);

最後の「引数の数」は、WordPressからあなたの関数に渡される引数の数を指定します。

  • あなたが作る関数内での引数の受け取り方 function my_function($arg1, $arg2, $arg3...) { // 引数を使った処理 }

引数の例

アクションフックの例

// save_post フックは投稿IDを引数として渡します
function my_save_post_function($post_id) {
    // $post_id を使って何かをする
    echo "投稿ID: " . $post_id . "が保存されました";
}
add_action('save_post', 'my_save_post_function');
// 複数の引数を受け取る例
function my_comment_function($comment_id, $comment_approved, $comment_data) {
    // 3つの引数を使って処理
    if ($comment_approved) {
        // 承認済みコメントの処理
    }
}
// 3つの引数を受け取ることを明示的に指定
add_action('wp_insert_comment', 'my_comment_function', 10, 3);

フィルターフックの例

// フィルターは最低1つの引数(変更するデータ)を必ず受け取ります
function my_title_filter($title) {
    return $title . " - カスタム追加";
}
add_filter('the_title', 'my_title_filter');

// 複数の引数を使う例
function my_title_with_id($title, $id) {
    return "ID:" . $id . " - " . $title;
}
// 2つの引数を受け取ることを指定
add_filter('the_title', 'my_title_with_id', 10, 2);

引数の情報を調べる方法

  1. 公式ドキュメント – 各フックの引数の情報が記載されています
  2. デバッグ出力 – 次のような関数で引数の内容を確認できます function check_arguments() { $args = func_get_args(); // すべての引数を配列で取得 echo '<pre>'; print_r($args); // 引数の内容を表示 echo '</pre>'; } add_action('init', 'check_arguments', 10, 999);

よくある間違い

最も多い間違いは、指定した引数の数と実際の関数の引数の数が一致していないケースです:

// 間違った例:2つの引数を指定しているのに、関数は1つしか受け取らない
function my_wrong_function($title) {
    return $title . " - 修正";
}
add_filter('the_title', 'my_wrong_function', 10, 2); // 2つの引数を指定

// 正しい例
function my_correct_function($title, $id) {
    return $title . " (ID: " . $id . ")";
}
add_filter('the_title', 'my_correct_function', 10, 2);

練習問題

  1. アクションフックを使って、すべての投稿ページの最後に「この記事はお役に立ちましたか?」というテキストを追加してみましょう。
  2. フィルターフックを使って、抜粋の長さを55語(デフォルト)から30語に変更してみましょう。 さらに、文末の[…]を[続きを読む]というリンクにしてみましょう。 か
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次