Welcartにクーポン機能を実装する方法

スポンサーリンク

Welcartでクーポン割引を行う方法です。Welcartを使い始めた頃、クーポンはどうしても欲しかった機能の一つでしたが、なかなか当時はうまく行きませんでした。

Credit by ooingle.com

Credit by ooingle.com

クーポンが活用出来れば、こんな販促活動が可能です!

  • メルマガ読者限定の特別割引
  • Facebookで「いいね!」でクーポン発行
  • アンケートに答えたらクーポン提供

クーポンコードが無効だった場合の表示など、ややカスタマイズ項目が多くなりますが、基本的にはfunctions.phpにフィルターフックを記述するだけです。

もくじ

  1. 「カートページ」設定で、クーポンコードの入力欄を作成
  2. クーポンコードが入力されたら、割引を行うフック
  3. 割引名を「クーポン割引」にするフック
  4. クーポンコードが無効だった場合の対策
  5. クーポンコード入力部分に説明書きを入れたい場合
  6. コードのまとめ
  7. 注意点&まとめ

1. 「カートページ」設定で、クーポンコードの入力欄を作成

カートページの「発送・支払方法」の画面で、予めクーポンコードの入力欄を作成します。

まず、Welcartの[カートページ設定]>[カスタム・オーダーフィールド]のタブで、以下のように設定します。

Welcartのカートページのカスタム・オーダーフィールド

フィールドキー セレクト値
フィールド名
 coupon(任意)  空欄のまま
 クーポン(任意)
 テキスト・必須なし

これで、カートページの「発送・支払方法」画面で、このように表示されるようになります。

カスタム・オーダーフィールドで、クーポン入力欄を増やす

2.  クーポンコードが入力されたら、割引を行うフック

次に、この入力欄に適切なクーポンコードが入力された場合に、割引を行うようにします。

割引は、Welcartのデフォルトの「キャンペーン割引」を書き換える方法で行います(従って、ユーザーは割引を併用出来ませんのでご注意下さい)。

2-1. 利用するフック

  • フックの記述・・・usces_order_discount
  • フックの場所・・・usc-e-shop/classes/usceshop.class.php

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

以下のコードをfunctions.phpに記載します。

今回の例では、クーポンコードを「coupon1234」、割引額を100円としました。クーポンコードと割引額は、6・7行目のコードや数字を任意で変更して下さい。

//クーポンコード「coupon1234」が入力されたら、100円割引
add_filter('usces_order_discount', 'coupon_order_discount', 10, 2);
function coupon_order_discount($discount, $cart){
    global $usces;
    $entry = $usces->cart->get_entry();
    if($entry['custom_order']['coupon'] == 'coupon1234'){
        $discount = -100;
    }
    return $discount;
}

ここまでだけで、一応は割引が適用されます。ただ、割引の文言はまだ「キャンペーン割引」のままです。

Welcartでクーポン割引

3以降の手順で、「キャンペーン割引」の文言を「クーポン割引」に変更します。

2-3. (アレンジ1)「○○%OFF」のような割引にしたい場合

商品の合計金額から「10%OFF」の場合は、以下のようにします。

商品の合計金額を取得して$total_items_priceという変数に代入し、それに0.1(10%)をかけ、更にそれをマイナスにしています。

//クーポンコード「coupon1234」が入力されたら、10%割引
add_filter('usces_order_discount', 'coupon_order_discount', 10, 2);
function coupon_order_discount($discount, $cart){
    global $usces;
    $entry = $usces->cart->get_entry();
    $total_items_price = $usces->get_total_price();
    if($entry['custom_order']['coupon'] == 'coupon1234'){
        $discount = ceil($total_items_price * 0.1 * -1);
    }
    return $discount;
}

2-4. (アレンジ2)一定金額以上でクーポンを有効にしたい場合

「商品合計が○○円以上の場合にクーポンが利用可能」というように、一定のお買い上げ金額以上でクーポンを有効にしたいことも結構あると思います。

以下の例は、「1,000円以上のお買い上げで100円引き」という場合です。

