WordPressフックのまとめ

WordPressを使ったコーポレートサイトやメディアの

- バグ修正
- 機能を追加
- plugin依存をやめる
- pluginコンフリクトの解消

の作業を行いました。
その中で得た知見をまとめておきます。

WordPressを触るのが初だったので、基礎的な内容多めです。
後半のフックがメインです。
<br>
## 情報源
### [Codex](http://wpdocs.osdn.jp/Main_Page)
Codexとは、WordPress開発者向けの公式ドキュメントです。
APIリファレンスなどがまとまっています。
わからないことを検索すると9割9分ここにたどり着きます。
日本語版もあります。

### [フォーラム](https://ja.wordpress.org/support/)
WordPressのフォーラムです。
プラグインの仕様を調べている時に何度かたどり着きました。
プラグイン開発者目線的には、利用者からのフィードバックに使っている人がいるそうです。
僕はまだ使っていませんが、本当に困ったら質問するのもありかもしれません。

### 技術者ブログ
簡単なカスタマイズであれば、WordPress界隈のエンジニアのブログは参考になります。
コピペでは正常に動作しないことも多いので、Codexとかで仕様を見ながら開発が必要です。


<br>
## デバッグ方法
**※ここは詳しい人いたら教えてください。**

### デバックモード
WordPressにはデバッグモードが用意されています。
デバッグモードを適応すると、PHPやWordPressのwarningやerrorが吐き出される様になります。

```php:wp-config.php
// デバッグモードの有効化
define( 'WP_DEBUG', true );
```
本番環境では、攻撃者にヒントを与えない様にfalseに変更した方が良い。

### その他
あとは、PHPやJavaScriptのデバッグ方法を使う.
`var_dump`とか。
あとは、PHPUnitなどのテストツールを使う方法があるみたいですが、今回はがっつり開発というわけではなかったので、導入しませんでした。
何かいい方法があればまた追記します。

<br>

## フック
WordPressのプラグインでは、フックという仕組みを使って機能を追加したりカスタマイズしたりしている。
#### キーワード
- フィルター
- アクション
<br>

## フィルター
WordPressが出力するコンテンツや、内部で使用される設定値などをカスタマイズしたい際に使用される。
フィルターフックを追加するか(add_filterを呼び出す)、既にWordPress内に用意されているフィルターフックを利用するかの二択。
[フィルターフック一覧](https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%BC%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7)

### apply_filters
[apply_filters](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/apply_filters)

add_filterを呼び出すための関数。

### add_filter
[add_filter](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_filter)
フィルターフックに関数を登録する関数。

### 例を見てみる
例えば、投稿コンテンツを表示する際、各投稿に最後に「hoge」と追加する。

```php:function.php

function hoge($content) {
    return $content . 'hoge';
}
add_filter('the_content', 'hoge');

```
#### 解説
`add_filter`の第1引数は、関数を登録するフィルターフックの名前。
第2引数は、フィルターが適用されたときに呼び出される関数。(第3/第4引数は割愛)

`the_content`というフィルターフックは、データベースから取得した投稿コンテンツを画面に出力する前に適用されるフックである。

テンプレートにthe_content()を記述したときに、本文の最後に「hoge」が付与される。

独自関数hogeの引数である$contentは、apply_filtersに依存する。
「apply_filtersは定義していないけど大丈夫?」と思ったかもしれませんが、これはWordPressがあらかじめ実装してくれてます。

```php:post-template.php
function the_content( $more_link_text = null, $strip_teaser = false) {
	$content = get_the_content( $more_link_text, $strip_teaser );

	/**
	 * Filters the post content.
	 *
	 * @since 0.71
	 *
	 * @param string $content Content of the current post.
	 */
	$content = apply_filters( 'the_content', $content ); // ←ここでフックを実装している
	$content = str_replace( ']]>', ']]&gt;', $content );
	echo $content;
}
```
<br>

## アクション
filterと同列の関係にあるのが、アクションです。
アクションは、特定のイベントが発生した際に実行する処理のこと。
テーマが変更された直後に実行されるアクションフックや、投稿を保存した直後に保存されるアクションフックなど、あらかじめ500以上のアクションフックがある。
[アクションフック一覧](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)

### do_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)
フィルターで言うところのapply_filters()に当たる。

### add_action()
[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)
フィルターで言うところの、add_filter()に当たる。
アクションフックに対して、アクションを登録する。

#### add_actionの引数について
codex見てもらえれば理解できると思いますが、
第1引数は、アクションを適用するフック名
第2引数は、フックに対して適用するコールバック関数。
第3引数は、アクションを実行する優先順位を指定する。小さい方から実行される。
第4引数は、コールバック関数が受け取る引数の数を指定する。