WooCommerce 搬遷後多語系與多貨幣:locale、hreflang 與價格顯示要核對甚麼

← 所有文章

Managed-WP.™ PRO 藍色橫幅:WooCommerce 搬遷後,語言版本不等於貨幣版本;locale、hreflang、canonical 與結帳幣值要分層核對。
搬遷後先把介面語言、搜尋語言標籤、交易貨幣與稅務分開;不要用 locale 推斷貨幣,也不要用 hreflang 當貨幣切換器。

搬遷後,中文頁和英文頁都打得開,不代表語言版本正確;產品頁見到港幣符號,也不代表結帳時真的用港幣收款。多語系和多貨幣是幾層不同設定,任何一層用「看起來正常」代替證據,都可能變成錯價、錯稅或錯語言訂單。

本文集中搬遷後的多語系/多貨幣驗收,不重複換主機後的 DNS、TLS、付款回呼、電郵與快取基礎檢查。那篇處理「新主機是否真的接手、單是否入到正確系統」;本篇只補上語言版本、hreflang、canonical、貨幣顯示、結帳幣值與稅務這幾層。也不重複staging 隔離與更新後功能回歸的完整清單,只在最後列出多語系/多貨幣測試要怎樣隔離。

先分清三層

介面語言、搜尋語言標籤、交易貨幣不是同一件事。 locale 影響介面語言;hreflang 和 canonical 影響搜尋如何理解語言版本;貨幣、稅、結帳與訂單則是交易層。三層可以互相影響,但沒有一層可以代替另一層。

一、locale 是介面語言,不是貨幣或 hreflang

WordPress 的 Site Language 是後台/網站介面語言設定;官方文件把它描述為 WordPress dashboard language [7]。它不會自動把產品內容、分類、文章或主題字串翻譯成另一種語言。前台內容翻譯要靠主題、翻譯檔或多語系外掛;WooCommerce 本身是 translation-ready,但仍要有所選語言的翻譯檔,未翻譯的字串可能保持原文 [9]。

WordPress locale 的寫法常見 pt_BR、en_GB 這種「語言_地區」底線格式 [8];hreflang 則用 pt-BR、en-GB 這種連字號標籤 [1]。兩者相似,但不是同一個字串。不要直接把 WordPress locale 貼進 hreflang 就當完成,也不要見 locale 有國家碼就推斷貨幣。

搬遷後最常見的問題不是翻譯文字本身,而是語言切換後仍然去舊域名、舊路徑,或者只回到首頁。Google 建議不同語言版本使用不同 URL,而不是單靠 cookie 或瀏覽器設定動態改語言 [3]。如果搬遷後只有一個 URL 靠 cookie 轉語言,搜尋引擎和快取都可能只見到其中一個版本;這不是加幾行 hreflang 就可以補救。

層 你要回答的問題 不是甚麼
locale/介面語言 這個 URL 的前台和後台語言是甚麼?翻譯檔存在嗎? 不是貨幣,也不是 hreflang
hreflang/canonical 這個語言版本和哪個版本互指?搜尋應顯示哪個版本? 不是轉址,也不是貨幣切換器
貨幣/稅/結帳 客人看到、被收取、訂單記錄和稅務用哪個幣值? 不是由 locale 自動決定

二、hreflang:語言/地區標籤,不是貨幣或 redirect 指令

hreflang 用來告訴 Google「這些 URL 是同一個內容的語言或地區版本」;Google 明確表示,它不會用 hreflang 或 HTML lang 屬性偵測頁面語言,而是用演算法判斷 [1]。hreflang 是配對訊號,不是自動翻譯、不是貨幣指令,也不是叫瀏覽器轉址的指令。

1. 有效語言標籤:語言必要,地區可選

Google 文件要求 hreflang 使用語言碼(ISO 639-1),可選地區碼(ISO 3166-1 Alpha 2);只寫地區而不寫語言不合法 [1]。例如 en、en-GB、de-ES 可以;單獨一個 HK 不可以。x-default 是選用的後備版本,用來接住沒有明確匹配語言/地區的訪客 [1]。

hreflang 也可以帶 ISO 15924 script subtag,例如 zh-Hant(繁體中文)、zh-Hans(簡體中文)。zh-Hant-HK 是語言 zh + script Hant + 地區 HK,不是 WordPress 的 zh_HK locale;不要只把底線換成連字號,就假設兩者語義相同。

