Contact Form 7で宛先をカスタムフィールドから取得して動的に変更!効率的なお問い合わせフォームの作成方法

WordPress

今回紹介する方法では、フォームへのリンク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サイトをさらにパワーアップさせていきましょう!