WordPressのテーマやプラグインの中核をなす、WordPressの拡張性の高さを実現しているWordPressの最も重要な機能に“フック”と“フィルタ”があります。今回は使い方次第でWordPressの姿をがらりと変える、このフックとフィルタについてお話します。
フックとフィルタの動作原理
WordPressは、PHPというスクリプト言語により動作し、記事となるHTMLを出力するのが主な役割ですが、HTMLを出力するまでの一連の処理を担うそれぞれのプログラムを関数やメソッドと言います。テーマで使われるテンプレートタグも関数です。それぞれが「記事を探す」や「ログインする」「メールを送信する」などと言った働きを担っており、WordPressはそれらの働きを複合的に作用させること事で数多くの機能をユーザに提供しています。
さて、WordPressにある機能を追加するプラグインを書くことになりました。「画像をアップロードする」や「コメントを残す」と言った能動的な機能の場合は、その機能を処理するプログラムとインターフェースがあれば実装できますが、たとえば「記事が投稿された時にバックアップを保存したい」というような受動的な機能が必要になった場合にはどうすれば良いでしょうか。
WordPress本体に手を加えればWordPressそのものの処理の最中に受動的な機能を書き加えることは可能です。しかし、それではWordPressがバージョンアップするたびに同じところに手を加えなければなりませんし、もしかしたらいずれかのプラグインやテーマに欠かせない処理を邪魔してしまっているかもしれません。そう考えるとWordPress本体に手を加えるのはとてもじゃないけど現実的ではないように思えます。
しかし、だからと言って「できない」と決めるのは早いです。
本体に手を加えることで様々な影響が出うるWordPressには、そのところどころにプログラムを引っかけておける場所が用意されています。この引っかけておける場所のことを“フック”と言います。
例えでフックを理解しよう
ここに“喫茶 WordPress”という喫茶店があることを想像してください。喫茶WordPressのドアにはベルがかけられており、誰かがドアを開けるたびに「カランコロン」と鳴り人の訪れを知らせます。
喫茶WordPressのドアは関数やメソッドであり、ドアベルがプラグインやテーマというわけです。ちなみに、ドアが開閉することは“イベント”と表現します。
喫茶WordPressの例で言うと「ドアの開閉イベントにドアベルメソッドをフックする」と表現します。喫茶WordPressのドアにはフックがあり、利用者は好きなところにドアベルがかけられるようになっている、というこの仕組みをWordPressは“フック”と“フィルタ”で実現しています。また、このような仕組みを一般的に”モジュラー方式”と表現し、イベントによってプログラムの動きを制御することを“イベントドリブン”と言います。
フックとフィルタの違い
実は、フックとフィルタは本質的には同じプログラムで動作しています。この2つの機能を区別している唯一の要因は“値を受け渡しする”というフィルタの特徴にあります。
Wikipediaで「フィルタ」を引いてみると“与えられた物の特定成分を取り除く(あるいは弱める)作用をする機能をもつもの”とあります。WordPressのフィルタも同様に、与えられたデータを変化させるのが目的です。
それゆえ、フィルタには必ずデータが与えられるようになっています。一部のフックもデータを渡しますが、あくまでもフックした関数やメソッドの処理上必要になる場合に“フックした関数やメソッドがデータを参照するため”に渡されるデータです。つまり、フックから渡されたデータを処理して返したとしてもWordPressの処理に変化はありません。
また、フィルタは受け取ったデータを変化させるのが目的ですので、フィルタとして実装しなくともテンプレートに直接処理を書くことができます。
たとえば、記事本文にフィルタしたい場合には、get_the_content()で記事本文を変数に渡せばフィルタと同様の処理を行うことができ、このような処理は動作的にはフィルタと変わりありませんが、フィルタの様々な恩恵を受けることができません。
フィルタのメリット
前述の通り、フィルタには様々なメリットがあります。WordPressをCMSとしてシステマチックに運用する場合、どれもとても有用なメリットです。逆に言えばこれらのメリットを受ける必要のない場合は無理にフィルタにする必要はありません。
再利用性 | 複数サイトで同じ処理を必要としている場合にはフィルタを使う事でテンプレートとフィルタを分離することができ、再利用性が高まります。 |
グローバル環境への配慮 | 処理をフィルタにすることで、他で使っている変数を意図せず変えてしまうことを防ぎます。 |
処理順序の保証 | 複数処理の実行順序にルールがある場合、フィルタを使うことで順序を指定することができます。 |
テンプレートの可読性 | 処理をテンプレートからフィルタに分けることでテンプレートの可読性を高めます。 |
メンテナビリティ | フィルタのオンオフを切り替えるだけでフィルタの処理をテンプレートから除外でき、障害時の原因切り分けなどに効率的です。 |
このように、フックとフィルタはWordPressの拡張性を高めるだけではなく、運用の効率にも大きな影響を持ちます。そのため、フックとフィルタは開発側の人間だけが理解していれば良いというものではありません。
次回は運用の要である“キャパビリティ”についてお伝えします。