6行目で商品の合計金額を取得して$total_items_priceという変数に代入し、7行目でそれが1000以上、という条件を追加しています。

//クーポンコード「coupon1234」が入力されたら、100円割引(1000円以上お買い上げ)
add_filter('usces_order_discount', 'coupon_order_discount', 10, 2);
function coupon_order_discount($discount, $cart){
    global $usces;
    $entry = $usces->cart->get_entry();
    $total_items_price = $usces->get_total_price();
    if($entry['custom_order']['coupon'] == 'coupon1234' && $total_items_price >= 1000){
        $discount = -100;
    }
    return $discount;
}

「商品合計」が内税か外税かは、Welcartの基本設定でどのようにしているかによって変わります。必ず確認しておきましょう。

2-5. (アレンジ3)送料無料のクーポンにしたい場合

送料関連は、送料を出力するためのコードを書き換えるため、割引の場合とは異なるフックを使います。

  • フックの記述・・・usces_filter_getShippingCharge
  • フックの場所・・・usc-e-shop/classes/usceshop.class.php

以下のコードをfunctions.phpに記入します。

//クーポンコード「coupon1234」が入力されたら、送料無料
add_filter('usces_filter_getShippingCharge', 'coupon_getShippingCharge', 10, 3);
function coupon_getShippingCharge($charge, $cart, $entry){
    if($entry['custom_order']['coupon'] == 'coupon1234'){
        $charge = 0;
    }
    return $charge;
}

5行目の$charge = 0;の数字部分が、正しいクーポンコードが入力された時の送料(この場合はゼロ=無料)です。

例えば100円割引にしたい場合は、$charge -= 100;とします。

3. 割引名を「クーポン割引」にするフック

次に、「キャンペーン割引」というテキストで出力される割引名を、クーポン利用時には「クーポン割引」に書き換えるカスタマイズを行います。

「キャンペーン割引」の表示のままでいい、という場合は、このカスタマイズは飛ばして下さい。

3-1. 利用するフック

画面上の表示・メール用
  • フックの記述:usces_confirm_discount_label
  • フックの場所:usc-e-shop/theme/welcart_default/wc_templates/cart/wc_confirm_page.phpほか
PDF用
  • フックの記述:usces_filter_disnount_label
  • フックの場所:usc-e-shop/includes/order_print.php

「キャンペーン割引」の出力をコントロールする【画面上の表示・メール用】のusces_confirm_discount_labelというフックは、「内容確認」ページ以外にも、顧客に送られるメール本文内にも設置されています。

従って、今回のフィルターフック設置により、内容確認ページとメール内の「キャンペーン割引」を、同時に「クーポン割引」に変更させます。

また、納品書などのPDF用のフィルターにも同時にフックしてしまいます。

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

以下のコードをfunctions.phpに追加します。

(9/25更新)以前のコードでは最新Welcart1.4.8でエラーが出たため、一部改善致しました。

//「キャンペーン割引」を「クーポン割引」に書き換え
add_filter('usces_confirm_discount_label', 'coupon_confirm_discount_label', 10, 1);
add_filter('usces_filter_disnount_label', 'coupon_confirm_discount_label', 10, 1);
function coupon_confirm_discount_label(){
    global $usces;
    $entry = $usces->cart->get_entry();
  if($entry['custom_order']['coupon'] == 'coupon1234' || $usces->get_order_meta_value('csod_coupon', $_REQUEST['order_id']) == true){
        $text = "クーポン割引";
    } else {
        $text = __('Campaign disnount', 'usces');
    }
    return $text;
}

17行目のifの条件分岐では、以下の2つの条件のどちらかに合致する場合に「クーポン割引」に変更するように判断しています。

  • 前半(「内容確認」ページ用):「coupon1234」というクーポンコードが入力された場合
  • 後半(メール用):当該注文に「coupon」というカスタム・オーダーフィールドに入力があった場合

これで、クーポン適用時には、以下の画像のように「クーポン割引」というように表示が変わります。

Welcartの「キャンペーン割引」を「クーポン割引」に

