匯出所有訂單的方法
啟用 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格式的內容去做各種的訂單處理,例如宅急便託運單,進銷存訂單....等等