ウェブ制作会社に勤めるエンジニア向けの話になりますが、WordPressのアクションフックとフィルターフックの話をしようと思います。
世界で最も普及しているCMSの一つであるWordPressには、アクションフックとフィルターフックという高度なカスタマイズをする上で欠かせない機能が備わっています。
アクションフックとフィルターフックは、WordPress本体のほか、プラグインにも用意されていることが多いので、アクションフックとフィルターフックの使い方を覚えるとWordPressのカスタマイズの幅が広がり、受注できる仕事の幅も広がります。
今回は、実際に僕が受注してカスタマイズをした案件をベースにアクションフックとフィルターフックの使用方法を紹介したいと思います。
アクションフックとは?
アクションフックは、WordPressもしくは、そのプラグインが何かを実行したタイミングで独自の関数を実行させることができる機能です。
例えば、ログインがあったらメールで通知するというようなことができるようになります。jQueryのプラグインでよくあるcallback(コールバック)と同じようなものだと思ってもらえればと思います。
WordPress本体のアクションフックは、以下のページをご覧ください。かなり多くのアクションフックが用意されています。
プラグイン API/アクションフック一覧 - WordPress Codex 日本語版
フィルターフックとは?
フィルターフックは、WordPressもしくは、そのプラグインが何かを実行する際に独自関数で規定のデータを追加・削除など加工できる機能です。
例えば、ヘッダーからアドミンバーのHTMLを除去して非表示にするということができるようになります。その名の通りフィルターなので、データを加工したい時に使うものだと思ってもらえればと思います。
WordPress本体のフィルターフックは、以下のページをご覧ください。こちらもかなり多くのフィルターフックが用意されています。
プラグイン API/フィルターフック一覧 - WordPress Codex 日本語版
フィルターフックとアクションフックの使い方
フィルターフックの使用方法は、以下のようになっています。 この書式でfunctions.phpに記述してあげることで、WordPress本体やプラグインの挙動を制御して、より高度なカスタマイズが可能になります。
<?php add_filter( $hook, $function_to_add, $priority, $accepted_args ); ?>
アクションフックについても同様のフォーマットで使用することができます。
<?php add_action( $hook, $function_to_add, $priority, $accepted_args ); ?>
引数について
- $hook
- (文字列) (必須) $function_to_add 引数で指定した関数を登録するフィルターフックの名前。初期値: なし
- $function_to_add
- (コールバック) (必須) 呼び出される関数の名前。初期値: なし
- $priority
- (整数) (オプション) フィルターフックに登録された関数の中で、この関数を実行する順序。数値が小さいほど早く実行し、同じ数値の場合は追加された順に実行する。初期値: 10
- $accepted_args
- (整数) (オプション) 関数が受け取る引数の個数。WordPress 1.5.1 以降、フィルターフックに登録された関数は、 対応するapply_filters() の実行時に渡される追加の引数を受け取ることができる。初期値: 1
実際に受注したカスタマイズ要件
本題のカスタマイズ要件ですが、以下のような要望がありました。
MW WP Formで予約を受け付けるサイトを作成したが、20200409-001(年月日-連番)のフォーマットの予約番号を発番しデータベースに保存かつ自動返信メールに記載させたい
MW WP Formには、連番の受付番号を送信する機能はありますが、 任意のフォーマットで番号を発番して送信する機能はデフォルトではありません。
そこで、カスタマイズ要件を満たすアクションフックもしくは、フィルターフックを探します。
アクションフック | MW WP Form
フィルターフック | MW WP Form
MW WP Formは、管理者宛メールに送信された内容がデータベースにも保存されるという仕様があるので、メール内に独自が追加できれば、メールにも記載でき、データベースにも保存することができます。
なので、今回はフィルターフックの中で要件を満たすことができる mwform_custom_mail_tag がありますので、こちらを使用したいと思います。
mwform_custom_mail_tagを使用したカスタマイズ
今回は、{ご予約番号} という独自のメールタグを追加して、それがメール内で実際のご予約番号が表示されるようにカスタマイズしたいと思います。
MW WP Formのフィルターフック mwform_custom_mail_tag の引数は3つあります。
1つ目の引数($value)は、メールタグに対応する値、2つ目の引数($key)は、メールタグ、3つ目($insert_contact_data_id)は、データベースに保存された際のPost IDがそれぞれ代入されます。
なので、2つ目の引数($key)がご予約番号の時に予約番号を返して、それ以外の時は、そのまま$valueを返すようにすればOKです。
以下のような感じにすると、メールタグ {ご予約番号} が、送信時には実際の予約番号に変換されて送信されるようになります。
<?php
/**
* {ご予約番号} で予約番号を送信&保存
*
* @param string $value 送信される値
* @param string $key メールタグ
* @param int $insert_contact_data_id データベースに保存した場合、そのときの Post ID
*/
function save_booking_number($value, $key, $insert_contact_data_id)
{
if ($key === 'ご予約番号') {
$today = new DateTIme();
$booking_number = get_booking_number($today);
return $booking_number;
}
return $value;
}
add_filter('mwform_custom_mail_tag', 'save_booking_number', 10, 3);
?>
このカスタマイズの注意点
このカスタマイズで注意点が1つありました。それは、このフィルターフックがメールが送信される都度、実行されるという点です。
管理者宛に1回、自動返信で1回、合計2回送信されます。なので、上記のコードだと1回の予約に対して2回実行されてしまい、管理者宛と自動返信で予約番号が変わってしまいます。
そこで、フォームのデータを取得して既に予約番号が設定されているかを確認し、設定されていない場合のみ、予約番号を発番して設定するようにすることで、2回実行されるのを防ぐことができます。
予約番号の発番ロジックに関しては割愛しますが、最終的なコードは、以下のようになりました。
/**
* {ご予約番号} で予約番号を送信&保存
*
* @param string $value 送信された値
* @param string $key メールタグ
* @param int $insert_contact_data_id データベースに保存した場合、そのときの Post ID
*/
function save_booking_number($value, $key, $insert_contact_data_id)
{
if ($key === 'ご予約番号') {
$today = new DateTIme();
$form_data = MW_WP_Form_Data::getInstance();
if (!(bool) $form_data->get('ご予約番号')) {
$booking_number = get_booking_number($today);
$form_data->set('ご予約番号', $booking_number);
return $booking_number;
}
}
return $value;
}
add_filter('mwform_custom_mail_tag', 'save_booking_number', 10, 3);
まとめ
このようにプラグインを含め、WordPressには、たくさんのアクションフックとフィルターフックが用意されています。それらを利用することにより、標準ではできないことができるようになります。
アクションフックやフィルターフックが扱えるようになると、WordPressのカスタマイズの幅がめちゃくちゃ広がります。
そして、プラグインなども開発できるようになるので、一層仕事の幅も広がりますし、収入アップにも繋がるかと思います。
ぜひ一度、よく使用するプラグインなどのリファレンスでアクションフックとフィルターフックを確認してみてください。