この記事は最後に更新してから1年以上経過しています。

Contact Form 7に確認フェーズを

説明

Contact Form 7はWordPressによるサイト製作でお世話になることが多いプラグインの1つ。ただ、クライアント様によっては、入力、確認、送信の3フェーズにしたいという要望があり、そんな時は別の方法を採用していたのですが、JavaScript(jQuery)を使ってページ遷移しなくてもいいなら確認フェーズは用意できるかなと思い、作り込んでみた。

きっかけはコメントフォーム

今回の対応を行う少し前、WordPress標準のコメント投稿フォームで同様のことを試した。さくさくコメントできる方がいいとも思うのだが、操作ミスなどによるコメント投稿を防ぎたかったのが主な目的で、比較的容易に対応することができていた。今回このことを思い立ったのは、この前提があったからだ。
概要の説明の前に、今回の対応の範囲などについて簡単に触れておく。検証環境は、WordPress 3.2.13.5日本語版、Contact Form 7バージョン3.0.13.3.2になり、jQuery 1.7.11.8.3を使用している。Contact Form 7はいくつかのフォーム用タグをサポートしているが、対応したのはテキスト項目、メールアドレス項目、テキストエリア、ドロップダウン・メニュー、チェックボックス、ラジオボタンとなる。それ以外のタグについては確認していないので、ご了承願いたい。

対応概要

まずはJavaScriptのソースコードを紹介する。

var SUBMIT_NAME = '送信';
var CONFIRM_NAME = '確認';
var MODIFY_NAME = '修正';
var SELECT_EMPTY_LABEL = '---';
var SELECT_EMPTY_VALUE = '---';
var MODIFY_BUTTON_ID = 'wpcf7-modify';
var ALERT_MESSAGE_CLASS = 'wpcf7-not-valid-tip';
var EMPTY_MESSAGE = '必須項目に記入もれがあります。';
var INVALIDE_EMAIL_MESSAGE = 'メールアドレスの形式が正しくないようです。';
var DISABLE_SELECT_COLOR = 'color:#000000';

( function($) {
$(document).ready( function () {
	$('select.wpcf7-validates-as-required').each( function () {
		if ( $(this).find( 'option:first' ).text() == SELECT_EMPTY_LABEL ) SELECT_EMPTY_VALUE = $(this).val();
	} );
	$('.wpcf7-form-control-wrap').mouseover( function () {
		$(this).find( '.wpcf7-not-valid-tip:visible' ).fadeOut();
	} );
	if ( $('.wpcf7-submit').val() == SUBMIT_NAME ) {
		$('.wpcf7-submit').val( CONFIRM_NAME );
		$('.wpcf7-form').submit( function () {
			if ( $('.wpcf7-submit').val() == CONFIRM_NAME ) {
				$(this).fadeOut('fast', function () {
					$('span.'+ALERT_MESSAGE_CLASS).remove();
					var validate = true;
					$('input.wpcf7-validates-as-required, textarea.wpcf7-validates-as-required').each( function () {
						if ( jQuery.trim( $(this).val() ) == '' ) {
							br = $(this).get(0).tagName.match( /textarea/i )? '<br />': '';
							$(this).after( '<span class="'+ALERT_MESSAGE_CLASS+'">'+br+EMPTY_MESSAGE+'</span>' );
							validate = false;
						}
					} );
					$('select.wpcf7-validates-as-required').each( function () {
						if ( $(this).children('option:selected').val() == SELECT_EMPTY_VALUE ) {
							$(this).after( '<span class="'+ALERT_MESSAGE_CLASS+'">'+EMPTY_MESSAGE+'</span>' );
							validate = false;
						}
					} );
					$('span.wpcf7-validates-as-required').each( function () { // for checkbox ( and radio? )
						if ( $(this).find('input:checked').length == 0 ) {
							$(this).after( '<span class="'+ALERT_MESSAGE_CLASS+'">'+EMPTY_MESSAGE+'</span>' );
							validate = false;
						}
					} );
					$('.wpcf7-validates-as-email ').each( function () {
						if ( jQuery.trim( $(this).val() ) != '' && !$(this).val().match( /^[A-Za-z0-9]+[\w\.-]+@[A-Za-z0-9]+[\w\.-]+\.\w{2,}$/ ) ) {
							$(this).after( '<span class="'+ALERT_MESSAGE_CLASS+'">'+INVALIDE_EMAIL_MESSAGE+'</span>' );
							validate = false;
						}
					} );
					if ( validate ) {
						$('.wpcf7-form input[type="text"], .wpcf7-form textarea').attr( 'readonly', 'readonly' );
						$('.wpcf7-form select').attr( 'disabled', 'disabled' ).attr( 'style', DISABLE_SELECT_COLOR );
						$('.wpcf7-radio input[type="radio"], .wpcf7-checkbox input[type="checkbox"]').each( function () {
							if ( !$(this).attr("checked") ) {
								$(this).next('span').hide();
								$(this).prev('span').hide();
							}
							$(this).hide();
						} );
						$('.wpcf7-submit').val( SUBMIT_NAME ).before( '<input type="button" name="'+MODIFY_BUTTON_ID+'" id="'+MODIFY_BUTTON_ID+'" value="'+MODIFY_NAME+'" />' );
						$('#'+MODIFY_BUTTON_ID).click( function () {
							$(this).remove();
							$('.wpcf7-form').fadeOut('fast', function () {
								$('.wpcf7-form input[type="text"], .wpcf7-form textarea').removeAttr( 'readonly' );
								$('.wpcf7-form select').removeAttr( 'disabled' ).removeAttr( 'style' );
								$('.wpcf7-radio input[type="radio"], .wpcf7-checkbox input[type="checkbox"]').each( function () {
									$(this).show();
									$(this).next().show();
									$(this).prev().show();
								} );
								$('.wpcf7-submit').val( CONFIRM_NAME );
								$(this).fadeIn('slow');
							} );
						} );
					}
					$(this).fadeIn('slow');
				} );
				return false;
			} else {
				$('.wpcf7-form select').removeAttr( 'disabled' ).removeAttr( 'style' );
			}
			return true;
		} );
	}
} );
} )( jQuery );