メール本文でも「クーポン割引」に

4. クーポンコードが無効だった場合の対策

無効なクーポンコードを入力した場合、このままでは確認画面で何も出ません。ユーザーとしては「あれ?」という感じになってしまいますので、エラー表示も出したほうが親切です。

(9/27更新)最新Welcart1.4.8では以前のフックではうまくいかなくなったため、フック及び関数を変更しました。

ここでは、次に確認画面のヘッダー部分にテキストを出力させるフックを使って、エラー表示を行います。

4-1. 利用するフック

  • フックの記述・・・usces_filter_confirm_page_header
  • フックの場所・・・usc-e-shop/includes/default_filter.php

4-2. functions.phpにアクションフックを記述

以下のコードをfunctions.phpに追加します。

//クーポンコードがエラーの時の表示
add_action('usces_action_confirm_page_header', 'coupon_confirm_page_header', 10, 1);
function coupon_confirm_page_header(){
    global $usces;
    $entry = $usces->cart->get_entry();
    if($entry['custom_order']['coupon'] == true && $entry['custom_order']['coupon'] != "coupon1234"){
        echo '<p class="coupon-error">入力されたクーポンコードは無効です。クーポンコードの再入力は前の画面に一旦戻って行って下さい。</p>';
    }
}

29行目のifの条件分岐で、「クーポンの入力があり、且つクーポンコードが「coupon1234」ではない場合」を判断しています。

クーポン入力欄に適当なコードを入れると・・・

Welcartのカートページで、無効クーポンコードを入れた場合

エラー表示が出ます。

Welcartのカートページで、無効なクーポンコードを入れた場合のエラー

coupon-errorというクラス属性をつけてあるので、スタイルシートで自由に装飾して下さい。

4-3. (アレンジ)一定金額以上でクーポンが有効な場合のエラー表示

商品合計が1,000円未満の場合に「入力されたクーポンは商品合計1,000円以上のお買い上げで有効です。合計金額が不足しています。」というエラー表示を出す場合のコードです。

2でのアレンジと同様、$total_items_priceという、商品合計金額を表す変数を用意し、それが1000未満の場合には新たなエラー表示を出力するように、更に細かく条件分岐を行います。

//クーポンがエラーの時の表示
add_action('usces_action_confirm_page_header', 'my_filter_confirm_page_header', 10, 1);
function my_filter_confirm_page_header(){
    global $usces;
    $entry = $usces->cart->get_entry();
    $total_items_price = $usces->get_total_price();
    if($entry['custom_order']['coupon'] == true){
        if($entry['custom_order']['coupon'] != "coupon1234"){
            echo '<p class="coupon-error">入力されたクーポンコードは無効です。クーポンコードの再入力は前の画面に一旦戻って行って下さい。</p>';
        } elseif ( $total_items_price < 1000 ){
            echo '<p class="coupon-error">入力されたクーポンは商品合計1,000円以上のお買い上げで有効です。合計金額が不足しています。</p>';
        }
    }
}

5. クーポンコード入力部分に説明書きを入れる

クーポンコードの入力部分で、「クーポンコードがある方はこちらにご記入下さい」というような説明を入れたい場合、これまたフックで記載が可能です。

Welcartのカスタム・オーダーフィールドに説明を追加

5-1. 利用するフック

  • フックの記述・・・usces_filter_custom_field_input_value
  • フックの場所・・・usc-e-shop/functions/template_func.php

5-2. functions.phpにフィルターフックを記述

以下のコードをfunctions.phpに追加します。

//クーポン入力フィールドの横にテキスト
add_filter('usces_filter_custom_field_input_value', 'coupon_custom_field_input', 10, 3);
function coupon_custom_field_input($html, $key, $entry){
    if($key == 'coupon'){
        $html .= '&nbsp;クーポンコードがある方はこちらにご入力下さい。';
    }
    return $html;
}

1の手順で設定した、カスタム・オーダーフィールドのフィールドキーが「coupon」でない場合は、37行目の$key == 'coupon'の「coupon」を変更して下さい。

