特定のSKUの購入履歴があるかどうか判別する方法
スポンサーリンク
Welcartの商品ページなどで、その商品(または特定の商品)を購入済みかどうかを判別する方法です。
会員の購入履歴を使う方法なので、会員システムが必要です。残念ながら、今回の方法は会員登録をしていない人の購入履歴まではわかりません。
購入履歴があるかどうかを判別出来ると、以下のようなことが実現出来ます。
- 「お一人様一回限り」等の購入制限がある商品で、購入履歴がある人には「カートに入れる」ボタンを見せない
- 商品ページにレビューシステムを設置している時、購入履歴がある人に「商品はいかがでしたか?レビューをお寄せ下さい!」等と表示する
もくじ
1. functions.phpにコードを記述
まずは、会員の購入履歴を取得します。Welcartでは以下のように購入履歴を取得出来ます。
global $usces; $usces_members = $usces->get_member(); $usces_member_history = $usces->get_member_history($usces_members['ID']);
※購入履歴関連のコードはtemplate_func.phpに書かれているので、その辺をチェックすると良いです。
print_r();
を使って、3行目で取得している$usces_member_history
をブラウザ上で見てみると、膨大な値が配列に入れられているのがわかります。
今回は「購入履歴の中に、特定のSKUが含まれているかどうか」で判定をしたいので、この配列の中の[cart]パラメータの、更にその中の[sku]のパラメータを拾って使うことを目標とします。
[cart]は配列に入れられているため、foreach
を使って一つずつ精査させます。
foreach ( $usces_member_history as $usces_member_histories ) { $cart = $usces_member_histories['cart']; }
先ほどprint_r
を使って見たとおり、[cart]そのものも、
cart[0]→商品ひとつめ、cart[1]→商品ふたつめ、・・・
という様に、商品情報を配列で持っているため、for
を使ってcartの中のskuを拾っていきます。
foreach ( $usces_member_history as $usces_member_histories ) { $cart = $usces_member_histories['cart']; for($i=0; $i<count($cart); $i++) { $cart_row = $cart[$i]; $skus[] = urldecode($cart_row['sku']); } }
8行目で$skus[]
という配列変数を用意して、取得したSKUを一つずつ$skus
に入れていきます。これはPHPではよくやる、変数に値を配列で入れていくのと同じ作業です。
$skus = array( 'SKU1', 'SKU2', 'SKU3');
←これを8行目でやってる
最後に、取得したSKUが、今回判定したい任意のSKUを含んでいるかどうかを判別する条件を加えます。ここでは、「ユーザーがログインしている場合」という条件も付け加えます(そうしないとうまく判定出来ない)。
if(usces_is_login() && in_array($itemsku, $skus)){ return 'true'; } else { return 'false'; }
11行目で登場させている$itemsku
が、判別に使いたいSKU(を代入するところ)です。$itemsku
に対応するSKUが、8行目で取得した購入履歴($skus
)にあればtrueを、なければfalseを返します。
今回はこれらのコードを全てまとめて一つの独自関数にして、テンプレート内で使えるようにしたいので、以下のようにまとめました。functions.phpに記述します。
//購入履歴チェック function my_sku_history_check($itemsku){ global $usces; $usces_members = $usces->get_member(); $usces_member_history = $usces->get_member_history($usces_members['ID']); foreach ( $usces_member_history as $usces_member_histories ) { $cart = $usces_member_histories['cart']; for($i=0; $i<count($cart); $i++) { $cart_row = $cart[$i]; $skus[] = urldecode($cart_row['sku']); } } if(usces_is_login() && in_array($itemsku, $skus)){ return 'true'; } else { return 'false'; } }
テンプレート内で使う時には、my_sku_history_check($itemsku);
の$itemsku
のところに、任意のSKUを入れればOKです。
詳しくは次の手順で解説します。
2. 条件分岐の方法
2-1. 商品詳細ページ
商品詳細ページで使う場合は、例えば以下のようにします。
<?php if(my_sku_history_check(usces_the_itemSku('return'))=='true'): ?> //ここに購入履歴がある(true)時に表示したい内容 <?php endif; ?>
もちろんtrueをfalseに変えれば、「表示の商品を購入したことがない人」に表示をさせることも可能です。
2-2. 特定のSKUで、任意のページや場所
特定の商品でこの条件を使いたい場合は、カッコの中に判別に使いたいSKUコードを入れればOKです。
例えばSKUコードが「sku001」の時は以下のようになります。
<?php if(my_sku_history_check('sku001')=='true'): ?> //ここにsku001の購入履歴がある(true)時に表示したい内容 <?php endif; ?>
3. まとめ
「レビューの記入は、購入した会員に限定したい」と思ったところから始まったカスタマイズです。もしかしたらもうちょっと綺麗なコードに出来るかもしれませんが、私のレベルではこのくらいです。
レビューの記入フォームの表示を、この判別を使って、購入していない人・ログインしていない人に見せないようにすれば、いたずら書き込みの心配も減ります。
もちろん、購入履歴のある人にはカートボタンを「リピートする」に変えたり、「○○様はこの商品を△月×日に注文しました。」とAmazonのような表示をすることもも出来ます(日にちはまた別に取得する必要があるけれど)。
今回の場合は1回でも購入履歴があればtrueを返しますが、購入回数を数えて判別条件に加えたい場合は、substr_count
あたりで同じSKUの回数をカウントするようにすれば、なんとなく出来そうです。
通りがかりの者です。
以前に実装で諦めたことがありますので質問させてください。
上記手法で購入履歴の各商品(sku)のステータスとして現在の在庫状況を表示することは可能でしょうか。
ユーザーの購入履歴からリピート注文する際に親切な情報になると思い、
いろいろ試しましたが力量不足で実現できませんでした。
誠に勝手ではありますが、お力添えいただければ幸いです。
この記事の方法は「商品ページ」で「閲覧者にその商品の購入歴があるか」を判定しているものですので、「メンバーページ」で「表示されている商品に在庫があるか」を表示するのは、また別の問題になると思います。
メンバーページの購入履歴の商品のテーブルには、
usces_filter_history_cart_row
などフィルターが用意されている(functions/template_func.php内)ので、フックで列か行を増やすなどして、在庫を表示させるテンプレートタグ(usces_the_itemZaiko
等)を挿入するようにしてみては如何でしょうか。リピーター用ならカートボタンを入れてもいいかもしれないですね。おかげさまで仕組みなどが、わかるようになりました。
ありがとうございます。
ご回答誠にありがとうございます。
場違いな質問をしてしまい恐縮です。
さて、実は購入履歴に関するカスタマイズも以前に断念したこおとがありまして、可能かどうかだけをお伺いしたく、ご意見をお願いいたします。
日付の範囲や特定の商品の購入履歴もユーザーサイドで閲覧できるようになりますでしょうか。
できるようになれば購入頻度などもお客様に有益な情報となるのですが。
お手数をおかけしますが、よろしくお願いいたします。
「日付」は、当記事の1で説明している注文情報の配列の中に、「order_date」という注文日のデータも格納されていますので、それを取り出せば表示が出来ると思います。
「特定の商品の購入履歴」は、当記事の2-2のコードで出来るのではないでしょうか。