From 1b46c740193e410cba8437e927f2efa762ed2a30 Mon Sep 17 00:00:00 2001 From: lukehsuhao Date: Sat, 9 May 2026 17:46:29 +0800 Subject: [PATCH] =?UTF-8?q?fix(hpos):=20=E4=BF=AE=E6=AD=A3=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E6=AC=84=E4=BD=8D=E9=80=8F=E9=81=8E=20update=5Fmeta?= =?UTF-8?q?=5Fdata=20=E5=AF=AB=E5=85=A5=E5=B0=8E=E8=87=B4=20HPOS=20?= =?UTF-8?q?=E4=B8=8B=E9=9D=9C=E9=BB=98=E5=A4=B1=E6=95=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `_transaction_id` 與 `_shipping_address_1` 在 HPOS 下分別是 wc_orders 與 wc_order_addresses 的欄位,不是 meta。透過 `WC_Order::update_meta_data()` 寫入 會在 save 階段被內建的 internal_meta_keys 過濾掉、靜默丟棄,必須改用對應 setter。 修正兩處: 1. PayNow 付款 IPN 回應將收款編號寫入 `_transaction_id`(class-paynow-payment-response.php:206) → 改用 `WC_Order::set_transaction_id()` 影響:HPOS 下 PayNow 訂單付款成功後,order 的 transaction_id 為空,後續退款/對帳/ `WC_Order::get_transaction_id()` 全部拿不到值。 2. RY 物流 CVS 取貨點地址寫入 `_shipping_address_1`(ry-base.php:181) → 改用 `WC_Order::set_shipping_address_1()` 影響:HPOS 下選擇超商取貨後,店點地址不會回寫進訂單的 shipping address。 掃描範圍是針對 woomp 全部 PHP 檔案,剩下 5 處對核心欄位的 update_meta_data 都被 `version_compare(WC_VERSION, '5.6.0', '<')` 守護,woomp 3.5.x 已要求 WC 7.1+, 為 dead-code branch、不影響執行;本 PR 不動這些。 Co-Authored-By: Claude Opus 4.7 (1M context) --- .../includes/gateways/class-paynow-payment-response.php | 4 +++- .../ry-woocommerce-tools/woocommerce/shipping/ry-base.php | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/includes/paynow-payment/includes/gateways/class-paynow-payment-response.php b/includes/paynow-payment/includes/gateways/class-paynow-payment-response.php index e81277b8..6318f04e 100755 --- a/includes/paynow-payment/includes/gateways/class-paynow-payment-response.php +++ b/includes/paynow-payment/includes/gateways/class-paynow-payment-response.php @@ -203,7 +203,9 @@ public static function paynow_valid_offline_response( $posted ) { $order->update_meta_data( '_paynow_tran_id', $buysafe_no ); $order->update_meta_data( '_paynow_tran_status', $tran_status ); - $order->update_meta_data( '_transaction_id', $buysafe_no ); + // HPOS 下 `_transaction_id` 是 wc_orders.transaction_id 欄位, + // 透過 update_meta_data 寫入會被靜默丟棄,必須使用 setter。 + $order->set_transaction_id( $buysafe_no ); // 虛擬帳號 virtual account pay type = 03. if ( PayNow_Pay_Type::VIRTUAL_ACCOUNT === $pay_type ) { diff --git a/includes/ry-woocommerce-tools/woocommerce/shipping/ry-base.php b/includes/ry-woocommerce-tools/woocommerce/shipping/ry-base.php index 011a66b2..670ff434 100644 --- a/includes/ry-woocommerce-tools/woocommerce/shipping/ry-base.php +++ b/includes/ry-woocommerce-tools/woocommerce/shipping/ry-base.php @@ -178,7 +178,9 @@ public static function save_order_update( $order_id ) { // HPOS 相容:使用物件方法操作 meta $shipping_address = $order->get_address( 'shipping' ); - $order->update_meta_data( '_shipping_address_1', wc_clean( wp_unslash( $_POST['_shipping_cvs_store_address'] ) ) ); + // `_shipping_address_1` 是 wc_order_addresses 的核心欄位, + // HPOS 下 update_meta_data 會被靜默丟棄,必須用 setter。 + $order->set_shipping_address_1( wc_clean( wp_unslash( $_POST['_shipping_cvs_store_address'] ) ) ); $order->update_meta_data( '_shipping_address_index', implode( ' ', $shipping_address ) ); $order->save(); }