上週遇到一個很有趣的需求,客戶來信說希望可以在商品頁面增加一個文字欄位輸入框,當顧客輸入數字時可以改變商品售價,這位客戶的網站是販售某種電線還纜線之類的產品,除了會依照線的材質會有不同的售價外,還會根據線的長度來計價。
具體的需求是他們希望當顧客輸入 1~100 這個區間的任意數字時,商品售價可以依照公式計算出除了基本規格的售價外,再將長度變數加入最後價格中,假設當商品售價初始價格為 100 元,輸入 10 會變成 110 元,輸入 50 會變成 150 元,有點類似客製化商品的作法。
一開始我的思路是從變化商品下手,想說能否開一個屬性是可以動態決定這個長度的價格,而當這個屬性被選擇時,就能多一個文字輸入框來提供顧客輸入任意的數字,但研究後發現變化商品的售價就是一個固定的欄位,沒有辨法進行動態的改變。
於是又想說直接在前端根據輸入文字欄位來修改商品定價,但跟變化商品的價格一樣,只要售價在後台設定後它就是一個固定的值,任何的變動都會影響到訂單的總金額,弄不好可能還會影響到其他訂單,既然直接修改商品價格不可行,我就朝著訂單附加費用的角度來思考,可能是把長度的計算加總在運費或是稅務上,但這樣一樣會讓運費與稅務大亂。
後來想起關鍵字 Dynamic Product Price,但找到的多半是像買兩件折 50,或是買三件打八折這種行銷用途的外掛,但從他們的作法中我可以確信使用附加費用解決這個需求是正確的方向,最後我找到了 Advanced Product Fields (Product Addons) for WooCommerce 這隻外掛。
![]() |
這支外掛的主要功能是可以增加商品在前台的欄位,免費版本可以增加九種欄位在商品頁面中,付費版還有更多欄位可以選擇,最重要的是它可以根據欄位的輸入結果來加入訂單的附加費用,完完全全可以解決客戶的需求。
![]() |
但免費版本的商品附加費用,只能是固定費率,也就是判斷有輸入這個長度欄位的話,附加費用是固定金額,升級付費版的話就可以依照輸入的輸字來決定金額,甚至還能寫入自己的公式來進行計算,操作介面如果你有使用過 ACF 的話,這一套完全可以無痛上手,想試用的話在他們的外掛說明頁上都有提供展示連結,或是直接下載玩看看最快。
![]() |
我進一步研究他們的程式碼,想了解附加費用的機制是如何運作的,發現到幾支關鍵的勾點可以使用:
用於修改自行新增的商品自訂欄位到結帳購物車中,讓購物車可以讀到商品的自訂欄位,可以傳入三個參數:$cart_item_data、$product_id 以及 $variation_id,回傳 $cart_item_data
```php // define the woocommerce_add_cart_item_data callback function filter_woocommerce_add_cart_item_data( $cart_item_data, $product_id, $variation_id ) { // make filter magic happen here… return $cart_item_data; };
// add the filter add_filter( ‘woocommerce_add_cart_item_data’, ‘filter_woocommerce_add_cart_item_data’, 10, 3 ); ```
用於取得已經儲存的商品自訂欄位,可以傳入兩個參數:$item_data 以及 $cart_item,回傳 $item_data,透過這個勾點可以把長度的規格顯示在結帳頁的商品清單中:
```php // define the woocommerce_get_item_data callback function filter_woocommerce_get_item_data( $item_data, $cart_item ) { // make filter magic happen here… return $item_data; };
// add the filter add_filter( ‘woocommerce_get_item_data’, ‘filter_woocommerce_get_item_data’, 10, 2 ); ```
用於計算訂單金額,訂單的總金額可以針對商品自訂欄位進行加總靠得就是它,下面為這支外掛外掛處理訂單金額計算的方法:
```php public function adjust_cart_item_pricing($cart_obj) {
if (is_admin() && ! defined('DOING_AJAX'))
return;
foreach( $cart_obj->get_cart() as $key=>$item ) {
if(empty($item['wapf']))
continue;
$quantity = empty($item['quantity']) ? 1 : wc_stock_amount($item['quantity']);
$product = wc_get_product($item['variation_id'] ? $item['variation_id'] : $item['product_id']);
$base = Helper::get_product_base_price($product);
$options_total = 0;
foreach ($item['wapf'] as $field) {
if(!empty($field['price'])) {
foreach ($field['price'] as $price) {
if($price['value'] === 0)
continue;
$options_total = $options_total + Fields::do_pricing($price['value'],$quantity);
}
}
}
if($options_total > 0)
$item['data']->set_price($base + $options_total);
}
} ```
它先檢查購物車裡面的商品是否帶有價格的自訂欄位,有的話就透過 Fields 類別的靜態方法來取得附加費用的計算邏輯,最後再把原始價格 $base 加上算出來的費用,使用 WooCommerce 的 set_price()
來做為訂單總價。
結合以上三個勾點我們就能搞懂這支外掛基本運作邏輯:先將商品自訂欄位寫入,然後在前台的商品頁加入前端表格,透過 JS 計算出附加費用後,再去修改購物車的商品總金額,藉此達成根據顧客手動輸入的結果來改變訂單總價。
另外值得一提的是 Advanced Product Fields 的設定頁面做得很好,除了比照 ACF 的設定邏輯外,整個資料夾結構也非常清楚,未來如果要開發自訂欄位的操作介面,這支外掛是非常好的參考教材。
你也有一些需求不知道該怎麼解比較好嗎?可以回信跟我說,也許在 WordPress 生態圈裡面還有沒被滿足的需求等著被我們開發XD,我們下週五見!
對我來說,學習新東西最好的方法就是從做中學,為此我暫時離開了 PHP,投入自己完全不熟悉的領域,使用 AI 開發了一個社群平台,技術採用了 React、Vite、Shadcn、Vercel 以及 Supabase,實驗看看全面交由 AI 進行開發會發生什麼事。 剛開始的第一週衝擊實在太大,以前大概要花一個月弄的東西 AI 一天就搞定,但也因此陷入了多巴胺中毒的危機之中,幸好即時清醒避免越陷越深。命令 AI 執行的過程中,也逐漸理解到它的可能性、限制與風險,更重要的是可以分辨出網路上瘋傳的最新模型、AI 工具是否適合自己,也慢慢知道這些工具該應用在什麼地方,如果沒有從做中學,這些資訊真的會讓人焦慮。 工作佔比 六月份我開始捨棄紀錄工作時數這件事了,一方面是因為事情都是 AI 在做,它執行的速度太快,我根本沒辦法依照每個工作事項記錄時數,另一方面因為暫時沒在接案,也就沒有跟客戶回報工作時數的流程,所以就沒有再繼續計時,取而代之的是用開發日誌來記錄,這樣工作起來反而更自在些。 六月工作時間安排基本上就是週一到週五早上 3 小時,下午 1~2...
如果有一個平台,可以協助你: 完整紀錄開發產品的過程,從想法、手稿到實際動工 紀錄產品開發中遇到的困難、解決方法與成長經驗 查看產品從模糊概念,逐步轉化為 MVP、再到 PMF 的歷程 透過時間軸、行事曆與圖表,檢視每月的開發狀況 如果你對這樣的紀錄方式感興趣,那你一定會想試試看 aiker(艾可)。 有別於一般搶奪你注意力的社群平台,aiker 的設計初衷就是幫助你專注目標。只要每天順手更新開發狀況或心得,就能在產品履歷頁看到你努力的成果: 你可以在這裡實際瀏覽 aiker 的開發歷程,感受若將自己的專案以這種方式呈現,會是什麼樣子:https://aiker.app/products/288a712d-d942-4d3f-a50d-f3741895bb21 不要你的注意力,只要你的恆毅力! 為了鼓勵你更新開發動態,一進入首頁就會看到貼文介面。發文當下可同時設定分類與關聯產品,方便日後回顧;想要瀏覽產品開發歷程的人,也能透過你設計的分類快速搜尋。 此外,貼文還提供許多寫作輔助功能: 輸入 @ai:請求 AI 搶頭香發第一則留言,你也可以回覆 AI 留言,進一步與它討論。AI...
多巴胺(Dopamine)是一種神經傳遞物質,負責傳遞興奮和愉悅感。能引起渴望、興奮和希望等情緒,激勵人們追求目標。 上週日感冒了,很久沒有這麼嚴重的大感冒,發燒加喉嚨、頭爆炸痛,連續幾個晚上都沒什麼睡,白天完全沒有體力上工,不是在睡覺就是在發呆放空,受不了最後還是看了醫生吃了藥,每天等著症狀好轉。 到了週三稍微有點精神可以看書,看完「流言終結者」主持人亞當的書「創客精神」後一整個被激勵,很想要來動手做些什麼,於是拿出筆記本把一些點子畫下來,我想到可以做一個平台來搜集大家使用 Vibe Coding 開發出來的作品: 由於還沒有體力坐在電腦前工作,我就想說用平板先來做個雛形看看,付費解鎖了 Claude,也試了 Replit、Firebase Studio 來玩看看,很快的就有網站原型,再從這個原型去發想更多的功能細節。 第一次的衝擊 隔天因為需要回一些工作的訊息就開了電腦,想説回完後就關機繼續休息,結果想說把昨天弄的原型用 Cursor 來重做一次,能夠直接自己修改程式碼還是比較安心,但我忽然靈光一閃,我不是想要讓自己投入到 Vibe Coding...