2. 每一版都要列出自己,也要互相指回

Google 的規則很清楚:每個語言版本都要列出自己以及所有其他版本;HTML <link> 要放在 <head>,URL 要用完整絕對網址;如果 X 指向 Y,Y 也要指回 X,否則註解可能被忽略或解讀錯誤 [1]。self entry 不是錯誤,而是必要條件。

以下只是格式示例,不是本站實際語言簇:

<link rel="alternate" hreflang="zh-Hant-HK" href="https://example.com/zh-hk/page/" />
<link rel="alternate" hreflang="en" href="https://example.com/en/page/" />
<link rel="alternate" hreflang="x-default" href="https://example.com/" />

三個版本都要有同一組 links,包括自己。搬遷後如果只改了其中一頁的域名,或者只把舊域名 search-replace 了資料庫、但外掛在輸出時仍用舊設定,就會出現單邊鏈、舊域名或缺失 self entry。

3. 同一語言不同貨幣:不要重複用同一個 hreflang

貨幣不是語言,也不是地區碼。不要因為同一頁有 HKD、USD、GBP 三個價格版本,就為三個 URL 重複加上同一個 hreflang="en"。 一個 hreflang 值應該對應一個語言/地區版本;重複值會令語言簇混亂。

如果貨幣版本只是同一個語言頁的 session/query 狀態,通常不應把每個貨幣 URL 都塞進 hreflang 語言簇。應先決定哪個是主要可索引語言頁,貨幣切換是否要產生獨立 URL,以及那些 URL 的 canonical/indexability 怎樣處理。不要用 hreflang 當貨幣切換器。

4. hreflang 不保證索引,也不能掩蓋 canonical 問題

hreflang 只描述替代版本。頁面仍然要回 200、可被抓取、沒有 noindex,canonical 也要指向同一語言的正確版本。一個 noindex 頁不會因為加了 hreflang 就變成可索引;把 noindex 的購物車或結帳頁放進語言簇,只會令驗證更混亂。

搬遷後要檢查的是實際 rendered HTML 和 sitemap,不是只看資料庫。特別留意:

  • hreflang、canonical、og:url 仍然指舊域名;
  • 只有單邊 hreflang,沒有 return link;
  • 語言碼寫錯,或把 WordPress locale 的底線格式直接貼進 hreflang;
  • 用相對 URL,或同一頁的 links 不一致;
  • canonical 跨語言,造成互相矛盾的語言訊號;
  • 自動 redirect 按瀏覽器語言跳走,令其他版本難以被看到。

三、canonical 與 indexability:同一語言,不要把全部語言併成一個

Google 對 canonical 的建議是:如果頁面有 hreflang,canonical 應指向同一語言的頁面,或同一語言不存在時最接近的替代語言 [2]。canonical 是強訊號,不是強制命令;如果英文版 canonical 指向中文版,會造成互相矛盾的語言訊號,Google 可能忽略這個 canonical 或選擇其他版本,不能當成可靠的「合併」方法。

最簡單、也最容易核對的做法,是每個語言版本 self-canonical;如果同一語言內有追蹤參數、結尾斜線、www/非 www 等重複 URL,才把該語言的重複版本指向同語言的首選 URL。不要把「所有語言指向預設語言」當成統一權重的方法。

indexability 要逐頁核對:

  • HTTP 200,沒有意外的 redirect chain;
  • robots meta 或 X-Robots-Tag 不是 noindex;
  • canonical 是同一語言、絕對 HTTPS URL;
  • hreflang 的每個目標都存在、回 200、可索引;
  • sitemap 包含正確語言 URL,沒有舊域名;
  • 購物車、結帳、我的帳戶等交易頁按網站政策 noindex,且不被當成 SEO 語言版本。

搬遷後亦要留意 trailing slash、大小寫、語言前綴和參數。如果 canonical、redirect、sitemap 和內部連結互相矛盾,搜尋引擎會自行選一個,結果未必是你想要的版本。

四、貨幣:顯示換算、結帳收取與商戶結算要分清

