PHPのフックってなんぞ（アクションフック編）

マークアップも上達し、JS・JQueryの基本文法もある程度理解できてきた。
よし、WordPressでテーマを作ろう
.
.
.
PHPが頭に入らん、、、


ということでPHPの勉強内容を今日から書き連ねていこうと思います。
タイトルの通り、今回は**フック**についてです。

※初学者の**ピーナッツボーイ**が備忘録程度に記述した内容ですので悪しからず、、、

＜参考記事＞
・[WordPress Codex: プラグイン API/アクションフック一覧](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7)
・[Web 制作リファレンス （＋α）](https://www.webdesignleaves.com/pr/wp/wp_func_hook.html)
・[Udemy： ちゃんと学ぶ、WordPress テーマ開発講座(作：たにぐち まこと)](https://www.udemy.com/course/wordpress_master/)

# フックの意味
個人的に[Udemyの講座](https://www.udemy.com/course/wordpress_master/)の解説が内容的に一番しっくりきたので、以下にその内容をまとめます。

>WordPressは読み込み時において、テーマ内のファイル（function.phpなど）全てを読み込み、処理を実行している。
ただ、読み込んだファイル内のプログラムを全て同じタイミングで実行してしまうと、プログラムの内容によっては正常に動作しないときがある。
よって、<font color="red">WordPress実行中における、このタイミングの時に、このプログラムを実行してください</font>というのを、こちらから指定する必要があり、その際に必要になるのが**フック**である。
（プログラムの実行タイミングをフックで引っ掛けて持ってくるイメージ）

もう少し専門的な言葉で表すと、[こちらの記事](https://www.webdesignleaves.com/pr/wp/wp_func_hook.html)もわかりやすいです。
（※以下、抜粋文）

>**フック**とは WordPress がページを表示する<font color="red">特定のタイミングで何らかの処理を実行するためのイベントトリガー（処理を実行させるきっかけ）</font>と言えます。

要はこのタイミングでこの処理を実行しますよ〜というの定義するのに使用するのがフック。

WordPressのテーマ制作はheader.php、footer.php...のように**ファイルをパーツ化**する点が特徴的なので、
このようなパーツ化したファイル達から内容を引っ張ってくる仕組みが必要になるわけですね。

# フックの種類
フックは大きく分けて以下の２種類があります。

**①アクションフック**
**②フィルターフック**

ここでは①アクションフックについて取りまとめていきます。
（②フィルターフックについてはまた別の記事で触れます）


#  アクションフックとは
[こちらの記事](https://www.webdesignleaves.com/pr/wp/wp_func_hook.html)から抜粋
>WordPress の**特定のタイミング**で**独自の関数**を使って何らかの処理を実行するための仕組み。

ここでいう特定のタイミングとは、たとえば<font color="blue">「WordPress の読み込みが完了した後〜」などが
いわゆる「タイミング」と呼ばれるものです。</font>
他に「headの内容を読み込む前〜」とか、沢山のパターンがあります。

なお、実行するプログラムの内容は「独自の関数」を使って指定してから実行します。
ここでいう独自の関数とは、具体的には[add_action関数](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/add_action)や[do_action関数](https://wpdocs.osdn.jp/%E9%96%A2%E6%95%B0%E3%83%AA%E3%83%95%E3%82%A1%E3%83%AC%E3%83%B3%E3%82%B9/do_action)を指します。
関数の詳細は「実行方法」の部分で触れます。
.


### アクションフックの実行方法

アクションフックの中でも①独自で作成するオリジナルのもの、②WordPressがあらかじめ設置しているもので分かれます。
①の仕組みが理解できていれば②のほうもまあ何となくわかってくると思うので、①から触れていきます。

工程的にはざっくり以下の通りです。
**(1)add_action関数を使って実行するプログラムの内容を登録する。**
**(2)do_action関数で登録したプログラムを実行する。**
.
.
#### (1)add_action関数を使って実行するプログラムの内容を登録する。

上で触れた通り、ここでプログラムの内容を登録します。
なお、どこに書くのかについては、ほとんどの場合で「function.php」になってくるかと思います。


まずは記述方法からです。
```php
<?php add_action( 
$hook, //第一引数：アクションフックの名前(いわゆる上述の"タイミング"）・・必須
$function_to_add, //第二引数:フックする関数名（任意の名前）・・・必須
$priority, //第三引数:関数実行の優先順位・・・任意
$accepted_args //第四引数:フックした関数が受け入れられる引数の数・・・任意
); ?>
```
第三〜四引数は任意なので一旦説明は省きます。
重要なのは第一〜二引数です。
.
.
まず第一引数で「どのタイミングで実行するのか」の**タイミングの名前**を記述します。
これが上述した、①独自で決めるパターン、②WordPressが既に用意しているタイミングの名前を書くパターン
で分かれてきます。
①の場合は任意の名前を指定できます。
.
.
第二引数では**実行するプログラムの関数名**を書きます。これは任意の名前なのでunkoとかでもOKです。

なお、ここでは関数名だけしか書きませんが、この後で第二引数で指定した関数名に対し、
function関数を使って具体的なプログラムの実行内容を登録していきます。
なので、ここではあくまで関数名呼び出してるだけという認識でOKです。
.
.
ここまで理解した上でadd_action関数を実際に書いてみます。
コードは[こちらの記事](https://www.webdesignleaves.com/pr/wp/wp_func_hook.html)を参照しました。

``` function.php
<? php add_action( 
'my_footer_action_hook', //第一引数
'my_footer_echo' //第二引数
);

//第二引数に実行内容を登録
function my_footer_echo(){
  echo 'This is my action hook!';
}
```

ちなみここではわかりやいように別途function関数を準備して実行内容を記述していますが、
以下のように、無名関数を使ってadd_action関数にひとまとめに記述することも可能です。

``` function.php
<? php add_action( 
'my_footer_action_hook', //第一引数
function(){ //第二引数
 echo 'This is my action hook!';
}
);
```
ひとまず実行するプログラムの登録までが終わりました。
.
.
#### (2)do_action関数で登録したプログラムを実行する。
あとは登録したプログラムを「実行する」ために必要な関数をここで記述します。

記述方法は以下の通りです。
```php
<?php do_action(
$tag, //第一引数：実行したいアクションフックの名前（add_action関数の第一引数で指定した名前）
$arg //第二引数：フックに付けられた関数へ送る引数のリスト・・・任意
); ?>
```

第二引数は任意なのでここでは省略します。
第一引数については記載の通り、add_action関数の第一引数で指定した名前を書くことで登録内容を紐づけます。

あとはこの関数をどこのファイルに記述するのか、についてですが、
これは**add_action関数で登録したプログラムを実行させたい場所**となります。

たとえば上記例で記載したadd_action関数の内容をfooterで実行させたい場合は
footer.phpに対しこのように書きます。

```footer.php
<? php
do_action('my_footer_action_hook'); 
?>
```

これでテーマのfooter部分に「This is my action hook!」と表示されていれば、
アクションフックが正常に機能しているということになりますね
.
.

### WordPress が設置しているアクションフックを使用するパターン

上記は①独自でオリジナルのアクションフックを作った際の流れですが、
WordPress が設置しているアクションフックを使用するパターンもあります。

なお、設置されたアクションフックについては、[WordPress Codexのリファレンス](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7)にて一覧で取りまとめられています。
たとえば一覧内の[init](https://developer.wordpress.org/reference/hooks/init/)を見てみると、二行目あたりに以下のように書かれています。

>Fires after WordPress has finished loading but before any headers are sent.

雑に訳すと「WordPressの読み込みが終わった時、ただしheaderが送付される前に着火（≒動作する）」という内容になります。
つまり、**add_action関数、do_action関数の第１引数に「init」と書くと、
WordPressが定義した、上述の「プログラムの実行タイミング」が自動的に指定される**ということになります。
.
.
また、テーマ制作で頻出の[テンプレートタグ](https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0)についても、実はアクションフックが裏で動作しています。

たとえばアクションフックのリファレンスに書かれている[wp_head](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7/wp_head)は
テーマのhead部分をheader.phpにパーツ化する際に使用される関数として、見覚えがあるかと思います。

head部分をパーツ化する際、header.phpにこのように記述したはずです。

```header.php
<?php wp_head(); ?>
```

このテンプレートタグですが、実は中身は以下のようになっています。

```wp-includes/general-template.php
function wp_head() {
    /**
     * Prints scripts or data in the head tag on the front end.
     *
     * @since 1.5.0
     */
    do_action( 'wp_head' );
}
```

```wp-includes/default-filters.php
// Actions
add_action( 'wp_head', '_wp_render_title_tag',            1     );
add_action( 'wp_head', 'wp_enqueue_scripts',              1     );
add_action( 'wp_head', 'wp_resource_hints',               2     );
add_action( 'wp_head', 'feed_links',                      2     );
add_action( 'wp_head', 'feed_links_extra',                3     );
add_action( 'wp_head', 'rsd_link'                               );
add_action( 'wp_head', 'wlwmanifest_link'                       );
add_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0 );
add_action( 'wp_head', 'locale_stylesheet'                      );
//・・・省略・・・//
```

このようにテンプレートタグファイルにadd_action関数/do_action関数が記述されており、
テンプレートタグを記述することで、アクションフックを呼び出しているということがわかります。
.
.

# おわりに
まあ色々書きましたが、結局は冒頭に書いた通り、バラバラに分けたファイルパーツを呼び寄せて
内容を集約させるためにフックが必要なんだな〜ぐらいの解釈でいいかなと思います（雑