WordPressのプラグインで簡単に問い合わせフォームを生成することができるContact Form 7。
自前でフォームジェネレーターを何度も開発してきた立場からみると本当によくできています。
柔軟性を持たせるために利用者にある程度呪文を覚えてもらう。これが一番の解決だと私も考えました。
なかなかこれが理解してもらえず結局一つのフィールドにつき10個も設定項目のあるUIを作ってしまっていました。
この話はおいおいどこかのコラムで詳しく記載したいと思いますが、今回はフォームで個別処理を行うための仕組み wpcf7_mail_sentについて調べます。
wpcf7_mail_sentの仕様の確認
Contact Form 7で送信する後に実行されるアクションフックです。(メール送信前なら wpcf7_before_send_mail を利用します。)
送信が実行されるタイミングで実行されるものです。
テーマは配下のfunction.phpや独自ブラグイン内に下記のように記述します。
add_action('wpcf7_mail_sent', 'custom_function_after_mail_sent');
function custom_function_after_mail_sent($contact_form) {
// ここにカスタム処理を追加します
}
定義した関数の引数 $contact_form は連想配列で以下が代入されてきます。
'title'
:フォームのタイトル(タイトルタグで指定されたもの)。'posted_data'
:送信されたフォームデータが含まれる連想配列。'skip_mail'
:メール送信をスキップする場合にtrue
が設定されます。これを使用して送信を制御することができます。
どのタイミングで実行されるか?
気になるのは実行されるタイミングです。
メールを送信して完了メッセージが入ったページの表示前に実行されるならいろいろなことができそうです。
試しに下記を入れてどうなるか試してみます。
add_action('wpcf7_mail_sent', 'custom_function_after_mail_sent');
function custom_function_after_mail_sent($contact_form) {
header("location:/");
exit;
}
メールは送付されるのですが、画面が切り替わりません。
どうやらここので画面表示やスクリプトの実行はできないようです。
単純に echo "hoge";としても止まってしまうので表示関連の処理はできないようです。
本当はフォームの選択した項目によってリダイレクトする完了ページを変えたかったのですが、どうやらできないようです。
とりあえずここでは条件によりPHPのセッションデータかクッキーデータに保存してメール送信後にフォームに戻った際にリダイレクトを実行するしくみしたいと思います。
wpcf7_mail_sentを何に使うか
色々な使い方が想定できますが、条件による会員登録の実行、外部APIの呼び出し(メルマガスタンドへの登録)、PHPにセッションデータの生成、LINEへのメッセージ送信、特定データベースの値の更新、ファイルの更新(カウント数など)が考えられますね。マーケティング的に考えるとオプトインフォームでのステップメール登録や期間限定での特定ページ閲覧権限、人数限定のフォームのカウント処理(制限を超えた場合の処理はwpcf7_before_send_mailをフックに実行)などが想定できます。
Contact Form 7にはどのようなフックがあるか
こちらにフック一覧が出ていました。
すごい数です。
https://qiita.com/matsumoto_sp/items/8613fc4a759f8a62da65
特定フォームの場合のリダイレクト先を設定する
今回の調査の目的は
・特定フォームで登録があった際に指定リダイレクト先に移動させたい。
・特定フォーム内のラジオボタンである値だったら指定リダイレクト先に移動させたい。
という2つです。
1つ目のと特定フォームでのリダイレクトはwpcf7_mail_sentを利用しなくても独自JavaScriptで実装できます。
まずfunction.phpか独自プラグインのPHPファイルに
function enqueue_my_custom_js()
{
wp_enqueue_script('my-custom-js', plugins_url('custom.js', __FILE__), array('jquery'), '1.0', true);
}
add_action('wp_enqueue_scripts', 'enqueue_my_custom_js');
と追加します。これで自前のJavaScriptが実行できるようになります。
ファイルと同じフォルダーに custom.js というファイル名でファイルをつくります。
この中に
document.addEventListener(
"wpcf7submit",
function (event) {
if ("48" == event.detail.contactFormId) {
location = "/contact/thanks/";
}
if ("71" == event.detail.contactFormId) {
location = "/contact2/thanks/";
}
},
false
);
wpcf7submitというイベントがContact Form 7のSubmitを送付した際のものです。
この「”48″ ==」 や「”71″ ==」の数値は フォームの編集画面のURL(例:?page=wpcf7&post=48&action=edit)にあるpostの値です。
リダイレクト先は「location = 」の値です。
これで特定フォームで登録があった際に指定リダイレクト先に移動させることができるようになりました。
フォームの値によりリダイレクト先を変える方法
フォームの値によりリダイレクト先を変える方法です。
wpcf7_mail_sentはすでにページのレンダリングが実行されている最終に呼び出されれるようでPHPのHeader関数では移動できませんでした。そのため少し汎用的なリダイレクトの仕組みで対応します。
wpcf7_mail_sentでは条件に合致した場合にPHPのセッションデータにリダイレクト先のURLほ保存するのみとします。
別途リダイレクト用の関数を作って、リダイレクト用のセッションデータが入っていたらそのデータを消してリダイレクトするという仕組みを追加します。
公開フォルダの直下にredirectというフォルダを作り、さらにそのその配下にindex.phpをつくります。
中身はPHPセッションのredirect_urlに値がセットされていたらその値を消した上でリダイレクトします。
つまり1度だけリダイレクトする仕組みです。
redirect/index.php
<?php
session_start();
if(isset($_SESSION['redirect_url'])){
$redirect_url=htmlspecialchars($_SESSION['redirect_url']);
unset($_SESSION['redirect_url']);
header("location:".$redirect_url);
exit();
}else{
header("location:/");
exit;
}
custom.js
document.addEventListener(
"wpcf7submit",
function (event) {
location = "/redirect/";
},
false
);
function.php またはプラグインファイル
add_action('wpcf7_mail_sent', 'custom_function_after_mail_sent');
function custom_function_after_mail_sent($contact_form) {
//フォームの名称でリダイレクト先をセット
if($contact_form->title=='問い合わせ' ){
$_SESSION['redirect_url']="/contact/thanks/"
//さらにフォームの値でリダイレクト先をセット
if($contact_form->posted_data['name']=='ねこすけ' ){
$_SESSION['redirect_url']="/contact/thanks2/"
}
}
}
ちょっと面倒ですが、これで目的は解決です。
もっとスマートな方法がありそうなのですが見つけられませんでした。
これはきちんと管理するなら専用の独自プラグイン作ったほうがいいかも。