最後更新:2026/10/13
新北一家做手工皂的小店,開了網店之後辦了兩個活動:一款試用包免費索取,全館滿一千免運。上線第一天就收到客人私訊:「試用包上面寫 NT$0,是不是標錯價?」另一位客人買了一千二,結帳頁還是預設勾著「宅配 80 元」,付完款才發現旁邊有免運可以選。
這兩件事都不是 WooCommerce 壞掉,是它預設的顯示方式不夠貼心。下面分成「後台勾一下就好」和「需要加一段程式碼」兩類,照順序處理。
不想自己改?把這篇交給 AI
把這篇的網址(或全文)連同下面這段話貼給 AI:
我的網站是 WordPress,有裝 WooCommerce。我想照下面這篇文章,讓 0 元的商品顯示「免費」、達到免運門檻時把要付費的運送方式藏起來,免費講義結帳時只要填姓名和 Email。
請先問我:我的結帳頁是哪一種、運費和免運門檻目前怎麼設定。
問清楚之後,再一步一步告訴我:要用哪一段程式碼、貼在哪裡、哪些地方要換成我自己的資料,以及改完怎麼測試。
如果文章的做法不適合我的網站,請直接告訴我原因和替代做法。
文章:(貼上這篇的網址,或整篇內容)
改之前先備份,密碼不要貼給 AI。
免運門檻:後台就能設定
免運費是 WooCommerce 內建的運送方式。到「WooCommerce → 設定 → 運送方式」,點進你的運送區域(例如「台灣」),新增一個「免費運送」,在「如果要免運費的話需要」選「最小訂購金額」,填上門檻金額。也可以選「有效的免運折價券」,做成只有拿到優惠碼的人才免運。運送方式的名稱可以自己改,例如把「自行取貨」改成「門市自取」,客人比較看得懂。
設好之後,購物車達到門檻時,結帳頁會多出免運這個選項。問題是原本的宅配還在,而且常常排在第一個、預設被選起來,就是上面那位客人遇到的狀況。
達到免運時,把要付費的運送方式藏起來
新版 WooCommerce 已經內建這個功能:同樣在「運送方式」裡,點「送貨設定」,勾選「有免運費活動時隱藏運費」。勾了之後,客人一達到免運門檻,結帳頁只剩免運和自取,不會再選到付費的宅配。我們在測試站滿額結帳,宅配 80 元那一項就不見了。
如果你的後台找不到這個選項(WooCommerce 版本比較舊),或者除了自取之外還想保留其他方式,可以用這段程式碼,$keep 裡面放想保留的運送方式:
// 有免運可選時,只留免運和 $keep 裡的運送方式
add_filter('woocommerce_package_rates', function ($rates) {
$keep = ['local_pickup', 'pickup_location']; // 自行取貨
$free = [];
foreach ($rates as $id => $rate) {
if ('free_shipping' === $rate->get_method_id()) {
$free[$id] = $rate;
}
}
if (!$free) {
return $rates; // 還沒達到免運,全部照常顯示
}
foreach ($rates as $id => $rate) {
if (in_array($rate->get_method_id(), $keep, true)) {
$free[$id] = $rate;
}
}
return $free;
}, 100);
運費算出來之後,WooCommerce 會先存起來,客人的購物車沒變動就不會重算。所以改完設定或程式碼,要用一個新的購物車測試;也可以在「送貨設定」暫時開啟「除錯模式」,它會略過運費的快取,測完記得關掉。
程式碼要放在 Code Snippets 這類外掛或子主題裡,放法和備份的注意事項,可以看〈WooCommerce 結帳頁改成台灣習慣〉。
0 元商品顯示「免費」
商品價格填 0,商店列表和商品頁就會出現「NT$0.00」。數字是對的,看起來卻像標錯價。加上這段,價格是 0 的商品改顯示「免費」:
// 價格是 0 的商品,商店和商品頁顯示「免費」
add_filter('woocommerce_get_price_html', function ($html, $product) {
$price = $product->get_price();
if ($price !== '' && (float) $price === 0.0) {
return '<span class="amount">免費</span>';
}
return $html;
}, 10, 2);
要注意價格欄空白和填 0 是兩回事:空白代表沒有定價,商品不能加入購物車;填 0 才是免費商品。另外,新版的區塊購物車頁,品項金額仍然會顯示 NT$0.00,那是購物車區塊自己算的格式,這段程式碼管不到;商店列表、商品頁這些客人決定要不要拿的地方,已經改成「免費」了。
傳統結帳頁的運送方式加上「免費」
區塊結帳頁會在 0 元的運送方式旁邊寫「免費」。傳統結帳頁不會,「門市自取」後面什麼都沒有,客人不確定要不要另外付錢。這段讓 0 元的運送方式後面加上「:免費」:
// 傳統購物車、結帳頁:0 元的運送方式加上「免費」
add_filter('woocommerce_cart_shipping_method_full_label',
function ($label, $method) {
if ((float) $method->get_cost() === 0.0
&& false === strpos($label, '免費')) {
$label .= ':免費';
}
return $label;
}, 10, 2);
免費講義:結帳只填姓名和 Email
購物車裡只有免費、又不用寄送的東西(例如電子講義),WooCommerce 仍然會要客人填完整地址和電話。為了一份免費講義填一整張表,很多人會直接放棄。
購物車不用付款也不用寄送時,WooCommerce 會自己拿掉付款方式;地址欄位則要靠這段程式碼拿掉,只留姓名和 Email:
// 只有免費、不用寄送的商品時,傳統結帳頁只留姓名和 Email
add_filter('woocommerce_checkout_fields', function ($fields) {
$cart = WC()->cart;
if ($cart && !$cart->needs_payment() && !$cart->needs_shipping()) {
$keep = ['billing_last_name', 'billing_first_name',
'billing_email'];
foreach (array_keys($fields['billing']) as $key) {
if (!in_array($key, $keep, true)) {
unset($fields['billing'][$key]);
}
}
}
return $fields;
});
我們用一份 0 元的電子講義測試,結帳頁只剩姓氏、名字、Email 和訂單備註,填完就能下單。這段只對傳統結帳頁有效;區塊結帳頁目前沒辦法用同樣的方式拿掉地址欄位。如果你的免費講義是用來收名單,用一個表單加上自動寄信,客人填 Email 就收到檔案,流程更短;怎麼設計這種「魚餌」,可以看〈粉絲很多卻賺不到錢?〉。
改完自己從頭買一次
每改一項,就用無痕視窗當一次客人:從商品頁加入購物車、看購物車、走到結帳頁,未滿門檻和滿額各試一次,電腦和手機都看。客人看到的價格和運費,最好跟你心裡想的完全一樣。
免運門檻、免費試用、自取優惠,都是小店用來拉高客單價的工具,前提是網站上講得清清楚楚。如果你還在用私訊報價、手動算運費,可以先看〈IG 帳號不是你的資產〉。MIMI 專做客製化網頁設計,購物車電商網站可以從商品、運費規則到結帳流程一起規劃。MIMI 提供新北網頁設計服務,新北的店家可以用電話、Email 直接和設計師討論;費用可以先看首頁的製作費用參考,歡迎聯絡 MIMI。
