之前在研究 WooCommerce Store API 的時候有順便紀錄 WooCommerce REST API 的用法,再次感謝有寫下這篇文章的自己,剛好這禮拜就派上了用場。需求是客戶想在後台透過更簡便以及客製化的操作介面來手動新增訂單,本想用 Store API 處理,但爬了 REST API 發現到裡面也有建立訂單的方法。
於是我先用 ACF 開好建立訂單的設定頁面並將欄位建好後,透過 ACF 的 acf/save_post
勾點來完成當儲存設定頁時觸發建立訂單 API,然後使用官方提供的 Composer 套件來建立 API 請求物件,接下來照著官方範例就可以在更新設定頁後很順利的建立訂單。
但有兩個地方在官方的範例裡面沒有提到,第一個是訂單自訂欄位,由於客戶需要在這個訂單手動建立畫面也能輸入電子發票選項,因此我需要將發票資訊一併寫入,後來查到的寫法是使用 meta_data
這個 key 來寫入,裡面帶的是 key value 陣列。
另一個問題是透過 REST API 建立的訂單沒有顧客歸屬,也就是該訂單的結帳對象都是訪客,根據 API 的回傳資料發現裡面有一個 customer_id
參數,實測後發現在請求時必須要將該參數帶入 user id 才能正確將會員跟訂單做綁定。
程式碼實作如下:
use Automattic\WooCommerce\Client;
$woocommerce = new Client(
home_url(),
'API_KEY',
'API_SECRECT',
array(
'wp_api' => true,
'version' => 'wc/v3',
'query_string_auth' => true,
)
);
$data = array(
'payment_method' => 'manual_order',
'payment_method_title' => 'Manual Order',
'customer_id' => 1,
'set_paid' => true,
'billing' => array(
'first_name' => 'Oberon',
'address_1' => 'tw',
'email' => 'm615926@gmail.com',
'phone' => '0912345678',
),
'line_items' => array(
array(
'product_id' => 1,
'quantity' => 1
)
),
'meta_data' => array(
array(
'key' => '_invoice_data',
'value' => array(
'invoice-type' => 0,
'invoice-carrier' => '/A123456',
),
),
),
);
$resp = $woocommerce->post( 'orders', $data );