WooCommerce 核心每個商店只設一個 base currency,用它顯示產品價格和記錄新訂單;要顯示或收取其他貨幣,需要 multi-currency 外掛/擴充 [4]。官方文件亦明確說,Currency Converter Widget 只改變價格顯示,不代表結帳會用該貨幣收款 [4]。

顯示幣可以和結帳幣不同,但這只是顯示層與交易層可以分開;不是說結帳、訂單或實際收款出現任何幣值差異都正常。搬遷後要分開核對四個層次:

  1. 產品頁和分類頁顯示甚麼幣?換算價怎樣來?
  2. 購物車和結帳頁向客人確認甚麼幣、應付總額多少?
  3. 訂單記錄和付款網關實際收取甚麼幣、多少錢?
  4. 商戶結算、退款、發票、訂單電郵和報表用甚麼幣?

客人確認結帳後,結帳頁、訂單記錄和付款網關實際收取的幣別與金額必須對得上。 如果網關按自己的換算、手續費或路由規則令金額不同,差異要能由網關紀錄和設定解釋;沒有解釋的幣別或金額落差,應視為錯幣/錯額並暫停,不能當作正常。商戶結算幣是另一個層次:網關可能以商戶結算幣入帳,這不代表客戶支付幣或訂單幣可以任意不同;客戶實付與商戶入帳要分開核對。

WPML 的 multicurrency 文件示範可按貨幣顯示不同付款方式:例如預設 Stripe 帳戶處理美元,地區 Stripe 帳戶或本地網關處理另一貨幣 [11]。這是付款方式路由,不代表結帳、訂單和網關實際收取可以出現無解釋的幣別或金額差異;路由後仍要核對客戶實付與商戶結算。

1. 四捨五入、分隔符和小數位要一起測

貨幣格式不只是一個符號。小數位、千位分隔符、小數分隔符、符號位置、固定價格與自動換算,都會影響顯示和總額。測試不要只用 100 這種整數:

  • 0.01、0.005、9.99、99.99、100、1,000;
  • 零小數位貨幣(例如 JPY)如果你有服務日本市場;
  • 固定價格與按匯率換算混合的產品;
  • 優惠券的固定金額折扣、免運門檻和混合購物車;
  • 稅前/稅後顯示不同時的總額。

WooCommerce 的貨幣設定包括幣別、符號位置、千位分隔符、小數分隔符和小數位數 [5]。如果搬遷後只改了幣別,沒有改分隔符或小數位,客人可能見到格式正確但數值難讀的價格。

2. 匯率不是搬遷設定,而是營運資料

多貨幣外掛通常有匯率來源、更新頻率、手動覆寫和換算費用。搬遷後要確認匯率沒有停留在舊環境、舊快取或測試值;亦要記錄你用的是哪個來源、多久更新一次、由誰覆核。不要假設「外掛會自動更新」就等於價格正確。

3. 改 base currency 不會換算舊訂單

WooCommerce 官方文件說得很清楚:改變 base currency 會改變商店顯示和收取的貨幣,但不會替你換算任何金額;產品價格數字會保持不變(原本 10 會顯示 10,不是自動換算),舊訂單亦保留原本的貨幣、符號和總額 [4]。搬遷後如果要改 base currency,必須手動更新產品價格,並核對舊訂單沒有被改寫。

五、稅與結帳:稅是獨立層,會令顯示價和總額不同

稅務設定和貨幣是兩個獨立層。WooCommerce 的稅務設定包括:價格是否含稅、按哪個地址計算稅(客戶送貨地址、帳單地址或商店地址)、購物車和結帳顯示含稅或未稅、運費稅類,以及不同稅類 [6]。搬遷後商店地址如果仍是舊地址,稅率可能整體錯位。

官方文件提醒,如果「價格輸入方式」、「商店顯示」和「購物車/結帳顯示」三個含稅/未稅設定不一致,可能出現差一仙的 rounding 差異或混亂 [6]。所以不要只測產品頁;要由產品頁、購物車、結帳、訂單到付款網關逐段對同一筆金額。

稅務與貨幣是兩層;多貨幣外掛可能影響稅基、換算與顯示,實際行為取決於外掛、稅務設定和付款網關。不要假設「幣別換了,稅會自動等比例換算」;要用實際地址、稅類和外掛設定測試。

1. 稅務測試要包含地址與身份