6. コードのまとめ

1~5の全て(「一定金額以上で有効」等のアレンジは省く)をまとめると、以下のようになります。

//クーポンコード「coupon1234」が入力されたら、100円割引
add_filter('usces_order_discount', 'coupon_order_discount', 10, 2);
function coupon_order_discount($discount, $cart){
    global $usces;
    $entry = $usces->cart->get_entry();
    if($entry['custom_order']['coupon'] == 'coupon1234'){
        $discount = -100;
    }
    return $discount;
}
//「キャンペーン割引」を「クーポン割引」に書き換え
add_filter('usces_confirm_discount_label', 'coupon_confirm_discount_label', 10, 1);
add_filter('usces_filter_disnount_label', 'coupon_confirm_discount_label', 10, 1);
function coupon_confirm_discount_label($order_id){
    global $usces;
    $entry = $usces->cart->get_entry();
    if($entry['custom_order']['coupon'] == 'coupon1234' ||  $usces->get_order_meta_value('csod_coupon', $_REQUEST['order_id']) == true ){
        $text = "クーポン割引";
    } else {
        $text = __('Campaign disnount', 'usces');
    }
    return $text;
}
//クーポンコードがエラーの時の表示
add_action('usces_action_confirm_page_header', 'coupon_confirm_page_header', 10, 1);
function coupon_confirm_page_header(){
    global $usces;
    $entry = $usces->cart->get_entry();
    if($entry['custom_order']['coupon'] == true && $entry['custom_order']['coupon'] != "coupon1234"){
        echo '<p class="coupon-error">入力されたクーポンコードは無効です。クーポンコードの再入力は前の画面に一旦戻って行って下さい。</p>';
    }
}
//クーポン入力フィールドの横にテキスト
add_filter('usces_filter_custom_field_input_value', 'coupon_custom_field_input', 10, 3);
function coupon_custom_field_input($html, $key, $entry){
    if($key == 'coupon'){
        $html .= '<span class="coupon-text">&nbsp;クーポンコードがある方はこちらにご入力下さい。</span>';
    }
    return $html;
}

少し長くなりましたが、これでちょっとしたクーポン機能の完成です。

7. 注意点&まとめ

このカスタマイズの注意点

「キャンペーン割引」を書き換えるフックを使っているため、顧客はキャンペーン割引との併用は出来ない(=どちらか一方の割引適用)カスタマイズとなりますので、ご注意下さい。キャンペーンそのものの開催とクーポン機能は共存可能です。

カスタマイズ部分が多岐に渡る為、テストは十分に行って下さい。

クーポンを期間限定にする場合

今回、期間限定にする方法は更に複雑になりそうだったので省きましたが、やってみたい方はキャンペーンの期間設定を利用して、「キャンペーン中を判別する条件分岐」を使ってやってみてもいいと思います(または、PHPで日時を指定して条件つけるとか)。

この場合、エラー表示でも「このクーポンは期限切れです」といった表示を出すなどの配慮も必要になるでしょう。

まとめ

とは言え、「一定金額以上で有効」や「期間限定」などの条件をつけると、コード的にもどんどん長くなり管理が大変になるので、有料プラグインでもいいのでバックエンドで楽に出来るようになればいいなと個人的には思うのが正直なところ。

少しPHPがわかる方なら、クーポンコードや割引額を最初に変数に置き換えて、その変数をコードに代入する方法を使うなどすれば、少しは管理がしやすくなるかと思います。

