WordPress の do_action のコードをクラス内に記述するスマートな使用方法
2020.03.02WordPress

WordPress は Web開発で主流となっている MVCモデルではなくリニア(一直線)な構造の各所にフィルタやアクションといったフックをかけていくという方法を取っています。
このような特殊なストラクチャから特にクラスなどを利用せずにコードを記述することができ、かなりレガシーな書き方でもサイト作成が容易にできる仕様になっています。
ここではあえて「クラスを通して do_action を利用する」という方法を、ごくごく簡単に説明したいと思います。

add_action() や add_filter() は利用するが do_action() は使用方法がよく分からない。
↑このようなあなたもぜひ参考にしてみてください。
1分で読める超簡単な記事です。
まずはじめに以下のようなクラスがあると仮定します。
1 2 3 4 5 6 7 |
// classファイル class My_class { public function my_function() { // do something } } |
あなたは my_funciton を、例えば single.php で利用する際にどのようは方法を取るでしょうか?
一番ありがちなのは以下のような手順でしょう。
1 2 3 4 5 |
// single.php $var = new My_class(); $var->my_function(); |
または一度のリクエスト内で複数回使用したい場合は、以下のようにグローバル変数を使う人もいるでしょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// classファイル class My_class { public function my_function() { // do something } } global $my_class; $my_class = new My_class() // index.php $my_class->my_function(); // single.php $my_class->my_function(); |
方法としては間違っていませんが WordPress にはフックという便利な機能が備わっているので、このような方法を取る必要性は全くありません。
以下でOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
// classファイル class My_class { public function __construct() { add_action( 'do_my_function' [ $this, 'my_function' ] ); } public function my_function() { // do something } } new My_class() // single.php do_action( 'do_my_function' ); |
こうすることで my_function を実行したいところで毎回クラスを初期化しなくてもいいですし、グローバル変数に頼る必要性もなくなります。
またクラス内に閉じ込めておくことで my_function 内でクラス変数が使用できるというメリットも生まれます。
引数を与えたい場合は単純に以下のようにするだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
// classファイル class My_class { public function __construct() { add_action( 'do_my_function' [ $this, 'my_function' ] ); } public function my_function( $post_type ) { if ( 'post' === $post_type ) { // do something } } } new My_class() // single.php do_action( 'do_my_function', $post->post_type ); |
apply_filters() も同様の書き方ができます。
参考にしてみてくださいね♪