匯出所有訂單的方法
啟用 REST API:
/wp-admin/admin.php?page=wc-settings&tab=advanced§ion=keys
取得金鑰及密鑰後,保存下來 (收好,如果忘了就要重取)
Python語法:
import requests import json import time # State 轉換對應字典 state_mapping = { "TAIPEI CITY": "臺北市", "NEW TAIPEI CITY": "新北市", "TAOYUAN CITY": "桃園市", "TAICHUNG CITY": "臺中市", "TAINAN CITY": "臺南市", "KAOHSIUNG CITY": "高雄市", "KEELUNG CITY": "基隆市", "HSINCHU CITY": "新竹市", "CHIAYI CITY": "嘉義市", "HSINCHU COUNTY": "新竹縣", "MIAOLI COUNTY": "苗栗縣", "CHANGHUA COUNTY": "彰化縣", "NANTOU COUNTY": "南投縣", "YUNLIN COUNTY": "雲林縣", "CHIAYI COUNTY": "嘉義縣", "PINGTUNG COUNTY": "屏東縣", "YILAN COUNTY": "宜蘭縣", "HUALIEN COUNTY": "花蓮縣", "TAITUNG COUNTY": "臺東縣", "PENGHU COUNTY": "澎湖縣", "KINMEN COUNTY": "金門縣", "LIENCHIANG COUNTY": "連江縣" } # WooCommerce 商店網址 & API(使用 Basic Auth 方式) store_url = "https://yoursite.com" consumer_key = "ck_金鑰" consumer_secret = "cs_密鑰" # API Endpoint,設定每頁抓取 50 筆,並以最新訂單排序 base_url = f"{store_url}/wp-json/wc/v3/orders?consumer_key={consumer_key}&consumer_secret={consumer_secret}&per_page=50&order=desc" order_data = [] print("📦 正在抓取最後 50 筆訂單...") try: response = requests.get(base_url, timeout=15) except requests.exceptions.RequestException as e: print(f"❌ API 連線失敗: {e}") response = None if response and response.status_code == 200: orders = response.json() for order in orders: # 處理商品資料,若 SKU 為空則填入預設值,並改變商品名稱為 "折扣" products = [] for item in order.get("line_items", []): sku = item.get("sku") if not sku: sku = "P07-005-09" product_name = "折扣" else: # 只保留 SKU 的前 10 碼 sku = sku[:10] product_name = item.get("name", "未知商品") # 取得商品金額,若為數值型態則直接保留(即使為負值) price = item.get("price", "未知價格") if isinstance(price, (int, float)): product_price = price else: product_price = "未知價格" product = { "商品名稱": product_name, "SKU": sku, "數量": item.get("quantity", 0), "單價": product_price } products.append(product) # 取得付款方式 payment_method = order.get("payment_method_title", "未知付款方式") # 轉換訂購人 (billing) 地址 billing = order.get("billing", {}) billing_postcode = billing.get("postcode", "").strip() billing_raw_state = billing.get("state", "").strip() billing_mapped_state = state_mapping.get(billing_raw_state.upper(), billing_raw_state) billing_city = billing.get("city", "").strip() billing_address1 = billing.get("address_1", "").strip() billing_address = " ".join([billing_postcode, billing_mapped_state, billing_city, billing_address1]) # 轉換收件人 (shipping) 地址 shipping = order.get("shipping", {}) recipient_postcode = shipping.get("postcode", "").strip() shipping_raw_state = shipping.get("state", "").strip() shipping_mapped_state = state_mapping.get(shipping_raw_state.upper(), shipping_raw_state) shipping_city = shipping.get("city", "").strip() shipping_address1 = shipping.get("address_1", "").strip() shipping_address2 = shipping.get("address_2", "").strip() address_parts = [recipient_postcode, shipping_mapped_state, shipping_city, shipping_address1] if shipping_address2: address_parts.append(shipping_address2) recipient_address = " ".join(part for part in address_parts if part) # 收件人姓名及電話(從 shipping 資料取出) recipient_name = shipping.get("last_name", "").strip() + shipping.get("first_name", "").strip() recipient_phone = shipping.get("phone", "").strip() # 組合消費者訂單資訊 customer_info = { "訂單編號": order.get("id", "未知訂單編號"), "下單時間": order.get("date_created", "未知時間"), # 訂購人資訊:姓名、電話、Email 與地址(state 已轉換成中文) "姓名": billing.get("last_name", "").strip() + billing.get("first_name", "").strip(), "聯絡電話": billing.get("phone", "無電話"), "Email": billing.get("email", "無 Email"), "地址": billing_address, "消費金額": order.get("total", "未知金額"), "付款方式": payment_method, "訂單備註": order.get("customer_note", "無備註"), "處理訂單備註": order.get("meta_data", []), "商品": products, # 收件人資訊轉換後 "收件人姓名": recipient_name, "收件人電話": recipient_phone, "收件人地址": recipient_address } order_data.append(customer_info) # 將訂單資訊存入 JSON 檔案 with open("export_order.json", "w", encoding="utf-8") as file: json.dump(order_data, file, ensure_ascii=False, indent=4) print(f"✅ 訂單資訊已成功匯出至 export_order.json,共 {len(order_data)} 筆") else: print(f"❌ 無法獲取訂單,HTTP 狀態碼: {response.status_code if response else '無回應'}")
上面的語法只會匯出50筆,如要匯出全部則修改
# 修改部分:改用分頁迴圈匯出所有訂單 order_data = [] page = 1 while True: page_url = f"{store_url}/wp-json/wc/v3/orders?consumer_key={consumer_key}&consumer_secret={consumer_secret}&per_page=50&order=desc&page={page}" try: response = requests.get(page_url, timeout=15) except requests.exceptions.RequestException as e: print(f"❌ API 連線失敗: {e}") break if response.status_code != 200: print(f"❌ 無法獲取訂單,HTTP 狀態碼: {response.status_code}") break orders = response.json() if not orders: break # 無更多訂單時離開迴圈 for order in orders: # 原有訂單處理邏輯(不變) order_data.append(customer_info) page += 1
匯出的json內容
[ { "訂單編號": 79494, "下單時間": "2025-02-24T14:12:50", "姓名": "王小明", "聯絡電話": "0911111111", "Email": "wayne@lianhung.com.tw", "地址": "708 臺南市 安平區 測試路11號", "消費金額": "4260", "付款方式": "貨到付款(刷卡)", "訂單備註": "", "處理訂單備註": [ { "id": 1406965, "key": "is_vat_exempt", "value": "no" }, { "id": 1406966, "key": "additional_temp", "value": "冷凍" }, { "id": 1406967, "key": "cpreftrack_woocommerce_referrer", "value": "https://www.google.com/" }, { "id": 1406968, "key": "_wc_cancel_key", "value": "12121212" }, { "id": 1406969, "key": "additional_deliver_date", "value": "不指定" }, { "id": 1406970, "key": "billing_phone", "value": "0911111111" }, { "id": 1406971, "key": "additional_shipping_receive_time", "value": "不指定" }, { "id": 1406972, "key": "additional_gift2", "value": "無送禮需求" }, { "id": 1406973, "key": "ywot_tracking_code", "value": "" }, { "id": 1406974, "key": "ywot_tracking_postcode", "value": "" }, { "id": 1406975, "key": "ywot_carrier_id", "value": "UNKNOWN" }, { "id": 1406976, "key": "ywot_pick_up_date", "value": "" }, { "id": 1406977, "key": "ywot_picked_up", "value": "" }, { "id": 1406978, "key": "ywpar_points_from_cart", "value": "4000" }, { "id": 1406985, "key": "_new_order_email_sent", "value": "true" } ], "商品": [ { "商品名稱": "測試123", "SKU": "P14-013-33", "數量": 1, "單價": 4000 } ], "收件人姓名": "吳大頭", "收件人電話": "061111111", "收件人地址": "894 金門縣 烈嶼鄉 測號5號" } ]
後續進階的作法,例如匯出"處理中"的訂單的json格式後,再把訂單狀態改成"完成"
然後再用json格式的內容去做各種的訂單處理,例如宅急便託運單,進銷存訂單....等等