配送オプションで料金を追加する方法

スポンサーリンク

Welcartのデフォルトで設定できる配送オプションは、代引きの追加料金のみとなっています。

今回は、この設定とは別に、クール便や翌朝10時便など、他の配送オプションを選択した際に料金を追加したり、簡易包装などで値引きしたりする方法です。

もくじ

  1. 利用するフック
  2. カスタマイズの前準備
  3. functions.phpにフィルターフックを記述
  4. カスタマイズのアレンジ
  5. 各社の配送オプションいろいろ

1. 利用するフック

  • フックの記述・・・usces_filter_set_cart_fees_shipping_charge
  • フックの場所・・・use-e-shop/classes/useshop.class.php

離島料金のカスタマイズ」「一定金額で送料無料ではなく値引き」のカスタマイズの時と同じフックです。

2. カスタマイズの前準備

まず、[ダッシュボード]>「Welcart Shop」>[カートページ設定]へ。

カートページ設定のページで、「カスタム・オーダーフィールド」タブを選択して下さい。

ここで、以下のようにカスタムオーダー・フィールドを追加します。

カスタムオーダー・フィールド

フィールドキー rapid(ご自由に)
フィールド名 翌朝10時便(ご自由に)
フィールドタイプ 「シングルセレクト」または「チェックボックス」が良い。オススメは「シングルセレクト」。
必須項目 チェックなし
セレクト値 希望しない
希望する(追加料金:210円)

シングルセレクト以外にも、ラジオボタンやチェックボックスなどで試しましたが、結局シングルセレクトが一番使い勝手が良かったように思います。

3. functions.phpにフィルターフックを記述

後は、以下のコードをfunctions.phpに追加するだけです。

//翌朝10時便希望時に送料210円追加
add_filter('usces_filter_set_cart_fees_shipping_charge', 'custom_filter_set_cart_fees_shipping_charge', 10, 3);
function custom_filter_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
	if($entries['custom_order']['rapid'] == "希望する(追加料金:210円)"){
			$shipping_charge += 210;
	}
	return $shipping_charge;
}

上記で4行目の[‘rapid’]“希望する(追加料金:210円)”の部分は、ご自分で決めたフィールドキーやセレクト値と一致させて下さい。

これで、「発送・支払方法」のカートページで、希望の配送オプションが選択された際に、自動的に送料にオプション料金が追加(値引き設定の場合は減額)されます。

カスタムオーダー・フィールドの配送オプション

4. カスタマイズのアレンジ

カスタムオーダー・フィールドで送料を値引きしたい場合

配送料金を追加ではなく値引きにしたい場合は、上記5行目の

$shipping_charge += 210;

を、以下のように修正(プラスをマイナスに変更)して下さい。

$shipping_charge -= 210;

オプション項目が複数ある場合

上記コードの4~6行目(if文の部分3行)をコピーしてフィールドキーやセレクト値を修正し、7行目のreturn文の前に挿入すればOK。

例)オプション項目が2つの場合

//配送オプション追加料金2項目
add_filter('usces_filter_set_cart_fees_shipping_charge', 'custom_filter_set_cart_fees_shipping_charge', 10, 3);
function custom_filter_set_cart_fees_shipping_charge($shipping_charge, $cart, $entry){
	if($entry['custom_order']['rapid'] == "希望する(追加料金:210円)"){
			$shipping_charge += 210;
	}
	if($entry['custom_order']['cool'] == "希望する(追加料金:160円)"){
			$shipping_charge += 160;
	}
	return $shipping_charge;
}

5. 各社の配送オプションいろいろ

配送業者によって、配送オプションもそれぞれ。以下は一例です。

ゆうパック

  • 本人限定受け取り(+100円)
  • セキュリティーサービス(+370円)
  • チルドゆうパック(+220円~)

ヤマト運輸

  • クール宅急便(+216円~)
  • 超速宅急便(+432円~)
  • 宅急便タイムサービス(+324円~)

佐川急便

  • 飛脚クール便(+162円~)

オプション設定で、よりユーザーの需要に合った配送方法を提供できるといいですね。

