最後更新:2026/10/23
米行的網店,一包 2 公斤的米運費 80 元沒問題,客人一次買五包就是 10 公斤,物流公司收你 250 元,網站還是只收客人 80,一張單賠 170。飼料店、飲用水、罐頭、書,都是同一個問題:運費跟重量有關,WooCommerce 內建的「單一費率」卻只有一個數字。
很多店家因此裝了運費外掛,設定頁幾十個欄位。這篇先把內建就能做的講清楚(運送類別、件數和金額的公式),再用一段程式碼補上內建做不到的「依整包重量分級」和「離島加價」,大部分台灣網店的運費規則這樣就夠了。
不想自己改?把這篇交給 AI
把這篇的網址(或全文)連同下面這段話貼給 AI:
我的網站是 WordPress,有裝 WooCommerce。我想照下面這篇文章,讓宅配運費依整包重量分級計算,離島另外加價。
請先問我:我的重量級距和運費各是多少、哪些地區要加價、加多少、商品有沒有都填重量。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)
改之前先備份,密碼不要貼給 AI。
先用內建的:運送類別和公式
「WooCommerce > 設定 > 運送」的運送區域裡,「單一費率」的費用欄位可以寫公式。[qty] 是件數、[cost] 是購物車金額,所以 80 + 20 * [qty] 就是第一件 80、每多一件加 20;[fee percent="5" min_fee="30"] 是金額的 5%、最低 30 元。
再往下是「運送類別」:到「運送 > 類別」建幾個類別,例如「大件」「易碎」,在商品的運送分頁指定類別,單一費率的設定就會多出每個類別各自的費用欄位,還可以選「每個類別算一次」或「只算最貴的那個類別」。所以「大件商品運費 200、一般商品 80」這種規則,內建就能做。
內建做不到的是「看整包的總重量」:三包 2 公斤的米加起來 6 公斤,要用 6 公斤的級距算。這就要寫程式。
完整程式碼
// 第 99 篇:運費依重量、件數、地區計算,不用外掛
// 「宅配」這個運送方式的運費,依整包的重量分級;離島再加 150
add_filter('woocommerce_package_rates', function ($rates, $package) {
$weight = 0;
foreach ($package['contents'] as $item) {
$weight += (float) $item['data']->get_weight() * $item['quantity']; // 商品沒填重量就算 0
}
$tiers = [[1, 80], [5, 150], [10, 250]]; // 1 公斤以內 80、5 公斤以內 150、10 公斤以內 250
$cost = 400; // 超過 10 公斤
foreach ($tiers as [$max, $fee]) {
if ($weight <= $max) {
$cost = $fee;
break;
}
}
$remote = ['PEN', 'KIN', 'LIE']; // 澎湖、金門、連江(WooCommerce 的縣市代碼)
if (in_array($package['destination']['state'] ?? '', $remote, true)) {
$cost += 150;
}
foreach ($rates as $id => $rate) {
if ($rate->get_method_id() === 'flat_rate') { // 只改「宅配」,免運、自取不動
$rate->set_cost($cost);
$rate->set_label($rate->get_label() . '(' . wc_format_weight($weight) . ')');
}
}
return $rates;
}, 10, 2);
程式碼放在 Code Snippets 這類外掛或子主題,放法和備份方式見〈WooCommerce 結帳頁改成台灣習慣〉。
這段程式碼在做什麼
WooCommerce 算完運費之後、顯示給客人之前,會經過 woocommerce_package_rates 這個過濾器,裡面有這一包的所有商品和收件地址,我們在這裡重新算一次宅配的費用。
先把每件商品的重量乘上數量加總,得到整包的重量。重量用的是商品編輯頁「運送」分頁的「重量」欄位,單位是「設定 > 一般」裡選的重量單位,台灣用公斤。沒填重量的商品算 0,所以上線前要把會寄的商品重量都填好。
接著比對級距:1 公斤以內 80、5 公斤以內 150、10 公斤以內 250,超過 400。級距和金額照你跟物流公司談的價目表改,要加幾級就加幾列。
然後看收件地址的縣市:澎湖、金門、連江再加 150。WooCommerce 用的縣市代碼是 PEN、KIN、LIE,其他縣市的代碼在〈WooCommerce 結帳頁改成台灣習慣〉那篇的縣市清單裡。
最後只改「單一費率」(也就是你命名為「宅配」的那個方式)的金額,並在名稱後面加上這一包的重量,客人會看到「宅配(2.4 kg)NT$150」。免運費、門市自取這些方式完全不動,所以「滿 1,000 免運」的規則照常有效。
測試結果
我們在本機測試站設了台灣的運送區域(宅配、滿 1,000 免運、門市自取),商品「手工皂禮盒」0.8 公斤、「精油組合」1.2 公斤,用程式算各種組合的運費:
- 一盒禮盒,寄臺北:0.8 公斤,宅配 80。
- 三盒禮盒,寄臺北:2.4 公斤,宅配 150,同時出現免運費(金額超過 1,000)。
- 五組精油,寄臺北:6 公斤,宅配 250。
- 一盒禮盒,寄澎湖:0.8 公斤,宅配 230(80 加離島 150)。
- 一盒禮盒加九組精油,寄臺北:11.6 公斤,宅配 400。
還有幾種常見規則怎麼做
超商取貨有重量和尺寸上限(各家超商不同,一般是 5 公斤以內),超過就不該出現超商選項:在同一個過濾器裡,重量超過上限時把超商那個運送方式從 $rates 拿掉就好。
「滿額免運但離島除外」:免運費方式的條件只看金額,離島要另外處理,一樣在這個過濾器裡,收件地在離島時拿掉免運費的方式、或把它改成只折抵一部分。
「大件商品一律 200」用內建的運送類別做,不用程式;兩種規則同時要用時,程式這段只動 flat_rate,類別的費用在它之前已經算進去,可以疊加。
運費規則寫在購物車上方或商品頁,客人結帳才不會被嚇到;免運的門檻和折扣的門檻怎麼配合,在〈WooCommerce 數量折扣、滿額折扣〉有提。秤重販售的商品(論斤賣的米、茶)怎麼設定,看〈WooCommerce 秤重賣〉,兩篇合起來就是重量型商品的完整做法。
運費算對,才不會賣越多賠越多
運費是網店最容易被忽略的成本:一張單賠一百,一個月三百張就是三萬。規則先跟物流公司談清楚,再用內建設定加這段程式碼寫進網站,之後每一張單都算對,客人也在結帳時就看到正確的金額。
如果你的網店賣的是重的、大的、要寄離島的商品,想把運費、免運和出貨流程一次規劃好,可以先看〈IG 帳號不是你的資產〉想想網站要做到什麼。MIMI 專做客製化網頁設計,購物車電商網站可以依你和物流公司談的價目表設定運費。MIMI 提供新北網頁設計服務,新北的店家可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。
