Repository navigation
v3.5.22 綠界超商取貨:未選門市仍能成立訂單、default 模式離島門市被誤擋
綠界超商取貨:未選門市仍能成立訂單;沒有離島欄位卻被擋外島超商(issue #136)
影響對象:
- 問題一:在傳統結帳(
[woocommerce_checkout])使用綠界超商取貨(7-ELEVEN/全家/萊爾富/OK)的站台。同時安裝會提早讀取結帳欄位的外掛(例如 ThemeHigh Checkout Field Editor Pro)時一定會發生。 - 問題二:結帳模式為
default、且開啟台灣欄位驗證(wc_woomp_setting_tw_field_valitdate,預設就是開啟)的站台。
問題
- 未選門市仍能成立訂單:門市必選原本只靠欄位的
required設定,而且這個設定是在結帳送出時才動態改的。WooCommerce 會快取結帳欄位:只要其他外掛比較早讀過欄位,required就會一直是 false。另外,沒勾「運送到不同地址」時,WooCommerce 會跳過整組運送欄位的驗證。結果顧客沒選門市也能下單、進入金流。 - default 模式選離島門市被擋:「寄送到離島區域」勾選欄位只有 onepage/twopage 模式才會出現,但後端把「沒有這個欄位」也當成「沒勾」。顧客會看到「外島超商 您選擇的運送方式不在運送範圍內」,畫面上卻沒有任何欄位可以修正。
修正
- 後端在建立訂單前直接檢查門市(掛在
woocommerce_after_checkout_validation):- 門市代號、名稱、地址任一為空就拒絕
- 門市品牌和選的超商不符(例如換超商後沒重新選店)也拒絕
- 不再受欄位初始化時機影響
- 前端提早擋:按下單或按 Enter 時,沒選門市會直接顯示「請選擇超商取貨門市」,不送出。換超商時,會一併清除前一家門市的殘留資料。
- 離島規則統一:
- default 模式:放行,運費依 WooCommerce 運送區域設定計算
- onepage/twopage 模式:依離島郵遞區號和勾選欄位判斷;欄位不存在時,不要求顧客勾選
- 連帶修正:綠界、藍新、速買配超商取貨在欄位被提早讀取時,地址欄位不會再被誤判為必填。
- 前端 JS 的版本號改成跟外掛版本一起變,升級後瀏覽器會載入新版。
⚠️ 升級注意
- default 模式開放離島超商取貨:之前離島訂單會被擋,升級後可以正常下單,運費依 WooCommerce 運送區域設定計算。不想接離島訂單的商家,請改用 onepage/twopage 模式,用離島郵遞區號控制。
- 結帳錯誤代碼拆分:原本共用的
validation,拆成woomp_name_length(姓名)、woomp_phone_length(電話)、woomp_island_cvs(離島)。如果自己寫程式用$errors->remove( 'validation' ),請改成新的代碼。 - 沒選門市的超取結帳會被擋下:以前會成立沒有門市資料的訂單。如果 WooCommerce「運送目的地」設成「強制寄到帳單地址」,又同時開啟綠界超取(綠界設定頁本來就標示不支援這個組合),超取結帳會被擋下。
驗證與已知限制
- 自動測試:整合測試 339 個全部通過(上一版是 307 個,這次新增 32 個)。新增的回歸測試,用舊版程式跑會失敗。
- 本機實際結帳:
- 沒選門市:按鈕、Enter、繞過前端直接送出,三種方式都被擋下,也沒有建立訂單
- 門市品牌不符:被拒絕
- 正確門市、金門門市(default 模式)、宅配:都正常成立訂單
- 尚未測試:還沒在正式的綠界選店地圖、以及實際安裝 ThemeHigh Checkout Field Editor Pro 的環境中測過。「欄位被提早讀取」的情境是用測試模擬的。
Closes #136