送料無料キャンペーンをする場合のカスタマイズ

スポンサーリンク

Welcartで送料無料キャンペーンを行いたいと思い、カスタマイズを行いました。

バナーの例

Welcartでは、通常は「割引」または「ポイントアップ」のキャンペーンが設定出来ます。ただ、割引等ではなく、「送料無料」で訴求したい場合には、カスタマイズで対応可能です。

もくじ

  1. 利用するフック
  2. 基本のカスタマイズコード
  3. 「特定のカテゴリーの商品がカートに入っていれば送料無料」にする場合
  4. 「特定の商品のみで送料無料」にする場合
  5. 送料無料の金額条件を下げたいだけの場合
  6. まとめ

1. 利用するフック

今回利用するフックは、以下の通りです。

  • フックの記述:usces_filter_set_cart_fees_shipping_charge
  • フックの場所:classes/usceshop.class.php

送料関係のカスタマイズでは、基本的にこのフックを使うので、覚えておいて損はありません。

2. 基本のカスタマイズコード

使用中のテーマのfunctions.phpにコードを記述します。

//送料無料キャンペーン(全商品)
add_filter( 'usces_filter_set_cart_fees_shipping_charge', 'my_free_set_cart_fees_shipping_charge', 10, 3);
function my_free_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
	$options = get_option('usces');
	if( 'Promotionsale' == $options['display_mode'] ){
		$shipping_charge = 0;
	}
    return $shipping_charge;
}

以上は商品によって区別せず、全商品で送料無料にする場合の、最もシンプルなコードです。

キャンペーン中を判別する条件分岐」を使っていますので、送料無料のキャンペーンの期間は、Welcartの「営業日設定」で設定したものに準じます。

free-shipping-campaign1

通常キャンペーンで設定できる、割引orポイントアップとの併用も可能です。

3.「特定のカテゴリーの商品がカートに入っていれば送料無料」にする場合

Welcartのキャンペーン設定では、キャンペーン対象としてカテゴリー指定をすることが出来ます。

free-shipping-campaign2

このカテゴリー指定を、「送料無料キャンペーン」でも使いたい場合のカスタマイズとなります。

この場合、カートの中身のデータを精査する必要が出てくるため、コードはやや複雑になります。

3-1. カートに入っている商品の投稿IDを取得

まず、カートに入っている商品の、それぞれの投稿IDを取得します。これは3-2.で、「その商品(の投稿ID)がキャンペーン対象カテゴリに属しているかどうか」を判断するためです。

利用しているフックでは、カートの中身のデータである$cartsを引数の一つとして受け渡してくれていますので、それを活用します。

$carts自体には、投稿ID以外にも、SKUや価格情報が格納されています。試しにprint_rで出力してみると、色々な情報が入っていることが確認出来ます(ここでは割愛)。

投稿IDは [post_id] に入っているので、カートの中の全ての商品の投稿IDを取り出すために、foreachを使います。

foreach( $carts as $cart ){
	$post_ids[] = $cart['post_id'];
}

このようにすることで、$post_ids = array ( 25, 30, 45 );というように、カートの中身の商品の投稿IDだけを集めることが出来ます。

3-2. キャンペーン対象が「全商品」または「特定のカテゴリ」の場合の条件分岐

キャンペーン対象が「全商品」の場合も考え、【キャンペーン対象が「全商品」または「特定のカテゴリ」の場合、送料を無料にする】という条件を作ります。

※カートの中に一つでもキャンペーン対象カテゴリの商品が入っていれば、送料は無料になります。

ここでの条件分岐は、usceshop.class.php内のWelcart独自関数getItemDiscountのコードを参考にしています。以下のハイライトの部分が、【「全商品」または「商品が対象カテゴリーに属している」場合】を分岐させている条件です。

function getItemDiscount($post_id, $skukey = '') {
	$display_mode = $this->options['display_mode'];
	$array = array();
	$skus = $this->get_skus($post_id, 'code');
	foreach((array)$skus as $key => $sku){
		$price = (float)str_replace(',', '', $sku['price']);
		if ( $display_mode == 'Promotionsale' ) {
			if ( $this->options['campaign_privilege'] == 'discount' ){
				if( 0 === (int)$this->options['campaign_category'] || in_category((int)$this->options['campaign_category'], $post_id) ){
					$discount = $price * $this->options['privilege_discount'] / 100;
				}else{
					$discount = 0;
				}
			}else if ( $this->options['campaign_privilege'] == 'point' ){
				$discount = 0;
			}
		}

		$discount = ceil($discount);
		$array[$key] = $discount;
	}
	if(!$array) return false;
	if($skukey == ''){
		return $array;
	}else if(isset($array[$skukey])){
		return $array[$skukey];
	}else{
		return false;
	}
}

