WooCommerce是一個(gè) WordPress插件,為了方便利用 WordPress 的便利性進(jìn)行開發(fā),WooCommerce開發(fā)團(tuán)隊(duì)使用了 WordPress 的自定義文章類型來存儲訂單,相信開發(fā)過WooCommerce主題或插件的朋友都了解這一點(diǎn)。
使用文章類型存儲WooCommerce數(shù)據(jù)的問題
混亂的WooCommerce數(shù)據(jù)存取方式
既然商品和訂單都是文章類型,我們就可以使用 WordPress 的 get_posts 或 WP_Query 來存儲或獲取這些數(shù)據(jù)。存儲文章的 wp_posts 數(shù)據(jù)表字段有限,無法存儲豐富的商品和訂單數(shù)據(jù)表,所以,一部分?jǐn)?shù)據(jù)是存儲在 post_meta 中。我們可以通過 WordPress 的 get_post_meta 和 updata_post_meta 函數(shù)來存取這些數(shù)據(jù)。
同時(shí),WooCommerce提供了 wc_get_product* 和 wc_get_order* 函數(shù)來幫助開發(fā)者存取數(shù)據(jù)。
一些開發(fā)者喜歡使用原生 MySQL 或一些 ORM ,通過直接操作 MySQL 數(shù)據(jù)表來存取WooCommerce商品或訂單數(shù)據(jù)。
不得不說,真 TM 混亂。
大量 post_meta 帶來的性能問題
另外,默認(rèn)情況下,如果用戶在站點(diǎn)下了一個(gè)訂單,WooCommerce會為每一個(gè)訂單創(chuàng)建至少 40 個(gè) post_meta 數(shù)據(jù),也就是說,如果網(wǎng)站每天有 10 個(gè)訂單,post_meta 數(shù)據(jù)表就要增加 400 行。post_meta 數(shù)據(jù)表越大,執(zhí)行訂單查詢的時(shí)間就越長,這是一個(gè)不容忽視的性能問題。
為了解決數(shù)據(jù)存取方式的混亂問題,我們需要要求開發(fā)者可以并且只能通過一種方式來訪問數(shù)據(jù)。為了解決性能問題,我們需要更換數(shù)據(jù)的存儲方式和存儲位置。
WooCommerceCRUD 抽象類是什么?
在 3.0 版本中,WooCommerce提供了新的 CRUD 類來解決這個(gè)問題。這是一個(gè)抽象的接口,通過這個(gè)接口,我們可以實(shí)現(xiàn)。
- 自定義每種數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
- 存取數(shù)據(jù)時(shí),對任何一種數(shù)據(jù)做必要的驗(yàn)證
- 作為開發(fā)者,我們不需要知道數(shù)據(jù)的存儲位置,只需要知道操作數(shù)據(jù)的 API 函數(shù)
- 把數(shù)據(jù)存儲到自定義數(shù)據(jù)表中,而不會影響數(shù)據(jù)的調(diào)用方式
- 使用相同的代碼在后臺更新數(shù)據(jù),就像在 REST API 和 CLI 中那樣 – 一切都是統(tǒng)一的。
- 更少的代碼,也意味著更少的 Bug,和更高的單元測試覆蓋率。
有哪些數(shù)據(jù)將會被遷移到這個(gè) CRUD 系統(tǒng)?
- 產(chǎn)品
- 顧客
- 訂單
- 訂單商品
- 優(yōu)惠券
這些都是WooCommerce中的主要數(shù)據(jù)類型,目前每個(gè)類型都是以自定義文章類型存儲的。除了顧客數(shù)據(jù)是存儲在用戶和用戶元數(shù)據(jù)中的。
兩種儲存WooCommerce數(shù)據(jù)方法的對比
我們來通過代碼看一下新的 CRUD 系統(tǒng)是怎么使用的。下面的代碼中,我們需要更新客戶的訂單姓名。
$order_id = 100;
update_post_meta( $order_id, '_billing_first_name', 'Fred' );
update_post_meta( $order_id, '_billing_last_name', 'Flintstone' );
我們需要知道訂單的文章 ID,每個(gè)數(shù)據(jù)的 meta_key的元鍵,還要處理所有的驗(yàn)證,真累!
使用 CRUD,我們是這樣更新這兩個(gè)數(shù)據(jù)的。
$order_id = 100;
$order = wc_get_order( $order ); //得到 $order 類
$order->set_billing_first_name( 'Fred );
$order->set_billing_last_name( 'Flintstone' );
$order->save();
等等,代碼咋看著還多了一行?別急,上面的代碼中,我們只需要知道 $order_id 這一個(gè)數(shù)據(jù)就可以了,至于獲取數(shù)據(jù)的類方法,我們可以通過 IDE(如 PHPStorm)的提示來輸入。并且通過這種方式,我們不需要關(guān)心數(shù)據(jù)在數(shù)據(jù)庫中是怎么存儲的,非常方便兼容未來的WooCommerce版本。
WooCommerce新 CRUD 類的意義
看起來,WooCommerce在逐步脫離 WordPress,表面上是這樣的,其實(shí)WooCommerce底層還是使用了很多 WordPress 的 API,完全脫離 WordPress 不大可能。不要忘了,WooCommerce現(xiàn)在已經(jīng)是 WordPress 母公司 Automatic 的產(chǎn)品了。
整體上來說,這個(gè)變化是好的,WooCommerceCRUD 類為開發(fā)人員提供了更統(tǒng)一的數(shù)據(jù)訪問接口,意味著更好的穩(wěn)定性,只要使用標(biāo)準(zhǔn)的方式訪問數(shù)據(jù),開發(fā)者就可以不用擔(dān)心底層數(shù)據(jù)的變化;為數(shù)據(jù)訪問提供了抽象層,意味著更大的靈活性,WooCoomerce 的數(shù)據(jù)可以很方便的被存儲在其他數(shù)據(jù)表中,而開發(fā)者不用改變訪問數(shù)據(jù)的方式。


