WooCommerce訂單管理 REST API

匯出所有訂單的方法

啟用 REST API:

/wp-admin/admin.php?page=wc-settings&tab=advanced&section=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格式的內容去做各種的訂單處理,例如宅急便託運單,進銷存訂單....等等

瀏覽次數:44