之前開發的使用 ACF Form 來建立 WooCommerce 訂單的功能,客戶希望增加自訂訂單金額的欄位,也就是預設用商品售價計算,或是可以自行輸入這筆訂單的金額。在 WooCommerce REST API 的官方文件範例中,並沒有提供訂單金額的參數,於是第一個直覺就是跑去問 ChatGPT,想不到反而繞了一大圈。
它給了我兩個錯誤的參數名稱,一個是 price
另一個是 _order_total
,結果完全沒有作用,後來再仔細研究官方文件提供的屬性列表,才發現到在商品屬性 line_items
裡面有一個 total
的參數,才理解原來下手的方向應該是調整商品總計進而變動訂單金額:
當然,如果你有稅或是運費計算的邏輯需要處理會麻煩些,我的情況比較單純,因此只要去動商品總計即可,只要將 line_items
的 total
欄位用 ACF 取拿資料。
<?php
$woocommerce->post(
'orders',
array(
'payment_method' => '...',
'payment_method_title' => '...',
'billing' => '...',
'line_items' => array(
'product_id' => 1,
'quantity' => 1,
'total' => get_field( 'custom_order_total' ), // 從 ACF 取得自訂訂單金額
),
)
);
當用這樣的方式去改變訂單金額時,在 WooCommerce 這邊的紀錄方式是用優惠券扣掉折扣金額去符合我們自行帶入的數字,也就是說如果商品價格是 1,000 元,我的自訂訂單金額是 100 元,那麼該訂單就會自動套用 900 元的折價券。
這樣的計算方式會延伸一些問題,我踩到的雷是電子發票的開立,由於套用折價券後會算成是兩筆商品小計,但商品名稱卻只有一個,因此會發生商品名稱的資料筆數跟小計的對不起來,造成發票無法開立的問題,這部分我是直接修改電子發票外掛來解決,但根本解可能還是要請外掛開發商將優惠券的情境考慮進去才行了。