WooCommerceのデータをRESTで取得するメモ

## 概要

- WooCommerce の REST API を使うための手順
    - WooCommerce で REST API をオンにする
    - Postman (アプリ) でテストする
- XServer でハマったこと
    - 「authorization header が使えない」原因と解決方法（クエリに含める）
    - 「顧客情報が取得できない」原因と解決方法（ユーザーグループが「お客様」になっていないと見つからない）
- 情報源
    - WooCommerce のドキュメント
    - GithubのIssueなどのやりとり


## 前提

私の本業は開発ではなく、業務効率化のためにちょっと触る程度です。社内での作業効率をアップするためにプログラミングをすることが殆どです。

従って、大した情報ではありませんが、「ハマった」ことがあったので、ここにシェアすることにしました。

どなたかの役に立てば幸いです。


## 動機

チーム内で「顧客がある商品を購入しているか？」を、ささっと調べたいという要望がありました。WooCommerceの管理画面は、非常にごちゃごちゃしています。

また、この画面へのアクセス権を不特定多数に与えると、間違ってデータを削除したり、追加したり混乱が起こることが予想されます。大前提として「信頼して、任せよう」の方針ですが、スキル不足による問題はさけたいところ。

そこで「WooCommerceの顧客情報をさっと調べられる」フォームを作ることにしました。

同じように「小さなプログラム」によって、業務効率が大幅にアップしたりするので、参考になればと思っています。

## WooCommerce の REST API

### 使えるようにする

WooCommerceは、REST API を独自に持っています。詳しくは、以下のページでしっかりと説明されています。

- [WooCommerce REST API Document](https://docs.woocommerce.com/document/woocommerce-rest-api/)

上記のページのスクリーンショットなどを参考に、REST API を有効にします。そして、REST APIにアクセスするための「キーセット」を作成します（今回はRead onlyで作成しました）。

> 【雑記】WordPressのREST APIも、これぐらい手軽に「アクセスコントロール」ができたら便利だなと思いました。WordPressのRESTを使う場合は、Application Passwordといプラグインを使います。ユーザーと紐づくので「閲覧だけができるユーザー」を作って、キーを発行することになりますが、ちょっと手間です。

### テスト & 開発のための情報

すごく丁寧でびっくりです。以下のページで、Step by Step で、方法を説明してくれています。

- [WooCommerce REST API Test方法](https://github.com/woocommerce/woocommerce/wiki/Getting-started-with-the-REST-API)

上記のサイトでは、Postman と Insomnia という REST API をテスト、URLの保存を行える便利なツールが紹介されています。Postman で良いかと思います（これを使いました）。

なお、以下のQiitaの記事にて、詳しく解説があります。

- [API開発・テスト便利ツール Postmanの使い方メモ](https://qiita.com/zaburo/items/16ac4189d0d1c35e26d1)


### REST API の調べ方

WooCommerce 3.5 以前（最近(2018/10月)リリースされた）は、v2を使う必要がある。
http://woocommerce.github.io/woocommerce-rest-api-docs/wp-api-v2.html

v3 のドキュメントは以下
http://woocommerce.github.io/woocommerce-rest-api-docs/

> v3のドキュメントを見てアクセスするも、Not Foundに。単純に、WooCommerceのバージョンが古くて、v2しか動かなかっただけでした。ご注意ください。


### authorization headerが使えない

XServerというレンタルサーバーで、Webサイトをホストしています。ここでは（だけではないかもしれない）、Authorization Header がデフォルトでは使えません。以下のように修正すれば使えるようです（別の方法を行いました）。

- 詳細はこちら [Application Passwords wiki](https://github.com/georgestephanis/application-passwords/wiki/Basic-Authorization-Header----Missing)

```
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress
```

### 解決方法（クエリーに含める）

Postman の画面のように「クエリ」に、 `consumer_key` と `consumer_secret` を含めることでアクセスできます（注意：裏で通信するようにして、通信が見えないようにしておくべきだと思います）。

<img width="964" alt="auth.png" src="https://qiita-image-store.s3.amazonaws.com/0/193970/d36071e5-50cc-9e00-0816-f620a02fe66e.png">


## 顧客情報の検索フォーム

### フォームについて

今回は、「ある顧客が、任意の商品を購入しているか？」をチェックするシンプルなフォームを作りました（再利用性とかは、全然考えていないので、お見せできませんが・・・）。

<img width="1011" alt="スクリーンショット 2018-10-31 10.47.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/193970/33574466-7091-78e5-0a5a-99fb127c1707.png">


フォーム表示時に、行なっていることは、以下の通りです。

- フォームを生成するために、商品一覧を取得する
    - 特定のカテゴリだけを取得する
    - 不要な商品を削除（IDで配列からunset）
    - idと名前を使って、selectフィールドを生成
- フォームにて、商品名と顧客のメールアドレスを入力、送信させる

フォームで送信すると

- 顧客IDを取得するためにREST APIにリクエスト
    - メールアドレスで検索
    - 顧客IDを取得する
- 取得した顧客IDと、商品IDでオーダーを取得
- オーダーの情報を表示

### 顧客が見つからない

いくつかテストをしていると「見つからない顧客」が存在することに気づきました。データベースが悪いのか、WooCommerceとの統合で問題が起こっているのか、、、複雑に考えすぎて、時間を無駄にしました。

WooCommerceのREST APIの顧客の検索対象は、「お客様」グループに登録されている人だけです。WooCommerceをインストールする以前に「購読者」として登録されているユーザーや、「編集権限」を割り当てたユーザーが「お客様」になっていませんでした。

### 解決策

つまり、WooCommerce REST API の検索対象にするために「お客様」グループに入れる必要があります。

購読者はシンプルに「購読者をお客様」に変更しました。

一方で、寄稿者に変更した人などは、お客様にすると「寄稿できなくなります」。そこで、複数のグループに属してもらうことが必要です。

WordPressのデフォルトの管理画面上では、複数のグループを割り当てることはできません。そこで、User Role Editor プラグインを導入しました。

- [User Role Editor](https://ja.wordpress.org/plugins/user-role-editor/)

ユーザー一覧画面のクイック編集のところに「権限」という項目が増えるので、そこをクリックして、複数のグループに属するように設定します。

---

## あとがき

WooCommerce の REST API は、色々と便利そうです。サポートのために活用できそう。