退稅、增值稅、GST、銷售稅的規則因地區而異;本文不是稅務建議,也不判斷你是否應該在某地收稅。測試要覆蓋:

  • 訪客與已登入客戶;
  • 送貨地址與帳單地址不同;
  • 商店基準地址 vs 客戶地址;
  • 含稅價與未稅價;
  • 標準稅類、減稅類、零稅率與運費稅;
  • 免運門檻、優惠券和混合購物車。

2. 結帳幣別和語言可以中途改變

如果客人在購物車中途切換語言或貨幣,購物車內容可能被重新定價、保留,或要求確認重置;這取決於多語系/多貨幣外掛的設定 [11]。搬遷後要實測「已在購物車有商品」時切換語言、切換貨幣、由訪客登入、套用優惠券,然後再入結帳。不要只在 empty cart 的狀態測。

六、搬遷後測試矩陣(示例)

WooCommerce 搬遷後多語系與多貨幣六步核對圖:語言×貨幣清單、hreflang self 與 return links、同語言 canonical 與索引、價格格式、結帳與稅、staging 隔離,最後以 Go/No-Go 閘門決定。
六步核對:先確認語言版本與索引,再測貨幣、稅、結帳與訂單;未確認不等於通過。

六步核對

  1. 01 · 清單語言 × 貨幣 × 市場

    列出每個要開賣的組合,不要只列語言。

  2. 02 · hreflangself + return links

    每版列出自己與所有版本;完整 URL、有效語言碼。

  3. 03 · canonical同語言 + 可索引

    canonical 不跨語言;200、index、sitemap 一致。

  4. 04 · 價格顯示幣別 + 格式 + 四捨五入

    核對符號、分隔符、小數位、固定價與換算價。

  5. 05 · 結帳與稅顯示幣不等於收款幣

    核對購物車、稅額、網關金額與訂單幣值。

  6. 06 · staging 隔離無真付款/真電郵

    測試 key、郵件 sink、獨立快取與排程。

通過:每個關鍵組合都有證據。阻擋:錯幣、錯稅、單邊 hreflang、canonical 跨語言、測試電郵外洩。未確認 ≠ 通過。

下載完整 SVG 流程圖

下表是組合示例,不是你的商店定價或稅務建議。實際測試應按你的市場、語言、貨幣、付款網關和稅務設定裁剪,但至少每個準備開賣的語言×貨幣×目的地要有一條完整路徑。

語言 貨幣 目的地 客戶 稅顯示 要核對
zh-Hant-HK HKD 香港 訪客 含稅 產品價、運費、結帳總額、訂單幣值
en USD 美國 訪客 未稅 稅是否按地址加入、網關是否收 USD
en GBP 英國 已登入 含稅 會員價、稅、訂單電郵語言
zh-Hans-CN CNY 中國內地 訪客 含稅 語言切換、貨幣符號、付款方式
ja JPY 日本 訪客 含稅 零小數位、四捨五入、網關金額
同一語言 第二貨幣 同一目的地 已登入 含稅 切換貨幣後購物車是否重算、優惠券是否仍有效

每一條路徑要留同一組證據:URL、HTTP 狀態、HTML lang、hreflang 組、canonical、robots、產品價、購物車總額、結帳總額、訂單 ID、訂單幣值、付款網關測試 ID、稅項明細、電郵記錄和截圖。只有「見到價格」不算完成。

高風險邊界

  • 訪客 vs 已登入:同一貨幣但不同稅/運費;
  • 語言切換後購物車重置或重新定價;
  • 貨幣切換後優惠券由固定金額變成另一個幣值;
  • 免運門檻在換算後剛好跨過或未跨過;
  • 付款網關不支援某貨幣時,是否隱藏、退回 base currency 或顯示錯誤;
  • 退款、部分退款、訂單電郵和發票的幣值與語言;
  • 舊訂單在搬遷後是否保留原幣值和原語言記錄。

七、安全 staging 隔離:不要在正式站試真付款或真電郵

WooCommerce 官方測試訂單文件提醒:測試訂單沒有特殊狀態,看起來可以和正式訂單一樣,亦可能觸發訂單電郵和進入分析;其他外掛或服務未必分得清測試與正式訂單。官方要求測試付款與結帳應在 staging 進行,完成後刪除測試訂單 [10]。

