WooCommerce 商品價格根據顧客輸入欄位加總


上週遇到一個很有趣的需求,客戶來信說希望可以在商品頁面增加一個文字欄位輸入框,當顧客輸入數字時可以改變商品售價,這位客戶的網站是販售某種電線還纜線之類的產品,除了會依照線的材質會有不同的售價外,還會根據線的長度來計價。

具體的需求是他們希望當顧客輸入 1~100 這個區間的任意數字時,商品售價可以依照公式計算出除了基本規格的售價外,再將長度變數加入最後價格中,假設當商品售價初始價格為 100 元,輸入 10 會變成 110 元,輸入 50 會變成 150 元,有點類似客製化商品的作法。

一開始我的思路是從變化商品下手,想說能否開一個屬性是可以動態決定這個長度的價格,而當這個屬性被選擇時,就能多一個文字輸入框來提供顧客輸入任意的數字,但研究後發現變化商品的售價就是一個固定的欄位,沒有辨法進行動態的改變。

於是又想說直接在前端根據輸入文字欄位來修改商品定價,但跟變化商品的價格一樣,只要售價在後台設定後它就是一個固定的值,任何的變動都會影響到訂單的總金額,弄不好可能還會影響到其他訂單,既然直接修改商品價格不可行,我就朝著訂單附加費用的角度來思考,可能是把長度的計算加總在運費或是稅務上,但這樣一樣會讓運費與稅務大亂。

後來想起關鍵字 Dynamic Product Price,但找到的多半是像買兩件折 50,或是買三件打八折這種行銷用途的外掛,但從他們的作法中我可以確信使用附加費用解決這個需求是正確的方向,最後我找到了 Advanced Product Fields (Product Addons) for WooCommerce 這隻外掛。

這支外掛的主要功能是可以增加商品在前台的欄位,免費版本可以增加九種欄位在商品頁面中,付費版還有更多欄位可以選擇,最重要的是它可以根據欄位的輸入結果來加入訂單的附加費用,完完全全可以解決客戶的需求。

但免費版本的商品附加費用,只能是固定費率,也就是判斷有輸入這個長度欄位的話,附加費用是固定金額,升級付費版的話就可以依照輸入的輸字來決定金額,甚至還能寫入自己的公式來進行計算,操作介面如果你有使用過 ACF 的話,這一套完全可以無痛上手,想試用的話在他們的外掛說明頁上都有提供展示連結,或是直接下載玩看看最快。

我進一步研究他們的程式碼,想了解附加費用的機制是如何運作的,發現到幾支關鍵的勾點可以使用:

woocommerce_add_cart_item_data

用於修改自行新增的商品自訂欄位到結帳購物車中,讓購物車可以讀到商品的自訂欄位,可以傳入三個參數:$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 ); ```

woocommerce_get_item_data

用於取得已經儲存的商品自訂欄位,可以傳入兩個參數:$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 ); ```

woocommerce_before_calculate_totals

用於計算訂單金額,訂單的總金額可以針對商品自訂欄位進行加總靠得就是它,下面為這支外掛外掛處理訂單金額計算的方法:

```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,我們下週五見!

WordPress 開發日常

Read more from WordPress 開發日常

過去我一直覺得,接收管理員通知用 Email 就夠了。如果訂單量不大,靠主機或第三方發信服務,其實也能運作得很順利。但後來與客戶訪談時發現,很多老闆根本不會用 Email,就算有,也常被廣告信和雜訊淹沒。 我自己試過很多收信軟體,試圖藉由工具來過濾重要訊息,但過不了多久,「重要信件」又變得滿天飛。雖然我會每天安排時間檢查,但有些緊急事件,例如新訂單通知,我希望能即時知道。 手機上的 App 通常只能根據「有新郵件」來推播,還找不到能針對「特定寄件者」推播的服務。因此我預設會把 App 的通知功能關掉,避免不緊急的訊息干擾我。 用 LINE 收通知也一樣,目前沒辦法只針對特定對象推播,只能全開或全關。這讓我想過是不是該換個沒那麼常用的通訊軟體來接收通知,但又懶得裝新 App,只好……自己開發一個外掛來解決了(?) 實機展示 要能在手機上接收到訂單通知,有三個關鍵技術:Web Push、Service Worker,以及 Progressive Web App,這邊先跳過他們,如果你也想在手機上收到訂單通知可以參考以下步驟: 1. 下載 DWP 網站助理...

創業的時光真是飛快得不可思議。明明才剛寫完第一個月的回顧,怎麼一下子又到了第二個月。這個月我全力投入開發新產品,原以為靠 AI 協助,兩週內就能搞定,沒想到一弄就是一整個月,還卡關連連,導致原本預定的行銷工作停滯不前。但我真的很喜歡開發產品的過程,彷彿在解謎闖關,每解開一個難題就多學一點新知,形成一種自我成長的良性循環。 工作佔比 四月份總工作時數為 65.64 小時,比三月增加了 24 小時。各類工作佔比如下: 行銷:30% 產品更新:7% 產品研發:63% 其中一個週末我整整兩天都在工作,有幾天甚至加班到晚上七點多。比較難統計的是晚上洗完澡到就寢前,還是會用平板跟 AI 討論白天卡住的問題,甚至請它幫我先寫好隔天要用的功能。若將這些時數也納入,總工時應該超過 70 小時。 我覺得比較理想的工作狀態是一個月大約 50 小時。像加班的那個週末,一直卡關讓我很煩躁,為了突破瓶頸逼自己解完才能休息,結果越急越解不開。後來乾脆休息一天,結果回來上工十分鐘就解決了。 所以還是得適時讓自己充電,給大腦一點空白,真正需要動腦時才有空間處理複雜問題。 行銷 內容行銷...

最近剛完成第一個完全由 AI 協助我開發的 WordPress 外掛,想說應該可以來整理一下這次開發的工作流程以及用到的工具,整體的心得是有 AI 實在是快超多,開發的速度跟飛的一樣,尤其是邊做邊想到新功能時,問一下複製貼上就能搞定,就像在裝外掛。 但不變的是 AI 跟我一樣會卡關,雖然每次它的解釋都好像解決了,但實際上測試就是無法,一直回饋給它後丟出新的解法,結果還是不行,這時候就要停下來自己看程式碼,然後思考是哪一行可能會出問題。 發現有可能造成問題的地方,再拿回去問 AI,這時候它就會說:「沒錯,你發現到問題的關鍵了!」我心裡想的是這應該是你要告訴我的啊 🤣,但整體而言這樣的開發節奏讓我可以很快的進入心流,不用擔心程式碼細節而是產品的方向,真的是回不去沒有 AI 協助的日子了~ 以下我從企劃、開發以及除錯階段,來說明我是如何用 AI 來設計這支外掛的。 企劃階段 這支外掛的主要功能是延續我上一個產品的概念,契機是因為 LINE Notify...