Contact form 7では、validationエラーのメッセージの変更が可能ですが、項目ごと(name属性ごと)の変更は設定画面からできません。
特別のカスタマイズを行わない限り、同一のフォームタグのエラーメッセージは全て同じになります。
項目ごとにエラーメッセージを変更したい!
そう思って検索すると、エラーメッセージの変更方法は出てきますが、内容が古かったりそもそも使えないものが多かったです。
色々調べて簡単に変更する方法を見つけました。
この記事では、最新のContact form 7のvalidationエラーのメッセージの変更方法について説明します。
Contact form 7のメッセージ表示位置の変更と組み合わせて、この記事を読むことで好きな位置に好きなメッセージを表示することができるようになります。
Contact form 7のエラーメッセージの変更方法は?
Contact form 7のエラーメッセージの変更は簡単にできるのかな?と思って検索しましたが、なかなかそのものズバリという内容がありませんでした。
Contact form 7のエラーメッセージを変更する方法を検索すいると、以下の記事が見つかります。
その通りにやってもうまくいきませんでした。
上記の方法は、公式で否定されています。
WPCF7_ContactForm::validation_error()
は非 Ajax のフォーム送信において使われるものですので Ajax 送信には何ら関与しません。動作しないのはそのためかと思います。項目に基づいてエラーメッセージを変えたいのでしたらカスタムバリデーションを定義するのが最適な方法です。試してみてください。
https://ja.wordpress.org/support/topic/%E3%80%90wordpress%E3%80%91contact-form-7-%E3%81%AE%E3%83%95%E3%83%83%E3%82%AF%E3%81%8C%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82/
Contact form7のメッセージの変更にはカスタムバリデーションが必要
項目に基づいてエラーメッセージを変えたい場合は、カスタムバリデーションが必要と言われてもピンときませんでした。
本来、カスタムバリデーションとはバリデーション自体を変更したり、追加するためのものだと思います。
というのも、カスタムバリデーションの説明の記事には、『メールアドレスの不一致判定の例』しかなく、単純に既存のメッセージを変更したい場合の簡単な例がないからです。
バリデーション後にメッセージを出力する部分を変更すればメッセージを変更できるのはわかりました。
しかし、メッセージを変更するためだけに、バリデーション自体も記述しないといけないのが課題になります。
バリデーションの内容は変更せず、メッセージだけ変更したい
いちいち、バリデーションを書くのは時間の無駄です。
答えは簡単です。
Contact form7のバリデーションチェックを本家からコピーする、です。
同じ仕組みを使っている本家のソースコードから、拝借してくるのが一番安全で簡単なはずです。
カスタムバリデーションのフックは、wpcf7_validate_{formタグ名}です。
Contact form 7のソースコードはgithubに公開されています。ソースコードをフック名で検索するとバリデーション処理が見つかります。
例えば、チェックボックスのバリデーションの場合は、wpcf7_validate_checkboxでソースを検索すると以下のようにバリデーションチェックの処理が見つかります。
/* Validation filter */
add_filter( 'wpcf7_validate_checkbox',
'wpcf7_checkbox_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_checkbox*',
'wpcf7_checkbox_validation_filter', 10, 2 );
add_filter( 'wpcf7_validate_radio',
'wpcf7_checkbox_validation_filter', 10, 2 );
function wpcf7_checkbox_validation_filter( $result, $tag ) {
$name = $tag->name;
$is_required = $tag->is_required() || 'radio' == $tag->type;
$value = isset( $_POST[$name] ) ? (array) $_POST[$name] : array();
if ( $is_required and empty( $value ) ) {
$result->invalidate( $tag, wpcf7_get_message( 'invalid_required' ) );
}
return $result;
}
基本、本家のフック関数をそのまま使ってメッセージ部分だけ好きな文言に変更するのが一番簡単です。
例:checkboxのカスタムバリデーションでエラーメッセージを変更する
checkboxのフォームタグでname属性がcatalogの場合で説明します。
以下のように$nameにname属性(catalog)を指定することで、catalogに項目を絞ってメッセージを変更することができます。
フォームタグの絞り込み(checkboxかどうか)は、フック名(wpcf7_validate_checkbox)に含まれていますので、特に判定不要です。
// contact form 7 バリデーション追加
function custom_catalog_confirmation_validation_filter($result, $tag)
{
$name = $tag->name;
$is_required = $tag->is_required() ;
$value = isset( $_POST[$name] ) ? (array) $_POST[$name] : array();
if ( $is_required and empty( $value ) && $name == 'catalog') {
$result->invalidate( $tag, '一つ以上選択してください' );
}
return $result;
}
add_filter( 'wpcf7_validate_checkbox*', 'custom_catalog_confirmation_validation_filter', 9, 2 );
まとめ
Contact form7 のカスタムバリデーションを使用した、エラーメッセージの変更方法について説明しました。
メッセージだけを変更したい時でもバリデーションルールを記載しなければならないので、Contact form 7のソースを拝借してくると、誰でも簡単にメッセージを変更できますよ、という内容でした。