搬遷後的多語系/多貨幣測試,起碼要做到:

  • 獨立環境:staging 用獨立域名或子域名、獨立資料庫和獨立 uploads;不要連正式資料庫。
  • 封鎖索引:staging 用 basic auth 和 noindex,不要讓搜尋引擎收錄。要驗 production 的 hreflang,應在受控 preview 或直接 parse rendered HTML,不要把 staging 開放給 Google。
  • 測試付款:只用付款網關的 test mode/sandbox key;不要用 live key,也不要輸入真實信用卡。
  • 封鎖電郵:停用或導入郵件 sink;不要寄給真實客戶,亦要留意 SMTP 外掛可能繞過「停用電郵」設定。
  • 切斷對外整合:webhook、CRM、ERP、物流和 analytics 指向測試端點或停用,避免測試單進入正式流程。
  • 獨立快取與排程:staging 用獨立 cache/CDN;逐一列出 cron、Action Scheduler、訂閱續期和其他會接觸正式資料或外部端點的工作,將它們停用、改指向測試端點或隔離。保留測試所需的購物車、訂單、稅務、電郵 sink 與會話工作,否則你測不到完整路徑;不要用一個 blanket 停用清單代替檢查。
  • 測試商品與庫存:用獨立 SKU 或複製商品,避免測試單扣正式庫存。
  • 清理與記錄:測試後刪除 staging 訂單,保留測試證據;不要把測試訂單匯入正式站。

如果 staging 是正式站的完整 clone,search-replace 後仍要檢查序列化資料、外掛設定、授權 domain、快取和付款回呼。不要用一個模糊的萬用 redirect 或「先上線再算」來跳過隔離。

相關閱讀:WordPress 網站遷移、促銷開賣前營運演練與更多網誌文章。

八、Go/No-Go:未確認不等於通過

狀態 條件 行動
通過 每個關鍵語言×貨幣路徑的 hreflang、canonical、indexability、顯示價、結帳價、訂單幣值、稅額、網關金額和電郵語言都有證據 可按既定範圍上線
待確認 只影響非關鍵語言、次要貨幣或格式,交易金額與稅務未受影響 暫緩受影響市場/貨幣,補測後再決定
阻擋 錯幣收款、錯稅、結帳退回未經批准的 base currency、hreflang 單邊/舊域名、canonical 指向另一語言、測試電郵寄給真實客戶 暫停受影響範圍,修正後重測

未確認不等於通過。若關鍵項未確認,應由店主或獲授權人員決定暫停哪個語言、貨幣或結帳範圍;不要自行刪除舊站、舊 DNS、舊訂單或測試證據。

九、常見問題

hreflang 可以當貨幣切換器嗎?

不可以。hreflang 只描述語言/地區替代版本,不會改變價格、貨幣或結帳幣值。貨幣切換要靠多貨幣外掛、session、cookie 或你設計的 URL 狀態,並要另外測試。

每個語言版本一定要列出自己嗎?

要。Google 要求每個語言版本列出自己以及所有其他版本;self entry 是必要條件,不是重複錯誤。缺少 return link 亦可能令註解被忽略。

Canonical 可以指向另一個語言嗎?

不建議。Canonical 應指向同一語言版本,或同一語言不存在時最接近的替代語言。跨語言 canonical 會造成矛盾訊號;Google 可能忽略它或選擇其他版本,不能保證合併或保留哪個版本。

WordPress Site Language 會自動翻譯前台內容嗎?

不會。Site Language 是 WordPress 介面/dashboard 語言;前台內容翻譯要靠主題、翻譯檔或多語系外掛。WooCommerce 也要有對應語言的翻譯檔。

WooCommerce 核心支援多貨幣嗎?

核心每個商店只有一個 base currency;要顯示或收取其他貨幣,需要 multi-currency 外掛或擴充。有些工具只改顯示,有些可以改變結帳幣值,行為要看外掛。

顯示幣和結帳幣可以不同嗎?

可以,但只限於顯示層與交易層的分工:只改顯示的換算器可令產品頁顯示幣與結帳幣不同。客人確認結帳後,結帳頁、訂單記錄和網關實際收取的幣別與金額必須互相對得上;網關的換算、手續費或稅項差異要有紀錄解釋,不能把無解釋的差額當正常。商戶結算幣是另一個層次,可能與客戶支付幣不同,應分開核對。