処理概要は次のようになっている。

1.初期時に「送信」ボタンを「確認」ボタンに書き換える。
2.「確認」ボタンが押された際、パラメータのバリデーションを行い、不備があればエラーメッセージを表示する。
3.2で不備がなければ、各テキスト項目とテキストエリアにはreadonly属性を、ドロップダウンメニューにはdisabled属性を、チェックボックスとラジオボタンは選択されていないinputタグ前後のラベル部分と、すべてのinputタグを非表示に。さらに「確認」ボタンを「送信」ボタンに書き換え、その前に「修正」ボタンを追加する。
4.「修正」ボタンが押された際は、3で行った処理を元に戻す。
5.「送信」ボタンが押された際は、ドロップダウンメニューにはdisabled属性を取り、正式なサブミットとする。

なおフェーズが切り替わる際は、jQueryのfadeOut/fadeInを使っている。これは、フェーズが切り替わったことを利用者に意識してもらうためである。

ご利用にあたって

実際のJavaScriptのソースコードは「こちら(jquery.wpcf7.confirm.js v0.12)」からアーカイブファイルをダウンロードし、アーカイブファイルから解凍したjquery.wpcf7.confirm.jsをサイトの適当なディレクトリにコピー。自テーマのheader.phpなどに追記する。
なおjquery.wpcf7.confirm.jsの冒頭のconstvar部分は、変更が予想される文字定数である。こちらは、利用されるフォームに応じて適宜書き変えること。まずチェックするとことは使用するフォームの送信ボタン名で、これは「SUBMIT_NAME」にて'送信'と定義している。送信ボタン名が異なる場合は必ず修正する。「SUBMIT_NAME」の内容とフォームの送信ボタン名が異なっているとこのスクリプトは機能しない。その他、エラーメッセージのspanタグにはwpcf7-not-valid-tipクラスを使用しているので、サイトのデザインに合わせてcssの内容を定義するか、このクラス名を変更する。また確認フェーズにおいてドロップダウン・メニューをdisabledにしているが、その際の文字色を「DISABLED_SELECT_COLOR」にて黒にしているので、必要に応じて書き変える。

最後に、こちらで紹介したスクリプトについては、前半で述べた環境を確認の上、自己責任にて使用してください。不具合についてはできるだけ速やかに対応することを心がけるが、時間がかかったり、対応できない場合があることをあらかじめご了承ください。

更新履歴

最新版0.12の修正内容は次の通りです。

  • jQuery.noConflict時に対応。
  • 「ドロップダウンメニュー」の「先頭に空の項目を挿入しますか?」がチェックされていた場合(include_blankオプション使用時)の不具合に対応
  • バリデーションエラー時のチップのフェイドアウト対応。


最終更新 : 2012年12月16日 11:49

お勧め

the_search_query(2018年5月27日 更新)

void the_search_query( )
検索フォームで入力された検索キーフレーズを表示する。

wp_parse_slug_list(2019年2月23日 更新)

array wp_parse_slug_list( mixed $list )
スラッグのリストをパースする。

get_current_user_id(2013年9月18日 更新)

int get_current_user_id()
現在のログイン済みユーザーのIDを取得抽出する。

wp_cache_set(2023年8月9日 更新)

bool wp_cache_set( mixed $id, mixed $data [, string $flag = '' [, int $expire = 0 ] ] )
任意のデータをキャッシュに保存する。

translate_user_role(2019年5月13日 更新)

string translate_user_role( string $name [ , string $domain = 'default' ] )
ロール(権限グループ)名の翻訳テキストを取得する。