15 Responses to “Welcartにクーポン機能を実装する方法”

  1. waka より:

    この記事でクーポンコードを使えるようになってとても助かっています。
    ありがとうございます。
    先ほど、Welcartのアップデートをしたら、クーポンコードのエラー時のメッセージが出ないようになりました。
    処理をするしないはきちんとやってくれているのでエラーメッセージのところだけ表示されなくなったようです。
    お知らせさせてもらいます。(多分そうだと思うんですが違ってたらすみません)

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

      あらまあ、本当ですね!ちょっと検証して、また何かわかりましたらブログ記事を修正したいと思います。有難うございます。

  2. MasaNyan より:

    有益な記事をありがとうございます!

    動作について1点質問があります。
    クーポン欄にコードを入れて[エンター」すると、一つ前の画面に戻ってしまいます(IE、Chromeでテストしました)。

    ここでエンターしても次の画面に進むにはどうすれば良いかをご教示いただければありがたいです。

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

      enterボタンでsubmitが作動してしまうのはブラウザの仕様のようです。Welcartの配送・支払いページは、「戻る」「次へ」のボタンが両方ともtype="submit"となっているため、そのうちテキスト入力フォーム(この場合はクーポンコードを入れる欄)から最も近い「戻る」のsubmitが作動してしまうのだと思われます。
      作動させない方法としてはこちらとかこちらの記事が参考になるでしょうか。

  3. MasaNyan より:

    お返事いただき、また、参考になるサイトを教えてくださりありがとうございました。とても助かります。
    ありがとうございました!

  4. こぶや より:

    いつも有益な情報ありがとうございます。
    Welcart1.4.12で教えていただいたコードを入力してもエラーメッセージが出ないのですが、これは私の方の環境の問題でしょうか?
    IE・chrome・firefoxで確認しました。
    以前もバージョンで作動していないことがあったようなので確認をお願いいたします。

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

      Welcartデフォルトテーマでも同じ症状ですか?確認した所、私のほうでは普通に動きました(WordPress4.1.1 + Welcart1.4.2)。確認ページをカスタマイズされている場合、do_action('usces_action_confirm_page_header');が書かれていないと、フックする場所がなくエラーも表示されません。もしWelcartデフォルトテーマでもフックが動かないとなれば、にわかに原因は思いつかないですが・・・。

      • こぶや より:

        お忙しいところお時間を割いていただきありがとうございます。
        原因は私の環境にあるとわかりましたので書いていただいた内容も含めて調べてみますね!
        ありがとうございました(^▽^)

  5. セバスチャン より:

    いつも参考にさせていただいています。
    クーポンを3種類用意したい場合はどのように記述すればいいでしょうか?
    お時間がある時にアドバイスをいただけると助かります!

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

      if($entry['custom_order']['coupon'] == 'coupon1234')のところを、

      $coupons = array( 'coupon1234', 'coupon5678', 'coupon9012');
      if(in_array($entry['custom_order']['coupon'], $coupons))

      にすれば出来そうです。
      その後のクーポンコードがcoupon1234かどうかを判定する所も、全てin_arrayを使って判定するようにします。
      ※検証していないので違っていたらごめんなさい。

  6. mysapo より:

    いつも参考にさせていただいています。
    上記クーポン機能を実装してみたところtopページURLを開く段階でエラーとなってしまいます。
    バージョンが1.xから2.xになったことで仕様が変わったからでしょうか?
    お手すきの際にご教授いただきたく、よろしくお願い致します。

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

      バージョンとは、何のバージョンについて仰っているのかわかりかねますが、当記事は執筆から大分経っております故、現在のWordPress/Welcartに合わない可能性もございます。このところ、ブログを更新する余裕も過去記事のコードを検証する余裕もなく、色々と放置してしまっており、申し訳ございません。
      この記事を書いた頃はなかったのですが、現在Welcart公式からクーポン発行のプラグインが\4,000で発売されています。例えばそちらをご利用になってみては如何でしょうか。Welcartのバージョンに合わせてアップグレードのサポートもされますし、何かと安心かと存じます。

  7. mysapo より:

    ご回答かありがとうございます。
    Welcart公式からクーポン発行のプラグインが発売されているとの情報、当方も確認しておらず知りませんでした。早速購入し、HPに設定したところうまく動きました。ご教授いただきありがとうございました。
    (※ちなみに前回問い合わせ文の「バージョン」とはWelcart対応テーマ「Blanc」のバージョンの事です)

  8. […] こちらのプラグイン制作にあたって Welcartにクーポン機能を実装する方法 を参考にさせていただきました。 […]

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