Contact Form 7で、入力項目に応じてメールの内容や送信先を変える

Wordpressのお問い合わせフォーム実装で、`Contact Form 7`というプラグインを利用したときの備忘録です。
このプラグインはデフォルトでは確認画面がないため、合わせて`Contact Form 7 Multi-Step Forms`というプラグインも使い確認画面と完了画面を実装します。
この時に、入力項目(今回はラジオボタン)の項目に応じて、管理者へ送信する自動送信メールの送信先を変えたいというのが今回の目的です。

送信先だけではなく、メールの内容は大体変える事ができるので、送信内容に基づいてDBから何か値を取得してBody(メール本文)を書き換えることなどもできると思います！

# 環境
- Wordpress - v6.6.1
- Contact Form 7 - v5.9.8
- Contact Form 7 Multi-Step Forms - v4.4

`Contact Form 7 Multi-Step Forms`の設定方法に関してはXserverさんが出している記事がわかりやすいと思うので、こちらも載せておきます！

https://www.xserver.ne.jp/bizhp/contact-form-7-confirm-thanks/

基本的な設定や使い方はこちらの記事に任せて、今回は具体的な方法を残していきます。

# 目的と準備
ラジオボタンを用意して、選択されている内容に応じてメールの送信先を上書きします。
この例では、
選択1: hoge@example.com
それ以外: fuga@example.com
にメールを送るという想定です！

基本的なContactFormの設定などは上のXserverの記事などを参照していただいて、今回はコードの方を解説していきます。
今回は送信時(確認画面から完了画面に遷移時)にメールの設定を上書きする方法を取ります。

:::note warn
確認画面を使わない`Contact Form 7`のみを使用する方は、もっと簡単なやり方があるので、下の「ContactForm7で用意されている"パイプ"という機能」というのを参考にしてください
:::

## 入力画面
入力画面では`Contact Form 7`の管理画面から項目を追加していきます。

```
[radio send-target use_label_element "選択1" "選択2" "選択3"]
```

入力画面で用意するラジオボタンはこんな感じです。
この選択1、選択2、選択3によって送信先を変えます。

最後に
```
[submit id:send  "確認画面へ"]
[multistep contact-conf first_step "/contact-conf"]
```
のようにすると確認画面に遷移できます。

## 確認画面
確認画面では、
```
[multiform send-target]
```
のようにすると実際の選択された項目を確認することができます。
あとは送信ボタンを実装します。
```
[submit id:send  "送信する"]
[multistep contact-thanks last_step send_email "/contact-thanks"]
```
このボタンで完了画面に遷移します。ショートコードに`send_email`を設定することでメールが飛びます。
ここで処理を引っ掛けます。

## functions.php
確認=>完了のメール送信のタイミングで処理を行います。
実際のコードはこちら

``` functions.php
// メール送信前に実行されるアクションフック。ここで送信先を変更する
add_action( 'wpcf7_before_send_mail', 'custom_change_send_mail_target' );

/**
 * メール送信前に実行されるアクションフック
 * メール2(管理者宛想定)の送信先を変更する
 *
 * @param [type] $contact_form : Contact Form 7のフォームオブジェクト
 * @return void
 */
function custom_change_send_mail_target($contact_form) {
    // WPCF7_Submission のインスタンスを取得、ここに投稿されたデータ関係の情報が入ってる
    $submission = WPCF7_Submission::get_instance();

    if ($submission) {
        // 投稿されたデータを取得
        $posted_data = $submission->get_posted_data();

        if (isset($posted_data['send-target'])) {
            // send-targetの値に基づいて送信先を変更
            $send_target_value = $posted_data['send-target'];

            // メールの設定を取得 今回はメール2の設定を上書きします
            // メール1の場合にはprop('mail')を使ってください
            $mail_2 = $contact_form->prop('mail_2');  // メール2の設定

            // メール2の送信先を設定
            if ($mail_2) {
                if ($send_target_value[0] == '選択1') {
                    $mail_2['recipient'] = 'hoge@example.com';  // 選択1の場合の送信先
                } else {
                    $mail_2['recipient'] = 'fuga@example.com';  // 選択1以外の場合の送信先
                }
                // メール2の設定を更新
                $contact_form->set_properties(array('mail_2' => $mail_2));
            }
        }
    }
}
```

コード内にコメントを載せているので詳しい解説は割愛しますが、やっていることは次の通り
1. メールを送信する直前のフックで処理を実行
1. 送信データを取得する
1. メールの設定を読み込む
1. 送信データ(入力画面で選択されたradioボタンの値)によって、メールの設定を上書きする

という流れになります。
これを応用すると、`$mail_2['body']`に代入すると本文も設定できるので色々出力させることができると思います！
これで一通り完了です✨

# ContactForm7で用意されている"パイプ"という機能
ContactForm7では、パイプという機能があり、これを使う事で簡単に送信先を変えることができます。

https://contactform7.com/ja/selectable-recipient-with-pipes/

具体的には、入力画面でラジオボタンの設定に`|(パイプ)`を繋げて右側に値(メールアドレス)を書きます。
```
[radio send-target use_label_element "選択1|hoge@example.com" "選択2|fuga@example.com" "選択3|fuga@example.com"]
```
こうすることで、メールの設定画面で
- `_raw_ + 項目名` => パイプの左側
- `項目名` => パイプの右側

を取得することができます！
今回の例の場合だと
`_raw_send-target`で、選択1を取得
`send-target`で、`hoge@example.com`を取得
というイメージです。
なので、自動返信の本文には`_raw_send-target`で選んだ値を入れて、管理者宛の自動返信メールの宛先設定欄には`send-target`を入れてあげるイメージですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297279/8bea1dd2-ca8f-1549-b1f2-861c1fa6a5c2.png)


## なぜパイプを使わなかったのか？
ではなぜ今回メールの方を書き換えたのか？というと確認画面が影響しています。
確認画面では、
```
[multiform 項目名]
```
のようにして値を取るのですが
```
[multiform send-target] => hoge@example.comが表示される
[multiform _raw_send-target] => 何も表示されない
```
というような事がありました。
確認画面では「選択1」などが出て欲しいのに、本来出てはいけない値が出てくる現象です。
色々してみたんですがダメだったので、メールの設定を変えることにしてみました。

もしもいい方法を知っている方がいたらコメントで教えてください💡


# その他リンク
[ContactForm7のプラグインリンク](https://ja.wordpress.org/plugins/contact-form-7/)
[ContactForm7公式](https://contactform7.com/ja/docs/)
[Contact Form 7 Multi-Step Formsのプラグインリンク](https://ja.wordpress.org/plugins/contact-form-7-multi-step-module/)