改 base currency 會自動換算舊訂單嗎?

不會。WooCommerce 官方文件說,改 base currency 不會替你換算金額;產品價格數字保持不變,舊訂單保留原本貨幣、符號和總額。要自己更新價格並核對舊訂單。

搬遷後 hreflang 最常見的錯誤是甚麼?

舊域名未清、缺少 self entry 或 return link、語言碼格式錯、canonical 指向另一語言、把 noindex 頁放進語言簇,以及只用 cookie/redirect 而沒有獨立 URL。

資料來源

  1. Google Search Central — Tell Google about localized versions of your page

    最後更新 2026-09-21 UTC;檢視日期 2026-11-06。用於 hreflang 語法、self/return links、有效語言與地區碼、x-default。

  2. Google Search Central — How to specify a canonical URL

    最後更新 2026-07-10 UTC;檢視日期 2026-11-06。用於 canonical 與 hreflang 同語言配對、canonical 訊號與 noindex 的分別。

  3. Google Search Central — Managing multi-regional and multilingual sites

    最後更新 2025-12-10(官方頁面資料);檢視日期 2026-11-06。用於不同語言版本使用不同 URL、避免只靠 cookie/瀏覽器設定。

  4. WooCommerce — Shop currency

    首次發布 2013-04-23;最後更新 2026-10-30(官方頁面資料);檢視日期 2026-11-06。用於單一 base currency、多貨幣需外掛、Currency Converter Widget 只改顯示、改幣別不換算舊訂單。

  5. WooCommerce — General settings

    首次發布 2024-05-17;最後更新 2026-10-09(官方頁面資料);檢視日期 2026-11-06。用於貨幣選項、幣別、分隔符與小數位設定。

  6. WooCommerce — Setting up taxes in WooCommerce

    首次發布 2013-02-22;最後更新 2026-08-07(官方頁面資料);檢視日期 2026-11-06。用於含稅/未稅、計算地址、購物車/結帳顯示、運費稅與 rounding 注意。

  7. WordPress.org — Settings General screen

    首次發布 2018-11-05;最後更新 2026-07-03;檢視日期 2026-11-06。用於 Site Language 是 WordPress dashboard language。

  8. WordPress Developer — Installing WordPress in your language

    頁面未顯示最後更新日期;檢視日期 2026-11-06。用於 locale 的語言碼+國家碼命名與 WordPress 語言設定。

  9. WooCommerce — Translating WooCommerce

    首次發布 2012-01-19;最後更新 2026-05-15(官方頁面資料);檢視日期 2026-11-06。用於 WooCommerce 翻譯檔、Site Language 與未翻譯字串。

  10. WooCommerce — Testing orders

    首次發布 2024-05-08;最後更新 2026-06-03(官方頁面資料);檢視日期 2026-11-06。用於測試訂單可能觸發電郵/分析、應在 staging 測試、完成後刪除。

  11. WPML — How to Add Multiple Currencies and Payment Gateways

    首次發布 2026-06-26;頁面顯示 Last updated July 2, 2026;檢視日期 2026-11-06。用於按貨幣路由付款方式、切換語言/貨幣時購物車同步或重置。

搬遷後,先把語言與交易層分開核對

Managed-WP.™ PRO 提供 WordPress 專業代管服務。若你正處理搬遷後的多語系、多貨幣、稅務與 WooCommerce 結帳設定,需要按實際站點、外掛、付款網關和稅務設定整理驗收清單,可先確認支援邊界。

聯絡 Managed-WP.™ PRO

若你需要按實際 WooCommerce 語言、貨幣、稅務與付款流程整理搬遷後測試紀錄,可聯絡 Managed-WP.™ PRO。

編輯說明:本文由 Managed-WP.™ PRO 編輯團隊根據上述官方文件整理。標示為實務建議的內容不是 WooCommerce、付款網關、多語系/多貨幣外掛或稅務處理的功能保證;版本、介面、外掛與供應商行為可能變更,請以實際環境及最新官方文件為準。本文不是稅務建議,也沒有指示在正式站建立測試訂單、寄出真實電郵、使用 live 付款金鑰或把 staging 開放給搜尋引擎。