Contact Form 7のSWVで出る「未定義の値」エラーを回避したい

Contact Form 7でチェックボックスの選択肢をJavaScriptで動的に生成して使っていました。ところが、プラグインをアップデートしたタイミングで、次のようなエラーメッセージが表示され、フォームが送信できなくなってしまいました。

「未定義の値がこの項目を通じて送信されました。」

調べてみると、これはContact Form 7 5.9系から導入された新しいバリデーション機構「SWV(Schema-based Web Validation)」が影響しているようです。SWVでは、フォームに送られてきた値が 「あらかじめ定義された選択肢と一致しているか」 をより厳密にチェックするため、動的に生成した値はスキーマに存在せず、“未定義”と判断されて弾かれてしまうケースが発生します。

SWVのcheckbox enumルールを除去してエラーを回避する

今回のケースでは、SWVがチェックボックスの選択肢をenum(列挙値)としてスキーマに登録し、それと一致しない値を弾くことが原因でした。そのため、一時的な対処としてチェックボックス用のSWVバリデーションルールをオフにすることで、送信エラーを回避できます。

functions.phpなどに次の1行を追加します。

remove_action( 'wpcf7_swv_create_schema', 'wpcf7_swv_add_checkbox_enum_rules', 20, 2 );

このコードは、SWVのスキーマ生成処理にフックされているwpcf7_swv_add_checkbox_enum_rules(チェックボックスの定義値チェックを行うコールバック)を削除することで、SWVがチェックボックスの選択肢を固定された値として扱わなくなる仕組みです。

同様に、selectタグでもSWVは選択肢をenum(列挙値としてスキーマに登録します。

そのため、JavaScript などでoptionを動的に追加している場合は、以下のルールを無効化することで回避できます。

remove_action( 'wpcf7_swv_create_schema', 'wpcf7_swv_add_select_enum_rules', 20, 2 );

この処理により、SWVはselectタグの選択肢についても「固定の定義値」とみなさなくなるため、動的に生成したoption が「未定義値」として弾かれず、フォーム送信が正常に行えるようになります。

まとめ

Contact Form 7の5.9系から導入されたSWV(Schema-based Web Validation)によって、フォームの入力値は「スキーマに定義された値と一致しているか」をより厳密にチェックするようになりました。

その結果、JavaScriptなどでcheckboxやselectの選択肢を動的に追加している場合、SWVに登録されていない値は「未定義値」と判断され、送信エラーが発生するケースがあります。

今回紹介したコードを使用して、SWV が追加しているenum(列挙値)チェックのルールを一時的に無効化することで、動的に生成した選択肢でもフォーム送信を通すことができます。

ただし、これはあくまで「応急処置」に近い対応です。本来は、SWVが求めるスキーマ構造に合わせて 動的生成側をどう扱うか検討することが理想的です。

今後のContact Form 7のアップデートでSWVがより強化される可能性もあるため、仕様変更には引き続き注意しておくと安心です。

参考サイト