Contact Form 7は言わずと知れたWordPressのお問い合わせフォーム作成プラグインですが、もう少し機能を追加したいってことがあると思います。プラグインなどをカスタマイズしたいときはアクションフックやフィルターフックを利用すると便利なのですが、プラグイン自体の構造やプログラムの流れをある程度把握しないといけないので、調べたるのが結構な手間になったります。調べることが勉強になったりするのですが、そんな時間がないって人のために(本当は忘れっぽい自分のために)、Contact Form 7をカスタマイズしたいという時に役に立つ解釈を書いていきます(解説ではなく解釈!)。しかしながらバージョンによって異なるので、もしバージョンが違う場合は確認をしてくださいね。
var 5.0.5
目次
Contact Form 7の便利なフック一覧表
フック名 | フックの種類 | 説明 |
---|---|---|
wpcf7_validate | フィルター | 送られた値を検証 |
wpcf7_mail_sent | アクション | メールが送信された後に実行するフック |
アクションフックとフィルターフックについて
WordPressにはアクションフックとフィルターフックという仕組みがあります。これは一言でいうと手を加えること。WordPressが動く一連の流れの途中で、何かを追加して実行したり、値を変えたり、独自の関数を挟むことができる機能です。例えば「投稿が保存されたとき」とか、「テンプレートが読み込まれた時」とか、WordPressでは様々なフックが要所要所で用意されているので、いい感じのところで機能を追加したり値を変えたりができるわけですね。「ユーザーが追加されたとき」に「カテゴリーを追加する」なんてこともできちゃうです。フック一覧についてはCodexで確認できます(アクションフック一覧 / フィルターフック一覧)。
わざわざフックを利用せずに直接ファイルを変更してカスタマイズすることも可能ではありますが、WordPressではコアな部分は編集しない方針があります。それはWordPressをバージョンアップする度に編集する必要が出てくることや、プラグインやテーマはコアファイルがデフォルトの前提で設計されているなど、安全性からみても管理性からみてもあまりいいことがないからです。しかし良い感じのところにフックが用意されているので余程特殊なことをしない限りはフックによってカスタマイズができるかと思います。
それはプラグインにも同じことが言えます。バージョンアップもありますので、余程のことがない限りプラグインのコアファイルも編集しないほうがいいでしょう。親切なプラグインの場合はフックを要所要所で用意していますので、プラグインは設定やフックを利用してカスタマイズするのが基本です。
今回のContact Form 7も色々とフックが用意されているので、カスタマイズする場合は、フックに引っ掛けるイメージで関数を実行したり、値を変更したりする流れになります。
フォーム送信後、送られた情報をチェックするフック
送られた情報をチェックするにはwpcf7_validate
のフィルターフックを利用すると便利です。これはフォームが送信されてからの流れの途中で実行されるフィルターで、お問い合わせのタグデータを引数として使えたり、エラー時のメッセージを設定できたりと、検証するのにうってつけです。
送信データのチェックは、郵便番号の形式のチェックを追加したり、確認用メールアドレスのチェックを追加したりと、使いどころの多いフックになると思いますが、ContactForm7のプラグイン自体はこのフィルターを利用していないのでカスタマイズ用に用意してくれているフックなのでしょうね。
フィルターフック「wpcf7_validate」について
フィルターフック「wpcf7_validate」は$result = apply_filters( 'wpcf7_validate', $result, $tags );
のようにフィルターを通しており、「$tags」を引数として「$result」に対してフィルタリングをすることができます。
流れとしては以下のようになります。
- ① フォームが送信されたときに「submit()」を実行
- ② 「submit()」内で送信データを検証するため
if ( ! $this->validate() ) {
として「validate()」を実行 - ③ 「validate()」内でそれぞれのお問い合わせ用のタグを検証
- ④ 次にタグ全体を引数として結果をフィルターフック「wpcf7_validate」に通す
- ⑤ 「validate()」が、「無効な項目がある場合はfalse」、「無効な項目がない場合はtrue」を返す
- ⑥ 無効な項目がある場合は
if ( ! $this->validate() ) {
に当てはまり、CF7が「validation_error」としてエラーメッセージを返す
注目したいのは⑤で、無効の項目があるかどうかによって検証結果を判別しているところです。フィルタリングを行ってチェックをしたとしても、$result
に対し無効な項目を設定しなければ「無効ではない」と判断されてメールが送信されてしまいます。
そのためadd_filterでフィルタリングを行う関数には、何らかの条件下で無効としたい箇所に$result->invalidate( $name,$message);
のような記述して、無効な項目をセットします。
- 実行ファイル
- 「contact-from-7」>「includes」> submission.php / 271行
$result = apply_filters( 'wpcf7_validate', $result, $tags );
フィルターフック「wpcf7_validate」の使用例
ネットで色々調べると引数で受け取ることができる「$tags」を回して該当のタグの時に判別するやり方が一般的ですかね。しかし、$tag['type']
で判別する場合、タイプ別のフィルターが用意されているので、そちらを利用したほうが無駄に回さずにいいかもしれないですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
add_filter('wpcf7_validate', 'my_wpcf7_validate', 11, 2); function my_wpcf7_validate($result,$tags){ foreach( $tags as $tag ){ $name = $tag['name']; /* ここにごにょごにょ */ // 何らかの判別 if($name === 'validate_invalidate'){ // 無効な項目を追加(第二引数は第一引数のフォーム近辺に表示されるメッセージ) $result->invalidate( $name, '〇〇してください。' ); } } return $result; } |
特定のtypeの時に行いたい場合
タグ全体を引数としてフィルターをかける「wpcf7_validate」ですが、「wpcf7_validate」のフィルターを通す前に、type別にフィルターを通しています。
フィルター名はwpcf7_validate_{タイプ名}
といった具合です(‘email’の場合は’wpcf7_validate_email’)。
デフォルトでもフィルタリングされており、例えば「number」の場合、maxやminの情報を取得して最小値を下回ったり最大値を上回ったりしていないかチェックしています。
メールが送信された後に実行するフック
メールが送信されたらゴニョゴニョしたいってときはアクションフックwpcf7_mail_sent
が便利です。これはメール送信が成功した時に実行されるアクションなので、POSTを利用して他のシステムとも連携することもできますね。「Contact Form 7」を申請フォームとして利用したり、夢が広がるのではないでしょうか。送信された情報を検証する為のフィルターフックwpcf7_validate
と組み合わせればユーザー登録だってできるかもしれません。
アクションフック「wpcf7_mail_sent」について
アクションフック「wpcf7_mail_sent」はdo_action( 'wpcf7_mail_sent', $contact_form );
のように実行されており、「$contact_form」を引数として実行されます。
流れとしては以下のようになります。
- ① フォームが送信されたときに「submit()」を実行
- ② 「submit()」内で検証後、
if ( $this->mail() ) {
でメール送信 - ③ 送信が成功すると、ステータスが「mail_sent」/’mail_sent_ok’のメッセージがセット
- ④
do_action( 'wpcf7_mail_sent', $contact_form );
を実行
ここでの注目したい所は、すでに検証が終わっており、メールも送信後になることです。
- 実行ファイル
- 「contact-from-7」>「includes」> submission.php / 219行
do_action( 'wpcf7_mail_sent', $contact_form );
アクションフック「wpcf7_mail_sent」の使用例
メール送信後に何かしたい場合に実行できるわけですが、$submission = WPCF7_Submission::get_instance();
とすることで、送信された情報を色々ととれるようです。
1 2 3 4 5 6 7 8 9 10 11 12 |
function my_wpcf7_mail_sent($contact_form){ //送信された情報を取得 $submission = WPCF7_Submission::get_instance(); if($submission) { /* ごにょごにょ */ } } add_action("wpcf7_mail_sent", "my_wpcf7_mail_sent"); |
コメントを残す