一件不想面對但在今年八月就要來臨的改變:WooCommerce 訂單資料庫大改版。這次改版主要的內容是將原本儲存在 wp_post
、 wp_postmeta
裡面的訂單資料,拆分成四個獨立的表格,分別是 wp_wc_orders
、wp_wc_orders_meta
、wp_wc_order_addresses
以及 wp_wc_order_operational_data
。
拆出這四個資料表對於工程師來說最大的影響就是再也不能用原本 WordPress內建的 get_post_meta()
、update_post_meta()
等一系列操作 Post Meta 的函式來修改訂單資料,而必須要透過 WooCommerce 的 CRUD 模式來操作,具體用法可以參考官方文件。
雖然訂單資料表格的轉換有段緩衝期,但從現在開始就養成 CRUD 的寫法會比保險,如果你手邊有很久以前寫的 WooCommerce 外掛,也最好把舊有的寫法替換,經過確認沒問題後,就能開啟 WooCommerce 高效能訂單儲存的設定來進行測試。
啟用步驟如下:

點選進階 > 功能,找到最下面的高效能訂單儲存,打勾後就能啟用資料表轉換,然後接下來就會看到有哪些外掛不相容:

點選管理不相容的外掛程式後,可以看到不相容外掛列表:

如果這些是你開發的外掛,然後你也確保都改全面改用 CRUD 的方法後,只要在外掛的主檔案加入以下程式碼宣告相容即可:
<?php
add_action(
'before_woocommerce_init',
function() {
if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) {
\Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', __FILE__, true );
}
}
);
declare_compatibility
接受三個參數,第一個是 $feature_id
,這邊用的是 custom_order_tables
,未來如果有推出其他實驗功能應該還會有其他可選項目,第二個參數是外掛主檔案,第三個是宣告是否相容,因此這邊使用 true
。
要注意的是這個勾點不會幫你檢查程式碼是否相容高效能訂單儲存,單純就是告訴 WordPress 說我們已經檢查過可以相容,而後續要使用新的資料表或是原有的,都可以在以下畫面進行切換,萬一當出問題的時候就能換回原本的 wp_postmeta
來檢查是哪邊出問題:

順帶一提,啟用高效能訂單儲存後,WooCommerce 會在背景以排程的方式將既有的訂單資料複製到新的表格中,但因為我的本機環境沒有啟用排程,因此可以改用 WP CLI 進行手動同步,指令為 wp wc cot sync
,同步完成後畫面如下:

2 則留言
您好,想請教一下,上述的php funtion code是否也能應用在綠界EC pay的金物流外掛呢?
Hi Joey
那段 Code 只是在宣告該外掛有相容 HPOS,但實際上還是要把外掛每個檔案都檢查過一遍,看是否都有改成 WC_Order 物件的 CRUD 寫法,如果沒有的話只是加那段 Code,外掛可能還是無法相容 HPOS。
具體要修改的地方可以參考官方文件:https://developer.woocommerce.com/docs/hpos-extension-recipe-book/