これを使いますが、$thisのままでは使えないため、ここは$uscesに置き換えます。$uscesを使う場合は、グローバル宣言(global $usces;)が必要になりますのでお忘れなく。

3-1.で取得したカート内の商品の投稿IDが、それぞれ対象カテゴリーに属するかどうかを一つずつ確認するため、ここでもforeachを使います。また、一つでも条件に合致するものがあればforeachのループを抜けるように、break;を入れておきます。

if( 'Promotionsale' == $options['display_mode'] ){
	foreach ( $post_ids as $post_id ){
		if( 0 === (int)$usces->options['campaign_category'] || in_category((int)$usces->options['campaign_category'], $post_id) ){
		$shipping_charge = 0;
		break;
		}
	}
}

3-3. コードまとめ

3-1.と3-2.をまとめると、以下のようになります。

//送料無料キャンペーン(対象カテゴリー指定あり)
add_filter( 'usces_filter_set_cart_fees_shipping_charge', 'my_free_set_cart_fees_shipping_charge', 10, 3);
function my_free_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
	$options=get_option('usces');
	global $usces;
	foreach( $carts as $cart ){
		$post_ids[] = $cart['post_id'];
	}
	if('Promotionsale'==$options['display_mode']){
		foreach ( $post_ids as $post_id ){
			if( 0 === (int)$usces->options['campaign_category'] || in_category((int)$usces->options['campaign_category'], $post_id) ){
			$shipping_charge = 0;
			break;
			}
		}
	}
    return $shipping_charge;
}

4.「特定の商品の購入で送料無料」にする場合

「キャンペーン期間中に○○を買えば、他のものも一緒に買っても送料無料!」としたい場合。

この場合のカスタマイズは、対象カテゴリーを判定させる3の場合よりかは、幾分楽になります。

4-1. 送料無料としたいSKUを決める

まずは、送料無料にしたい商品のSKUをピックアップします。対象商品が複数の場合、PHPの配列(array)を使いますが、対象商品が1つであれば、arrayを使う必要はありません。

対象商品(SKU)が複数の時
$sku_campaign = array('SKU1','SKU2');
対象商品(SKU)が一つの時
$sku_campaign = 'SKU1';

当然ながら、「SKU1」「SKU2」は、任意のSKUに書き換えてお使い下さい。

4-2. カートに入っている商品のSKUを取得

3-1.と同じように、フックが持っている$cartsという引数のデータを精査して、どんなSKUが含まれているかを取り出します。取り出すデータは違いますが、取り出し方は同じです。

foreach( $carts as $cart ){
	$skus[] = $cart['sku'];
}

4-3. カート内に対象SKUが含まれていれば、送料無料にする条件

キャンペーン対象SKUとカート内のSKUを比較して、一致するものがあれば送料無料とするための条件分岐を追加します。

対象商品(SKU)が複数の時

対象商品(SKU)が複数の時は、$sku_campaignも配列(array)、比べる対象の$skusも配列(array)なので、比較するためにarray_intersectを利用します。

$matches = array_intersect( $sku_campaign, $skus );
if( 'Promotionsale' == $options['display_mode'] && !empty( $matches ) ){
	$shipping_charge = 0;
}
対象商品(SKU)が一つの時

対象商品(SKU)が一つの時は、簡単です。in_arrayを使いましょう。

if( 'Promotionsale' == $options['display_mode'] && in_array( $sku_campaign, $skus ) ){
	$shipping_charge = 0;
}

4-4. コードまとめ

4-1.から4-3.をまとめると、以下のようになります。

