今回紹介する方法では、フォームへのリンクURLに記事のIDをパラメータとして設定します。その後、フォームページにアクセスすると、パラメータから宛先のメールアドレスを動的に取得できるようになります。
これはちょっと特殊なケースかもしれませんが、例えば投稿に店舗などが登録されていて、そのお問い合わせ先のメールアドレスがカスタムフィールドとして登録されている場合を想定しています。そして、その投稿ページにはお問い合わせフォームへのリンクが掲載されている状態です。この方法で、フォームの送信先を柔軟に変更できるようになります。
もし宛先がたった1つだけであれば、特別な対応は不要かもしれません。しかし、宛先が100を超えるような場合、それぞれの宛先に対応するフォームを用意しなければならないとなると、管理が大変になってしまいます。
そんな時、このソースコードを利用することで、一つのフォームで複数の宛先に対応できるようになり、フォームの管理が容易になります。これにより、WordPressのバックエンドでの作業も効率化され、新たな宛先が追加される際も、カスタムフィールドを更新するだけで対応できるため、メンテナンスも簡単になります。このメリットを活かして、大量の宛先を持つお問い合わせフォームをより効率的かつシンプルに管理しましょう。
サンプルソース
各投稿ページにフォームへのリンクを作成します。リンクURLに記事のIDをパラメータとして設定します。
<a href="/contact-form-page?post_id=<?php echo get_the_ID(); ?>">お問い合わせフォームへ</a>
Contact Form 7 のフォームに、宛先メールアドレスを入力するための hidden フィールドを追加します。このフィールドは、フォーム送信時に動的に設定される宛先メールアドレスを保持します。
[hidden send-email id:send-email]
functions.php ファイルに、以下のコードを追加します。
function my_form_tag_filter( $tag ) {
// $tag が配列でない場合は、そのまま返す
if ( ! is_array( $tag ) ) {
return $tag;
}
// URL に post_id が設定されている場合
if ( isset( $_GET['post_id'] ) && is_numeric( $_GET['post_id'] ) ) {
// $tag 配列の 'name' キーの値を $name に代入
$name = $tag['name'];
// URL の post_id パラメータを整数に変換して $post_id に代入
$post_id = intval( $_GET['post_id'] );
// $post_id に紐づく 'contact_mail' カスタムフィールドの値を取得し、$serviceEmail に代入
$serviceEmail = get_post_meta( $post_id, 'contact_mail', true ); // 'contact_mail' を実際のカスタムフィールドキーに置き換えてください
// $name が 'send-email' で、$serviceEmail に値が設定されている場合
if ( $name == 'send-email' && $serviceEmail ) {
// $tag 配列の 'values' キーに $serviceEmail の値を設定
$tag['values'] = (array) $serviceEmail;
}
}
// 変更された $tag 配列を返す
return $tag;
}
// 'wpcf7_form_tag' フィルターフックに my_form_tag_filter 関数を追加
add_filter( 'wpcf7_form_tag', 'my_form_tag_filter', 11 );
このコードは、wpcf7_form_tagフィルターフックを使って、Contact Form 7のフォームタグを動的に変更する機能を追加しています。このフィルターフックは、フォームの表示前に実行されます。
- my_form_tag_filter関数は、$tag 配列を受け取ります。この配列には、フォームタグの情報(名前、型、値など)が含まれています。
- まず、$tagが配列でない場合は、そのまま返します。これは、フィルターフックが期待通りに機能しない場合のエラー対策です。
- 次に、if ( isset( $_GET[‘post_id’] ) && is_numeric( $_GET[‘post_id’] ) ) で、URL に post_id パラメータが設定されているかどうかをチェックします。post_id が設定されていて、かつ数値である場合、条件が真となり、コードブロック内の処理が実行されます。
- $name にフォームタグの名前($tag[‘name’])を代入します。
- $post_id に URL から取得した post_id パラメータを整数に変換して代入します。
- $serviceEmail に、$post_id に紐づくカスタムフィールド contact_mail の値を取得して代入します。contact_mail を実際のカスタムフィールドキーに置き換えてください。
- if ( $name == ‘send-email’ && $serviceEmail ) で、フォームタグの名前が send-email であり、かつ $serviceEmail に値が設定されているかどうかをチェックします。条件が真の場合、コードブロック内の処理が実行されます。
- $tag[‘values’] に、$serviceEmail の値を設定します。この操作により、send-email の hidden フィールドの値が、カスタムフィールドから取得したメールアドレスになります。
- 最後に、変更された $tag 配列を返します。
このコードにより、各投稿ページのカスタムフィールドに登録されている宛先メールアドレスが、Contact Form 7のhiddenフィールドに動的に設定されるようになります。
ボタン押下時に宛先を再設定する
さらに functions.php ファイルに、以下のコードを追加します。
// メールコンポーネントの動的受信者設定を行う関数
function dynamic_recipient_with_hidden_field( $components, $form, $mail ) {
// フォームの ID を指定
$target_form_id = 77; // あなたのフォーム ID に置き換えてください
// 現在のフォームのIDが対象フォームのIDと一致する場合
if ( $form->id() == $target_form_id ) {
// フォームから送信されたデータを取得
$submission = WPCF7_Submission::get_instance();
// フォーム送信データのインスタンスが取得できた場合
if ( $submission ) {
// フォームから送信されたデータを取得
$posted_data = $submission->get_posted_data();
// 宛先メールアドレスの hidden フィールドの値を取得
if ( isset( $posted_data['recipient-email'] ) && !empty( $posted_data['recipient-email'] ) ) {
// メールの宛先を hidden フィールドの値に設定(メールアドレスをサニタイズ)
$components['recipient'] = sanitize_email( $posted_data['recipient-email'] );
}
}
}
// 更新されたメールコンポーネントを返す
return $components;
}
// 'wpcf7_mail_components' フィルターフックに 'dynamic_recipient_with_hidden_field' 関数を追加
add_filter( 'wpcf7_mail_components', 'dynamic_recipient_with_hidden_field', 10, 3 );
このコードは、Contact Form 7のフォームで、メールの送り先を動的に変更する目的で使用されます。これは、特定のフォームで送り先を柔軟に変更できるようにするためです。ただし、単純に送り先を変えるだけであれば、このコードは必要ありません。
しかし、もしフォームの送り先が、ブラウザのコンソールなどを使って変更されてしまった場合、このコードが役に立ちます。なぜなら、送信ボタンを押すときに、もう一度送り先を設定しなおすため、不正な変更を防ぐことができるからです。
このコードがやっていることは以下の通りです
1.指定したフォームIDのものだけに対して動作します。これにより、特定のフォームだけで送り先を変更できます。
2.フォームを送信するときに、hiddenフィールドから送り先のメールアドレスを取得します。
3.取得した送り先メールアドレスが正しい形式かどうかをチェックし、無害化(サニタイズ)を行います。
4.無害化された送り先メールアドレスを、メールの送り先に設定します。
このように、送信ボタンを押すときに送り先のメールアドレスを再設定することができるので、もし送り先が何らかの方法で変更された場合でも、正しい送り先にメールが送信されます。これにより、フォームのセキュリティが向上し、不正な変更から保護されるので、追加しておいたほうが良いでしょう。
まとめ
今回の記事では、Contact Form 7で宛先をカスタムフィールドから動的に変更する方法を紹介しました。この方法を利用することで、効率的なお問い合わせフォームを作成することができます。初心者の方でも、分かりやすい解説を心がけましたので、ぜひチャレンジしてみてください。
実際に実装してみることで、お問い合わせフォームの送信先を柔軟に変更できるようになり、より便利で充実したものになることでしょう。今回学んだ知識を活かして、あなたのWordPressサイトをさらにパワーアップさせていきましょう!