Facebook にシェア
[`evernote` not found]
LINEで送る

コンタクトフォームのバージョンが7 3.4にあがってHTML5のタグが使えるようになりました。
そこで、今までtextで登録してもらっていた日付部分をdateに変更しました。クローム等のブラウザではカレンダーが表示されるので
登録が便利になるだろうと思ってやったのですが、しばらくすると日付の部分がエラーがでて送れないという苦情がきました。
おかしいなと調べてみると、どうもクロームのカレンダーで送られる形式は2013-04-01のように区切りがハイフンで、コンタクトフォームのバリデーションもそれに準じた設定になっていました。

しかし、今まで日付を入力してもらっていたのは2013/04/01 等の/で区切る形で送ってもらっていたので、そこでエラーが出たようです。
どうにかならないのかとプラグインを調べてみましたら、wpcf7_is_dateというフィルターフックがありました。

wpcf7_is_dateは日付がただしいかチェックする関数で一番最後にフィルターがかかっていたのでそこに割り込んで新しいバリデーションを追加しました。

function wpcf7_is_date_new( $result,$date ) {
	$result = preg_match( '/^([0-9]{4,})[-\/]([0-9]{2})[-\/]([0-9]{2})$/', $date, $matches );

	if ( $result )
		$result = checkdate( $matches[2], $matches[3], $matches[1] );

	return $result;
}
add_filter( 'wpcf7_is_date', 'wpcf7_is_date_new', 10,2 );

これで 2013/04/01 でも 2013-04-01でも日付エラーがでなくなりました。
難点は2013-04/01でも通ってしまう事ですね。
マッチ条件を変更ではなく、マッチ前に/を-に置換したほうがいいかもしれません。