welcart到着希望日選択リストに曜日を入れる

welcartのデフォルトでは、到着希望日選択リスト(select option)に曜日が表示されない。
注文者にとって不便なので、日付の後ろに曜日を追加する。

/**
 * welcart ver2.10.5
 * hookがあるfile : usc-e-shop/includes/delivery_info_script.php
 * 
 * @param string $delivery_after_days_script
 */
add_filter( 'usces_delivery_after_days_script', function( $delivery_after_days_script ) {
	$no_preference = __( 'No preference', 'usces' );

	$delivery_after_days_script = "
	const dayOfWeek_arr = [ '(日)', '(月)', '(火)', '(水)', '(木)', '(金)', '(土)' ];
	let d_obj;
	option += '<option value=\"" . $no_preference . "\">" . $no_preference . "</option>';
	for( var i = 0; i < delivery_after_days; i++ ) {
		d_obj = new Date( date['year'], date['month'] - 1, date['day'] );
		date_str = date[\"year\"] + \"-\" + date[\"month\"] + \"-\" + date[\"day\"];
		if ( date_str == selected_delivery_date ) {
			option += '<option value=\"' + date_str + '\" selected>' + date_str + dayOfWeek_arr[ d_obj.getDay() ] + '</option>';
		} else {
			option += '<option value=\"' + date_str + '\">' + date_str + dayOfWeek_arr[ d_obj.getDay() ] + '</option>';
		}
		date = addDate( date[\"year\"], date[\"month\"], date[\"day\"], 1 );
	}";

	return $delivery_after_days_script;
} );

15行目、Dateオブジェクトのコンストラクターの引数で、月の引数を「date[‘month’] – 1」としている。月は1~12ではなく0~11なので、-1を引き算する必要があるため。

option[value]の値に曜日は入れない。

曜日を入れるのはoptionのtextContentだけにする。option[value]の値はデフォルトの’Y-m-d’形式のままにしておく。

後から分かったのだが、こうしないと指定された到着希望日に対してバリデーションが実行されない。

welcartは、内容確認ページへ遷移する際に、「指定された到着希望日に商品が届くのか?」を検証している( $usces->delivery_check() ← $usces->confirm() )。
具体的には、到着希望日が計算上の到着日(=発送予定日+配達日数)より前なら、到着希望日の再指定を強制するメッセージが表示され、内容確認ページへ遷移できない。

到着希望日のバリデーションでは、まず、値の存在をempty()で確認し、次に、日付の正当性をcheckdate()関数で検証している。
(正確にいうと、usces_is_date()というwelcart独自のcheckdate()ラッパー関数で検証)
検証する値は当然、POST送信されるoption[value]値である。ここに日本語の曜日が入っていると正当な日付とみなされず、バリデーションが実行されない。

したがって、曜日を入れるのはoptionのtextContentだけにしておく。


コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です