『Contact Form 7 Multi-Step Forms』 でデフォルト値を指定したデータソースを優先して表示させる

WordPressプラグイン『Contact Form 7』のお問い合わせフォームを 『Contact Form 7 Multi-Step Forms』を利用してマルチステップフォームにしたときに、デフォルト値が正しく適用されない問題を解決する方法を解説します。

■『Contact Form 7』version: 5.9.6

https://ja.wordpress.org/plugins/contact-form-7/

■『Contact Form 7 Multi-Step Forms』version: 4.4

https://ja.wordpress.org/plugins/contact-form-7-multi-step-module/

## はじめに
この記事は、下記『Contact Form 7』公式ドキュメントの使い方をマルチステップ化するプラグインを追加した場合においても正しく適用させる方法を書き留めた内容となっております。

https://contactform7.com/ja/getting-default-values-from-the-context/


『Contact Form 7』のお問い合わせフォームに対して『Contact Form 7 Multi-Step Forms』を利用してマルチステップ化した際に、
『Contact Form 7 Multi-Step Forms』の"Cookie及びセッションを利用したフォームに入力したデータを保持する"機能によって、保持したデータがデータソースで指定したデフォルト値を上書きする形でフォームに自動入力されてしまう問題が発生します。

この問題を解決する方法について、以下に詳細を説明します。

## 実装
『Contact Form 7』の”文脈からデフォルト値を取得する”機能の設定は、[前述した公式ドキュメント](https://contactform7.com/ja/getting-default-values-from-the-context/)を参照してください。
> 例として、”your-name” を名前に持つ項目があるとします:
> 
> `[text* your-name]`
> ここで HTTP GET 変数からデフォルト値を得るには、`default:get` オプションをフォームタグに追加します:
> 
> `[text* your-name default:get]`
> 
> これで、この項目はデフォルト値を、同じ名前 (“your-name”) を持った GET 変数から取得するようになります。フォームがあるページの URL にクエリー文字列を加えてアクセスしてみましょう:
> 
> http://example.com/contact/?your-name=John+Smith
> 
> 問題なく動いていれば、当該項目に「John Smith」と入力されているはずです。

上記の設定を行った上で、
次のコードを『Contact Form 7 Multi-Step Forms』プラグインの`cf7msm.php`ファイルに追加します。
ここでは、HTTP GET 変数からデフォルト値を取得する方法を記載します。

```diff_javascript:/wp-content/plugins/contact-form-7-multi-step-module/cf7msm.php
/**
 *  Get a variable from cookies or if not enabled, from session.
 */
function cf7msm_get(  $var_name, $default = ''  ) {
    $ret = $default;
    $force_session = apply_filters( 'cf7msm_force_session', false );
    $allow_session = apply_filters( 'cf7msm_allow_session', $force_session );
    if ( $allow_session && empty( $_COOKIE['cf7msm_check'] ) ) {
        $ret = ( isset( $_SESSION[$var_name] ) ? cf7msm_sanitize_posted_data( $_SESSION[$var_name] ) : $default );
    } else {
        $ret = ( isset( $_COOKIE[$var_name] ) ? cf7msm_sanitize_posted_data( $_COOKIE[$var_name] ) : $default );
        $ret = json_decode( wp_unslash( $ret ), true );
    }
    // Conditional Fields plugin throws 500 error when these aren't set.
    if ( $var_name == 'cf7msm_posted_data' && class_exists( 'CF7CF' ) && method_exists( 'CF7CF', 'cf7msm_merge_post_with_cookie' ) ) {
        if ( !isset( $ret['_wpcf7cf_hidden_group_fields'] ) ) {
            $ret['_wpcf7cf_hidden_group_fields'] = '[]';
        }
        if ( !isset( $ret['_wpcf7cf_hidden_groups'] ) ) {
            $ret['_wpcf7cf_hidden_groups'] = '[]';
        }
        if ( !isset( $ret['_wpcf7cf_visible_groups'] ) ) {
            $ret['_wpcf7cf_visible_groups'] = '[]';
        }
    }
+   // Set your preferred data source（HTTP GET, custom field）
+   // Reference: https://contactform7.com/ja/getting-default-values-from-the-context/
+   if( $var_name == 'cf7msm_posted_data' ) ) {
+       if( isset($_GET['your-name']) ) {
+           ret['your-name'] = $_GET['your-name'];
+       }
+   }
    return $ret;
}
```

このコードは、Cookieやセッションから取得したデータを取得する関数（`cf7msm_get`）に対して、指定したデータソースの値を優先して対象のフォームへ自動入力するための記述です。

各データソースの値を優先して表示させる場合の記述は以下の通りです。

```javascript:HTTP GET
if( isset($_GET['your-name']) ) {
    $ret['your-name'] = $_GET['your-name'];
}
```

```javascript:カスタムフィールド
$post_meta = get_post_meta(get_the_ID(), 'your-name', true);
if( !empty($post_meta) ) {
     $ret['your-name'] = $post_meta;
} 
```

:::note warn
HTTP POST 変数をデータソースとする場合は別途POSTされたデータを保持しておく必要があります。
:::

## 結論
この修正により、Contact Form 7のデフォルト値がマルチステップフォームでも正しく反映されるようになります。
ただし、プラグインの管理ファイルを編集するため、プラグインのアップデートを行う際には変更内容を再確認し、動作検証を行うようにしてください。

## 最後に
この記事では、『Contact Form 7』と『Contact Form 7 Multi-Step Forms』を組み合わせた場合に発生するデフォルト値の表示優先度の問題を解決する方法について説明しました。これにより、よりスムーズなフォーム体験を提供できるようになります。

質問やフィードバックがありましたら、ぜひコメントでお知らせください。