プラグインでカスタマイズする為に!フックについて知ろう

プラグインでカスタマイズや拡張と言うコトは、実際にやってみない事には何から理解すれば良いのか解らず、難しいと感じてしまうかもしれません。
しかし、すべてのカスタマイズに共通される事を覚えればそうではありません。

この記事では、すべてのカスタマイズに共通される事「フック」について、簡単に解説しています。

フックってなんだろう?

フック【hook】

1. 鉤 (かぎ) 。鉤形の留め金。衣服の合わせ目を留める金具。
2. 物を引っ掛けるための器具。鉤。

出典:デジタル大辞泉(小学館)

この場合のフックは2の意味が由来していると思われます。

WordPress(ワードプレス)は、多くの特定の処理にフック処理を実行する仕組みも持つWebシステムです。
物を引っ掛ける = 特定の処理に実行する処理を追加する …と言う感じだと思ってください。

ルミェール

例えば、検索フォームを表示する場合は、get_searchと言う名前で用意されたフックに対してフック処理を追加すると、検索フォームを表示する処理が実行された時に追加したフック処理を同時に実行できるんだ。

ルミェール(アイコン01)
テネーブル

場合によっては、本来の結果ではなく、追加したフック処理の値を代わりに使用すると言った事も可能です。
例えば、記事の作成時間を本来の西暦表記から和暦で表示すると言った事もフックを使う事でされているプラグインも存在しています!

テネーブル(アイコン01)
ルミェール

フック処理と言うのは、プログラマの方やゲームを改造した事のある方であれば、処理トリガーとか、パラサイトルーチンのアタッチコールとか…をイメージすれば解りやすいのかも?(ちょっと仕組みは違うけど、ニュアンスは一緒)

ルミェール(アイコン05)

フックを使うと出来る事の例

例えば…

  • 検索ボックスの部分にフックで書き換えると、検索ボックスの下に検索条件を追加できる
  • 記事一覧の時間表示部分にフックで書き換えると、時間のフォーマットを和暦に書き換えられる
  • お問い合わせフォームにフックで書き換えると、入力間違いのエラー表示を変更できる

そんな風に、色々な所の表示や条件を思いのままに変更する事が可能となります。

フックの種類は2つ!

WordPressワードプレスのフックには、アクションフックフィルターフックと呼ばれる2種類が存在します。

アクションフック

WordPressが行う特定の処理に対してアクションフックが準備されている場合は、アクションフック処理を追加する事が可能です。その特定の処理が行われる時に、追加されているアクションフック処理も同時に行われます。
アクションフックの場合は、returnで値を返却しません。
大抵は、追加でフック内の処理結果を表示させたりすると言った使い方をします。

フィルターフック

WordPressが行う特定の処理に対してフィルターフックが準備されている場合は、フィルターフック処理を追加する事が可能です。その特定の処理が行われる時に、フィルターフック処理が追加されている場合は、追加されているフィルターフック処理を実行します。
フィルターフックの場合は、returnで値を返却できます。
場合によっては、フィルターフックのreturnで返却された値を本来の値の代わりに使用します。

追加したいフックの種類がどっちか解らない場合

最初は、あまり気にする必要はありません。
フィルターフックをアクションフックとして動作することは出来ませんが、アクションフックをフィルターフックとして追加した場合は、値を返却しない、またはデフォルト値で返却するフィルターフックと言う形で処理が行われる為です。

ルミェール

まず最初は、解らない場合や慣れていないから、フィルターフックとして追加しちゃおう!

ルミェール(アイコン01)
テネーブル

WordPressの更新などで、アクションフックがフィルターフックに変更される場合もありますので、わざとアクションフックをフィルターフックの追加方法で書かれているプラグインもありますよ。大きく気にする事ではありません。

テネーブル(アイコン03)

フック処理の追加方法

アクションフックであれば、

add_action(
  フック名,
  フックを処理するfunction名,
  優先度(デフォルトは10),
  引数の数(デフォルトは1)
);
function フックを処理するfunction名( 各引数 ) {
  フックの処理
}

となります。

フィルターフックであれば、

add_filter(
  フック名,
  フックを処理するfunction名,
  優先度(デフォルトは10),
  引数の数(デフォルトは1)
);
function フックを処理するfunction名( 各引数 ) {
  フックの処理
  return 返却値;
}

となります。

優先度は、数値が小さければ小さいほど先に実行されます。
アクションフックでは、別のフックより前に実行したい場合には優先度の数値を小さくし、別のフックより後に実行したい場合は優先度の数値を大きくして使います。
フィルターフックでは、最後に実行されたフック処理の値が使用される事もある為、優先度の数値を大きくすればするほど、実行される順序が最後の可能性が高くなる事から優先度を99999(またはPHP_INT_MAX)などの最大数値を使用する事で、強制的にそのフックの返却値で実行させる…と言ったようにも使えます。

また、中には一番優先度が低いフックのみを1度きりしか動作させない場合もあります。その際は、他のフックより優先的に動作される可能性を利用し優先度を1とする事が多いでしょう。

フック処理の削除の仕方

追加したフック処理は、削除する事も可能です。
特定の時には追加したフック処理を処理したくないと言う場合は、追加したフック処理を削除する事で可能です。

アクションフック処理の削除方法は、下記の通りです。

remove_action(
  除去するフック処理のフック名,
  除去するフック処理のファンクション名,
  除去するフック処理の優先度,
  除去するフック処理の引数の数
);

フィルターフック処理の削除方法は、下記の通りです。

remove_filter(
  除去するフック処理のフック名,
  除去するフック処理のファンクション名,
  除去するフック処理の優先度,
  除去するフック処理の引数の数
);

アクションフックは、追加と同様にremove_filterでも削除する事が可能です。

ルミェール

…これだけじゃ良く解らないよね

ルミェール(アイコン04)
テネーブル

ちょっと難しいですよね。
フック処理の削除は、削除する時にだけ使うものですので、使わなくてもカスタマイズする事は可能です!なので、まずはフック処理の追加から覚えましょうね!

テネーブル(アイコン01)

使う方法については、今後の記事で実際に使用する際に別に解説していきますがWordPressのリファレンス系のWebサイトでフックの詳細が書かれていますのでそちらを参考にするのも良いかもしれません。

add_filterの関数リファレンス(日本語版)
remove_filterの関数リファレンス(日本語版)