welcartをカスタマイズして予約販売の機能を実装する仕事をした。
たとえば、
10月1日から11月30日までの間だけクリスマスケーキを販売して、指定された到着希望日に届ける。
こういうのは、正月のおせち料理とかでもよくある仕組みだと思う。
この仕組みづくりの中でポイントの1つになったのが、usces_get_send_out_date()関数である。
簡単に役割を言うと、カート内にあるすべての商品の中から最も遅い最短発送予定日を返す関数だ。この日にちに基づいて作成する到着希望日リストから、注文者に到着希望日を選んでもらう。
この関数の戻り値は配列で、最も遅い最短発送予定日以外にも値がある。しかも予約販売機能カスタマイズには重要な値ばかりだ。
毎回コードを読み解いて値の意味を調べるのは面倒なので、まとめておく。
welcart内部での実行箇所
usces_get_send_out_date()関数が、welcartプラグイン内で実行されているのは2箇所。
- includes/delivery_info_script.php
冒頭で実行されている。wc_delivery_page.phpにおける到着希望日のselect optionを生成するための基礎情報を取得する。 - classes/usceshop.class.php > $usces->confirm() > $usces->delivery_check()
welcartは、カートの配送・支払方法ページから内容確認ページへ遷移する際に、「指定された到着希望日に商品が届くのか?」を検証している。検証用の基礎情報を取得するために、$usces->delivery_check()メソッド内部で実行されている。usces_get_send_out_date()関数の戻り値から、検証で使う計算上の到着日(=発送予定日+配達日数)を求めている。
戻り値(配列)の説明
/**
* welcart ver2.10.5
*/
var_dump( usces_get_send_out_date() );
array (size=6)
'today_bus_flag' => int 1
'time_limit_addition' => int 0
'indication_incart' => int 57
'holiday' => int 4
'sendout_num' => int 61
'sendout_date' =>
array (size=3)
'year' => string '2024' (length=4)
'month' => string '12' (length=2)
'day' => string '05' (length=2)
today_bus_flag
注文日が営業日なら1。発送業務休日なら0。
管理画面Welcart Shop 営業日設定ページのカレンダーで設定した内容が反映される。
$usces->options[‘business_days’]
time_limit_addition
Welcart Shop 配送設定で設定した配送業務締時間の値により決まる。
$usces->options[‘delivery_time_limit’]
注文時間が配送業務締時間内なら0。配送業務締時間を過ぎていれば1。
このtime_limit_addition値がsendout_num値に加算される。
つまり、注文時間が配送業務締時間を過ぎていれば、1日加算されて翌営業日に入った注文と同じ扱いで発送日の計算が行われる。
indication_incart
発送日までの日数。
具体的には、welcartデフォルトで設定されている発送日目安の配列の値である。
$usces->options[‘usces_shipping_indication’]
var_dump( $usces->options['usces_shipping_indication'] );
array (size=10)
0 => int 0 //--選択--
1 => int 0 //即日
2 => int 2 //1~2日後
3 => int 3 //2~3日後
4 => int 5 //3~5日後
5 => int 6 //4~6日後
6 => int 7 //約1週間後
7 => int 14 //約2週間後
8 => int 21 //約3週間後
9 => int 0 //商品入荷後
たとえば、要素が’「6 => 7 //約1週間後」ならindication_incart値は7。
indication_incart値は、最短配送希望日の算出に利用される。具体的には、デフォルトのindication_incart値が最短配送希望日に加算される。
カート内に商品が複数ある場合は、その中で最も大きい値が採用される(下記コード参照)。つまり、発送日までの日数が長い(後の=遅い)商品に合わせて到着希望日の選択肢select optionリストが生成される。
// get the shipping indication in cart.
$cart = $usces->cart->get_cart();
$shipping_indication = apply_filters( 'usces_filter_shipping_indication', $usces->options['usces_shipping_indication'] );
$shipping = 0;
$indication_flag = true;
$cart_count = ( $cart && is_array( $cart ) ) ? count( $cart ) : 0;
$shipping_rule_ex = apply_filters( 'usces_filter_item_shipping_rule_ex', 9 );
for ( $i = 0; $i < $cart_count; $i++ ) {
$cart_row = $cart[ $i ];
$post_id = $cart_row['post_id'];
$itemShipping = (int) $usces->getItemShipping( $post_id );
if ( 0 === $itemShipping || $shipping_rule_ex === $itemShipping ) {
$indication_flag = false;
break;
}
if ( $shipping < $itemShipping ) {
$shipping = $itemShipping;
}
}
$indication_incart = ( $indication_flag ) ? $shipping_indication[ $shipping ] : false;
holiday
発送予定日までにある「発送業務休日」数。
管理画面Welcart Shop 営業日設定ページのカレンダーで設定した内容が反映される。
sendout_num
注文日から発送予定日までの日にち数。
注文日が営業日なら、
sendout_num=time_limit_addition+indication_incart+holiday
注文日が発送業務休日なら、
sendout_num=indication_incart+holiday
sendout_date
発送予定日(=注文日+sendout_num)。
year,month,dayをkeyとした連想配列で返される。
welcartカスタマイズでの使い方など
usces_get_send_out_date()関数の戻り値が引数になっているフックに、includes/delivery_info_script.php内にある’usces_filter_cart_delivery_script’ filter hookがある。
このフックを使えば、配送・支払方法ページにおいて「配送先・配送方法・到着希望日・到着希望時間」の出力や動きを操作するjavaScriptを、大幅に変更することが可能だ。
コメントを残す