14 Responses to “配送オプションで料金を追加する方法”

  1. km より:

    welcartの送料のカスタマイズでこちらにたどり着きました。
    非常に参考になる記事をありがとうございます。

    もし差し支えがなければご教授いただきたい内容があるのですが、
    送料が例えばA500円、B800円、C1000円があり、BとCを個別課金にしてしまうと注文数の数だけBとCの送料が上乗せされてしまいます。
    これをBとCの送料を設定した商品をいくつ購入しても、固定にする方法をご存知ではないでしょうか?
    例)Aの商品5個+Bの商品5個+Cの商品5個の送料=2300円
    できればfunctions.phpへのフィルターフックへの記述を希望します。

    もしご予算がかかるようでしたら、お見積もりを頂くことはできますでしょうか?

    ご検討を何卒宜しくお願い申し上げます。

    • まめ子(管理人) より:

      未検証ですが、恐らくこんな感じで出来ると思います。

      1. BとCの送料は、とりあえずAと同じに設定
      2. こちらのカスタマイズをアレンジして、特定の商品(この場合はBまたはC)を含む場合に送料を加算するコードをfunctions.phpに記述

      2の手順での条件分岐などは適宜増やして下さいね。これならば、B(またはC)がカートに入っている時に、1回だけそれらの送料がプラスされるはずです。

  2. km より:

    まめ子様

    さっそくのご返信ありがとうございます。
    非常に参考になるアドバイスで助かります!

    説明不足だった点があり、あともう少しのところまでたどり着くことが出来ました。
    以下のSKUの所なのですが、送料BはSKUが1つ(019-1)なのですが、送料Cは(018-1)(018-2)(018-3)の3つのSKUがあります。

    //特定のSKUがカートに入っている場合、送料追加
    add_filter(‘usces_filter_set_cart_fees_shipping_charge’, ‘mysku_set_cart_fees_shipping_charge’, 10, 3);
    function mysku_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
    $mysku = array(‘019-1’, ‘018-1’, ‘018-2’, ‘018-3’); //送料追加のSKUを記入
    foreach($carts as $cart){
    $sku = $cart[‘sku’];
    if(in_array($sku, $mysku)){
    $shipping_charge += 850;
    }
    }
    return $shipping_charge;
    }

    上記のコードではBとCが共に送料850円の場合、カートに(019-1)と(018-1)のみ入れますと上手く850円づつが加算されるのですが、さらに(018-2)や(018-3)も入れると、Cの送料が上乗せになってしまいます。

    それを回避できないかと条件分岐にて下記のコードを考えてみたのですが、上手くいきませんでした。

    //特定のSKUがカートに入っている場合、送料追加
    add_filter(‘usces_filter_set_cart_fees_shipping_charge’, ‘mysku_set_cart_fees_shipping_charge’, 10, 3);
    function mysku_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
    $mysku = array(‘019-1’); //送料追加のSKUを記入
    $mysku2 = array(‘018-1’); //送料追加のSKUを記入
    $mysku3 = array(‘018-2’); //送料追加のSKUを記入
    $mysku4 = array(‘018-3’); //送料追加のSKUを記入
    foreach($carts as $cart){
    $sku = $cart[‘sku’];
    if(in_array($sku, $mysku) && in_array($sku, $mysku2) || in_array($sku, $mysku3) || in_array($sku, $mysku4)){
    $shipping_charge += 1700;
    }
    elseif(in_array($sku, $mysku2) || in_array($sku, $mysku3) || in_array($sku, $mysku4)){
    $shipping_charge += 850;
    }
    }
    return $shipping_charge;
    }

    間違いだらけのコードかもしれませんが、もしアドバイスを頂けますと、大変助かります。
    お手数をおかけ致しまして申し訳ありませんが、ご検討を何卒宜しくお願い申し上げます。

    • まめ子(管理人) より:

      あ、よく考えたら送料B/Cの商品のみの注文ですと、Aの送料設定だとそれに加算されてしまいますね。なので、商品登録での送料設定はゼロ円にしておいたほうがいいかもしれません。arrayは複数の値を代入するものなので、値が一つしかない場合はarrayやin_arrayを使う必要はないです。
      SKU登録部分は送料別に$mysku1(送料B)と$mysku2(送料c)と二つ用意して、条件分岐はBの時はif($sku == $mysku1)、Cの時はelseif(in_array($sku, $mysku2))としてみれば、多分いけるのではと思います。

  3. km より:

    ご返信ありがとうございます!

    コードに関するご指摘、誠に有難うございます。大変勉強になります。

    //特定のSKUがカートに入っている場合、送料追加
    add_filter(‘usces_filter_set_cart_fees_shipping_charge’, ‘mysku_set_cart_fees_shipping_charge’, 10, 3);
    function mysku_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
    $mysku1 = ‘019-1’; //送料追加のSKUを記入
    $mysku2 = array(‘018-1’, ‘018-2’, ‘018-3’); //送料追加のSKUを記入
    foreach($carts as $cart){
    $sku = $cart[‘sku’];
    if($sku == $mysku1){
    $shipping_charge += 850;
    }
    elseif(in_array($sku, $mysku2)){
    $shipping_charge += 850;
    }
    }
    return $shipping_charge;
    }

    ご教授頂きましたことを活かし、上記のように書いてみました所、

    //特定のSKUがカートに入っている場合、送料追加
    add_filter(‘usces_filter_set_cart_fees_shipping_charge’, ‘mysku_set_cart_fees_shipping_charge’, 10, 3);
    function mysku_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
    $mysku = array(‘019-1’, ‘018-1’, ‘018-2’, ‘018-3’); //送料追加のSKUを記入
    foreach($carts as $cart){
    $sku = $cart[‘sku’];
    if(in_array($sku, $mysku)){
    $shipping_charge += 850;
    }
    }
    return $shipping_charge;
    }

    と同じ結果が得られました。

    条件分岐、非常に難しいですね。。
    elseif(‘018-1’, ‘018-2’, ‘018-3’が全て含まれる場合)は850円を一度だけ追加するといった風にできればいいのですが、850円が3回追加されてしまいます。

    もしくはカートに’018-1’と’018-2’しか入っていない状況でも上記のelseif(‘018-1’, ‘018-2’, ‘018-3’)が適用され、850円が2回追加されてしまいます。

    色々と親身にご相談に乗って頂きまして、本当にありがとうございます。

    お客様に妥協案の提案も考えつつ、もう少し粘ってみようと思います!

    • まめ子(管理人) より:

      すみません、確認不足でした。何度も加算されてしまうのは、foreachがそのままなのが原因です。一度でも条件が合致したらループを抜け出すように、条件文(if)の終わりにbreak;を入れてみて下さい。これで出来ないですかね~

  4. km より:

    まめ子様

    何度も本当にありがとうございます!!とても助かっております。

    break;を使用した下記のコードで上手くいったと思ったのですが、商品をカートに追加する順番によって上手くいく場合とそうでない場合があることがわかりました。

    //特定のSKUがカートに入っている場合、送料追加
    add_filter(‘usces_filter_set_cart_fees_shipping_charge’, ‘mysku_set_cart_fees_shipping_charge’, 10, 3);
    function mysku_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
    $mysku1 = ‘019-1’; //送料追加のSKUを記入
    $mysku2 = array(‘018-1’, ‘018-2’, ‘018-3’); //送料追加のSKUを記入
    foreach($carts as $cart){
    $sku = $cart[‘sku’];
    if($sku == $mysku1) {
    $shipping_charge += 850;
    }
    elseif(in_array($sku, $mysku2)){
    $shipping_charge += 850;
    break;
    }
    }
    return $shipping_charge;
    }

    上記のコードでは、019-1を先にカートに入れた場合は上手くいきます。

    019-1をカートに後に入れた場合の記述も追記しようと考えたのですが、break;によりうまくいきませんでした。

    本来私がもっと勉強すべきなのですが、納期が迫っており、ご迷惑をおかけしているにもかかわらずご対応頂いておりますことに大変感謝致します。

    if($sku == $mysku1 || in_array($sku, $mysku2)) {
    $shipping_charge += 850;
    }
    elseif(in_array($sku, $mysku2) || $sku == $mysku1){
    $shipping_charge += 850;
    break;
    }
    上記のようなコードも試してみたのですが、ダメでした。

    何度も申し訳ありませんが、もしアドバイスを頂けますと大変光栄です。

    宜しくお願い申し上げます。

    • まめ子(管理人) より:

      break;の位置やforeachの動作についてチェックなさってみるのが良いと思います。検証までちょっと出来ないので細かい所までは何ともなんですが・・・

  5. km より:

    まめ子様

    ご返信ありがととうございます!!

    break;の位置やforeachの動作を研究してみます!

    本当にありがとうございます!

  6. km より:

    まめ子様

    何度もご教授頂き、本当にありがとうございました。

    やっと以下のコードで上手く行くことが出来ました。

    //特定のSKUがカートに入っている場合、送料追加
    add_filter('usces_filter_set_cart_fees_shipping_charge', 'mysku_set_cart_fees_shipping_charge', 10, 3);
    function mysku_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
        $mysku1 = '019-1'; //送料追加のSKUを記入
        $mysku2 = array('018-1', '018-2', '018-3'); //送料追加のSKUを記入
        foreach($carts as $cart){
            $sku = $cart['sku'];
            if($sku == $mysku1) {
                $shipping_charge += 850;
                break;
            }
        }
        foreach($carts as $cart){
            $sku = $cart['sku'];
            if(in_array($sku, $mysku2)) {
                $shipping_charge += 850;
                break;
            }
        }
        return $shipping_charge;
    }

    心よりお礼申し上げます。

  7. steven より:

    大変参考になりました。
    また、その他有力なカスタマイズありがとうございます。

    検索でこちらのページを拝見しました。
    この項目で設定した配送オプションで料金を追加するというもの
    決まった商品を購入した場合にのみ表示するというのは可能でしょうか?
    よろしくお願いいたします

    • まめ子(管理人) より:

      検証までは致しかねますが、以下のようにすれば出来るのではないでしょうか。編集するファイルは、wc_delivery_page.phpです。

      1. カスタム・オーダーフィールドの記述の直前で、
      2. カートの中身を取得し、
      3. 2に特定の商品が含まれている時のみ、カスタム・オーダーフィールドを表示する。
  8. steven より:

    まめ子さま

    お返事ありがとうございます。
    私には歯が立たないのであきらめます。
    ありがとうございました。

Copyright© 2017 Welcart カスタマイズ ブログ All Rights Reserved.