対象商品(SKU)が複数の時
//送料無料キャンペーン(対象SKUが含まれる場合)
add_filter( 'usces_filter_set_cart_fees_shipping_charge', 'my_free_set_cart_fees_shipping_charge', 10, 3);
function my_free_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
	$options=get_option('usces');
	$sku_campaign = array('SKU1','SKU2');
	foreach( $carts as $cart ){
		$skus[] = $cart['sku'];
	}
	$matches = array_intersect( $sku_campaign, $skus );
	if( 'Promotionsale' == $options['display_mode'] && !empty( $matches ) ){
		$shipping_charge = 0;
	}
    return $shipping_charge;
}
対象商品(SKU)が一つの時
//送料無料キャンペーン(対象SKUが含まれる場合)
add_filter( 'usces_filter_set_cart_fees_shipping_charge', 'my_free_set_cart_fees_shipping_charge', 10, 3);
function my_free_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
	$options=get_option('usces');
	$sku_campaign = 'SKU1';
	foreach( $carts as $cart ){
		$skus[] = $cart['sku'];
	}
	if( 'Promotionsale' == $options['display_mode'] && in_array( $sku_campaign, $skus ) ){
		$shipping_charge = 0;
	}
    return $shipping_charge;
}

5. 送料無料の金額条件を下げたいだけの場合

送料無料キャンペーンは、売る側としては「1,000円程度の商品だけの買い物では赤字」となる、ややリスキーなものでもあります。

というわけで、「いつもは1万円以上のお買い物で送料無料だけど、今だけ5,000円以上のお買い物で送料無料!」としたい場合のアレンジです。

5-1. 「今だけ送料無料になるお買い物金額」を設定

まずは、送料無料にする金額を決めます。カンマは入れません。

$shipping_free_price = '5000';

5-2. 商品の合計金額を取得

次に、引数$entriesから、商品の合計金額を取得します。

$total_items_price = $entries['order']['total_items_price'];

ここで取得しているtotal_items_priceは、税込み設定なら税込み、税抜き設定なら税抜きのものとなります。

5-3. 送料無料になるお買い物金額と、商品の合計金額を比較して条件分岐

5-1.と5-2.の二つを比べて、「商品の合計金額が、送料無料条件を上回っている」ことを判断するには、以下のようにします。

$total_items_price >= $shipping_free_price

この条件を、2. 基本のカスタマイズコードのif条件の中に加えると、こうなります。

if( 'Promotionsale' == $options['display_mode'] && $total_items_price >= $shipping_free_price )

5-4. コードまとめ

5-1.から5-3.のコードをまとめると、こうです。

//送料無料キャンペーン(お買い物金額5,000円以上の場合)
add_filter( 'usces_filter_set_cart_fees_shipping_charge', 'my_free_set_cart_fees_shipping_charge', 10, 3);
function my_free_set_cart_fees_shipping_charge($shipping_charge, $carts, $entries){
	$options = get_option('usces');
	$shipping_free_price = '5000';
	$total_items_price = $entries['order']['total_items_price'];
	if( 'Promotionsale' == $options['display_mode'] && $total_items_price >= $shipping_free_price ){
		$shipping_charge = 0;
	}
    return $shipping_charge;
}

6. まとめ

$shipping_chargeの部分の演算を変えれば、「送料値引き」にもアレンジ可能です。PHPの四則演算についてご存じない場合は、PHPの参考書などをご覧下さい。

私もネットで買い物をしますが、やはり「送料無料」という言葉の響きは非常に魅力的です。効果的にキャンペーンを打てれば、「ちょっと迷っていた」お客様にも訴求できるようになりそうですね。

3 Responses to “送料無料キャンペーンをする場合のカスタマイズ”

  1. リエ より:

    初めまして、いつも見させていただいております、
    初心者な質問で申し訳有りませんが、
    上のコードをそのままコピーして、
    welcart管理画面の外観>テーマの編集よりfunction.php編集ページよりコードを追加して保存しても何度しても
    SyntaxErrorというのがでてしまいうまくいきません、何が悪いのでしょうか?
    お時間がありましたらで構いませんのでどうぞアドバイスをお願い致します。

    • リエ より:

      すいません、
      一定金額以上の買物で送料無料ではなく値引き
      のページに投稿するつもりが、ここに投稿してしまいました。
      ほんとうにごめんなさい!

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

        SyntaxErrorの内容をご覧になってみて下さい。どのファイルのどの行にエラーがあるのか明示してくれているはずです。また、functions.phpをWordPressの管理画面から編集される場合、エラーになると正常な画面に戻れなくなる場合がありますので、まずはローカル環境でお試しになってみて下さいませ。

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