WordPressのフックを使ってみる【アクションフック・フィルターフック】

WordPressには特定のタイミングで処理を追加することができるフックという機能が備わっている。フックには2種類あり、それぞれアクションフックとフィルターフックという。フック学習をスタートさせる。

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

アクションフックとは情報を受け取って変化させて返す仕組み、フィルターフックとはフックのタイミングで何かを実行する仕組みのこと。

フックアクションフックフィルターフック
設置add_action()add_filter()
作成do_action()apply_filters()

優先度

フックには優先度が設定されている。1から実行され数が大きいほどあとで実行される。

フックの探し方

  • 「[使いたい部分の関数名]+フック」でネット検索。
  • WordPressのソーズを読む

WordPress標準フックを使ってみる

the_titleフック記事タイトルを取得している部分で使われるフック

add_filter('the_title', function () {
  return 'タイトル変えるよ';
});

全記事のタイトルが「タイトル変えるよ」になる。ダッシュボードも同様。

つづいて引数を渡す。

add_filter('the_title', function ($title, $id) {
  return $title . '/' . $id;
}, 10, 2);
  • 引数を2つ使うため、第4引数に2を渡さなければならない。
  • 第3引数の優先度はデフォルトの10だとしても、必ず明示しなければならない

上の方法ではナビゲーションにもフックが追加されてしまうので、コンテンツの部分にだけフックの処理を与えてみる。

add_filter('the_title', function ($title, $id) {

  // ループの中のコンテンツにのみ $id を付け加える
  if (in_the_loop()) {
    return $title . '/' . $id;
  }
  // それ以外は何もしない
  return $title;
}, 10, 2);

ホームの投稿リストで、特定のカテゴリを非表示にする。

add_action('pre_get_posts', function ($query) {
  if ($query->is_home() && $query->is_main_query()) {
    $query->set('cat', '-1');
  }
});

ホームの投稿リストで、特定の記事を非表示にする。

add_action('pre_get_posts', function ($query) {
  if ($query->is_home() && $query->is_main_query()) {
    $query->set('post__not_in', array(1)); /* アンスコの数は2+1 */
  }
});

wp_body_open

body開始タグのするあとにアイコンを挿入する。

<?php
// Googleマテリアルアイコン読み込み
add_action('wp_head', function () {
?>
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" />
<?php
});

// wp_body_openフックにhtmlを追加
add_action('wp_body_open', function () {
?>
  <div class="body_open_container">
    <p><a href="<?php echo home_url(); ?>"><span class="material-symbols-outlined">home</span></a></p>
  </div>
<?php
});