[Welcart] 注文個数が一定数を超えたら送料を加算したい
Welcartで作成したECサイトでアクセサリーなどの小物を取り扱う場合、注文数に応じて送料計算をしたいケースがあります。
例えば、ヤマト運輸の60サイズに商品が10個梱包できるのであれば、1〜10個までは60サイズ1セット分、11個〜20個までは60サイズ2セット分の送料にしたい、といったケースです。
Welcartで提供されているフィルターフックを使うことで、送料の再計算を行うことができます。
サンプルコード
function my_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries) {
global $usces;
$unit_border = 10;
foreach($carts as $cart) {
$quantity = $cart['quantity'];
if($quantity > $unit_border) {
$shipping_charge_by_unit = 0;
$item_shipping_charge_id = get_post_meta($cart['post_id'], '_itemShippingCharge', true);
$opt_shipping_charges = $usces->options['shipping_charge'];
foreach($opt_shipping_charges as $opt_shipping_charge) {
if($item_shipping_charge_id == $opt_shipping_charge['id']) {
foreach($opt_shipping_charge['JP'] as $key => $value) {
if($key == $entries['delivery']['pref']) {
$shipping_charge_by_unit = $value;
break;
}
}
break;
}
}
$add_shipping_charge = $shipping_charge_by_unit * (intdiv($quantity - 1, $unit_border));
$shipping_charge = $shipping_charge + $add_shipping_charge;
}
}
return $shipping_charge;
}
add_filter('usces_filter_set_cart_fees_shipping_charge', 'my_set_cart_fees_shipping_charge', 10, 3);
上記コードを「functions.php」に記載して使用します。
サンプルコードの解説
フィルターフックに関数を登録する
function my_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries) {
〜
return $shipping_charge;
}
add_filter('usces_filter_set_cart_fees_shipping_charge', 'my_set_cart_fees_shipping_charge', 10, 3);
フィルターフック「usces_filter_set_cart_fees_shipping_charge」に関数を登録することで、注文時の送料を計算するタイミングで関数が実行されます。
引数の$shipping_chargeには現状の送料が格納されています。この値を書き換えてreturnすることで、送料が変更されます。
合わせて設定されている引数$cartsにはカート内の商品情報が、$entriesには注文者情報が格納されており、適宜必要な情報を参照することができます。
送料加算のしきい値を決める
$unit_border = 10;
変数$unit_borderに送料の加算が必要な数量を設定します。
サンプルでは10としており、数量が10個を超えるたびに送料を加算していきます。
カート内の商品をループして再計算が必要な商品を判定する
foreach($carts as $cart) {
$quantity = $cart['quantity'];
if($quantity > $unit_border) {
〜
}
}
引数で渡された$cartsには、カート内の商品情報が以下のような配列形式で格納されています。
Array
(
[0] => Array
(
[serial] => a:1:{i:100;a:1:{s:5:"code0";i:0;}}
[post_id] => 100
[sku] => code0
[options] => Array
(
)
[price] => 2000
[quantity] => 1
[advance] =>
)
[1] => Array
(
[serial] => a:1:{i:101;a:1:{s:5:"code0";i:0;}}
[post_id] => 101
[sku] => code0
[options] => Array
(
)
[price] => 3000
[quantity] => 11
[advance] =>
)
)
$cartsをforeachでループしてカート内の商品を一つずつ処理します。
注文数($cart['quantity'])が$unit_borderより多ければ、以降の送料計算処理に進みます。
ある商品をある場所に送る際にかかる送料を取得する
$shipping_charge_by_unit = 0;
$item_shipping_charge_id = get_post_meta($cart['post_id'], '_itemShippingCharge', true);
$opt_shipping_charges = $usces->options['shipping_charge'];
foreach($opt_shipping_charges as $opt_shipping_charge) {
if($item_shipping_charge_id == $opt_shipping_charge['id']) {
foreach($opt_shipping_charge['JP'] as $key => $value) {
if($key == $entries['delivery']['pref']) {
$shipping_charge_by_unit = $value;
break;
}
}
break;
}
}
商品の送料は、商品それぞれの送料設定や送り先によって変動します。
加算する料金の計算にあたって、まずは「商品AをB県に送るときにかかる送料」を取得します。
$item_shipping_charge_id = get_post_meta($cart['post_id'], '_itemShippingCharge', true);
$cart['post_id']に設定されている投稿IDを使って、カスタムフィールド「_itemShippingCharge」の値を取得します。
「_itemShippingCharge」には、商品情報の登録時に指定した送料設定のIDが格納されています。
$opt_shipping_charges = $usces->options['shipping_charge'];
次に、Welcartの基本設定で登録した送料設定(の集まり)を取得します。
$usces->options['shipping_charge']には、以下のような形式で送料設定が格納されています。
[shipping_charge] => Array
(
[0] => Array
(
[id] => 1
[name] => クロネコヤマト60サイズ
[JP] => Array
(
[北海道] => 1370
〜
[沖縄県] => 1480
)
)
[1] => Array
(
[id] => 2
[name] => クロネコヤマト160サイズ
[JP] => Array
(
[北海道] => 2510
〜
[沖縄県] => 4270
)
)
)
[id]の中に格納された値が、送料設定のIDとなります。
foreach($opt_shipping_charges as $opt_shipping_charge) {
if($item_shipping_charge_id == $opt_shipping_charge['id']) {
〜
break;
}
}
送料設定の配列をforeachでループして、カート内の商品とIDが一致する送料設定を特定します。
foreach($opt_shipping_charge['JP'] as $key => $value) {
if($key == $entries['delivery']['pref']) {
$shipping_charge_by_unit = $value;
break;
}
}
次に、特定した送料設定の県別の送料が格納されている配列$opt_shipping_charge['JP']をforeachでループします。
$keyに格納されている県名と、$entries['delivery']['pref']に格納されている発送先の県名が一致しているかチェックして、その送料を変数$shipping_charge_by_unitに保持します。
送料の再計算
$add_shipping_charge = $shipping_charge_by_unit * (intdiv($quantity - 1, $unit_border));
$shipping_charge = $shipping_charge + $add_shipping_charge;
特定した商品の送料を使って加算分の送料を計算します。
注文数から1を引いた値を、送料加算のしきい値$unit_borderで割り、その値と送料を乗算します。
送料($shipping_charge_by_unit)が500円、数量($quantity)が20個、しきい値($unit_border)が10個なら、500 × ((20 - 1) ÷ 10)で500円。
数量が21個なら500 × ((21 - 1) ÷ 10)で1,000円。となります。
算出した追加分の送料を$shipping_chargeに加算します。同じ一連の処理をカート内の全商品にそれぞれ行ってから$shipping_chargeをreturnします。
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。