
WooCommerce 預設的結帳欄位是照國外的習慣設計的:名字和姓氏分開、國家、州/省、郵遞區號、地址第二行……對台灣的消費者來說,欄位太多會讓人懶得填,結帳到一半就放棄。
這篇整理怎麼用程式碼調整結帳欄位:移除、改名稱、設為必填或選填、調整順序。(原本另外兩篇〈WooCommerce 改變欄位名稱〉與〈WooCommerce「公司名稱」欄位設為必填〉的內容已經整合到這裡。)
先確認:你的結帳頁是區塊版還是傳統版?
這一步很重要,它決定了下面的程式碼有沒有用。
新版 WooCommerce 新安裝的網站,結帳頁預設是用「結帳」區塊(Checkout block)做的;比較早架設的網站,結帳頁通常是 [woocommerce_checkout] 短代碼的傳統版。
確認方式:
- 到後台「WooCommerce → 設定 → 進階」,在頁面設定裡看「結帳頁面」是哪一頁。
- 到「頁面」打開那一頁編輯:
- 看到一整個「結帳」區塊,裡面有聯絡資訊、地址、付款等子區塊:區塊結帳。
- 看到
[woocommerce_checkout]短代碼,或「傳統結帳」區塊:傳統結帳。
本文的 woocommerce_checkout_fields 寫法只對傳統結帳有效。 區塊結帳頁不會套用這個 filter,程式碼加了也不會有任何反應。區塊結帳的處理方式請看後面「區塊結帳頁怎麼辦?」。
開始之前
- 程式碼加在子主題的
functions.php,或用 Code Snippets 外掛新增,主題更新時才不會被覆蓋。 - 動手前先備份網站,能在測試站先試過最好。
先看看不用寫程式的設定
使用傳統主題的話,「外觀 → 自訂 → WooCommerce → 結帳」裡可以直接把公司名稱、地址第二行、電話這三個欄位設成隱藏、選填或必填。只要調整這三個欄位,用這裡設定就好,不需要寫程式。
結帳欄位的名稱
woocommerce_checkout_fields 會拿到一個陣列,欄位分成四組:
billing:帳單資料shipping:運送地址(勾選「運送到不同地址」時才會出現)account:建立帳號用的欄位order:訂單備註
帳單欄位的名稱:
billing_first_name:名字billing_last_name:姓氏billing_company:公司名稱billing_country:國家billing_address_1:地址billing_address_2:地址第二行(公寓、樓層等)billing_city:城市billing_state:州/省billing_postcode:郵遞區號billing_phone:電話billing_email:電子郵件
運送欄位是把 billing_ 換成 shipping_,例如 shipping_address_1;訂單備註是 order 那一組裡的 order_comments。
移除用不到的欄位
用 unset() 把欄位從陣列裡拿掉:
add_filter( 'woocommerce_checkout_fields', 'ahwei_remove_checkout_fields' );
function ahwei_remove_checkout_fields( $fields ) {
unset( $fields['billing']['billing_last_name'] ); // 姓氏
unset( $fields['billing']['billing_company'] ); // 公司名稱
unset( $fields['billing']['billing_address_2'] ); // 地址第二行
unset( $fields['billing']['billing_state'] ); // 州/省
unset( $fields['billing']['billing_postcode'] ); // 郵遞區號
// unset( $fields['order']['order_comments'] ); // 訂單備註
return $fields;
}前面加了 // 的那一行是「註解」,不會執行。想連訂單備註也移除,把那一行前面的 // 刪掉就好。反過來,想保留某個欄位,就在那一行前面加上 //,這也是舊版文章的用法。
有開啟「運送到不同地址」的話,shipping 那一組也要做一樣的調整。
哪些欄位不要刪?
- 電子郵件(
billing_email):訂單通知信要寄到這裡,不能刪。 - 國家(
billing_country):運費、稅金的計算都會用到,刪掉可能讓運送方式算不出來。只賣台灣的話,到「WooCommerce → 設定 → 一般」把銷售地點與運送地點都設成只有台灣,國家欄位就不會出現下拉選單讓客人選。 - 金流、物流、電子發票外掛需要的欄位:例如超商取貨需要電話、宅配需要地址。刪之前先確認你用的外掛需要哪些資料。
修改欄位名稱與提示文字
每個欄位都有 label(欄位名稱)、placeholder(輸入框裡的灰色提示字)、required(是否必填)、class(寬度等樣式)、priority(排序)等屬性。只改你需要的那一個屬性就好:
add_filter( 'woocommerce_checkout_fields', 'ahwei_rename_checkout_fields' );
function ahwei_rename_checkout_fields( $fields ) {
$fields['billing']['billing_first_name']['label'] = '姓名';
$fields['billing']['billing_phone']['label'] = '手機號碼';
$fields['order']['order_comments']['placeholder'] = '有什麼需要特別交代的嗎?';
return $fields;
}舊版文章的寫法是把整個欄位換成 array( 'label' => '詳細收件地址' ),這樣會把欄位原本的必填、寬度、排序等設定全部洗掉,欄位可能跑位或變成選填。正確的做法是像上面一樣,只修改 ['label'] 這一項。
地址類欄位要改用另一個 filter
地址、城市、州/省、郵遞區號這幾個欄位比較特別:WooCommerce 會依照客人選的國家,用 JavaScript 重新套用地址格式,所以用上面的方法改了名稱,畫面載入後可能又被換回原本的文字。
這幾個欄位改用 woocommerce_default_address_fields 修改,名稱不用加 billing_ 或 shipping_,帳單與運送地址會一起套用:
add_filter( 'woocommerce_default_address_fields', 'ahwei_address_fields' );
function ahwei_address_fields( $fields ) {
$fields['address_1']['label'] = '詳細收件地址';
$fields['address_1']['placeholder'] = '縣市、區、路名、門牌、樓層';
return $fields;
}設為必填或選填
把 required 設成 true(必填)或 false(選填)。例如公司行號的客戶多,想讓公司名稱變成必填:
add_filter( 'woocommerce_checkout_fields', 'ahwei_required_checkout_fields' );
function ahwei_required_checkout_fields( $fields ) {
$fields['billing']['billing_company']['required'] = true; // 公司名稱必填
$fields['billing']['billing_phone']['required'] = true; // 電話必填
return $fields;
}欄位名稱是文字,要加引號;true、false 是布林值,不用加引號。
連「我的帳號」的地址頁一起改
woocommerce_checkout_fields 只影響結帳頁。會員在「我的帳號 → 地址」編輯帳單地址時,用的是另一個 filter:woocommerce_billing_fields(運送地址是 woocommerce_shipping_fields)。想兩邊一致,改用這個寫法,注意陣列少了 ['billing'] 這一層:
add_filter( 'woocommerce_billing_fields', 'ahwei_billing_fields' );
function ahwei_billing_fields( $fields ) {
$fields['billing_company']['required'] = true;
return $fields;
}woocommerce_billing_fields 會同時影響結帳頁與我的帳號頁的帳單欄位。
調整欄位順序與寬度
priority 決定欄位的順序,數字越小越前面。預設是姓名最前面、電話和電子郵件在最後。想把電話移到姓名後面:
$fields['billing']['billing_phone']['priority'] = 25;欄位寬度用 class 控制:form-row-first、form-row-last 是左右各半,form-row-wide 是整行。移除姓氏之後,名字欄位會只剩半行寬,改成整行比較好看:
$fields['billing']['billing_first_name']['class'] = array( 'form-row-wide' );完整範例:適合台灣的結帳欄位
把上面的調整合在一起,例如:
add_filter( 'woocommerce_checkout_fields', 'ahwei_custom_checkout_fields' );
function ahwei_custom_checkout_fields( $fields ) {
// 移除:姓氏、地址第二行、州/省、郵遞區號
unset( $fields['billing']['billing_last_name'] );
unset( $fields['billing']['billing_address_2'] );
unset( $fields['billing']['billing_state'] );
unset( $fields['billing']['billing_postcode'] );
// 名字改成「姓名」,並改成整行寬度
$fields['billing']['billing_first_name']['label'] = '姓名';
$fields['billing']['billing_first_name']['class'] = array( 'form-row-wide' );
// 電話:改名、必填,移到姓名後面
$fields['billing']['billing_phone']['label'] = '手機號碼';
$fields['billing']['billing_phone']['required'] = true;
$fields['billing']['billing_phone']['priority'] = 25;
// 公司名稱維持選填
$fields['billing']['billing_company']['required'] = false;
// 訂單備註的提示文字
$fields['order']['order_comments']['placeholder'] = '有什麼需要特別交代的嗎?';
return $fields;
}同一個欄位不要在好幾段程式碼裡重複修改,之後很難找出到底是哪一段生效。
區塊結帳頁怎麼辦?
結帳頁如果是區塊版,上面的 woocommerce_checkout_fields 程式碼都不會生效,有兩個方向:
方向一:用區塊編輯器調整
編輯結帳頁,點選「結帳」區塊或裡面的地址區塊,右側的設定面板可以控制公司名稱、地址第二行、電話等欄位要不要顯示、是否必填(實際的選項與位置,會依 WooCommerce 版本而有些不同)。區塊結帳的介面比較新、手機上也好填,是 WooCommerce 之後主要發展的方向。
需要新增欄位(例如統一編號)時,WooCommerce 替區塊結帳提供了「Additional Checkout Fields」的開發介面,要用新的寫法處理,舊的 woocommerce_checkout_fields 程式碼不能直接沿用。
方向二:切回傳統結帳
需要大量客製欄位,或是你用的金流、物流、電子發票外掛只支援傳統結帳時,可以把結帳頁換回短代碼:
- 編輯結帳頁,刪除「結帳」區塊。
- 加入「短代碼」區塊,填入
[woocommerce_checkout]。 - 更新頁面,到前台確認結帳頁正常顯示。
切回之後,本文的程式碼就會生效。切換前後,都要確認金流、物流外掛支援你用的結帳頁版本。
不想寫程式:結帳欄位編輯外掛
wordpress.org 上有不少「Checkout Field Editor」類的外掛,可以用介面新增、刪除、排序欄位。安裝前一樣要確認它支援的是傳統結帳還是區塊結帳,也不要跟自己寫的程式碼同時修改同一個欄位。
改完一定要實際下一筆訂單
- 用無痕視窗、以訪客身分,從加入購物車一路走到付款完成。
- 確認後台的訂單資料、客人收到的通知信,欄位都正確。
- 金流與物流(超商取貨、宅配)都要實際測試一次。
延伸閱讀
- WooCommerce 價格顯示成「100 元」、隱藏 NT$ 貨幣符號的設定方法
- WordPress functions.php 實用程式碼整理:10 個常用又安全的小技巧
- WordPress 會員註冊後自動登入、跳轉到指定頁面(PHP 8 安全寫法)
結帳流程越順,客人越不容易在最後一步放棄。正威網路行銷是 25 年經驗的基隆網頁設計工作室,提供客製化網頁設計,也服務台北與全台客戶,購物網站的需求歡迎來聊聊。







發表留言
還沒有人留言,歡迎第一個分享你的想法或問題。留言經審核後才會顯示,Email 不會公開。