WooCommerce 運費依重量、件數、地區計算,不用外掛:1 公斤 80、5 公斤 150、離島加 150

WooCommerce 運費依重量、件數、地區計算,不用外掛:1 公斤 80、5 公斤 150、離島加 150

最後更新: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。

WooCommerce 商品太多怎麼一次改:批次編輯、快速編輯、CSV 匯出匯入、程式調價
WooCommerce 商品評價:只給買過的人寫、可以附照片、商店頁顯示星等

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

我的車
願望清單
最近瀏覽過的
類別