Conditional Fields for Contact Form 7が動作しなかった時の対処(ChatGPT)
バージョン
Conditional Fields for Contact Form 7 バージョン 2.4.12
Contact Form 7 バージョン 5.9.5
対処法(ChatGPT)
ContactForm7
<table>
<tr>
<th>手段<span class="must">※必須</span></th>
<td>[select* group-menu "選択してください" "配送" "郵送" "お届け"]</td>
</tr>
[group email-delivery clear_on_hide]
配送の内容
[/group]
[group post-delivery clear_on_hide]
郵送の内容
[/group]
[group delivery-delivery clear_on_hide]
お届けの内容
[/group]
</table>
ここまでは通常の設定。条件付きフィールドの設定も行って動作確認をしたが動かない。
やったこと
バージョンの変更
他プラグインの停止
関係のないjavascriptの停止
jQueryのバージョン変更
いろいろやってみましたが、動作しませんでした。
そこでChatGPTで対処法を質問。
javascript
ここからが対処法。フォームの下に以下を追加したら解決しました。
<script>
$(document).ready(function() {
function updateVisibility() {
var value = $('select[name="group-menu"]').val();
$('.email-delivery').hide();
$('.post-delivery').hide();
$('.delivery-delivery').hide();
if (value === '配送') {
$('.email-delivery').show();
} else if (value === '郵送') {
$('.post-delivery').show();
} else if (value === 'お届け') {
$('.delivery-delivery').show();
}
}
$('select[name="group-menu"]').on('change', updateVisibility);
updateVisibility(); // 初期状態の更新
});
</script>
追記
解決したかと思ったら、問題が発生、group内の項目は全て必須項目。隠れた必須項目は記入していないため、送信出来ませんでした。そこでChatGPTで対処法をさらに質問。
対処法
javascriptの変更
<script>
$(document).ready(function() {
function updateVisibility() {
var value = $('select[name="group-menu"]').val();
$('.email-delivery').hide();
$('.post-delivery').hide();
$('.delivery-delivery').hide();
// 必須クラスをリセット
$('input, select, textarea').removeClass('wpcf7-validates-as-required');
$('.wpcf7-not-valid-tip').remove();
if (value === '配送') {
$('.email-delivery').show();
$('input[name="email-company"], input[name="email-department"]').addClass('wpcf7-validates-as-required');
} else if (value === '郵送') {
$('.post-delivery').show();
$('input[name="address-post"], input[name="post-company"], input[name="post-department"]').addClass('wpcf7-validates-as-required');
} else if (value === 'お届け') {
$('.delivery-delivery').show();
$('input[name="address-delivery"], input[name="company-delivery"], input[name="date-delivery"]').addClass('wpcf7-validates-as-required');
}
}
$('select[name="group-menu"]').on('change', updateVisibility);
updateVisibility(); // 初期状態の更新
// フォーム送信前にバリデーションを再評価
$('form.wpcf7-form').on('submit', function(event) {
updateVisibility(); // 送信時に再評価
var invalidFields = $('.wpcf7-validates-as-required').filter(function() {
return !$(this).val();
});
if (invalidFields.length > 0) {
event.preventDefault(); // フォーム送信をキャンセル
// 各フィールドにエラーメッセージを追加
invalidFields.each(function() {
if (!$(this).next('.wpcf7-not-valid-tip').length) {
$(this).closest('.wpcf7-form-control-wrap').append('<span class="wpcf7-not-valid-tip">このフィールドを入力してください。</span>');
}
$(this).addClass('wpcf7-not-valid');
});
}
});
});
</script>
Contactform7の必須のclass wpcf7-validates-as-requiredが入るように修正したが、デフォルトのエラーメッセージが出ない。必須なのに未記入で送信出来てしまうという状況。そこで以下を追加。
php
テーマの inc ディレクトリに cf7-custom-validation.php という名前のファイルを作成し、以下のコードを追加します。
<?php
defined( 'ABSPATH' ) || exit;
add_filter( 'wpcf7_validate_text', 'custom_validation_text', 20, 2 );
add_filter( 'wpcf7_validate_text*', 'custom_validation_text', 20, 2 );
function custom_validation_text( $result, $tag ) {
$name = $tag->name;
$value = isset( $_POST[$name] ) ? trim( $_POST[$name] ) : '';
$group_menu = isset( $_POST['group-menu'] ) ? $_POST['group-menu'] : '';
if ( $group_menu === '配送' ) {
if ( $name == 'email-company' && empty( $value ) ) {
$result->invalidate( $tag, "会社名を入力してください。" );
}
if ( $name == 'email-department' && empty( $value ) ) {
$result->invalidate( $tag, "部署名を入力してください。" );
}
}
if ( $group_menu === '郵送' ) {
if ( $name == 'address-post' && empty( $value ) ) {
$result->invalidate( $tag, "住所を入力してください。" );
}
if ( $name == 'post-company' && empty( $value ) ) {
$result->invalidate( $tag, "会社名を入力してください。" );
}
if ( $name == 'post-department' && empty( $value ) ) {
$result->invalidate( $tag, "部署名を入力してください。" );
}
}
if ( $group_menu === 'お届け' ) {
if ( $name == 'address-delivery' && empty( $value ) ) {
$result->invalidate( $tag, "住所を入力してください。" );
}
if ( $name == 'company-delivery' && empty( $value ) ) {
$result->invalidate( $tag, "会社名を入力してください。" );
}
if ( $name == 'date-delivery' && empty( $value ) ) {
$result->invalidate( $tag, "打設予定日を入力してください。" );
}
}
return $result;
}
functions.php
functions.php ファイルに以下の行を追加して、このカスタムバリデーションファイルを読み込みます。
require_once( get_template_directory() . '/inc/cf7-custom-validation.php' );
かなり強引な感じですが、これで動作しました。
他に対処法ありましたら、ご教授ください。
この記事が気に入ったらサポートをしてみませんか?