ミギムキ

[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です。