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だけにしておく。
コメントを残す