この実装、面倒なら代行します
100ウェブでは、WordPressサイトに組み込むフォームにはいつも「Contact Form 7」を利用していますが、フォームプラグインでもうひとつ有名なものに「MW WP Form」というのがあります。
今回はこの「MW WP Form」を使ったフォームのカスタマイズについてです。
具体的なカスタマイズの内容は以下の通りです。
2つの機能がありますね。
一つ目がMW WP Formのバリデーション制御、二つ目がjavascriptによる表示の切り替え。
どちらも単体では簡単ですが、合わせ技だと割と役に立つシーンが増えるかもしれません。
それでは実装していきましょう。
まず「MW WP Form」の投稿に次のように記述します。
[mwform_checkbox name="c-active-q1" children="選択肢1,選択肢2,その他"]</div> <div id="disp_by_checkclick1">[mwform_textarea name="c-reactive-q1" cols="50" rows="6"]</div> [mwform_checkbox name="c-active-q2" children="選択肢1,選択肢2,その他"] <div id="disp_by_checkclick2">[mwform_textarea name="c-reactive-q2" cols="50" rows="6"]</div> [mwform_radio name="r-active-q1" children="選択肢1,選択肢2,その他"] <div id="disp_by_radioclick1">[mwform_textarea name="r-reactive-q1" cols="50" rows="6"]</div> [mwform_radio name="r-active-q2" children="選択肢1,選択肢2,その他"] <div id="disp_by_radioclick2">[mwform_textarea name="r-reactive-q2" cols="50" rows="6"]</div>
次に functions.php に次のコードを追記
【MW WP Formのバリデーションにフィルター】
//MW WP Form 動的バリテーション function kaiza_active_validation( $Validation, $data ) { foreach ($data as $key => $value) { //チェックボックス if (preg_match('/^c-active-q(\d+)$/', $key, $matches)) { $s = $matches[1]; // キーから数字部分を抽出 if (isset($value['data']) && is_array($value['data'])) { if (in_array('その他', $value['data'])) { $Validation->set_rule("c-reactive-q$s", 'noEmpty', array( 'message' => '必須項目です。' )); } } } //ラジオボタン if (preg_match('/^r-active-q(\d+)$/', $key, $matches)) { $t = $matches[1]; // キーから数字部分を抽出 if ($value == 'その他') { $Validation->set_rule("r-reactive-q$t", 'noEmpty', array( 'message' => '必須項目です。' )); } } } return $Validation; } add_filter( 'mwform_validation_mw-wp-form-XXXXXX', 'kaiza_active_validation', 10, 3 ); //mw-wp-form-XXXXXXのところはMW WP Formが発行する修飾子を充てます。(投稿画面に出てます)
続けてwp_footer内に設置する【フォームを操作するjavascriptコード】
//フォーム操作js function js_for_activeform() { ?> <script> jQuery(function($) { // ラジオボタンの状態に応じて表示を切り替える関数 function toggleDisplayByRadio(radioName, switchItemSelector) { let switchItem = $(switchItemSelector); let hiddenValueExists = switchItem.find('input[type="hidden"]').val() !== undefined; let isSelectedOther = $(`input[name='${radioName}']:checked`).val() === 'その他'; if (hiddenValueExists || isSelectedOther) { switchItem.show(); } else { switchItem.hide(); switchItem.find('textarea').val(''); } } // チェックボックスの状態に応じて表示を切り替える関数 function toggleDisplayByCheckbox(checkboxName, switchItemSelector) { let switchItem = $(switchItemSelector); let hiddenValueExists = switchItem.find('input[type="hidden"]').val() !== undefined; let checkboxes = $(`input[name='${checkboxName}']`); let display = hiddenValueExists || checkboxes.filter(':checked').toArray().some(function(elem) { return $(elem).val() === 'その他'; }); if (display) { switchItem.show(); } else { switchItem.hide(); switchItem.find('textarea').val(''); } } // ラジオボタンの変更を監視 $("input[name='r-active-q1'], input[name='r-active-q2']").change(function() { toggleDisplayByRadio('r-active-q1', '#disp_by_radioclick1'); toggleDisplayByRadio('r-active-q2', '#disp_by_radioclick2'); }); // ラジオボタン初期状態の設定 toggleDisplayByRadio('r-active-q1', '#disp_by_radioclick1'); toggleDisplayByRadio('r-active-q2', '#disp_by_radioclick2'); // チェックボックスの変更を監視 $("input[name='c-active-q1[data][]'], input[name='c-active-q2[data][]']").change(function() { toggleDisplayByCheckbox('c-active-q1[data][]', '#disp_by_checkclick1'); toggleDisplayByCheckbox('c-active-q2[data][]', '#disp_by_checkclick2'); }); // チェックボックス初期状態の設定 toggleDisplayByCheckbox('c-active-q1[data][]', '#disp_by_checkclick1'); toggleDisplayByCheckbox('c-active-q2[data][]', '#disp_by_checkclick2'); }); </script> <?php } add_action('wp_footer', 'js_for_activeform');
jquery前提となっていますので、jqueryを参照するようにしてください。
「MW WP Form」利用者の皆さん、ご活用ください。
WordPressカスタマイズ事例やウェブ制作ノウハウの新着情報、お役立ち情報を
リアルタイムにメルマガ配信!
100ウェブで手がけた制作・開発案件を一部、ご紹介。
クライアントからご相談いただいた内容とその実装におけるポイント、工期、予算について確認いただけます。
【テレワーク実施中 につきお電話転送中】
コール中1秒程度無音状態になりますがそのままお待ちください。
受付時間
平日 10:00~18:00
メールでのお問い合わせでも
1営業日以内にご連絡いたします。