Woocommerceで顧客の購入した商品の一覧を表示したいとう要望がありました。
最初は顧客の購入履歴を取得したらできるだろうから楽勝と思っていたのですが、そこから商品データを取り出す方法がなかなか見つからず時間がかかりました。
なので、忘れないように覚書きしときます。
顧客の購入商品を取得する流れ
- 顧客の購入履歴を取得
- 購入履歴から商品データを取得
- あとはそれを目的に合わせて処理
一発では取得できる関数はなさそうなのでこのようにに2段階になりま。もしよい関数をもし知っている方がいたらコメント頂きたいです。
商品データを取得するコード
とりあえず全てのコードを掲載します。
// 現在のユーザーの購入履歴を取得
$customer_orders = [];
foreach ( wc_get_is_paid_statuses() as $paid_status ) {
$customer_orders += wc_get_orders(
[
'type' => 'shop_order',
'limit' => -1,
'customer_id' => get_current_user_id(),
'status' => $paid_status,
]
);
}
// 購入履歴から購入した商品のIDを取得
$products = [];
foreach ( $customer_orders as $cs_order ) {
if ( is_a( $cs_order, 'WC_Order' ) ) {
foreach ( $cs_order->get_items() as $item_id => $item ) {
// product ID を取得
$products[] = $item->get_product_id();
}
}
}
// 商品IDが入った配列$productsができるので、後はそれを利用していろいろやる。
コードの説明
まず、最初のループでユーザーの購入履歴を取得します。購入履歴の取得はwc_get_orders()
関数を使います。foreach
でループにしているのは2種類のstatus
の履歴を取得したいからです。
今回の例では、支払が済んだものは全て取得したいのでwc_get_is_paid_statuses()
で支払済のstatus
の配列を取得し(この記事を公開時点ではprocessing
とcompleted
の2つ)、それぞれをパラメータstatus
にセットして履歴を取得・結合しています。
例えば、status
がcomplete
のみでよければループにする必要はありません。その場合は下記のようにもっと簡単に書くことができます。
$customer_orders = wc_get_orders(
[
'type' => 'shop_order',
'limit' => -1,
'customer_id' => get_current_user_id(),
'status' => 'complete',
]
);
ユーザーの購入履歴が取得できたら後はそこからループを回して商品データを取り出します。各購入履歴から商品データを取り出すにはget_items()
を使います。
上記の例では商品のIDを取り出していますが、他にも様々な情報を取り出すことができます。例えば下記のようなものがあります。
$item_name = $item->get_name(); // 商品名
$variation_id = $item->get_variation_id(); // 商品のバリエーションID
もっと詳しく知りたい場合は下記のStack Overflowの記事にいろいろなサンプルが掲載されています。これを見れば大抵の購入情報は取得できると思います。
php – How to get WooCommerce order details – Stack Overflow
ちなみにif ( is_a( $cs_order, 'WC_Order' ) ) {......}
文で何やらチェックしていますが、これはget_items()
を適用するオブジェクトがWC_order
オブジェクトかチェックするためのものです。
もしWC_Order
オブジェクト以外にget_items()
を適用すると致命的なエラー吐いて動かなくなります。最初、いろいろあってWC_Orderオブジェクトでないものを渡してエラーが出て困ったので一応付けておきましたが、多くのケースでは必要ないかもしれません。
コメント
この記事へのコメントはありません。