返信先: オプション設定による料金値引きについて

フォーラム 使い方全般 オプション設定による料金値引きについて 返信先: オプション設定による料金値引きについて

#101533
Alicia
参加者

tani.on-gaeshi.com 様

こんにちは。

 気になっていたものの、時間が取れなくてすっかり遅くなってしまいました。
もう、これを見ることはないかもですが、他の方が参考にされるかもしれませんのでメモしておきます。

商品合計3900円以下の場合に送料を一律150円引きにしたいのですが、
オプションで商品毎にギフトラッピングの選択が出来るようにしており、
一商品でもオプション(ギフトラッピング)を選択した場合は、例外としたいです。

 そのお気持ちすごくよくわかります。特に、「〇〇円以下」の「以下」ってところが・・・。送料で稼ぎたいわけじゃないので、できるだけ安くしたいけど・・・。
ギフトラッピングにすると、包装用の箱の中に更に化粧箱が入るので、包装用の箱のサイズが変わっちゃうんですよね。たぶん。だから除外・・・。

 素人の私は、たまにしかプログラムを書かないので、すぐに忘れてしまいます。なので、今回お手伝いさせてもらいました。ですが、最近プログラムというものを初めて書き始めたばかりですので、何の保証もできません。しっかりバックアップを取ってからにしてくださいね。

WCEX Multi Price をご利用ですので、ギフトラッピングの箱代などは、それで徴収されるのだと思います。私の場合、オプションがとても多くなってしまったので、色んな独自のルールがあるために、オプションの先頭8文字をコード化して、フロント側では見えないように消去しています。その為、そのコードで厳格に引っ掛けてゴニョゴニョと色々しているのですが、今回はわかりやすく、「ギフトラッピング」という文字列を含んでいれば、という条件にしました。簡素化したせいで予期せぬ動きをするかもしれませんので、気になったらご自身で変更してください。
Welcart 本体の送料無料の機能も、せっかくなので残しておきます。

【注意事項】
PHP8.0 ~ 新設された str_contains() を使っています。
今、お使いの

PHP のバージョン:7.4.30

では、機能しません。
PHPを更新して、8.0にする(8.1以上は、他のプラグインなどの対応状況がわからないうちは、やめておいた方がいいと思います。)か、ご都合が悪いようでしたら strpos() や strstr() に変更するなどしてください。

add_filter( 'usces_filter_set_cart_fees_shipping_charge', 'my_filter_set_cart_fees_shipping_charge', 10 );
function my_filter_set_cart_fees_shipping_charge(){
	// 変数の一部は、フックから取っても構いません。
	
		global $usces, $usces_entries;

		$carts = $usces->cart->get_cart();
		$entries = $usces->cart->get_entry();
		$total_items_price = $usces->get_total_price();
		$entries['order']['total_items_price'] = $total_items_price;
		
		// 一応、Welcart 本体の送料無料条件 は機能するように残しました
		if( empty( $usces->options['postage_privilege'] ) || $total_items_price < $usces->options['postage_privilege'] ) {
			$shipping_charge = $usces->getShippingCharge( $entries['delivery']['pref'], $carts, $entries );

			$carts = $usces->cart->get_cart(); //カートの中身を抽出する
			$counter = 0;// カウンター初期化
			foreach($carts as $cart_key => $cart_row){ //カートの中身からカートの行番号となるKeyと内容を1行ごと(1つの注文ごと)に抽出してループする

				$opt = $carts{"$cart_key"}["options"]; //1つ目の注文からオプションデータのみ抽出する

				foreach($opt as $opt_key => $value){ //オプションデータから共通オプションのKeyと中身を抽出してループする
					
					$wrapping_name = 'ギフトラッピング';// ← ← ← ← ← ← ←  ここに、除外したいオプションの任意の文字列を入力する
					
					if( str_contains( urldecode($value), $wrapping_name)){ // オプションのセレクト値に $wrapping_name が含まれる場合 (注 str_contains PHP 8.0~)
						$counter ++;// 1ループごとにカウントしていく
					}
				}
			}
			// カウンターが0のまま(ギフトラッピングがなかった)、且つ 商品合計 3,900円以下だったら
			if( $counter <= 0 && $total_items_price <= 3900){
				$shipping_charge -= 150;		
			}
		} else {
			$shipping_charge = 0;// Welcart 本体で送料無料の条件を満たした場合
		}
	return $shipping_charge;
}
  • この返信は1年、 9ヶ月前にAliciaが編集しました。